authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-17 11:15:41+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-17 11:28:56+02:00
logdaa22d42b0cdb8ccf04625ea921f3e71b647b68c
tree3fd9d659ca39049b65e322c1fc7faa109693878e
parent9cda93a24e3f4eaae63f3a7a8da99e91f47222fa
signature Commit is signed but in an unrecognized format.

translate-c-2 floats


5 files changed, 74 insertions(+), 8 deletions(-)

src-self-hosted/clang.zig+4
...@@ -76,6 +76,7 @@ pub const struct_ZigClangFunctionType = @OpaqueType();...@@ -76,6 +76,7 @@ pub const struct_ZigClangFunctionType = @OpaqueType();
76pub const struct_ZigClangPredefinedExpr = @OpaqueType();76pub const struct_ZigClangPredefinedExpr = @OpaqueType();
77pub const struct_ZigClangInitListExpr = @OpaqueType();77pub const struct_ZigClangInitListExpr = @OpaqueType();
78pub const ZigClangPreprocessingRecord = @OpaqueType();78pub const ZigClangPreprocessingRecord = @OpaqueType();
79pub const ZigClangFloatingLiteral = @OpaqueType();
7980
80pub const ZigClangBO = extern enum {81pub const ZigClangBO = extern enum {
81 PtrMemD,82 PtrMemD,
...@@ -1051,3 +1052,6 @@ pub extern fn ZigClangForStmt_getInit(*const ZigClangForStmt) ?*const ZigClangSt...@@ -1051,3 +1052,6 @@ pub extern fn ZigClangForStmt_getInit(*const ZigClangForStmt) ?*const ZigClangSt
1051pub extern fn ZigClangForStmt_getCond(*const ZigClangForStmt) ?*const ZigClangExpr;1052pub extern fn ZigClangForStmt_getCond(*const ZigClangForStmt) ?*const ZigClangExpr;
1052pub extern fn ZigClangForStmt_getInc(*const ZigClangForStmt) ?*const ZigClangExpr;1053pub extern fn ZigClangForStmt_getInc(*const ZigClangForStmt) ?*const ZigClangExpr;
1053pub extern fn ZigClangForStmt_getBody(*const ZigClangForStmt) *const ZigClangStmt;1054pub extern fn ZigClangForStmt_getBody(*const ZigClangForStmt) *const ZigClangStmt;
1055
1056pub extern fn ZigClangAPFloat_toString(self: *const ZigClangAPFloat, precision: c_uint, maxPadding: c_uint, truncateZero: bool) [*:0]const u8;
1057pub extern fn ZigClangAPFloat_getValueAsApproximateDouble(*const ZigClangFloatingLiteral) f64;
src-self-hosted/translate_c.zig+52-8
...@@ -632,6 +632,7 @@ fn transStmt(...@@ -632,6 +632,7 @@ fn transStmt(
632 .ContinueStmtClass => return try transCreateNodeContinue(rp.c),632 .ContinueStmtClass => return try transCreateNodeContinue(rp.c),
633 .BreakStmtClass => return transBreak(rp, scope),633 .BreakStmtClass => return transBreak(rp, scope),
634 .ForStmtClass => return transForLoop(rp, scope, @ptrCast(*const ZigClangForStmt, stmt)),634 .ForStmtClass => return transForLoop(rp, scope, @ptrCast(*const ZigClangForStmt, stmt)),
635 .FloatingLiteralClass => return transFloatingLiteral(rp, scope, @ptrCast(*const ZigClangFloatingLiteral, stmt), result_used),
635 else => {636 else => {
636 return revertAndWarn(637 return revertAndWarn(
637 rp,638 rp,
...@@ -896,16 +897,11 @@ fn transImplicitCastExpr(...@@ -896,16 +897,11 @@ fn transImplicitCastExpr(
896 const sub_expr = ZigClangImplicitCastExpr_getSubExpr(expr);897 const sub_expr = ZigClangImplicitCastExpr_getSubExpr(expr);
897 const sub_expr_node = try transExpr(rp, scope, @ptrCast(*const ZigClangExpr, sub_expr), .used, .r_value);898 const sub_expr_node = try transExpr(rp, scope, @ptrCast(*const ZigClangExpr, sub_expr), .used, .r_value);
898 switch (ZigClangImplicitCastExpr_getCastKind(expr)) {899 switch (ZigClangImplicitCastExpr_getCastKind(expr)) {
899 .BitCast => {900 .BitCast, .FloatingCast, .FloatingToIntegral, .IntegralToFloating, .IntegralCast => {
900 const dest_type = getExprQualType(c, @ptrCast(*const ZigClangExpr, expr));901 const dest_type = getExprQualType(c, @ptrCast(*const ZigClangExpr, expr));
901 const src_type = getExprQualType(c, sub_expr);902 const src_type = getExprQualType(c, sub_expr);
902 return transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node);903 return transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node);
903 },904 },
904 .IntegralCast => {
905 const dest_type = ZigClangExpr_getType(@ptrCast(*const ZigClangExpr, expr));
906 const src_type = ZigClangExpr_getType(sub_expr);
907 return transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node);
908 },
909 .FunctionToPointerDecay, .ArrayToPointerDecay => {905 .FunctionToPointerDecay, .ArrayToPointerDecay => {
910 return maybeSuppressResult(rp, scope, result_used, sub_expr_node);906 return maybeSuppressResult(rp, scope, result_used, sub_expr_node);
911 },907 },
...@@ -1057,6 +1053,30 @@ fn transCCast(...@@ -1057,6 +1053,30 @@ fn transCCast(
1057 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");1053 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");
1058 return &builtin_node.base;1054 return &builtin_node.base;
1059 }1055 }
1056 if (cIsFloating(src_type) and cIsFloating(dst_type)) {
1057 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@floatCast");
1058 try builtin_node.params.push(try transQualType(rp, dst_type, loc));
1059 _ = try appendToken(rp.c, .Comma, ",");
1060 try builtin_node.params.push(expr);
1061 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");
1062 return &builtin_node.base;
1063 }
1064 if (cIsFloating(src_type) and !cIsFloating(dst_type)) {
1065 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@floatToInt");
1066 try builtin_node.params.push(try transQualType(rp, dst_type, loc));
1067 _ = try appendToken(rp.c, .Comma, ",");
1068 try builtin_node.params.push(expr);
1069 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");
1070 return &builtin_node.base;
1071 }
1072 if (!cIsFloating(src_type) and cIsFloating(dst_type)) {
1073 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@intToFloat");
1074 try builtin_node.params.push(try transQualType(rp, dst_type, loc));
1075 _ = try appendToken(rp.c, .Comma, ",");
1076 try builtin_node.params.push(expr);
1077 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");
1078 return &builtin_node.base;
1079 }
1060 // TODO: maybe widen to increase size1080 // TODO: maybe widen to increase size
1061 // TODO: maybe bitcast to change sign1081 // TODO: maybe bitcast to change sign
1062 // TODO: maybe truncate to reduce size1082 // TODO: maybe truncate to reduce size
...@@ -1399,6 +1419,16 @@ fn transBreak(rp: RestorePoint, scope: *Scope) TransError!*ast.Node {...@@ -1399,6 +1419,16 @@ fn transBreak(rp: RestorePoint, scope: *Scope) TransError!*ast.Node {
1399 return &br.base;1419 return &br.base;
1400}1420}
14011421
1422fn transFloatingLiteral(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangFloatingLiteral, used: ResultUsed) TransError!*ast.Node {
1423 // TODO use something more accurate
1424 const dbl = ZigClangAPFloat_getValueAsApproximateDouble(stmt);
1425 const node = try rp.c.a().create(ast.Node.FloatLiteral);
1426 node.* = .{
1427 .token = try appendTokenFmt(rp.c, .FloatLiteral, "{d}", .{dbl}),
1428 };
1429 return maybeSuppressResult(rp, scope, used, &node.base);
1430}
1431
1402fn maybeSuppressResult(1432fn maybeSuppressResult(
1403 rp: RestorePoint,1433 rp: RestorePoint,
1404 scope: *Scope,1434 scope: *Scope,
...@@ -1770,6 +1800,20 @@ fn cIsUnsignedInteger(qt: ZigClangQualType) bool {...@@ -1770,6 +1800,20 @@ fn cIsUnsignedInteger(qt: ZigClangQualType) bool {
1770 };1800 };
1771}1801}
17721802
1803fn cIsFloating(qt: ZigClangQualType) bool {
1804 const c_type = qualTypeCanon(qt);
1805 if (ZigClangType_getTypeClass(c_type) != .Builtin) return false;
1806 const builtin_ty = @ptrCast(*const ZigClangBuiltinType, c_type);
1807 return switch (ZigClangBuiltinType_getKind(builtin_ty)) {
1808 .Float,
1809 .Double,
1810 .Float128,
1811 .LongDouble,
1812 => true,
1813 else => false,
1814 };
1815}
1816
1773fn transCreateNodeAssign(1817fn transCreateNodeAssign(
1774 rp: RestorePoint,1818 rp: RestorePoint,
1775 scope: *Scope,1819 scope: *Scope,
...@@ -1964,7 +2008,7 @@ fn transCreateNodeAPInt(c: *Context, int: ?*const ZigClangAPSInt) !*ast.Node {...@@ -1964,7 +2008,7 @@ fn transCreateNodeAPInt(c: *Context, int: ?*const ZigClangAPSInt) !*ast.Node {
1964 };2008 };
1965 const token = try appendToken(c, .IntegerLiteral, str);2009 const token = try appendToken(c, .IntegerLiteral, str);
1966 const node = try c.a().create(ast.Node.IntegerLiteral);2010 const node = try c.a().create(ast.Node.IntegerLiteral);
1967 node.* = ast.Node.IntegerLiteral{2011 node.* = .{
1968 .token = token,2012 .token = token,
1969 };2013 };
1970 return &node.base;2014 return &node.base;
...@@ -2027,7 +2071,7 @@ fn transCreateNodeArrayInitializer(c: *Context, dot_tok: ast.TokenIndex) !*ast.N...@@ -2027,7 +2071,7 @@ fn transCreateNodeArrayInitializer(c: *Context, dot_tok: ast.TokenIndex) !*ast.N
2027fn transCreateNodeInt(c: *Context, int: var) !*ast.Node {2071fn transCreateNodeInt(c: *Context, int: var) !*ast.Node {
2028 const token = try appendTokenFmt(c, .IntegerLiteral, "{}", .{int});2072 const token = try appendTokenFmt(c, .IntegerLiteral, "{}", .{int});
2029 const node = try c.a().create(ast.Node.IntegerLiteral);2073 const node = try c.a().create(ast.Node.IntegerLiteral);
2030 node.* = ast.Node.IntegerLiteral{2074 node.* = .{
2031 .token = token,2075 .token = token,
2032 };2076 };
2033 return &node.base;2077 return &node.base;
src/zig_clang.cpp+5
...@@ -2161,6 +2161,11 @@ unsigned ZigClangAPFloat_convertToHexString(const ZigClangAPFloat *self, char *D...@@ -2161,6 +2161,11 @@ unsigned ZigClangAPFloat_convertToHexString(const ZigClangAPFloat *self, char *D
2161 return casted->convertToHexString(DST, HexDigits, UpperCase, (llvm::APFloat::roundingMode)RM);2161 return casted->convertToHexString(DST, HexDigits, UpperCase, (llvm::APFloat::roundingMode)RM);
2162}2162}
21632163
2164double ZigClangAPFloat_getValueAsApproximateDouble(const ZigClangFloatingLiteral *self) {
2165 auto casted = reinterpret_cast<const clang::FloatingLiteral *>(self);
2166 return casted->getValueAsApproximateDouble();
2167}
2168
2164enum ZigClangStringLiteral_StringKind ZigClangStringLiteral_getKind(const struct ZigClangStringLiteral *self) {2169enum ZigClangStringLiteral_StringKind ZigClangStringLiteral_getKind(const struct ZigClangStringLiteral *self) {
2165 auto casted = reinterpret_cast<const clang::StringLiteral *>(self);2170 auto casted = reinterpret_cast<const clang::StringLiteral *>(self);
2166 return (ZigClangStringLiteral_StringKind)casted->getKind();2171 return (ZigClangStringLiteral_StringKind)casted->getKind();
src/zig_clang.h+1
...@@ -985,6 +985,7 @@ ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangDeclStmt_getBeginLoc(const st...@@ -985,6 +985,7 @@ ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangDeclStmt_getBeginLoc(const st
985985
986ZIG_EXTERN_C unsigned ZigClangAPFloat_convertToHexString(const struct ZigClangAPFloat *self, char *DST,986ZIG_EXTERN_C unsigned ZigClangAPFloat_convertToHexString(const struct ZigClangAPFloat *self, char *DST,
987 unsigned HexDigits, bool UpperCase, enum ZigClangAPFloat_roundingMode RM);987 unsigned HexDigits, bool UpperCase, enum ZigClangAPFloat_roundingMode RM);
988ZIG_EXTERN_C double ZigClangAPFloat_getValueAsApproximateDouble(const ZigClangFloatingLiteral *self);
988989
989ZIG_EXTERN_C enum ZigClangStringLiteral_StringKind ZigClangStringLiteral_getKind(const struct ZigClangStringLiteral *self);990ZIG_EXTERN_C enum ZigClangStringLiteral_StringKind ZigClangStringLiteral_getKind(const struct ZigClangStringLiteral *self);
990ZIG_EXTERN_C const char *ZigClangStringLiteral_getString_bytes_begin_size(const struct ZigClangStringLiteral *self,991ZIG_EXTERN_C const char *ZigClangStringLiteral_getString_bytes_begin_size(const struct ZigClangStringLiteral *self,
test/translate_c.zig+12
...@@ -825,6 +825,18 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -825,6 +825,18 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
825 \\pub export var _anyerror: c_uint = @as(c_uint, 2);825 \\pub export var _anyerror: c_uint = @as(c_uint, 2);
826 });826 });
827827
828 cases.add_2("floats",
829 \\float a = 3.1415;
830 \\double b = 3.1415;
831 \\int c = 3.1415;
832 \\double d = 3;
833 , &[_][]const u8{
834 \\pub export var a: f32 = @floatCast(f32, 3.1415);
835 \\pub export var b: f64 = 3.1415;
836 \\pub export var c: c_int = @floatToInt(c_int, 3.1415);
837 \\pub export var d: f64 = @intToFloat(f64, 3);
838 });
839
828 /////////////// Cases for only stage1 which are TODO items for stage2 ////////////////840 /////////////// Cases for only stage1 which are TODO items for stage2 ////////////////
829841
830 if (builtin.os != builtin.Os.windows) {842 if (builtin.os != builtin.Os.windows) {