P5.7 Step C2b: drop the Interpreter materialization context from emit_llvm
valueToLLVMConst / serializeAggregateValue took a *const Interpreter only to resolve .heap_ptr data fields via interp.heapSlice — but the VM's regToValue never produces .heap_ptr (it's interp-internal). Drop the param, remove the dead interp_inst in emitGlobals, and drop the .heap_ptr fat-pointer data arm (falls through to the loud bail). Remove the now-unused Interpreter alias. 500/500 unit + 706/0 corpus.
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user