mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-09-01 10:19:01 +00:00
interp: mark pointers in aggregate call operands as external
This commit is contained in:
Vendored
+27
@@ -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
|
||||
}
|
||||
Vendored
+15
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user