| author | |
| committer | |
| log | ed026b5dffd116d36aa51508e3eefa8c36838c07 |
| tree | b782023d9c85c5acf5589a11639f54b5b9f8503f |
| parent | 1e1598950aeb20e8f414fdb3993109f05f1b4765 |
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 | } |
| 1185 | 1185 | ||
| 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 { |
| 1202 | 1206 | ||
| 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(); | ||
| 1205 | 1210 | ||
| 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(); |
| 1251 | 1256 | ||
| 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); |
| 1259 | 1261 | ||
| 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 | } |
| 8398 | 8398 | ||
| 8399 | pub 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 | |||
| 8399 | pub fn deinit(self: *Builder) void { | 8443 | pub fn deinit(self: *Builder) void { |
| 8400 | self.module_asm.deinit(self.gpa); | 8444 | self.module_asm.deinit(self.gpa); |
| 8401 | 8445 |