diff options
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/llvm.zig | 31 | ||||
| -rw-r--r-- | src/codegen/llvm/bindings.zig | 3 |
2 files changed, 32 insertions, 2 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 85a82f4eda..11fc44747e 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -751,8 +751,35 @@ pub const Object = struct { dib.finalize(); } - if (comp.verbose_llvm_ir) { - self.llvm_module.dump(); + if (comp.verbose_llvm_ir) |path| { + if (std.mem.eql(u8, path, "-")) { + self.llvm_module.dump(); + } else { + const path_z = try comp.gpa.dupeZ(u8, path); + defer comp.gpa.free(path_z); + + var error_message: [*:0]const u8 = undefined; + + if (self.llvm_module.printModuleToFile(path_z, &error_message).toBool()) { + defer llvm.disposeMessage(error_message); + + log.err("dump LLVM module failed ir={s}: {s}", .{ + path, error_message, + }); + } + } + } + + if (comp.verbose_llvm_bc) |path| { + const path_z = try comp.gpa.dupeZ(u8, path); + defer comp.gpa.free(path_z); + + const error_code = self.llvm_module.writeBitcodeToFile(path_z); + if (error_code != 0) { + log.err("dump LLVM module failed bc={s}: {d}", .{ + path, error_code, + }); + } } var arena_allocator = std.heap.ArenaAllocator.init(comp.gpa); diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig index e16da29335..c759c7874b 100644 --- a/src/codegen/llvm/bindings.zig +++ b/src/codegen/llvm/bindings.zig @@ -422,6 +422,9 @@ pub const Module = opaque { pub const printModuleToFile = LLVMPrintModuleToFile; extern fn LLVMPrintModuleToFile(M: *Module, Filename: [*:0]const u8, ErrorMessage: *[*:0]const u8) Bool; + + pub const writeBitcodeToFile = LLVMWriteBitcodeToFile; + extern fn LLVMWriteBitcodeToFile(M: *Module, Path: [*:0]const u8) c_int; }; pub const lookupIntrinsicID = LLVMLookupIntrinsicID; |
