mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-09-11 15:09:32 +00:00
runtime: precisely scan Wasm globals
This commit is contained in:
Vendored
+12
@@ -0,0 +1,12 @@
|
||||
target datalayout = "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8:16-a:8"
|
||||
target triple = "avr-unknown-unknown"
|
||||
|
||||
%entry = type { i8, ptr }
|
||||
|
||||
@table = global [4 x %entry] zeroinitializer
|
||||
|
||||
declare i16 @runtime.gcGlobalRootCount()
|
||||
|
||||
declare ptr @runtime.gcGlobalRoot(i16)
|
||||
|
||||
declare i16 @runtime.gcGlobalRootSize(i16)
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
target datalayout = "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8:16-a:8"
|
||||
target triple = "avr-unknown-unknown"
|
||||
|
||||
%entry = type { i8, ptr }
|
||||
|
||||
@table = global [4 x %entry] zeroinitializer
|
||||
@runtime.gcGlobalRoots = internal constant [4 x { ptr, i16 }] [{ ptr, i16 } { ptr getelementptr (i8, ptr @table, i16 1), i16 2 }, { ptr, i16 } { ptr getelementptr (i8, ptr @table, i16 4), i16 2 }, { ptr, i16 } { ptr getelementptr (i8, ptr @table, i16 7), i16 2 }, { ptr, i16 } { ptr getelementptr (i8, ptr @table, i16 10), i16 2 }]
|
||||
|
||||
define i16 @runtime.gcGlobalRootCount() addrspace(1) {
|
||||
entry:
|
||||
ret i16 4
|
||||
}
|
||||
|
||||
define ptr @runtime.gcGlobalRoot(i16 %0) addrspace(1) {
|
||||
entry:
|
||||
%1 = getelementptr inbounds [4 x { ptr, i16 }], ptr @runtime.gcGlobalRoots, i32 0, i16 %0
|
||||
%2 = getelementptr inbounds nuw { ptr, i16 }, ptr %1, i32 0, i32 0
|
||||
%3 = load ptr, ptr %2, align 1
|
||||
ret ptr %3
|
||||
}
|
||||
|
||||
define i16 @runtime.gcGlobalRootSize(i16 %0) addrspace(1) {
|
||||
entry:
|
||||
%1 = getelementptr inbounds [4 x { ptr, i16 }], ptr @runtime.gcGlobalRoots, i32 0, i16 %0
|
||||
%2 = getelementptr inbounds nuw { ptr, i16 }, ptr %1, i32 0, i32 1
|
||||
%3 = load i16, ptr %2, align 1
|
||||
ret i16 %3
|
||||
}
|
||||
Vendored
+11
@@ -5,11 +5,22 @@ target triple = "wasm32-unknown-unknown-wasm"
|
||||
@someGlobal = global i8 3
|
||||
@ptrGlobal = global ptr null
|
||||
@arrGlobal = global [8 x i8] zeroinitializer
|
||||
@structGlobal = global {ptr, i32, [2 x ptr]} zeroinitializer
|
||||
@ptrArrayGlobal = global [8 x ptr] zeroinitializer
|
||||
@constantPtrGlobal = constant ptr @someGlobal
|
||||
|
||||
declare void @runtime.trackPointer(ptr nocapture readonly)
|
||||
|
||||
declare noalias nonnull ptr @runtime.alloc(i32, ptr)
|
||||
|
||||
declare i32 @runtime.gcGlobalRootCount()
|
||||
|
||||
declare ptr @runtime.gcGlobalRoot(i32)
|
||||
|
||||
declare i32 @runtime.gcGlobalRootSize(i32)
|
||||
|
||||
declare ptr @runtime.gcGlobalRootValues()
|
||||
|
||||
; Generic function that returns a pointer (that must be tracked).
|
||||
define ptr @getPointer() {
|
||||
ret ptr @someGlobal
|
||||
|
||||
+31
@@ -5,11 +5,42 @@ target triple = "wasm32-unknown-unknown-wasm"
|
||||
@someGlobal = global i8 3
|
||||
@ptrGlobal = global ptr null
|
||||
@arrGlobal = global [8 x i8] zeroinitializer
|
||||
@structGlobal = global { ptr, i32, [2 x ptr] } zeroinitializer
|
||||
@ptrArrayGlobal = global [8 x ptr] zeroinitializer
|
||||
@constantPtrGlobal = constant ptr @someGlobal
|
||||
@runtime.gcGlobalRoots = internal constant [4 x { ptr, i32 }] [{ ptr, i32 } { ptr @ptrGlobal, i32 4 }, { ptr, i32 } { ptr @structGlobal, i32 4 }, { ptr, i32 } { ptr getelementptr (i8, ptr @structGlobal, i32 8), i32 8 }, { ptr, i32 } { ptr @ptrArrayGlobal, i32 32 }]
|
||||
@runtime.gcGlobalRootValueArray = internal global [12 x i32] zeroinitializer
|
||||
|
||||
declare void @runtime.trackPointer(ptr nocapture readonly)
|
||||
|
||||
declare noalias nonnull ptr @runtime.alloc(i32, ptr)
|
||||
|
||||
define i32 @runtime.gcGlobalRootCount() {
|
||||
entry:
|
||||
ret i32 4
|
||||
}
|
||||
|
||||
define ptr @runtime.gcGlobalRoot(i32 %0) {
|
||||
entry:
|
||||
%1 = getelementptr inbounds [4 x { ptr, i32 }], ptr @runtime.gcGlobalRoots, i32 0, i32 %0
|
||||
%2 = getelementptr inbounds nuw { ptr, i32 }, ptr %1, i32 0, i32 0
|
||||
%3 = load ptr, ptr %2, align 4
|
||||
ret ptr %3
|
||||
}
|
||||
|
||||
define i32 @runtime.gcGlobalRootSize(i32 %0) {
|
||||
entry:
|
||||
%1 = getelementptr inbounds [4 x { ptr, i32 }], ptr @runtime.gcGlobalRoots, i32 0, i32 %0
|
||||
%2 = getelementptr inbounds nuw { ptr, i32 }, ptr %1, i32 0, i32 1
|
||||
%3 = load i32, ptr %2, align 4
|
||||
ret i32 %3
|
||||
}
|
||||
|
||||
define ptr @runtime.gcGlobalRootValues() {
|
||||
entry:
|
||||
ret ptr @runtime.gcGlobalRootValueArray
|
||||
}
|
||||
|
||||
define ptr @getPointer() {
|
||||
ret ptr @someGlobal
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user