Skip to content

Commit af429a5

Browse files
rdon-keydeadprogram
authored andcommitted
interp: mark pointers in aggregate call operands as external
1 parent 93bc654 commit af429a5

4 files changed

Lines changed: 46 additions & 5 deletions

File tree

interp/interp_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ func TestInterp(t *testing.T) {
2222
"store",
2323
"alloc",
2424
"slicedata",
25+
"aggregate",
2526
} {
2627
t.Run(name, func(t *testing.T) {
2728
t.Parallel()

interp/interpreter.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -928,11 +928,9 @@ func (r *runner) runAtRuntime(fn *function, inst instruction, locals []value, me
928928
llvmFn := operands[len(operands)-1]
929929
args := operands[:len(operands)-1]
930930
for _, op := range operands {
931-
if op.Type().TypeKind() == llvm.PointerTypeKind {
932-
err := mem.markExternalStore(op)
933-
if err != nil {
934-
return r.errorAt(inst, err)
935-
}
931+
err := mem.markExternalStore(op)
932+
if err != nil {
933+
return r.errorAt(inst, err)
936934
}
937935
}
938936
result = r.builder.CreateCall(inst.llvmInst.CalledFunctionType(), llvmFn, args, inst.name)

interp/testdata/aggregate.ll

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
2+
target triple = "x86_64--linux"
3+
4+
declare void @externalAggregate({ ptr })
5+
6+
@main.value = global i32 1
7+
@main.result = global i32 0
8+
9+
define void @runtime.initAll() unnamed_addr {
10+
entry:
11+
call void @main.init(ptr undef)
12+
ret void
13+
}
14+
15+
define internal void @main.init(ptr %context) unnamed_addr {
16+
entry:
17+
; The pointer is hidden inside an aggregate argument.
18+
%arg = insertvalue { ptr } undef, ptr @main.value, 0
19+
20+
; This call runs at runtime and may modify @main.value.
21+
call void @externalAggregate({ ptr } %arg)
22+
23+
; Therefore this load must also remain at runtime.
24+
%value = load i32, ptr @main.value
25+
store i32 %value, ptr @main.result
26+
ret void
27+
}

interp/testdata/aggregate.out.ll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
2+
target triple = "x86_64--linux"
3+
4+
@main.value = global i32 1
5+
@main.result = local_unnamed_addr global i32 0
6+
7+
declare void @externalAggregate({ ptr }) local_unnamed_addr
8+
9+
define void @runtime.initAll() unnamed_addr {
10+
entry:
11+
call void @externalAggregate({ ptr } { ptr @main.value })
12+
%value = load i32, ptr @main.value, align 4
13+
store i32 %value, ptr @main.result, align 4
14+
ret void
15+
}

0 commit comments

Comments
 (0)