authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-08-20 10:45:55+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-08-20 10:45:55+03:00
loga553947a51bc5858ff40fb47dfe41daaa9ff75bf
tree8e8803ec59d72bb69b480c19f25286ed0164dfa2
parentadc5bce5e8487cf9507ab5dd2b1b60dd7f54cc3d
signature Commit is signed but in an unrecognized format.

translate-c: correctly put static and extern local variables in global scope


3 files changed, 46 insertions(+), 10 deletions(-)

src-self-hosted/translate_c.zig+16-9
...@@ -498,7 +498,7 @@ fn declVisitor(c: *Context, decl: *const ZigClangDecl) Error!void {...@@ -498,7 +498,7 @@ fn declVisitor(c: *Context, decl: *const ZigClangDecl) Error!void {
498 _ = try transRecordDecl(c, @ptrCast(*const ZigClangRecordDecl, decl));498 _ = try transRecordDecl(c, @ptrCast(*const ZigClangRecordDecl, decl));
499 },499 },
500 .Var => {500 .Var => {
501 return visitVarDecl(c, @ptrCast(*const ZigClangVarDecl, decl));501 return visitVarDecl(c, @ptrCast(*const ZigClangVarDecl, decl), null);
502 },502 },
503 .Empty => {503 .Empty => {
504 // Do nothing504 // Do nothing
...@@ -679,12 +679,13 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {...@@ -679,12 +679,13 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
679 return addTopLevelDecl(c, fn_name, &proto_node.base);679 return addTopLevelDecl(c, fn_name, &proto_node.base);
680}680}
681681
682fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {682/// if mangled_name is not null, this var decl was declared in a block scope.
683 const var_name = try c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, var_decl)));683fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl, mangled_name: ?[]const u8) Error!void {
684 const var_name = mangled_name orelse try c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, var_decl)));
684 if (c.global_scope.sym_table.contains(var_name))685 if (c.global_scope.sym_table.contains(var_name))
685 return; // Avoid processing this decl twice686 return; // Avoid processing this decl twice
686 const rp = makeRestorePoint(c);687 const rp = makeRestorePoint(c);
687 const visib_tok = try appendToken(c, .Keyword_pub, "pub");688 const visib_tok = if (mangled_name) |_| null else try appendToken(c, .Keyword_pub, "pub");
688689
689 const thread_local_token = if (ZigClangVarDecl_getTLSKind(var_decl) == .None)690 const thread_local_token = if (ZigClangVarDecl_getTLSKind(var_decl) == .None)
690 null691 null
...@@ -1582,15 +1583,22 @@ fn transDeclStmtOne(...@@ -1582,15 +1583,22 @@ fn transDeclStmtOne(
1582 .Var => {1583 .Var => {
1583 const var_decl = @ptrCast(*const ZigClangVarDecl, decl);1584 const var_decl = @ptrCast(*const ZigClangVarDecl, decl);
15841585
1585 const thread_local_token = if (ZigClangVarDecl_getTLSKind(var_decl) == .None)
1586 null
1587 else
1588 try appendToken(c, .Keyword_threadlocal, "threadlocal");
1589 const qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl);1586 const qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl);
1590 const name = try c.str(ZigClangNamedDecl_getName_bytes_begin(1587 const name = try c.str(ZigClangNamedDecl_getName_bytes_begin(
1591 @ptrCast(*const ZigClangNamedDecl, var_decl),1588 @ptrCast(*const ZigClangNamedDecl, var_decl),
1592 ));1589 ));
1593 const mangled_name = try block_scope.makeMangledName(c, name);1590 const mangled_name = try block_scope.makeMangledName(c, name);
1591
1592 switch (ZigClangVarDecl_getStorageClass(var_decl)) {
1593 .Extern, .Static => {
1594 // This is actually a global variable, put it in the global scope and reference it.
1595 // `_ = mangled_name;`
1596 try visitVarDecl(rp.c, var_decl, mangled_name);
1597 return try maybeSuppressResult(rp, scope, .unused, try transCreateNodeIdentifier(rp.c, mangled_name));
1598 },
1599 else => {},
1600 }
1601
1594 const mut_tok = if (ZigClangQualType_isConstQualified(qual_type))1602 const mut_tok = if (ZigClangQualType_isConstQualified(qual_type))
1595 try appendToken(c, .Keyword_const, "const")1603 try appendToken(c, .Keyword_const, "const")
1596 else1604 else
...@@ -1618,7 +1626,6 @@ fn transDeclStmtOne(...@@ -1618,7 +1626,6 @@ fn transDeclStmtOne(
1618 .mut_token = mut_tok,1626 .mut_token = mut_tok,
1619 .semicolon_token = semicolon_token,1627 .semicolon_token = semicolon_token,
1620 }, .{1628 }, .{
1621 .thread_local_token = thread_local_token,
1622 .eq_token = eq_token,1629 .eq_token = eq_token,
1623 .type_node = type_node,1630 .type_node = type_node,
1624 .init_node = init_node,1631 .init_node = init_node,
test/run_translated_c.zig+14
...@@ -3,6 +3,20 @@ const tests = @import("tests.zig");...@@ -3,6 +3,20 @@ const tests = @import("tests.zig");
3const nl = std.cstr.line_sep;3const nl = std.cstr.line_sep;
44
5pub fn addCases(cases: *tests.RunTranslatedCContext) void {5pub fn addCases(cases: *tests.RunTranslatedCContext) void {
6 cases.add("static variable in block scope",
7 \\#include <stdlib.h>
8 \\int foo() {
9 \\ static int bar;
10 \\ bar += 1;
11 \\ return bar;
12 \\}
13 \\int main() {
14 \\ foo();
15 \\ foo();
16 \\ if (foo() != 3) abort();
17 \\}
18 , "");
19
6 cases.add("array initializer",20 cases.add("array initializer",
7 \\#include <stdlib.h>21 \\#include <stdlib.h>
8 \\int main(int argc, char **argv) {22 \\int main(int argc, char **argv) {
test/translate_c.zig+16-1
...@@ -3,6 +3,20 @@ const std = @import("std");...@@ -3,6 +3,20 @@ const std = @import("std");
3const CrossTarget = std.zig.CrossTarget;3const CrossTarget = std.zig.CrossTarget;
44
5pub fn addCases(cases: *tests.TranslateCContext) void {5pub fn addCases(cases: *tests.TranslateCContext) void {
6 cases.add("extern variable in block scope",
7 \\float bar;
8 \\int foo() {
9 \\ _Thread_local static int bar = 2;
10 \\}
11 , &[_][]const u8{
12 \\pub export var bar: f32 = @import("std").mem.zeroes(f32);
13 \\threadlocal var bar_1: c_int = 2;
14 \\pub export fn foo() c_int {
15 \\ _ = bar_1;
16 \\ return 0;
17 \\}
18 });
19
6 cases.add("missing return stmt",20 cases.add("missing return stmt",
7 \\int foo() {}21 \\int foo() {}
8 \\int bar() {22 \\int bar() {
...@@ -480,8 +494,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -480,8 +494,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
480 \\ static const char v2[] = "2.2.2";494 \\ static const char v2[] = "2.2.2";
481 \\}495 \\}
482 , &[_][]const u8{496 , &[_][]const u8{
497 \\const v2: [*c]const u8 = "2.2.2";
483 \\pub export fn foo() void {498 \\pub export fn foo() void {
484 \\ const v2: [*c]const u8 = "2.2.2";499 \\ _ = v2;
485 \\}500 \\}
486 });501 });
487502