Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions interp/interp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ func TestInterp(t *testing.T) {
"store",
"alloc",
"slicedata",
"aggregate",
} {
t.Run(name, func(t *testing.T) {
t.Parallel()
Expand Down
8 changes: 3 additions & 5 deletions interp/interpreter.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
27 changes: 27 additions & 0 deletions interp/testdata/aggregate.ll
Original file line number Diff line number Diff line change
@@ -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 changes: 15 additions & 0 deletions interp/testdata/aggregate.out.ll
Original file line number Diff line number Diff line change
@@ -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
}
Loading