authorgravatar for reserveblue@protonmail.comdrew <reserveblue@protonmail.com> 2021-11-14 19:51:36-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-11-16 16:51:31-07:00
log0300ec4ef70f524718d01f0f351d41349465387c
tree067eeb003614b6af2b2fd81c7f53a60b2f78456d
parent89793bdfa78badd6e29252e5c10a21233ea9b822

fix assumption where all positive big ints are unsigned


1 files changed, 22 insertions(+), 9 deletions(-)

src/codegen/c.zig+22-9
......@@ -19,6 +19,7 @@ const Zir = @import("../Zir.zig");
1919const Liveness = @import("../Liveness.zig");
2020
2121const Mutability = enum { Const, Mut };
22const BigIntConst = std.math.big.int.Const;
2223
2324pub const CValue = union(enum) {
2425 none: void,
......@@ -226,8 +227,7 @@ pub const DeclGen = struct {
226227 try dg.renderDeclName(decl, writer);
227228 }
228229
229 /// Assumes that int_val is an int greater than maxInt(u64) and has > 64 and <= 128 bits.
230 fn renderBigInt(
230 fn renderInt128(
231231 writer: anytype,
232232 int_val: anytype,
233233 ) error{ OutOfMemory, AnalysisFail }!void {
......@@ -256,6 +256,23 @@ pub const DeclGen = struct {
256256 return writer.writeByte(')');
257257 }
258258
259 fn renderBigIntConst(
260 dg: *DeclGen,
261 writer: anytype,
262 val: BigIntConst,
263 signed: bool,
264 ) error{ OutOfMemory, AnalysisFail }!void {
265 if (signed) {
266 try renderInt128(writer, val.to(i128) catch {
267 return dg.fail("TODO implement integer constants larger than 128 bits", .{});
268 });
269 } else {
270 try renderInt128(writer, val.to(u128) catch {
271 return dg.fail("TODO implement integer constants larger than 128 bits", .{});
272 });
273 }
274 }
275
259276 fn renderValue(
260277 dg: *DeclGen,
261278 writer: anytype,
......@@ -274,7 +291,7 @@ pub const DeclGen = struct {
274291 16 => return writer.writeAll("0xaaaau"),
275292 32 => return writer.writeAll("0xaaaaaaaau"),
276293 64 => return writer.writeAll("0xaaaaaaaaaaaaaaaau"),
277 128 => return renderBigInt(writer, @as(u128, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),
294 128 => return renderInt128(writer, @as(u128, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),
278295 else => unreachable,
279296 }
280297 },
......@@ -296,12 +313,8 @@ pub const DeclGen = struct {
296313 }
297314 switch (ty.zigTypeTag()) {
298315 .Int => switch (val.tag()) {
299 .int_big_positive => try renderBigInt(writer, val.castTag(.int_big_positive).?.asBigInt().to(u128) catch {
300 return dg.fail("TODO implement integer constants larger than 128 bits", .{});
301 }),
302 .int_big_negative => try renderBigInt(writer, val.castTag(.int_big_negative).?.asBigInt().to(i128) catch {
303 return dg.fail("TODO implement integer constants larger than 128 bits", .{});
304 }),
316 .int_big_positive => try dg.renderBigIntConst(writer, val.castTag(.int_big_positive).?.asBigInt(), ty.isSignedInt()),
317 .int_big_negative => try dg.renderBigIntConst(writer, val.castTag(.int_big_negative).?.asBigInt(), true),
305318 else => {
306319 if (ty.isSignedInt())
307320 return writer.print("{d}", .{val.toSignedInt()});