interp: mark pointers in aggregate call operands as external

This commit is contained in:
rdon-key
2026-08-13 20:19:07 +09:00
committed by Ron Evans
parent 93bc65479f
commit af429a597b
4 changed files with 46 additions and 5 deletions
+1
View File
@@ -22,6 +22,7 @@ func TestInterp(t *testing.T) {
"store",
"alloc",
"slicedata",
"aggregate",
} {
t.Run(name, func(t *testing.T) {
t.Parallel()
+3 -5
View File
@@ -928,11 +928,9 @@ func (r *runner) runAtRuntime(fn *function, inst instruction, locals []value, me
llvmFn := operands[len(operands)-1]
args := operands[:len(operands)-1]
for _, op := range operands {
if op.Type().TypeKind() == llvm.PointerTypeKind {
err := mem.markExternalStore(op)
if err != nil {
return r.errorAt(inst, err)
}
err := mem.markExternalStore(op)
if err != nil {
return r.errorAt(inst, err)
}
}
result = r.builder.CreateCall(inst.llvmInst.CalledFunctionType(), llvmFn, args, inst.name)
+27
View File
@@ -0,0 +1,27 @@
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64--linux"
declare void @externalAggregate({ ptr })
@main.value = global i32 1
@main.result = global i32 0
define void @runtime.initAll() unnamed_addr {
entry:
call void @main.init(ptr undef)
ret void
}
define internal void @main.init(ptr %context) unnamed_addr {
entry:
; The pointer is hidden inside an aggregate argument.
%arg = insertvalue { ptr } undef, ptr @main.value, 0
; This call runs at runtime and may modify @main.value.
call void @externalAggregate({ ptr } %arg)
; Therefore this load must also remain at runtime.
%value = load i32, ptr @main.value
store i32 %value, ptr @main.result
ret void
}
+15
View File
@@ -0,0 +1,15 @@
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64--linux"
@main.value = global i32 1
@main.result = local_unnamed_addr global i32 0
declare void @externalAggregate({ ptr }) local_unnamed_addr
define void @runtime.initAll() unnamed_addr {
entry:
call void @externalAggregate({ ptr } { ptr @main.value })
%value = load i32, ptr @main.value, align 4
store i32 %value, ptr @main.result, align 4
ret void
}