From 3e1dd93bb2ac7e9d99fb340f1f4ca6868a52cb6b Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Tue, 8 Aug 2023 22:34:24 -0400 Subject: [PATCH] llvm: force strip without libllvm to avoid unimplemented behavior Also fix deinit bugs. --- src/codegen/llvm.zig | 16 +++++++++++----- src/zig_llvm.cpp | 11 ++++++++++- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 3a2846ef8c..9f77f8e8a9 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -823,7 +823,7 @@ pub const Object = struct { var builder = try Builder.init(.{ .allocator = gpa, .use_lib_llvm = options.use_lib_llvm, - .strip = options.strip, + .strip = options.strip or !options.use_lib_llvm, // TODO .name = options.root_name, .target = options.target, .triple = llvm_target_triple, @@ -961,14 +961,17 @@ pub const Object = struct { } pub fn deinit(self: *Object, gpa: Allocator) void { - self.di_map.deinit(gpa); - self.di_type_map.deinit(gpa); - self.target_data.dispose(); - self.target_machine.dispose(); + if (self.builder.useLibLlvm()) { + self.di_map.deinit(gpa); + self.di_type_map.deinit(gpa); + self.target_data.dispose(); + self.target_machine.dispose(); + } self.decl_map.deinit(gpa); self.named_enum_map.deinit(gpa); self.type_map.deinit(gpa); self.extern_collisions.deinit(gpa); + self.builder.deinit(); self.* = undefined; } @@ -1182,6 +1185,9 @@ pub const Object = struct { emit_asm_msg, emit_bin_msg, emit_llvm_ir_msg, emit_llvm_bc_msg, }); + if (emit_asm_path == null and emit_bin_path == null and + emit_llvm_ir_path == null and emit_llvm_bc_path == null) return; + if (!self.builder.useLibLlvm()) { log.err("emitting without libllvm not implemented", .{}); return error.FailedToEmit; diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index 6dd54d3ae4..256d3581df 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -1131,7 +1131,16 @@ void ZigLLVMEraseGlobalValue(LLVMValueRef GlobalVal) { } void ZigLLVMDeleteGlobalValue(LLVMValueRef GlobalVal) { - delete unwrap(GlobalVal); + auto *GV = unwrap(GlobalVal); + assert(GV->getParent() == nullptr); + switch (GV->getValueID()) { +#define HANDLE_GLOBAL_VALUE(NAME) \ + case Value::NAME##Val: \ + delete static_cast(GV); \ + break; +#include + default: llvm_unreachable("Expected global value"); + } } void ZigLLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal) {