|
|
|
@ -4,8 +4,7 @@ const llvm = @import("../llvm.zig");
|
|
|
|
|
const comp = @import("../comp_ctx.zig");
|
|
|
|
|
const CompileError = @import("../codegen.zig").CompileError;
|
|
|
|
|
|
|
|
|
|
fn sliceify(non_slice: ?[*]const u8) []const u8 {
|
|
|
|
|
if (non_slice == null) return "";
|
|
|
|
|
fn sliceify(non_slice: ?[*:0]const u8) []const u8 {
|
|
|
|
|
return non_slice.?[0..std.mem.len(u8, non_slice.?)];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -126,8 +125,8 @@ pub const Codegen = struct {
|
|
|
|
|
var right = try self.emitExpr(builder, unary.right);
|
|
|
|
|
|
|
|
|
|
return switch (unary.op) {
|
|
|
|
|
.Negate => llvm.LLVMBuildNeg(builder, right, c"neg_tmp"),
|
|
|
|
|
.Not => llvm.LLVMBuildNot(builder, right, c"neg_tmp"),
|
|
|
|
|
.Negate => llvm.LLVMBuildNeg(builder, right, "neg_tmp"),
|
|
|
|
|
.Not => llvm.LLVMBuildNot(builder, right, "neg_tmp"),
|
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
@ -136,13 +135,13 @@ pub const Codegen = struct {
|
|
|
|
|
var right = try self.emitExpr(builder, binary.right);
|
|
|
|
|
|
|
|
|
|
return switch (binary.op) {
|
|
|
|
|
.Add => llvm.LLVMBuildAdd(builder, left, right, c"addtmp"),
|
|
|
|
|
.Sub => llvm.LLVMBuildSub(builder, left, right, c"subtmp"),
|
|
|
|
|
.Mul => llvm.LLVMBuildMul(builder, left, right, c"multmp"),
|
|
|
|
|
.Add => llvm.LLVMBuildAdd(builder, left, right, "addtmp"),
|
|
|
|
|
.Sub => llvm.LLVMBuildSub(builder, left, right, "subtmp"),
|
|
|
|
|
.Mul => llvm.LLVMBuildMul(builder, left, right, "multmp"),
|
|
|
|
|
|
|
|
|
|
//.Div => llvm.LLVMBuildDiv(builder, left, right, c"divtmp"),
|
|
|
|
|
.And => llvm.LLVMBuildAnd(builder, left, right, c"andtmp"),
|
|
|
|
|
.Or => llvm.LLVMBuildOr(builder, left, right, c"ortmp"),
|
|
|
|
|
//.Div => llvm.LLVMBuildDiv(builder, left, right, "divtmp"),
|
|
|
|
|
.And => llvm.LLVMBuildAnd(builder, left, right, "andtmp"),
|
|
|
|
|
.Or => llvm.LLVMBuildOr(builder, left, right, "ortmp"),
|
|
|
|
|
|
|
|
|
|
else => {
|
|
|
|
|
std.debug.warn("Unexpected binary operator: '{}'\n", binary.op);
|
|
|
|
@ -199,7 +198,7 @@ pub const Codegen = struct {
|
|
|
|
|
llvm_func.?.value,
|
|
|
|
|
args_slice.ptr,
|
|
|
|
|
@intCast(c_uint, args_slice.len),
|
|
|
|
|
c"call",
|
|
|
|
|
"call",
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
@ -276,14 +275,14 @@ pub const Codegen = struct {
|
|
|
|
|
.If => |ifstmt| {
|
|
|
|
|
var cond = try self.emitExpr(builder, ifstmt.condition);
|
|
|
|
|
var zero = mkLLVMBool(false);
|
|
|
|
|
var icmp = llvm.LLVMBuildICmp(builder, llvm.LLVMIntPredicate.LLVMIntNE, cond, zero, c"ifcond");
|
|
|
|
|
var icmp = llvm.LLVMBuildICmp(builder, llvm.LLVMIntPredicate.LLVMIntNE, cond, zero, "ifcond");
|
|
|
|
|
|
|
|
|
|
var insert = llvm.LLVMGetInsertBlock(builder);
|
|
|
|
|
var function = llvm.LLVMGetBasicBlockParent(insert);
|
|
|
|
|
|
|
|
|
|
var then_bb = llvm.LLVMAppendBasicBlock(function, c"then");
|
|
|
|
|
var else_bb = llvm.LLVMAppendBasicBlock(function, c"else");
|
|
|
|
|
var merge_bb = llvm.LLVMAppendBasicBlock(function, c"ifcont");
|
|
|
|
|
var then_bb = llvm.LLVMAppendBasicBlock(function, "then");
|
|
|
|
|
var else_bb = llvm.LLVMAppendBasicBlock(function, "else");
|
|
|
|
|
var merge_bb = llvm.LLVMAppendBasicBlock(function, "ifcont");
|
|
|
|
|
|
|
|
|
|
var condbr = llvm.LLVMBuildCondBr(builder, icmp, then_bb, else_bb);
|
|
|
|
|
|
|
|
|
@ -514,7 +513,7 @@ pub const Codegen = struct {
|
|
|
|
|
std.debug.warn("cgen: start gen\n");
|
|
|
|
|
_ = llvm.LLVMInitializeNativeTarget();
|
|
|
|
|
|
|
|
|
|
var mod = llvm.LLVMModuleCreateWithName(c"awoo").?;
|
|
|
|
|
var mod = llvm.LLVMModuleCreateWithName("awoo").?;
|
|
|
|
|
defer llvm.LLVMDisposeModule(mod);
|
|
|
|
|
|
|
|
|
|
var root_slice = root.Root.toSlice();
|
|
|
|
@ -522,15 +521,15 @@ pub const Codegen = struct {
|
|
|
|
|
try self.genNode(mod, &root_slice[idx]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var err: ?[*]u8 = null;
|
|
|
|
|
var err: ?[*:0]u8 = null;
|
|
|
|
|
defer llvm.LLVMDisposeMessage(err);
|
|
|
|
|
|
|
|
|
|
if (llvm.LLVMPrintModuleToFile(mod, c"output.ll", &err) != 0) {
|
|
|
|
|
if (llvm.LLVMPrintModuleToFile(mod, "output.ll", &err) != 0) {
|
|
|
|
|
std.debug.warn("error printing module to file: {}\n", sliceify(err));
|
|
|
|
|
return CompileError.BackendError;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//if (llvm.LLVMWriteBitcodeToFile(mod, c"awoo.bc") != 0) {
|
|
|
|
|
//if (llvm.LLVMWriteBitcodeToFile(mod, "awoo.bc") != 0) {
|
|
|
|
|
// std.debug.warn("error writing bitcode to file: {}\n", sliceify(err));
|
|
|
|
|
// return CompileError.BackendError;
|
|
|
|
|
//}
|
|
|
|
|