authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-04-21 19:46:34-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-04-25 00:06:58-04:00
log535d4195907de8a7e494b0480c394634d4c6034a
treef2e1043578df233191c860212d88222e33019ff2
parent712274997e80a93bdfe204f2238c4cfaac72a5b8
signature Commit is signed but in an unrecognized format.

translate-c: self-hosted implementation can detect C errors

See #1964

3 files changed, 27 insertions(+), 2 deletions(-)

src-self-hosted/clang.zig+8
......@@ -959,3 +959,11 @@ pub const Stage2ErrorMsg = extern struct {
959959 offset: c_uint,
960960};
961961pub extern fn ZigClangErrorMsg_delete(ptr: [*c]Stage2ErrorMsg, len: usize) void;
962
963pub extern fn ZigClangLoadFromCommandLine(
964 args_begin: [*]?[*]const u8,
965 args_end: [*]?[*]const u8,
966 errors_ptr: *[*]Stage2ErrorMsg,
967 errors_len: *usize,
968 resources_path: [*c]const u8,
969) ?*ZigClangASTUnit;
src-self-hosted/stage1.zig+7-2
......@@ -88,10 +88,15 @@ export fn stage2_translate_c(
8888 out_ast.* = translate_c.translate(args_begin, args_end, switch (mode) {
8989 .import => translate_c.Mode.import,
9090 .translate => translate_c.Mode.translate,
91 }, &errors) catch |err| switch (err) {
91 }, &errors, resources_path) catch |err| switch (err) {
9292 error.Unimplemented => return Error.Unimplemented,
93 error.SemanticAnalyzeFail => {
94 out_errors_ptr.* = errors.ptr;
95 out_errors_len.* = errors.len;
96 return Error.CCompileErrors;
97 },
98 error.OutOfMemory => return Error.OutOfMemory,
9399 };
94
95100 return Error.None;
96101}
97102
src-self-hosted/translate_c.zig+12
......@@ -17,7 +17,19 @@ pub fn translate(
1717 args_end: [*]?[*]const u8,
1818 mode: Mode,
1919 errors: *[]ClangErrMsg,
20 resources_path: [*]const u8,
2021) !*ast.Tree {
22 const ast_unit = ZigClangLoadFromCommandLine(
23 args_begin,
24 args_end,
25 &errors.ptr,
26 &errors.len,
27 resources_path,
28 ) orelse {
29 if (errors.len == 0) return error.OutOfMemory;
30 return error.SemanticAnalyzeFail;
31 };
32
2133 return error.Unimplemented;
2234}
2335