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 {
11831183 }
11841184 }
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
11861190 const emit_asm_msg = options.asm_path orelse "(none)";
11871191 const emit_bin_msg = options.bin_path orelse "(none)";
11881192 const post_llvm_ir_msg = options.post_ir_path orelse "(none)";
......@@ -1202,6 +1206,7 @@ pub const Object = struct {
12021206
12031207 const bitcode = try self.builder.toBitcode(self.gpa);
12041208 defer self.gpa.free(bitcode);
1209 self.builder.clearAndFree();
12051210
12061211 if (options.pre_bc_path) |path| {
12071212 var file = try std.fs.cwd().createFile(path, .{});
......@@ -1249,16 +1254,13 @@ pub const Object = struct {
12491254 };
12501255 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);
12551257 var target: *llvm.Target = undefined;
12561258 var error_message: [*:0]const u8 = undefined;
12571259 if (llvm.Target.getFromTriple(target_triple_sentinel, &target, &error_message).toBool()) {
12581260 defer llvm.disposeMessage(error_message);
12591261
12601262 log.err("LLVM failed to parse '{s}': {s}", .{
1261 self.builder.target_triple.slice(&self.builder).?,
1263 target_triple_sentinel,
12621264 error_message,
12631265 });
12641266 @panic("Invalid LLVM triple");
src/codegen/llvm/Builder.zig+44
......@@ -8396,6 +8396,50 @@ pub fn init(options: Options) Allocator.Error!Builder {
83968396 return self;
83978397}
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
83998443pub fn deinit(self: *Builder) void {
84008444 self.module_asm.deinit(self.gpa);
84018445