diff --git a/src/ir/emit_llvm.zig b/src/ir/emit_llvm.zig index 3c38940b..197139ba 100644 --- a/src/ir/emit_llvm.zig +++ b/src/ir/emit_llvm.zig @@ -30,7 +30,6 @@ const Global = ir_inst.Global; const ir_module = @import("module.zig"); const Module = ir_module.Module; const interp_mod = @import("interp.zig"); -const Interpreter = interp_mod.Interpreter; const Value = interp_mod.Value; const comptime_vm = @import("comptime_vm.zig"); const build_opts = @import("build_opts"); @@ -933,12 +932,7 @@ pub const LLVMEmitter = struct { if (global.comptime_func) |func_id| { // The comptime VM is the SOLE evaluator (P5.7) — no legacy // fallback. A bail is ALWAYS a build-gating error naming the - // reason. `interp_inst` is a fresh helper context that - // `valueToLLVMConst` uses to materialize the VM's result Value - // (strings / aggregates) — it does NOT evaluate anything. - var interp_inst = Interpreter.init(self.ir_mod, self.alloc); - interp_inst.build_config = &self.build_config; - if (self.import_sources) |sm| interp_inst.setSourceMap(sm); + // reason; its result Value is materialized by `valueToLLVMConst`. sx_trace_clear(); const result = comptime_vm.tryEval(self.alloc, self.ir_mod, func_id, &self.build_config, self.import_sources) orelse { // Surface the bail loudly instead of silently filling the @@ -966,7 +960,7 @@ pub const LLVMEmitter = struct { continue; } } - const init_val = self.valueToLLVMConst(init_value, global.ty, &interp_inst, self.ir_mod.types.getString(global.name)); + const init_val = self.valueToLLVMConst(init_value, global.ty, self.ir_mod.types.getString(global.name)); c.LLVMSetInitializer(llvm_global, init_val); } else if (global.init_val) |iv| { const init_val = switch (iv) { @@ -1091,7 +1085,6 @@ pub const LLVMEmitter = struct { self: *LLVMEmitter, val: Value, ty: TypeId, - interp: *const Interpreter, global_name: []const u8, ) c.LLVMValueRef { const llvm_ty = self.toLLVMType(ty); @@ -1132,7 +1125,7 @@ pub const LLVMEmitter = struct { break :blk self.failGlobalInit(llvm_ty); }, .string => |s| self.emitConstStringGlobal(s), - .aggregate => |fields| self.serializeAggregateValue(fields, ty, interp, global_name), + .aggregate => |fields| self.serializeAggregateValue(fields, ty, global_name), // The remaining Value variants cannot become static binary // constants outside of a fat-pointer aggregate. Bail loudly. // (`heap_ptr` / `byte_ptr` / `int → ptr` are handled inside @@ -1164,7 +1157,6 @@ pub const LLVMEmitter = struct { self: *LLVMEmitter, fields: []const Value, ty: TypeId, - interp: *const Interpreter, global_name: []const u8, ) c.LLVMValueRef { const llvm_ty = self.toLLVMType(ty); @@ -1185,10 +1177,6 @@ pub const LLVMEmitter = struct { const len: usize = @intCast(len_i); const bytes_opt: ?[]const u8 = switch (data) { - .heap_ptr => |hp| blk: { - const mem = interp.heapSlice(hp) orelse break :blk null; - break :blk if (len <= mem.len) mem[0..len] else null; - }, .byte_ptr => |addr| readHostBytes(addr, len), .int => |v| blk: { if (v == 0 and len == 0) break :blk &.{}; // empty slice @@ -1225,7 +1213,7 @@ pub const LLVMEmitter = struct { var field_vals = std.ArrayList(c.LLVMValueRef).empty; defer field_vals.deinit(self.alloc); for (ir_fields, fields) |ir_field, fv| { - field_vals.append(self.alloc, self.valueToLLVMConst(fv, ir_field.ty, interp, global_name)) catch unreachable; + field_vals.append(self.alloc, self.valueToLLVMConst(fv, ir_field.ty, global_name)) catch unreachable; } return c.LLVMConstNamedStruct(llvm_ty, field_vals.items.ptr, @intCast(field_vals.items.len)); } @@ -1235,7 +1223,7 @@ pub const LLVMEmitter = struct { var elem_vals = std.ArrayList(c.LLVMValueRef).empty; defer elem_vals.deinit(self.alloc); for (fields) |fv| { - elem_vals.append(self.alloc, self.valueToLLVMConst(fv, elem_ty, interp, global_name)) catch unreachable; + elem_vals.append(self.alloc, self.valueToLLVMConst(fv, elem_ty, global_name)) catch unreachable; } return c.LLVMConstArray2(llvm_elem_ty, elem_vals.items.ptr, @intCast(elem_vals.items.len)); }