authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-16 17:55:51+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-16 18:19:37+02:00
loge3f1bfe48388b3c585792367a898a25c58324000
treee764b756c116680c6991873ee60558ee697b8032
parent626562555e3ffd9ae259aba967efb23ce293e338
signature Commit is signed but in an unrecognized format.

translate-c-2 if statements


3 files changed, 78 insertions(+), 8 deletions(-)

src-self-hosted/clang.zig+4
......@@ -1036,3 +1036,7 @@ pub extern fn ZigClangPreprocessedEntity_getKind(*const ZigClangPreprocessedEnti
10361036pub extern fn ZigClangMacroDefinitionRecord_getName_getNameStart(*const ZigClangMacroDefinitionRecord) [*:0]const u8;
10371037pub extern fn ZigClangMacroDefinitionRecord_getSourceRange_getBegin(*const ZigClangMacroDefinitionRecord) ZigClangSourceLocation;
10381038pub extern fn ZigClangMacroDefinitionRecord_getSourceRange_getEnd(*const ZigClangMacroDefinitionRecord) ZigClangSourceLocation;
1039
1040pub extern fn ZigClangIfStmt_getThen(*const ZigClangIfStmt) *const ZigClangStmt;
1041pub extern fn ZigClangIfStmt_getElse(*const ZigClangIfStmt) ?*const ZigClangStmt;
1042pub extern fn ZigClangIfStmt_getCond(*const ZigClangIfStmt) *const ZigClangStmt;
src-self-hosted/translate_c.zig+51-8
......@@ -67,18 +67,17 @@ const Scope = struct {
6767 variables: AliasList,
6868 label: ?[]const u8,
6969
70 /// Don't forget to set rbrace token later
70 /// Don't forget to set rbrace token and block_node later
7171 fn init(c: *Context, parent: *Scope, want_label: bool) !*Block {
7272 // TODO removing `?[]const u8` here causes LLVM error
7373 const label: ?[]const u8 = if (want_label) try std.fmt.allocPrint(c.a(), "blk_{}", .{c.getMangle()}) else null;
74 const block_node = try transCreateNodeBlock(c, label);
7574 const block = try c.a().create(Block);
7675 block.* = .{
7776 .base = .{
7877 .id = .Block,
7978 .parent = parent,
8079 },
81 .block_node = block_node,
80 .block_node = undefined,
8281 .variables = AliasList.init(c.a()),
8382 .label = label,
8483 };
......@@ -126,7 +125,6 @@ const Scope = struct {
126125 };
127126
128127 const Condition = struct {
129 expr: *ast.Node,
130128 base: Scope,
131129 };
132130
......@@ -612,6 +610,7 @@ fn transStmt(
612610 .ParenExprClass => return transExpr(rp, scope, ZigClangParenExpr_getSubExpr(@ptrCast(*const ZigClangParenExpr, stmt)), result_used, lrvalue),
613611 .InitListExprClass => return transInitListExpr(rp, scope, @ptrCast(*const ZigClangInitListExpr, stmt), result_used),
614612 .ImplicitValueInitExprClass => return transImplicitValueInitExpr(rp, scope, @ptrCast(*const ZigClangExpr, stmt), result_used),
613 .IfStmtClass => return transIfStmt(rp, scope, @ptrCast(*const ZigClangIfStmt, stmt), result_used),
615614 else => {
616615 return revertAndWarn(
617616 rp,
......@@ -718,18 +717,31 @@ fn transBinaryOperator(
718717 ),
719718 .Comma => {
720719 const block_scope = try scope.findBlockScope(rp.c);
720 const expr = block_scope.base.parent == scope;
721 const lparen = if (expr) blk: {
722 const l = try appendToken(rp.c, .LParen, "(");
723 block_scope.block_node = try transCreateNodeBlock(rp.c, block_scope.label);
724 break :blk l;
725 } else undefined;
721726
722727 const lhs = try transExpr(rp, &block_scope.base, ZigClangBinaryOperator_getLHS(stmt), .unused, .r_value);
723728 try block_scope.block_node.statements.push(lhs);
724729
725730 const rhs = try transExpr(rp, &block_scope.base, ZigClangBinaryOperator_getRHS(stmt), .used, .r_value);
726 if (block_scope.base.parent == scope) {
731 if (expr) {
732 _ = try appendToken(rp.c, .Semicolon, ";");
727733 const break_node = try transCreateNodeBreak(rp.c, block_scope.label);
728734 break_node.rhs = rhs;
729 _ = try appendToken(rp.c, .Semicolon, ";");
730735 try block_scope.block_node.statements.push(&break_node.base);
731736 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");
732 return maybeSuppressResult(rp, scope, result_used, &block_scope.block_node.base);
737 const rparen = try appendToken(rp.c, .RParen, ")");
738 const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression);
739 grouped_expr.* = .{
740 .lparen = lparen,
741 .expr = &block_scope.block_node.base,
742 .rparen = rparen,
743 };
744 return maybeSuppressResult(rp, scope, result_used, &grouped_expr.base);
733745 } else {
734746 return maybeSuppressResult(rp, scope, result_used, rhs);
735747 }
......@@ -766,6 +778,7 @@ fn transCompoundStmtInline(
766778
767779fn transCompoundStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCompoundStmt) TransError!*ast.Node {
768780 const block_scope = try Scope.Block.init(rp.c, scope, false);
781 block_scope.block_node = try transCreateNodeBlock(rp.c, block_scope.label);
769782 try transCompoundStmtInline(rp, &block_scope.base, stmt, block_scope.block_node);
770783 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");
771784 return &block_scope.block_node.base;
......@@ -792,7 +805,7 @@ fn transCStyleCastExprClass(
792805
793806fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt) TransError!*ast.Node {
794807 const c = rp.c;
795 const block_scope = try scope.findBlockScope(c);
808 const block_scope = scope.findBlockScope(c) catch unreachable;
796809
797810 var it = ZigClangDeclStmt_decl_begin(stmt);
798811 const end_it = ZigClangDeclStmt_decl_end(stmt);
......@@ -1167,6 +1180,35 @@ fn transImplicitValueInitExpr(
11671180 };
11681181}
11691182
1183fn transIfStmt(
1184 rp: RestorePoint,
1185 scope: *Scope,
1186 stmt: *const ZigClangIfStmt,
1187 used: ResultUsed,
1188) TransError!*ast.Node {
1189 // if (c) t
1190 // if (c) t else e
1191 const if_node = try transCreateNodeIf(rp.c);
1192
1193 var cond_scope = Scope.Condition{
1194 .base = .{
1195 .parent = scope,
1196 .id = .Condition,
1197 },
1198 };
1199 if_node.condition = try transBoolExpr(rp, &cond_scope.base, @ptrCast(*const ZigClangExpr, ZigClangIfStmt_getCond(stmt)), .used, .r_value);
1200 _ = try appendToken(rp.c, .RParen, ")");
1201
1202 if_node.body = try transStmt(rp, scope, ZigClangIfStmt_getThen(stmt), .used, .r_value);
1203
1204 if (ZigClangIfStmt_getElse(stmt)) |expr| {
1205 if_node.@"else" = try transCreateNodeElse(rp.c);
1206 if_node.@"else".?.body = try transStmt(rp, scope, expr, .used, .r_value);
1207 }
1208 _ = try appendToken(rp.c, .Semicolon, ";");
1209 return &if_node.base;
1210}
1211
11701212fn transCPtrCast(
11711213 rp: RestorePoint,
11721214 loc: ZigClangSourceLocation,
......@@ -1602,6 +1644,7 @@ fn transCreateNodeAssign(
16021644 // zig: })
16031645 _ = try appendToken(rp.c, .LParen, "(");
16041646 const block_scope = try Scope.Block.init(rp.c, scope, true);
1647 block_scope.block_node = try transCreateNodeBlock(rp.c, block_scope.label);
16051648 const tmp = try std.fmt.allocPrint(rp.c.a(), "_tmp_{}", .{rp.c.getMangle()});
16061649
16071650 const node = try transCreateNodeVarDecl(rp.c, false, true, tmp);
test/translate_c.zig+23
......@@ -732,6 +732,29 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
732732 \\}
733733 });
734734
735 cases.add_2("if statements",
736 \\int foo(char c) {
737 \\ if (2) {
738 \\ int a = 2;
739 \\ }
740 \\ if (2, 5) {
741 \\ int a = 2;
742 \\ }
743 \\}
744 , &[_][]const u8{
745 \\pub export fn foo(c: u8) c_int {
746 \\ if (2 != 0) {
747 \\ var a: c_int = 2;
748 \\ }
749 \\ if ((blk_1: {
750 \\ _ = 2;
751 \\ break :blk_1 5;
752 \\ }) != 0) {
753 \\ var a: c_int = 2;
754 \\ }
755 \\}
756 });
757
735758 /////////////// Cases for only stage1 which are TODO items for stage2 ////////////////
736759
737760 if (builtin.os != builtin.Os.windows) {