diff --git a/.gitignore b/.gitignore index 3cef7be..900a841 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ zig-cache/ +*.bc +*.ll diff --git a/build.zig b/build.zig index d7502d4..020f6cf 100644 --- a/build.zig +++ b/build.zig @@ -6,7 +6,9 @@ pub fn build(b: *Builder) void { exe.setBuildMode(mode); exe.install(); + exe.linkSystemLibrary("c"); exe.linkSystemLibrary("LLVM-8"); + exe.linkSystemLibrary("stdc++"); const run_cmd = exe.run(); run_cmd.step.dependOn(b.getInstallStep()); diff --git a/src/codegen.zig b/src/codegen.zig index 3e5661c..37e39ac 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -62,18 +62,18 @@ pub const Codegen = struct { } pub fn gen(self: *Codegen, root: *ast.Node) !void { + //std.debug.warn("cgen: init native target\n"); + //_ = llvm.LLVMInitializeNativeTarget(); std.debug.warn("cgen: start gen\n"); - var mod = llvm.LLVMModuleCreateWithName(c"awoo"); + + var mod = llvm.LLVMModuleCreateWithName(c"awoo").?; defer llvm.LLVMDisposeModule(mod); - std.debug.warn("cgen: got mod\n"); for (root.Root.toSlice()) |child| { std.debug.warn("cgen: gen child {}\n", child); try self.genNode(mod, &child); } - std.debug.warn("cgen: done\n"); - var err: ?[*]u8 = null; _ = llvm.LLVMVerifyModule( mod, @@ -81,5 +81,9 @@ pub const Codegen = struct { &err, ); llvm.LLVMDisposeMessage(err); + + if (llvm.LLVMWriteBitcodeToFile(mod, c"awoo.bc") != 0) { + std.debug.warn("error writing bitcode to file\n"); + } } }; diff --git a/src/llvm.zig b/src/llvm.zig index 8e79786..f849857 100644 --- a/src/llvm.zig +++ b/src/llvm.zig @@ -6,6 +6,11 @@ pub const llvm = @cImport({ @cInclude("llvm-c/Target.h"); @cInclude("llvm-c/Analysis.h"); @cInclude("llvm-c/BitWriter.h"); + + @cDefine("_GNU_SOURCE", {}); + @cDefine("__STDC_CONSTANT_MACROS", {}); + @cDefine("__STDC_FORMAT_MACROS", {}); + @cDefine("__STDC_LIMIT_MACROS", {}); }); usingnamespace llvm;