diff --git a/hello b/hello new file mode 100755 index 0000000..a4b5094 Binary files /dev/null and b/hello differ diff --git a/src/codegen.zig b/src/codegen.zig index 0466d58..e71517e 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -236,11 +236,16 @@ pub const Codegen = struct { return switch (metadata.using) { .Function => blk: { var param = metadata.from_function.?.parameters.get(vari.lexeme).?.value; - // var llvm_func = self.llvm_table.get(self.current_function_name.?).?.value; - // break :blk llvm.LLVMGetParam(llvm_func, @intCast(c_uint, param.idx)); - std.debug.warn("fn param alloca {} {}\n", param.name, param.llvm_alloca); - break :blk param.llvm_alloca.?; + var buf = try self.allocator.alloc(u8, 512); + errdefer self.allocator.free(buf); + + var load_str = try std.fmt.bufPrint(buf, "{}_loaded", param.name); + + var load_cstr = try std.cstr.addNullByte(self.allocator, load_str); + errdefer self.allocator.free(load_cstr); + + break :blk llvm.LLVMBuildLoad(builder, param.llvm_alloca.?, load_cstr.ptr); }, .Scope => @panic("TODO local variables"), @@ -444,8 +449,11 @@ pub const Codegen = struct { std.debug.warn("SET PARAM LLVM ALLOCA {} to {}\n", param_node.name.lexeme, alloca); param.llvm_alloca = alloca; - // TODO store register into stack param - // llvm.LLVMBuildStore(builder, null, assign_expr); + _ = llvm.LLVMBuildStore( + builder, + llvm.LLVMGetParam(func, @intCast(c_uint, idx)), + alloca, + ); } self.ctx.setScope(fn_sym.scope); diff --git a/src/comp_ctx.zig b/src/comp_ctx.zig index a786770..afbe5e4 100644 --- a/src/comp_ctx.zig +++ b/src/comp_ctx.zig @@ -85,7 +85,7 @@ pub const Parameter = struct { llvm_alloca: llvm.LLVMValueRef = null, }; -pub const ParameterMap = std.StringHashMap(Parameter); +pub const ParameterMap = std.StringHashMap(*Parameter); // functions, for our purposes, other than symbols, have: // - a return type @@ -274,11 +274,14 @@ pub const CompilationContext = struct { var param_map = ParameterMap.init(self.allocator); for (decl.params.toSlice()) |param, idx| { - _ = try param_map.put(param.name.lexeme, Parameter{ + var param_sym = try self.allocator.create(Parameter); + + param_sym.* = Parameter{ .name = param.name.lexeme, .idx = idx, .typ = param_types.at(idx), - }); + }; + _ = try param_map.put(param.name.lexeme, param_sym); } const lex = decl.func_name.lexeme;