aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/llvm.zig31
-rw-r--r--src/codegen/llvm/bindings.zig3
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;