authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-19 08:27:35+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-19 08:28:36+02:00
loge4c47e80b43eb3096093b38e8e984d9042e3742e
tree36b1d95b77903af84cca6059412624f6902fea91
parent122a9bad3973bb9f7f48c91eb45cbf0513cf19c3
signature Commit is signed but in an unrecognized format.

translate-c-2 unaryexprortypetrait + fixes


3 files changed, 100 insertions(+), 47 deletions(-)

src-self-hosted/clang.zig+3
...@@ -1113,3 +1113,6 @@ pub extern fn ZigClangCallExpr_getCallee(*const ZigClangCallExpr) *const ZigClan...@@ -1113,3 +1113,6 @@ pub extern fn ZigClangCallExpr_getCallee(*const ZigClangCallExpr) *const ZigClan
1113pub extern fn ZigClangCallExpr_getNumArgs(*const ZigClangCallExpr) c_uint;1113pub extern fn ZigClangCallExpr_getNumArgs(*const ZigClangCallExpr) c_uint;
1114pub extern fn ZigClangCallExpr_getArgs(*const ZigClangCallExpr) [*]const *const ZigClangExpr;1114pub extern fn ZigClangCallExpr_getArgs(*const ZigClangCallExpr) [*]const *const ZigClangExpr;
11151115
1116pub extern fn ZigClangUnaryExprOrTypeTraitExpr_getTypeOfArgument(*const ZigClangUnaryExprOrTypeTraitExpr) ZigClangQualType;
1117pub extern fn ZigClangUnaryExprOrTypeTraitExpr_getBeginLoc(*const ZigClangUnaryExprOrTypeTraitExpr) ZigClangSourceLocation;
1118
src-self-hosted/translate_c.zig+73-11
...@@ -375,7 +375,7 @@ fn declVisitor(c: *Context, decl: *const ZigClangDecl) Error!void {...@@ -375,7 +375,7 @@ fn declVisitor(c: *Context, decl: *const ZigClangDecl) Error!void {
375}375}
376376
377fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {377fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
378 if (c.decl_table.contains(@ptrToInt(ZigClangFunctionDecl_getCanonicalDecl(fn_decl)))) 378 if (c.decl_table.contains(@ptrToInt(ZigClangFunctionDecl_getCanonicalDecl(fn_decl))))
379 return; // Avoid processing this decl twice379 return; // Avoid processing this decl twice
380 const rp = makeRestorePoint(c);380 const rp = makeRestorePoint(c);
381 const fn_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, fn_decl)));381 const fn_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, fn_decl)));
...@@ -443,7 +443,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {...@@ -443,7 +443,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
443}443}
444444
445fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {445fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
446 if (c.decl_table.contains(@ptrToInt(ZigClangVarDecl_getCanonicalDecl(var_decl)))) 446 if (c.decl_table.contains(@ptrToInt(ZigClangVarDecl_getCanonicalDecl(var_decl))))
447 return; // Avoid processing this decl twice447 return; // Avoid processing this decl twice
448 const rp = makeRestorePoint(c);448 const rp = makeRestorePoint(c);
449 const visib_tok = try appendToken(c, .Keyword_pub, "pub");449 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
...@@ -528,15 +528,46 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {...@@ -528,15 +528,46 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
528 return addTopLevelDecl(c, checked_name, &node.base);528 return addTopLevelDecl(c, checked_name, &node.base);
529}529}
530530
531fn transTypeDefAsBuiltin(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, builtin_name: []const u8) !*ast.Node {
532 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), builtin_name);
533 return transCreateNodeIdentifier(c, builtin_name);
534}
535
531fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Error!?*ast.Node {536fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Error!?*ast.Node {
532 if (c.decl_table.get(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)))) |kv|537 if (c.decl_table.get(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)))) |kv|
533 return try transCreateNodeIdentifier(c, kv.value); // Avoid processing this decl twice538 return try transCreateNodeIdentifier(c, kv.value); // Avoid processing this decl twice
534 const rp = makeRestorePoint(c);539 const rp = makeRestorePoint(c);
535 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
536 const const_tok = try appendToken(c, .Keyword_const, "const");
537540
538 const typedef_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));541 const typedef_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));
542
543 if (std.mem.eql(u8, typedef_name, "uint8_t"))
544 return transTypeDefAsBuiltin(c, typedef_decl, "u8")
545 else if (std.mem.eql(u8, typedef_name, "int8_t"))
546 return transTypeDefAsBuiltin(c, typedef_decl, "i8")
547 else if (std.mem.eql(u8, typedef_name, "uint16_t"))
548 return transTypeDefAsBuiltin(c, typedef_decl, "u16")
549 else if (std.mem.eql(u8, typedef_name, "int16_t"))
550 return transTypeDefAsBuiltin(c, typedef_decl, "i16")
551 else if (std.mem.eql(u8, typedef_name, "uint32_t"))
552 return transTypeDefAsBuiltin(c, typedef_decl, "u32")
553 else if (std.mem.eql(u8, typedef_name, "int32_t"))
554 return transTypeDefAsBuiltin(c, typedef_decl, "i32")
555 else if (std.mem.eql(u8, typedef_name, "uint64_t"))
556 return transTypeDefAsBuiltin(c, typedef_decl, "u64")
557 else if (std.mem.eql(u8, typedef_name, "int64_t"))
558 return transTypeDefAsBuiltin(c, typedef_decl, "i64")
559 else if (std.mem.eql(u8, typedef_name, "intptr_t"))
560 return transTypeDefAsBuiltin(c, typedef_decl, "isize")
561 else if (std.mem.eql(u8, typedef_name, "uintptr_t"))
562 return transTypeDefAsBuiltin(c, typedef_decl, "usize")
563 else if (std.mem.eql(u8, typedef_name, "ssize_t"))
564 return transTypeDefAsBuiltin(c, typedef_decl, "isize")
565 else if (std.mem.eql(u8, typedef_name, "size_t"))
566 return transTypeDefAsBuiltin(c, typedef_decl, "usize");
567
539 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), typedef_name);568 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), typedef_name);
569 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
570 const const_tok = try appendToken(c, .Keyword_const, "const");
540 const node = try transCreateNodeVarDecl(c, true, true, typedef_name);571 const node = try transCreateNodeVarDecl(c, true, true, typedef_name);
541 node.eq_token = try appendToken(c, .Equal, "=");572 node.eq_token = try appendToken(c, .Equal, "=");
542573
...@@ -621,8 +652,9 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*...@@ -621,8 +652,9 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*
621 try emitWarning(c, field_loc, "{} demoted to opaque type - has bitfield", .{container_kind_name});652 try emitWarning(c, field_loc, "{} demoted to opaque type - has bitfield", .{container_kind_name});
622 break :blk opaque;653 break :blk opaque;
623 }654 }
624655 const raw_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, field_decl)));
625 const field_name = try appendIdentifier(c, try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, field_decl))));656 if (raw_name.len < 1) continue; // fix weird windows bug?
657 const field_name = try appendIdentifier(c, raw_name);
626 _ = try appendToken(c, .Colon, ":");658 _ = try appendToken(c, .Colon, ":");
627 const field_type = transQualType(rp, ZigClangFieldDecl_getType(field_decl), field_loc) catch |err| switch (err) {659 const field_type = transQualType(rp, ZigClangFieldDecl_getType(field_decl), field_loc) catch |err| switch (err) {
628 error.UnsupportedType => {660 error.UnsupportedType => {
...@@ -828,7 +860,17 @@ fn transStmt(...@@ -828,7 +860,17 @@ fn transStmt(
828 .IntegerLiteralClass => return transIntegerLiteral(rp, scope, @ptrCast(*const ZigClangIntegerLiteral, stmt), result_used),860 .IntegerLiteralClass => return transIntegerLiteral(rp, scope, @ptrCast(*const ZigClangIntegerLiteral, stmt), result_used),
829 .ReturnStmtClass => return transReturnStmt(rp, scope, @ptrCast(*const ZigClangReturnStmt, stmt)),861 .ReturnStmtClass => return transReturnStmt(rp, scope, @ptrCast(*const ZigClangReturnStmt, stmt)),
830 .StringLiteralClass => return transStringLiteral(rp, scope, @ptrCast(*const ZigClangStringLiteral, stmt), result_used),862 .StringLiteralClass => return transStringLiteral(rp, scope, @ptrCast(*const ZigClangStringLiteral, stmt), result_used),
831 .ParenExprClass => return transExpr(rp, scope, ZigClangParenExpr_getSubExpr(@ptrCast(*const ZigClangParenExpr, stmt)), result_used, lrvalue),863 .ParenExprClass => {
864 const expr = try transExpr(rp, scope, ZigClangParenExpr_getSubExpr(@ptrCast(*const ZigClangParenExpr, stmt)), result_used, lrvalue);
865 if (expr.id == .GroupedExpression) return expr;
866 const node = try rp.c.a().create(ast.Node.GroupedExpression);
867 node.* = .{
868 .lparen = try appendToken(rp.c, .LParen, "("),
869 .expr = expr,
870 .rparen = try appendToken(rp.c, .RParen, ")"),
871 };
872 return &node.base;
873 },
832 .InitListExprClass => return transInitListExpr(rp, scope, @ptrCast(*const ZigClangInitListExpr, stmt), result_used),874 .InitListExprClass => return transInitListExpr(rp, scope, @ptrCast(*const ZigClangInitListExpr, stmt), result_used),
833 .ImplicitValueInitExprClass => return transImplicitValueInitExpr(rp, scope, @ptrCast(*const ZigClangExpr, stmt), result_used),875 .ImplicitValueInitExprClass => return transImplicitValueInitExpr(rp, scope, @ptrCast(*const ZigClangExpr, stmt), result_used),
834 .IfStmtClass => return transIfStmt(rp, scope, @ptrCast(*const ZigClangIfStmt, stmt)),876 .IfStmtClass => return transIfStmt(rp, scope, @ptrCast(*const ZigClangIfStmt, stmt)),
...@@ -854,6 +896,7 @@ fn transStmt(...@@ -854,6 +896,7 @@ fn transStmt(
854 .MemberExprClass => return transMemberExpr(rp, scope, @ptrCast(*const ZigClangMemberExpr, stmt), result_used),896 .MemberExprClass => return transMemberExpr(rp, scope, @ptrCast(*const ZigClangMemberExpr, stmt), result_used),
855 .ArraySubscriptExprClass => return transArrayAccess(rp, scope, @ptrCast(*const ZigClangArraySubscriptExpr, stmt), result_used),897 .ArraySubscriptExprClass => return transArrayAccess(rp, scope, @ptrCast(*const ZigClangArraySubscriptExpr, stmt), result_used),
856 .CallExprClass => return transCallExpr(rp, scope, @ptrCast(*const ZigClangCallExpr, stmt), result_used),898 .CallExprClass => return transCallExpr(rp, scope, @ptrCast(*const ZigClangCallExpr, stmt), result_used),
899 .UnaryExprOrTypeTraitExprClass => return transUnaryExprOrTypeTraitExpr(rp, scope, @ptrCast(*const ZigClangUnaryExprOrTypeTraitExpr, stmt), result_used),
857 else => {900 else => {
858 return revertAndWarn(901 return revertAndWarn(
859 rp,902 rp,
...@@ -1485,7 +1528,8 @@ fn transCCast(...@@ -1485,7 +1528,8 @@ fn transCCast(
1485 return transCCast(rp, scope, loc, ZigClangElaboratedType_getNamedType(elaborated_ty), src_type, expr);1528 return transCCast(rp, scope, loc, ZigClangElaboratedType_getNamedType(elaborated_ty), src_type, expr);
1486 }1529 }
1487 if (ZigClangQualType_getTypeClass(src_type) == .Enum and1530 if (ZigClangQualType_getTypeClass(src_type) == .Enum and
1488 ZigClangQualType_getTypeClass(dst_type) != .Enum) {1531 ZigClangQualType_getTypeClass(dst_type) != .Enum)
1532 {
1489 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@enumToInt");1533 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@enumToInt");
1490 try builtin_node.params.push(expr);1534 try builtin_node.params.push(expr);
1491 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");1535 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");
...@@ -2064,7 +2108,7 @@ fn transCallExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCallExpr,...@@ -2064,7 +2108,7 @@ fn transCallExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCallExpr,
2064 const num_args = ZigClangCallExpr_getNumArgs(stmt);2108 const num_args = ZigClangCallExpr_getNumArgs(stmt);
2065 const args = ZigClangCallExpr_getArgs(stmt);2109 const args = ZigClangCallExpr_getArgs(stmt);
2066 var i: usize = 0;2110 var i: usize = 0;
2067 while (i < num_args) : (i+=1) {2111 while (i < num_args) : (i += 1) {
2068 if (i != 0) {2112 if (i != 0) {
2069 _ = try appendToken(rp.c, .Comma, ",");2113 _ = try appendToken(rp.c, .Comma, ",");
2070 }2114 }
...@@ -2081,7 +2125,7 @@ fn transCallExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCallExpr,...@@ -2081,7 +2125,7 @@ fn transCallExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCallExpr,
2081 return &node.base;2125 return &node.base;
2082 }2126 }
2083 }2127 }
2084 2128
2085 return maybeSuppressResult(rp, scope, result_used, &node.base);2129 return maybeSuppressResult(rp, scope, result_used, &node.base);
2086}2130}
20872131
...@@ -2101,6 +2145,24 @@ fn qualTypeGetFnProto(qt: ZigClangQualType, is_ptr: *bool) ?*const ZigClangFunct...@@ -2101,6 +2145,24 @@ fn qualTypeGetFnProto(qt: ZigClangQualType, is_ptr: *bool) ?*const ZigClangFunct
2101 return null;2145 return null;
2102}2146}
21032147
2148fn transUnaryExprOrTypeTraitExpr(
2149 rp: RestorePoint,
2150 scope: *Scope,
2151 stmt: *const ZigClangUnaryExprOrTypeTraitExpr,
2152 result_used: ResultUsed,
2153) TransError!*ast.Node {
2154 const type_node = try transQualType(
2155 rp,
2156 ZigClangUnaryExprOrTypeTraitExpr_getTypeOfArgument(stmt),
2157 ZigClangUnaryExprOrTypeTraitExpr_getBeginLoc(stmt),
2158 );
2159
2160 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@sizeOf");
2161 try builtin_node.params.push(type_node);
2162 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");
2163 return maybeSuppressResult(rp, scope, result_used, &builtin_node.base);
2164}
2165
2104fn transCPtrCast(2166fn transCPtrCast(
2105 rp: RestorePoint,2167 rp: RestorePoint,
2106 loc: ZigClangSourceLocation,2168 loc: ZigClangSourceLocation,
...@@ -3092,7 +3154,7 @@ fn transCreateNodePtrDeref(c: *Context, lhs: *ast.Node) !*ast.Node {...@@ -3092,7 +3154,7 @@ fn transCreateNodePtrDeref(c: *Context, lhs: *ast.Node) !*ast.Node {
3092}3154}
30933155
3094fn transCreateNodeArrayAccess(c: *Context, lhs: *ast.Node) !*ast.Node.SuffixOp {3156fn transCreateNodeArrayAccess(c: *Context, lhs: *ast.Node) !*ast.Node.SuffixOp {
3095 _ = try appendToken(c, .LBrace, "[");3157 _ = try appendToken(c, .LBrace, "[");
3096 const node = try c.a().create(ast.Node.SuffixOp);3158 const node = try c.a().create(ast.Node.SuffixOp);
3097 node.* = .{3159 node.* = .{
3098 .lhs = .{ .node = lhs },3160 .lhs = .{ .node = lhs },
test/translate_c.zig+24-36
...@@ -748,6 +748,27 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -748,6 +748,27 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
748 \\}748 \\}
749 });749 });
750750
751 cases.addC_both("bitshift",
752 \\int foo(void) {
753 \\ return (1 << 2) >> 1;
754 \\}
755 , &[_][]const u8{
756 \\pub export fn foo() c_int {
757 \\ return (1 << @as(@import("std").math.Log2Int(c_int), 2)) >> @as(@import("std").math.Log2Int(c_int), 1);
758 \\}
759 });
760
761 cases.addC_both("sizeof",
762 \\#include <stddef.h>
763 \\size_t size_of(void) {
764 \\ return sizeof(int);
765 \\}
766 , &[_][]const u8{
767 \\pub export fn size_of() usize {
768 \\ return @sizeOf(c_int);
769 \\}
770 });
771
751 /////////////// Cases that pass for only stage2 ////////////////772 /////////////// Cases that pass for only stage2 ////////////////
752773
753 cases.add_2("Parameterless function prototypes",774 cases.add_2("Parameterless function prototypes",
...@@ -1353,15 +1374,15 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1353,15 +1374,15 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1353 \\}1374 \\}
1354 });1375 });
13551376
1356 cases.add_2("shift right with a fixed size type, no while", // TODO can fold this into "shift right assign with a fixed size type" once `while` and `>>=` and `uint32_t` are handled in translate-c-21377 cases.add_2("shift right with a fixed size type, no while", // TODO can fold this into "shift right assign with a fixed size type" once `>>=` is handled in translate-c-2
1357 \\#include <stdint.h>1378 \\#include <stdint.h>
1358 \\uint32_t some_func(uint32_t a) {1379 \\uint32_t some_func(uint32_t a) {
1359 \\ uint32_t b = a >> 1;1380 \\ uint32_t b = a >> 1;
1360 \\ return b;1381 \\ return b;
1361 \\}1382 \\}
1362 , &[_][]const u8{1383 , &[_][]const u8{
1363 \\pub export fn some_func(a: uint32_t) uint32_t {1384 \\pub export fn some_func(a: u32) u32 {
1364 \\ var b: uint32_t = a >> @as(u5, 1);1385 \\ var b: u32 = a >> @as(u5, 1);
1365 \\ return b;1386 \\ return b;
1366 \\}1387 \\}
1367 });1388 });
...@@ -1496,18 +1517,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1496,18 +1517,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1496 \\}1517 \\}
1497 });1518 });
14981519
1499 cases.add_2("bitshift, no parens", // TODO can fold this into "bitshift" once parens are preserved correctly in translate-c-2
1500 \\int foo(void) {
1501 \\ int a = (1 << 2);
1502 \\ return a >> 1;
1503 \\}
1504 , &[_][]const u8{
1505 \\pub export fn foo() c_int {
1506 \\ var a: c_int = 1 << @as(@import("std").math.Log2Int(c_int), 2);
1507 \\ return a >> @as(@import("std").math.Log2Int(c_int), 1);
1508 \\}
1509 });
1510
1511 cases.add_2("typedeffed bool expression",1520 cases.add_2("typedeffed bool expression",
1512 \\typedef char* yes;1521 \\typedef char* yes;
1513 \\void foo(void) {1522 \\void foo(void) {
...@@ -1766,17 +1775,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1766,17 +1775,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1766 \\}1775 \\}
1767 });1776 });
17681777
1769 cases.addC("sizeof",
1770 \\#include <stddef.h>
1771 \\size_t size_of(void) {
1772 \\ return sizeof(int);
1773 \\}
1774 , &[_][]const u8{
1775 \\pub export fn size_of() usize {
1776 \\ return @sizeOf(c_int);
1777 \\}
1778 });
1779
1780 cases.addC("__extension__ cast",1778 cases.addC("__extension__ cast",
1781 \\int foo(void) {1779 \\int foo(void) {
1782 \\ return __extension__ 1;1780 \\ return __extension__ 1;
...@@ -1787,16 +1785,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1787,16 +1785,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1787 \\}1785 \\}
1788 });1786 });
17891787
1790 cases.addC("bitshift",
1791 \\int foo(void) {
1792 \\ return (1 << 2) >> 1;
1793 \\}
1794 , &[_][]const u8{
1795 \\pub export fn foo() c_int {
1796 \\ return (1 << @as(@import("std").math.Log2Int(c_int), 2)) >> @as(@import("std").math.Log2Int(c_int), 1);
1797 \\}
1798 });
1799
1800 cases.addC("compound assignment operators",1788 cases.addC("compound assignment operators",
1801 \\void foo(void) {1789 \\void foo(void) {
1802 \\ int a = 0;1790 \\ int a = 0;