authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-08-08 22:34:24-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-08-08 23:32:40-04:00
log3e1dd93bb2ac7e9d99fb340f1f4ca6868a52cb6b
tree3a67b92da2378f614bc52bf23133bcf22b5a5c4b
parent53bea0f7e44591e741c357297a1f25310d36ca78

llvm: force strip without libllvm to avoid unimplemented behavior

Also fix deinit bugs.

2 files changed, 21 insertions(+), 6 deletions(-)

src/codegen/llvm.zig+11-5
...@@ -823,7 +823,7 @@ pub const Object = struct {...@@ -823,7 +823,7 @@ pub const Object = struct {
823 var builder = try Builder.init(.{823 var builder = try Builder.init(.{
824 .allocator = gpa,824 .allocator = gpa,
825 .use_lib_llvm = options.use_lib_llvm,825 .use_lib_llvm = options.use_lib_llvm,
826 .strip = options.strip,826 .strip = options.strip or !options.use_lib_llvm, // TODO
827 .name = options.root_name,827 .name = options.root_name,
828 .target = options.target,828 .target = options.target,
829 .triple = llvm_target_triple,829 .triple = llvm_target_triple,
...@@ -961,14 +961,17 @@ pub const Object = struct {...@@ -961,14 +961,17 @@ pub const Object = struct {
961 }961 }
962962
963 pub fn deinit(self: *Object, gpa: Allocator) void {963 pub fn deinit(self: *Object, gpa: Allocator) void {
964 self.di_map.deinit(gpa);964 if (self.builder.useLibLlvm()) {
965 self.di_type_map.deinit(gpa);965 self.di_map.deinit(gpa);
966 self.target_data.dispose();966 self.di_type_map.deinit(gpa);
967 self.target_machine.dispose();967 self.target_data.dispose();
968 self.target_machine.dispose();
969 }
968 self.decl_map.deinit(gpa);970 self.decl_map.deinit(gpa);
969 self.named_enum_map.deinit(gpa);971 self.named_enum_map.deinit(gpa);
970 self.type_map.deinit(gpa);972 self.type_map.deinit(gpa);
971 self.extern_collisions.deinit(gpa);973 self.extern_collisions.deinit(gpa);
974 self.builder.deinit();
972 self.* = undefined;975 self.* = undefined;
973 }976 }
974977
...@@ -1182,6 +1185,9 @@ pub const Object = struct {...@@ -1182,6 +1185,9 @@ pub const Object = struct {
1182 emit_asm_msg, emit_bin_msg, emit_llvm_ir_msg, emit_llvm_bc_msg,1185 emit_asm_msg, emit_bin_msg, emit_llvm_ir_msg, emit_llvm_bc_msg,
1183 });1186 });
11841187
1188 if (emit_asm_path == null and emit_bin_path == null and
1189 emit_llvm_ir_path == null and emit_llvm_bc_path == null) return;
1190
1185 if (!self.builder.useLibLlvm()) {1191 if (!self.builder.useLibLlvm()) {
1186 log.err("emitting without libllvm not implemented", .{});1192 log.err("emitting without libllvm not implemented", .{});
1187 return error.FailedToEmit;1193 return error.FailedToEmit;
src/zig_llvm.cpp+10-1
...@@ -1131,7 +1131,16 @@ void ZigLLVMEraseGlobalValue(LLVMValueRef GlobalVal) {...@@ -1131,7 +1131,16 @@ void ZigLLVMEraseGlobalValue(LLVMValueRef GlobalVal) {
1131}1131}
11321132
1133void ZigLLVMDeleteGlobalValue(LLVMValueRef GlobalVal) {1133void ZigLLVMDeleteGlobalValue(LLVMValueRef GlobalVal) {
1134 delete unwrap<GlobalVariable>(GlobalVal);1134 auto *GV = unwrap<GlobalValue>(GlobalVal);
1135 assert(GV->getParent() == nullptr);
1136 switch (GV->getValueID()) {
1137#define HANDLE_GLOBAL_VALUE(NAME) \
1138 case Value::NAME##Val: \
1139 delete static_cast<NAME *>(GV); \
1140 break;
1141#include <llvm/IR/Value.def>
1142 default: llvm_unreachable("Expected global value");
1143 }
1135}1144}
11361145
1137void ZigLLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal) {1146void ZigLLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal) {