authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-12 20:35:40+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-12 20:35:40+02:00
log48ac84db1b6638d4892a5b9d88d193562e1a4f04
tree3326af1b7242b821b55e37dfbf96236dcaac82e7
parent3bca02509163b1c77776762d371fd802073ff7dd
signature Commit is signed but in an unrecognized format.

translate-c-2 translate apvalue


2 files changed, 142 insertions(+), 20 deletions(-)

src-self-hosted/clang.zig+8-2
...@@ -1,5 +1,6 @@...@@ -1,5 +1,6 @@
1const builtin = @import("builtin");1const builtin = @import("builtin");
22
3pub const struct_ZigClangAPInt = @OpaqueType();
3pub const struct_ZigClangAPSInt = @OpaqueType();4pub const struct_ZigClangAPSInt = @OpaqueType();
4pub const struct_ZigClangAPFloat = @OpaqueType();5pub const struct_ZigClangAPFloat = @OpaqueType();
5pub const struct_ZigClangASTContext = @OpaqueType();6pub const struct_ZigClangASTContext = @OpaqueType();
...@@ -747,6 +748,7 @@ pub extern fn ZigClangType_getTypeClass(self: ?*const struct_ZigClangType) ZigCl...@@ -747,6 +748,7 @@ pub extern fn ZigClangType_getTypeClass(self: ?*const struct_ZigClangType) ZigCl
747pub extern fn ZigClangType_getPointeeType(self: ?*const struct_ZigClangType) struct_ZigClangQualType;748pub extern fn ZigClangType_getPointeeType(self: ?*const struct_ZigClangType) struct_ZigClangQualType;
748pub extern fn ZigClangType_isVoidType(self: ?*const struct_ZigClangType) bool;749pub extern fn ZigClangType_isVoidType(self: ?*const struct_ZigClangType) bool;
749pub extern fn ZigClangType_getTypeClassName(self: *const struct_ZigClangType) [*:0]const u8;750pub extern fn ZigClangType_getTypeClassName(self: *const struct_ZigClangType) [*:0]const u8;
751pub extern fn ZigClangType_getAsArrayTypeUnsafe(self: *const ZigClangType) *const ZigClangArrayType;
750pub extern fn ZigClangStmt_getBeginLoc(self: *const struct_ZigClangStmt) struct_ZigClangSourceLocation;752pub extern fn ZigClangStmt_getBeginLoc(self: *const struct_ZigClangStmt) struct_ZigClangSourceLocation;
751pub extern fn ZigClangStmt_getStmtClass(self: ?*const struct_ZigClangStmt) ZigClangStmtClass;753pub extern fn ZigClangStmt_getStmtClass(self: ?*const struct_ZigClangStmt) ZigClangStmtClass;
752pub extern fn ZigClangStmt_classof_Expr(self: ?*const struct_ZigClangStmt) bool;754pub extern fn ZigClangStmt_classof_Expr(self: ?*const struct_ZigClangStmt) bool;
...@@ -756,8 +758,8 @@ pub extern fn ZigClangExpr_getBeginLoc(self: *const struct_ZigClangExpr) struct_...@@ -756,8 +758,8 @@ pub extern fn ZigClangExpr_getBeginLoc(self: *const struct_ZigClangExpr) struct_
756pub extern fn ZigClangAPValue_getKind(self: ?*const struct_ZigClangAPValue) ZigClangAPValueKind;758pub extern fn ZigClangAPValue_getKind(self: ?*const struct_ZigClangAPValue) ZigClangAPValueKind;
757pub extern fn ZigClangAPValue_getInt(self: ?*const struct_ZigClangAPValue) ?*const struct_ZigClangAPSInt;759pub extern fn ZigClangAPValue_getInt(self: ?*const struct_ZigClangAPValue) ?*const struct_ZigClangAPSInt;
758pub extern fn ZigClangAPValue_getArrayInitializedElts(self: ?*const struct_ZigClangAPValue) c_uint;760pub extern fn ZigClangAPValue_getArrayInitializedElts(self: ?*const struct_ZigClangAPValue) c_uint;
759pub extern fn ZigClangAPValue_getArrayInitializedElt(self: ?*const struct_ZigClangAPValue, i: c_uint) ?*const struct_ZigClangAPValue;761pub extern fn ZigClangAPValue_getArrayInitializedElt(self: ?*const struct_ZigClangAPValue, i: c_uint) *const struct_ZigClangAPValue;
760pub extern fn ZigClangAPValue_getArrayFiller(self: ?*const struct_ZigClangAPValue) ?*const struct_ZigClangAPValue;762pub extern fn ZigClangAPValue_getArrayFiller(self: ?*const struct_ZigClangAPValue) *const struct_ZigClangAPValue;
761pub extern fn ZigClangAPValue_getArraySize(self: ?*const struct_ZigClangAPValue) c_uint;763pub extern fn ZigClangAPValue_getArraySize(self: ?*const struct_ZigClangAPValue) c_uint;
762pub extern fn ZigClangAPValue_getLValueBase(self: ?*const struct_ZigClangAPValue) struct_ZigClangAPValueLValueBase;764pub extern fn ZigClangAPValue_getLValueBase(self: ?*const struct_ZigClangAPValue) struct_ZigClangAPValueLValueBase;
763pub extern fn ZigClangAPSInt_isSigned(self: ?*const struct_ZigClangAPSInt) bool;765pub extern fn ZigClangAPSInt_isSigned(self: ?*const struct_ZigClangAPSInt) bool;
...@@ -766,6 +768,8 @@ pub extern fn ZigClangAPSInt_negate(self: ?*const struct_ZigClangAPSInt) ?*const...@@ -766,6 +768,8 @@ pub extern fn ZigClangAPSInt_negate(self: ?*const struct_ZigClangAPSInt) ?*const
766pub extern fn ZigClangAPSInt_free(self: ?*const struct_ZigClangAPSInt) void;768pub extern fn ZigClangAPSInt_free(self: ?*const struct_ZigClangAPSInt) void;
767pub extern fn ZigClangAPSInt_getRawData(self: ?*const struct_ZigClangAPSInt) [*c]const u64;769pub extern fn ZigClangAPSInt_getRawData(self: ?*const struct_ZigClangAPSInt) [*c]const u64;
768pub extern fn ZigClangAPSInt_getNumWords(self: ?*const struct_ZigClangAPSInt) c_uint;770pub extern fn ZigClangAPSInt_getNumWords(self: ?*const struct_ZigClangAPSInt) c_uint;
771
772pub extern fn ZigClangAPInt_getLimitedValue(self: *const struct_ZigClangAPInt, limit: u64) u64;
769pub extern fn ZigClangAPValueLValueBase_dyn_cast_Expr(self: struct_ZigClangAPValueLValueBase) ?*const struct_ZigClangExpr;773pub extern fn ZigClangAPValueLValueBase_dyn_cast_Expr(self: struct_ZigClangAPValueLValueBase) ?*const struct_ZigClangExpr;
770pub extern fn ZigClangASTUnit_delete(self: ?*struct_ZigClangASTUnit) void;774pub extern fn ZigClangASTUnit_delete(self: ?*struct_ZigClangASTUnit) void;
771775
...@@ -935,6 +939,8 @@ pub extern fn ZigClangImplicitCastExpr_getSubExpr(*const ZigClangImplicitCastExp...@@ -935,6 +939,8 @@ pub extern fn ZigClangImplicitCastExpr_getSubExpr(*const ZigClangImplicitCastExp
935939
936pub extern fn ZigClangArrayType_getElementType(*const ZigClangArrayType) ZigClangQualType;940pub extern fn ZigClangArrayType_getElementType(*const ZigClangArrayType) ZigClangQualType;
937941
942pub extern fn ZigClangConstantArrayType_getElementType(self: *const struct_ZigClangConstantArrayType) ZigClangQualType;
943pub extern fn ZigClangConstantArrayType_getSize(self: *const struct_ZigClangConstantArrayType) *const struct_ZigClangAPInt;
938pub extern fn ZigClangDeclRefExpr_getDecl(*const ZigClangDeclRefExpr) *const ZigClangValueDecl;944pub extern fn ZigClangDeclRefExpr_getDecl(*const ZigClangDeclRefExpr) *const ZigClangValueDecl;
939945
940pub extern fn ZigClangParenType_getInnerType(*const ZigClangParenType) ZigClangQualType;946pub extern fn ZigClangParenType_getInnerType(*const ZigClangParenType) ZigClangQualType;
src-self-hosted/translate_c.zig+134-18
...@@ -322,7 +322,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {...@@ -322,7 +322,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
322322
323 var var_node = try transCreateNodeVarDecl(c, true, is_extern, is_const, var_name);323 var var_node = try transCreateNodeVarDecl(c, true, is_extern, is_const, var_name);
324324
325 _= try appendToken(rp.c, .Colon, ":");325 _ = try appendToken(rp.c, .Colon, ":");
326 var_node.type_node = transQualType(rp, qual_type, var_decl_loc) catch |err| switch (err) {326 var_node.type_node = transQualType(rp, qual_type, var_decl_loc) catch |err| switch (err) {
327 error.UnsupportedType => {327 error.UnsupportedType => {
328 return failDecl(c, var_decl_loc, var_name, "unable to resolve variable type", .{});328 return failDecl(c, var_decl_loc, var_name, "unable to resolve variable type", .{});
...@@ -634,15 +634,8 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe...@@ -634,15 +634,8 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe
634 const eq_token = try appendToken(c, .Equal, "=");634 const eq_token = try appendToken(c, .Equal, "=");
635 const init_node = if (ZigClangVarDecl_getInit(var_decl)) |expr|635 const init_node = if (ZigClangVarDecl_getInit(var_decl)) |expr|
636 (try transExpr(rp, scope, expr, .used, .r_value)).node636 (try transExpr(rp, scope, expr, .used, .r_value)).node
637 else blk: {637 else
638 const undefined_token = try appendToken(c, .Keyword_undefined, "undefined");638 try transCreateNodeUndefinedLiteral(rp.c);
639 const undefined_node = try rp.c.a().create(ast.Node.UndefinedLiteral);
640 undefined_node.* = ast.Node.UndefinedLiteral{
641 .base = ast.Node{ .id = .UndefinedLiteral },
642 .token = undefined_token,
643 };
644 break :blk &undefined_node.base;
645 };
646 const semicolon_token = try appendToken(c, .Semicolon, ";");639 const semicolon_token = try appendToken(c, .Semicolon, ";");
647640
648 const node = try c.a().create(ast.Node.VarDecl);641 const node = try c.a().create(ast.Node.VarDecl);
...@@ -1288,6 +1281,20 @@ fn transCreateNodeUndefinedLiteral(c: *Context) !*ast.Node {...@@ -1288,6 +1281,20 @@ fn transCreateNodeUndefinedLiteral(c: *Context) !*ast.Node {
1288 return &node.base;1281 return &node.base;
1289}1282}
12901283
1284fn transCreateNodeArrayInitializer(c: *Context, type_node: *ast.Node) !*ast.Node.SuffixOp {
1285 _ = try appendToken(c, .LBrace, "{");
1286 const node = try c.a().create(ast.Node.SuffixOp);
1287 node.* = ast.Node.SuffixOp{
1288 .base = ast.Node{ .id = .SuffixOp },
1289 .lhs = .{ .node = type_node },
1290 .op = .{
1291 .ArrayInitializer = ast.Node.SuffixOp.Op.InitList.init(c.a()),
1292 },
1293 .rtoken = undefined, // set after appending values
1294 };
1295 return node;
1296}
1297
1291fn transCreateNodeVarDecl(1298fn transCreateNodeVarDecl(
1292 c: *Context,1299 c: *Context,
1293 is_pub: bool,1300 is_pub: bool,
...@@ -1333,6 +1340,16 @@ fn transCreateNodeVarDecl(...@@ -1333,6 +1340,16 @@ fn transCreateNodeVarDecl(
1333 return node;1340 return node;
1334}1341}
13351342
1343fn transCreateNodeInt(c: *Context, int: var) !*ast.Node {
1344 const token = try appendToken(c, .IntegerLiteral, try std.fmt.allocPrint(c.a(), "{}", .{int}));
1345 const node = try c.a().create(ast.Node.IntegerLiteral);
1346 node.* = ast.Node.IntegerLiteral{
1347 .base = ast.Node{ .id = .IntegerLiteral },
1348 .token = token,
1349 };
1350 return &node.base;
1351}
1352
1336const RestorePoint = struct {1353const RestorePoint = struct {
1337 c: *Context,1354 c: *Context,
1338 token_index: ast.TokenIndex,1355 token_index: ast.TokenIndex,
...@@ -1416,6 +1433,27 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour...@@ -1416,6 +1433,27 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
1416 pointer_node.rhs = try transQualType(rp, child_qt, source_loc);1433 pointer_node.rhs = try transQualType(rp, child_qt, source_loc);
1417 return &pointer_node.base;1434 return &pointer_node.base;
1418 },1435 },
1436 .ConstantArray => {
1437 const const_arr_ty = @ptrCast(*const ZigClangConstantArrayType, ty);
1438
1439 const size_ap_int = ZigClangConstantArrayType_getSize(const_arr_ty);
1440 const size = ZigClangAPInt_getLimitedValue(size_ap_int, std.math.maxInt(usize));
1441 var node = try transCreateNodePrefixOp(
1442 rp.c,
1443 .{
1444 .ArrayType = .{
1445 .len_expr = undefined,
1446 .sentinel = null,
1447 },
1448 },
1449 .LBracket,
1450 "[",
1451 );
1452 node.op.ArrayType.len_expr = try transCreateNodeInt(rp.c, size);
1453 _ = try appendToken(rp.c, .RBracket, "]");
1454 node.rhs = try transQualType(rp, ZigClangConstantArrayType_getElementType(const_arr_ty), source_loc);
1455 return &node.base;
1456 },
1419 else => {1457 else => {
1420 const type_name = rp.c.str(ZigClangType_getTypeClassName(ty));1458 const type_name = rp.c.str(ZigClangType_getTypeClassName(ty));
1421 return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported type: '{}'", .{type_name});1459 return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported type: '{}'", .{type_name});
...@@ -1423,14 +1461,92 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour...@@ -1423,14 +1461,92 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
1423 }1461 }
1424}1462}
14251463
1426fn transApValue(rp: RestorePoint, ap_value: *const ZigClangAPValue, qual_type: ZigClangQualType, source_loc: ZigClangSourceLocation) TransError!*ast.Node {1464fn transApValue(rp: RestorePoint, ap_value: *const ZigClangAPValue, qt: ZigClangQualType, source_loc: ZigClangSourceLocation) TransError!*ast.Node {
1427 return revertAndWarn(1465 switch (ZigClangAPValue_getKind(ap_value)) {
1428 rp,1466 .None => return transCreateNodeUndefinedLiteral(rp.c),
1429 error.UnsupportedTranslation,1467 .Int => return transCreateNodeAPInt(rp.c, ZigClangAPValue_getInt(ap_value)),
1430 source_loc,1468 .Array => {
1431 "TODO implement translation of ap value",1469 // TODO evaluateValue is null for Array init for some reason
1432 .{},1470 // TODO use anon literals once they work properly
1433 );1471 const init_count = ZigClangAPValue_getArrayInitializedElts(ap_value);
1472 const all_count = ZigClangAPValue_getArraySize(ap_value);
1473 const leftover_count = all_count - init_count;
1474 const qt_type = ZigClangQualType_getTypePtr(qt);
1475 const child_qt = ZigClangArrayType_getElementType(ZigClangType_getAsArrayTypeUnsafe(qt_type));
1476
1477 var init_node: *ast.Node.SuffixOp = undefined;
1478 var cat_tok: ast.TokenIndex = undefined;
1479 if (init_count != 0) {
1480 var type_node = try transQualType(rp, qt, source_loc);
1481 init_node = try transCreateNodeArrayInitializer(rp.c, type_node);
1482 var i: c_uint = 0;
1483 while (i < init_count) : (i += 1) {
1484 const elem_ap_val = ZigClangAPValue_getArrayInitializedElt(ap_value, i);
1485 try init_node.op.ArrayInitializer.push(try transApValue(rp, elem_ap_val, child_qt, source_loc));
1486 _ = try appendToken(rp.c, .Comma, ",");
1487 }
1488 init_node.rtoken = try appendToken(rp.c, .RBrace, "}");
1489 if (leftover_count == 0) {
1490 return &init_node.base;
1491 }
1492 cat_tok = try appendToken(rp.c, .PlusPlus, "++");
1493 }
1494
1495 var filler_type_node = try transQualType(rp, qt, source_loc);
1496 var filler_init_node = try transCreateNodeArrayInitializer(rp.c, filler_type_node);
1497 const filler_ap_val = ZigClangAPValue_getArrayFiller(ap_value);
1498 try filler_init_node.op.ArrayInitializer.push(try transApValue(rp, filler_ap_val, child_qt, source_loc));
1499 filler_init_node.rtoken = try appendToken(rp.c, .RBrace, "}");
1500
1501 const rhs_node = if (leftover_count == 1)
1502 &filler_init_node.base
1503 else blk: {
1504 const mul_tok = try appendToken(rp.c, .AsteriskAsterisk, "**");
1505 const mul_node = try rp.c.a().create(ast.Node.InfixOp);
1506 mul_node.* = .{
1507 .base = .{ .id = .InfixOp },
1508 .op_token = mul_tok,
1509 .lhs = &filler_init_node.base,
1510 .op = .ArrayMult,
1511 .rhs = try transCreateNodeInt(rp.c, leftover_count),
1512 };
1513 break :blk &mul_node.base;
1514 };
1515
1516 if (init_count == 0) {
1517 return rhs_node;
1518 }
1519
1520 const cat_node = try rp.c.a().create(ast.Node.InfixOp);
1521 cat_node.* = .{
1522 .base = .{ .id = .InfixOp },
1523 .op_token = cat_tok,
1524 .lhs = &init_node.base,
1525 .op = .ArrayCat,
1526 .rhs = rhs_node,
1527 };
1528 return &cat_node.base;
1529 },
1530 .LValue => {
1531 const lval_base = ZigClangAPValue_getLValueBase(ap_value);
1532 const expr = ZigClangAPValueLValueBase_dyn_cast_Expr(lval_base);
1533 if (expr) |e| {
1534 return (try transExpr(rp, &rp.c.global_scope.base, e, .used, .r_value)).node;
1535 }
1536 try emitWarning(rp.c, source_loc, "TODO handle initializer LValue ValueDecl", .{});
1537 },
1538 .Float => try emitWarning(rp.c, source_loc, "unsupported initializer value kind: Float", .{}),
1539 .ComplexInt => try emitWarning(rp.c, source_loc, "unsupported initializer value kind: ComplexInt", .{}),
1540 .ComplexFloat => try emitWarning(rp.c, source_loc, "Tunsupported initializer value kind: ComplexFloat", .{}),
1541 .Vector => try emitWarning(rp.c, source_loc, "unsupported initializer value kind: Vector", .{}),
1542 .Struct => try emitWarning(rp.c, source_loc, "unsupported initializer value kind: Struct", .{}),
1543 .Union => try emitWarning(rp.c, source_loc, "unsupported initializer value kind: Union", .{}),
1544 .MemberPointer => try emitWarning(rp.c, source_loc, "unsupported initializer value kind: MemberPointer", .{}),
1545 .AddrLabelDiff => try emitWarning(rp.c, source_loc, "unsupported initializer value kind: AddrLabelDiff", .{}),
1546 .Indeterminate => try emitWarning(rp.c, source_loc, "unsupported initializer value kind: Indeterminate", .{}),
1547 .FixedPoint => try emitWarning(rp.c, source_loc, "unsupported initializer value kind: FixedPoint", .{}),
1548 }
1549 return error.UnsupportedTranslation;
1434}1550}
14351551
1436const FnDeclContext = struct {1552const FnDeclContext = struct {