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();
7676pub const struct_ZigClangPredefinedExpr = @OpaqueType();
7777pub const struct_ZigClangInitListExpr = @OpaqueType();
7878pub const ZigClangPreprocessingRecord = @OpaqueType();
79pub const ZigClangFloatingLiteral = @OpaqueType();
7980
8081pub const ZigClangBO = extern enum {
8182 PtrMemD,
......@@ -1051,3 +1052,6 @@ pub extern fn ZigClangForStmt_getInit(*const ZigClangForStmt) ?*const ZigClangSt
10511052pub extern fn ZigClangForStmt_getCond(*const ZigClangForStmt) ?*const ZigClangExpr;
10521053pub extern fn ZigClangForStmt_getInc(*const ZigClangForStmt) ?*const ZigClangExpr;
10531054pub 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(
632632 .ContinueStmtClass => return try transCreateNodeContinue(rp.c),
633633 .BreakStmtClass => return transBreak(rp, scope),
634634 .ForStmtClass => return transForLoop(rp, scope, @ptrCast(*const ZigClangForStmt, stmt)),
635 .FloatingLiteralClass => return transFloatingLiteral(rp, scope, @ptrCast(*const ZigClangFloatingLiteral, stmt), result_used),
635636 else => {
636637 return revertAndWarn(
637638 rp,
......@@ -896,16 +897,11 @@ fn transImplicitCastExpr(
896897 const sub_expr = ZigClangImplicitCastExpr_getSubExpr(expr);
897898 const sub_expr_node = try transExpr(rp, scope, @ptrCast(*const ZigClangExpr, sub_expr), .used, .r_value);
898899 switch (ZigClangImplicitCastExpr_getCastKind(expr)) {
899 .BitCast => {
900 .BitCast, .FloatingCast, .FloatingToIntegral, .IntegralToFloating, .IntegralCast => {
900901 const dest_type = getExprQualType(c, @ptrCast(*const ZigClangExpr, expr));
901902 const src_type = getExprQualType(c, sub_expr);
902903 return transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node);
903904 },
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 },
909905 .FunctionToPointerDecay, .ArrayToPointerDecay => {
910906 return maybeSuppressResult(rp, scope, result_used, sub_expr_node);
911907 },
......@@ -1057,6 +1053,30 @@ fn transCCast(
10571053 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");
10581054 return &builtin_node.base;
10591055 }
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 }
10601080 // TODO: maybe widen to increase size
10611081 // TODO: maybe bitcast to change sign
10621082 // TODO: maybe truncate to reduce size
......@@ -1399,6 +1419,16 @@ fn transBreak(rp: RestorePoint, scope: *Scope) TransError!*ast.Node {
13991419 return &br.base;
14001420}
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
14021432fn maybeSuppressResult(
14031433 rp: RestorePoint,
14041434 scope: *Scope,
......@@ -1770,6 +1800,20 @@ fn cIsUnsignedInteger(qt: ZigClangQualType) bool {
17701800 };
17711801}
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
17731817fn transCreateNodeAssign(
17741818 rp: RestorePoint,
17751819 scope: *Scope,
......@@ -1964,7 +2008,7 @@ fn transCreateNodeAPInt(c: *Context, int: ?*const ZigClangAPSInt) !*ast.Node {
19642008 };
19652009 const token = try appendToken(c, .IntegerLiteral, str);
19662010 const node = try c.a().create(ast.Node.IntegerLiteral);
1967 node.* = ast.Node.IntegerLiteral{
2011 node.* = .{
19682012 .token = token,
19692013 };
19702014 return &node.base;
......@@ -2027,7 +2071,7 @@ fn transCreateNodeArrayInitializer(c: *Context, dot_tok: ast.TokenIndex) !*ast.N
20272071fn transCreateNodeInt(c: *Context, int: var) !*ast.Node {
20282072 const token = try appendTokenFmt(c, .IntegerLiteral, "{}", .{int});
20292073 const node = try c.a().create(ast.Node.IntegerLiteral);
2030 node.* = ast.Node.IntegerLiteral{
2074 node.* = .{
20312075 .token = token,
20322076 };
20332077 return &node.base;
src/zig_clang.cpp+5
......@@ -2161,6 +2161,11 @@ unsigned ZigClangAPFloat_convertToHexString(const ZigClangAPFloat *self, char *D
21612161 return casted->convertToHexString(DST, HexDigits, UpperCase, (llvm::APFloat::roundingMode)RM);
21622162}
21632163
2164double ZigClangAPFloat_getValueAsApproximateDouble(const ZigClangFloatingLiteral *self) {
2165 auto casted = reinterpret_cast<const clang::FloatingLiteral *>(self);
2166 return casted->getValueAsApproximateDouble();
2167}
2168
21642169enum ZigClangStringLiteral_StringKind ZigClangStringLiteral_getKind(const struct ZigClangStringLiteral *self) {
21652170 auto casted = reinterpret_cast<const clang::StringLiteral *>(self);
21662171 return (ZigClangStringLiteral_StringKind)casted->getKind();
src/zig_clang.h+1
......@@ -985,6 +985,7 @@ ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangDeclStmt_getBeginLoc(const st
985985
986986ZIG_EXTERN_C unsigned ZigClangAPFloat_convertToHexString(const struct ZigClangAPFloat *self, char *DST,
987987 unsigned HexDigits, bool UpperCase, enum ZigClangAPFloat_roundingMode RM);
988ZIG_EXTERN_C double ZigClangAPFloat_getValueAsApproximateDouble(const ZigClangFloatingLiteral *self);
988989
989990ZIG_EXTERN_C enum ZigClangStringLiteral_StringKind ZigClangStringLiteral_getKind(const struct ZigClangStringLiteral *self);
990991ZIG_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 {
825825 \\pub export var _anyerror: c_uint = @as(c_uint, 2);
826826 });
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
828840 /////////////// Cases for only stage1 which are TODO items for stage2 ////////////////
829841
830842 if (builtin.os != builtin.Os.windows) {