aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authordrew <reserveblue@protonmail.com>2021-11-14 19:51:36 -0800
committerAndrew Kelley <andrew@ziglang.org>2021-11-16 16:51:31 -0700
commit0300ec4ef70f524718d01f0f351d41349465387c (patch)
tree067eeb003614b6af2b2fd81c7f53a60b2f78456d /src/codegen
parent89793bdfa78badd6e29252e5c10a21233ea9b822 (diff)
downloadzig-0300ec4ef70f524718d01f0f351d41349465387c.tar.gz
zig-0300ec4ef70f524718d01f0f351d41349465387c.zip
fix assumption where all positive big ints are unsigned
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/c.zig31
1 files changed, 22 insertions, 9 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index 5fdc2b1c2a..a82fb42625 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -19,6 +19,7 @@ const Zir = @import("../Zir.zig");
const Liveness = @import("../Liveness.zig");
const Mutability = enum { Const, Mut };
+const BigIntConst = std.math.big.int.Const;
pub const CValue = union(enum) {
none: void,
@@ -226,8 +227,7 @@ pub const DeclGen = struct {
try dg.renderDeclName(decl, writer);
}
- /// Assumes that int_val is an int greater than maxInt(u64) and has > 64 and <= 128 bits.
- fn renderBigInt(
+ fn renderInt128(
writer: anytype,
int_val: anytype,
) error{ OutOfMemory, AnalysisFail }!void {
@@ -256,6 +256,23 @@ pub const DeclGen = struct {
return writer.writeByte(')');
}
+ fn renderBigIntConst(
+ dg: *DeclGen,
+ writer: anytype,
+ val: BigIntConst,
+ signed: bool,
+ ) error{ OutOfMemory, AnalysisFail }!void {
+ if (signed) {
+ try renderInt128(writer, val.to(i128) catch {
+ return dg.fail("TODO implement integer constants larger than 128 bits", .{});
+ });
+ } else {
+ try renderInt128(writer, val.to(u128) catch {
+ return dg.fail("TODO implement integer constants larger than 128 bits", .{});
+ });
+ }
+ }
+
fn renderValue(
dg: *DeclGen,
writer: anytype,
@@ -274,7 +291,7 @@ pub const DeclGen = struct {
16 => return writer.writeAll("0xaaaau"),
32 => return writer.writeAll("0xaaaaaaaau"),
64 => return writer.writeAll("0xaaaaaaaaaaaaaaaau"),
- 128 => return renderBigInt(writer, @as(u128, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),
+ 128 => return renderInt128(writer, @as(u128, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),
else => unreachable,
}
},
@@ -296,12 +313,8 @@ pub const DeclGen = struct {
}
switch (ty.zigTypeTag()) {
.Int => switch (val.tag()) {
- .int_big_positive => try renderBigInt(writer, val.castTag(.int_big_positive).?.asBigInt().to(u128) catch {
- return dg.fail("TODO implement integer constants larger than 128 bits", .{});
- }),
- .int_big_negative => try renderBigInt(writer, val.castTag(.int_big_negative).?.asBigInt().to(i128) catch {
- return dg.fail("TODO implement integer constants larger than 128 bits", .{});
- }),
+ .int_big_positive => try dg.renderBigIntConst(writer, val.castTag(.int_big_positive).?.asBigInt(), ty.isSignedInt()),
+ .int_big_negative => try dg.renderBigIntConst(writer, val.castTag(.int_big_negative).?.asBigInt(), true),
else => {
if (ty.isSignedInt())
return writer.print("{d}", .{val.toSignedInt()});