Commit 15bcfcd368

Andrew Kelley <andrew@ziglang.org>
2020-08-19 00:11:43
stage2: fix use-after-free when printing ZIR
1 parent 31b58ac
Changed files (2)
src-self-hosted
test
stage2
src-self-hosted/zir.zig
@@ -872,6 +872,8 @@ pub const Module = struct {
     };
 
     pub fn deinit(self: *Module, allocator: *Allocator) void {
+        self.metadata.deinit();
+        self.body_metadata.deinit();
         allocator.free(self.decls);
         self.arena.deinit();
         self.* = undefined;
@@ -1543,8 +1545,8 @@ pub fn emit(allocator: *Allocator, old_module: IrModule) !Module {
         .metadata = std.AutoHashMap(*Inst, Module.MetaData).init(allocator),
         .body_metadata = std.AutoHashMap(*Module.Body, Module.BodyMetaData).init(allocator),
     };
-    defer ctx.metadata.deinit();
-    defer ctx.body_metadata.deinit();
+    errdefer ctx.metadata.deinit();
+    errdefer ctx.body_metadata.deinit();
     defer ctx.block_table.deinit();
     defer ctx.loop_table.deinit();
     defer ctx.decls.deinit(allocator);
test/stage2/zir.zig
@@ -28,7 +28,7 @@ pub fn addCases(ctx: *TestContext) !void {
         \\@unnamed$5 = export(@unnamed$4, "entry")
         \\@unnamed$6 = fntype([], @void, cc=C)
         \\@entry = fn(@unnamed$6, {
-        \\  %0 = returnvoid()
+        \\  %0 = returnvoid() ; deaths=0b1000000000000000
         \\})
         \\
     );
@@ -75,7 +75,7 @@ pub fn addCases(ctx: *TestContext) !void {
         \\@3 = int(3)
         \\@unnamed$6 = fntype([], @void, cc=C)
         \\@entry = fn(@unnamed$6, {
-        \\  %0 = returnvoid()
+        \\  %0 = returnvoid() ; deaths=0b1000000000000000
         \\})
         \\@entry__anon_1 = str("2\x08\x01\n")
         \\@9 = declref("9__anon_0")
@@ -117,18 +117,18 @@ pub fn addCases(ctx: *TestContext) !void {
             \\@unnamed$5 = export(@unnamed$4, "entry")
             \\@unnamed$6 = fntype([], @void, cc=C)
             \\@entry = fn(@unnamed$6, {
-            \\  %0 = call(@a, [], modifier=auto)
-            \\  %1 = returnvoid()
+            \\  %0 = call(@a, [], modifier=auto) ; deaths=0b1000000000000001
+            \\  %1 = returnvoid() ; deaths=0b1000000000000000
             \\})
             \\@unnamed$8 = fntype([], @void, cc=C)
             \\@a = fn(@unnamed$8, {
-            \\  %0 = call(@b, [], modifier=auto)
-            \\  %1 = returnvoid()
+            \\  %0 = call(@b, [], modifier=auto) ; deaths=0b1000000000000001
+            \\  %1 = returnvoid() ; deaths=0b1000000000000000
             \\})
             \\@unnamed$10 = fntype([], @void, cc=C)
             \\@b = fn(@unnamed$10, {
-            \\  %0 = call(@a, [], modifier=auto)
-            \\  %1 = returnvoid()
+            \\  %0 = call(@a, [], modifier=auto) ; deaths=0b1000000000000001
+            \\  %1 = returnvoid() ; deaths=0b1000000000000000
             \\})
             \\
         );
@@ -193,7 +193,7 @@ pub fn addCases(ctx: *TestContext) !void {
             \\@unnamed$5 = export(@unnamed$4, "entry")
             \\@unnamed$6 = fntype([], @void, cc=C)
             \\@entry = fn(@unnamed$6, {
-            \\  %0 = returnvoid()
+            \\  %0 = returnvoid() ; deaths=0b1000000000000000
             \\})
             \\
         );