authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-02-25 16:04:59+01:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-02-25 17:37:27+01:00
loged026b5dffd116d36aa51508e3eefa8c36838c07
treeb782023d9c85c5acf5589a11639f54b5b9f8503f
parent1e1598950aeb20e8f414fdb3993109f05f1b4765

llvm: free llvm data before running llvm optimizations

This reduces the max memory usage.

2 files changed, 50 insertions(+), 4 deletions(-)

src/codegen/llvm.zig+6-4
...@@ -1183,6 +1183,10 @@ pub const Object = struct {...@@ -1183,6 +1183,10 @@ pub const Object = struct {
1183 }1183 }
1184 }1184 }
11851185
1186 const target_triple_sentinel =
1187 try self.gpa.dupeZ(u8, self.builder.target_triple.slice(&self.builder).?);
1188 defer self.gpa.free(target_triple_sentinel);
1189
1186 const emit_asm_msg = options.asm_path orelse "(none)";1190 const emit_asm_msg = options.asm_path orelse "(none)";
1187 const emit_bin_msg = options.bin_path orelse "(none)";1191 const emit_bin_msg = options.bin_path orelse "(none)";
1188 const post_llvm_ir_msg = options.post_ir_path orelse "(none)";1192 const post_llvm_ir_msg = options.post_ir_path orelse "(none)";
...@@ -1202,6 +1206,7 @@ pub const Object = struct {...@@ -1202,6 +1206,7 @@ pub const Object = struct {
12021206
1203 const bitcode = try self.builder.toBitcode(self.gpa);1207 const bitcode = try self.builder.toBitcode(self.gpa);
1204 defer self.gpa.free(bitcode);1208 defer self.gpa.free(bitcode);
1209 self.builder.clearAndFree();
12051210
1206 if (options.pre_bc_path) |path| {1211 if (options.pre_bc_path) |path| {
1207 var file = try std.fs.cwd().createFile(path, .{});1212 var file = try std.fs.cwd().createFile(path, .{});
...@@ -1249,16 +1254,13 @@ pub const Object = struct {...@@ -1249,16 +1254,13 @@ pub const Object = struct {
1249 };1254 };
1250 defer context.dispose();1255 defer context.dispose();
12511256
1252 const target_triple_sentinel =
1253 try self.gpa.dupeZ(u8, self.builder.target_triple.slice(&self.builder).?);
1254 defer self.gpa.free(target_triple_sentinel);
1255 var target: *llvm.Target = undefined;1257 var target: *llvm.Target = undefined;
1256 var error_message: [*:0]const u8 = undefined;1258 var error_message: [*:0]const u8 = undefined;
1257 if (llvm.Target.getFromTriple(target_triple_sentinel, &target, &error_message).toBool()) {1259 if (llvm.Target.getFromTriple(target_triple_sentinel, &target, &error_message).toBool()) {
1258 defer llvm.disposeMessage(error_message);1260 defer llvm.disposeMessage(error_message);
12591261
1260 log.err("LLVM failed to parse '{s}': {s}", .{1262 log.err("LLVM failed to parse '{s}': {s}", .{
1261 self.builder.target_triple.slice(&self.builder).?,1263 target_triple_sentinel,
1262 error_message,1264 error_message,
1263 });1265 });
1264 @panic("Invalid LLVM triple");1266 @panic("Invalid LLVM triple");
src/codegen/llvm/Builder.zig+44
...@@ -8396,6 +8396,50 @@ pub fn init(options: Options) Allocator.Error!Builder {...@@ -8396,6 +8396,50 @@ pub fn init(options: Options) Allocator.Error!Builder {
8396 return self;8396 return self;
8397}8397}
83988398
8399pub fn clearAndFree(self: *Builder) void {
8400 self.module_asm.clearAndFree(self.gpa);
8401
8402 self.string_map.clearAndFree(self.gpa);
8403 self.string_indices.clearAndFree(self.gpa);
8404 self.string_bytes.clearAndFree(self.gpa);
8405
8406 self.types.clearAndFree(self.gpa);
8407 self.next_unique_type_id.clearAndFree(self.gpa);
8408 self.type_map.clearAndFree(self.gpa);
8409 self.type_items.clearAndFree(self.gpa);
8410 self.type_extra.clearAndFree(self.gpa);
8411
8412 self.attributes.clearAndFree(self.gpa);
8413 self.attributes_map.clearAndFree(self.gpa);
8414 self.attributes_indices.clearAndFree(self.gpa);
8415 self.attributes_extra.clearAndFree(self.gpa);
8416
8417 self.function_attributes_set.clearAndFree(self.gpa);
8418
8419 self.globals.clearAndFree(self.gpa);
8420 self.next_unique_global_id.clearAndFree(self.gpa);
8421 self.aliases.clearAndFree(self.gpa);
8422 self.variables.clearAndFree(self.gpa);
8423 for (self.functions.items) |*function| function.deinit(self.gpa);
8424 self.functions.clearAndFree(self.gpa);
8425
8426 self.constant_map.clearAndFree(self.gpa);
8427 self.constant_items.shrinkAndFree(self.gpa, 0);
8428 self.constant_extra.clearAndFree(self.gpa);
8429 self.constant_limbs.clearAndFree(self.gpa);
8430
8431 self.metadata_map.clearAndFree(self.gpa);
8432 self.metadata_items.shrinkAndFree(self.gpa, 0);
8433 self.metadata_extra.clearAndFree(self.gpa);
8434 self.metadata_limbs.clearAndFree(self.gpa);
8435 self.metadata_forward_references.clearAndFree(self.gpa);
8436 self.metadata_named.clearAndFree(self.gpa);
8437
8438 self.metadata_string_map.clearAndFree(self.gpa);
8439 self.metadata_string_indices.clearAndFree(self.gpa);
8440 self.metadata_string_bytes.clearAndFree(self.gpa);
8441}
8442
8399pub fn deinit(self: *Builder) void {8443pub fn deinit(self: *Builder) void {
8400 self.module_asm.deinit(self.gpa);8444 self.module_asm.deinit(self.gpa);
84018445