The -pie binary doesn't know that layout ahead of time so needs to import the stack pointer from the embedder, just like we do already for shared libraries. This change is needed in order to address: https://github.com/emscripten-core/emscripten/issues/8915 Differential Revision: https://reviews.llvm.org/D64516 llvm-svn: 365771
59 lines
1.9 KiB
LLVM
59 lines
1.9 KiB
LLVM
; RUN: llc -relocation-model=pic -filetype=obj %s -o %t.o
|
|
; RUN: wasm-ld --no-gc-sections --allow-undefined -pie -o %t.wasm %t.o
|
|
; RUN: obj2yaml %t.wasm | FileCheck %s
|
|
|
|
target triple = "wasm32-unknown-emscripten"
|
|
|
|
@data = global i32 2, align 4
|
|
@data_external = external global i32
|
|
@indirect_func = local_unnamed_addr global i32 ()* @foo, align 4
|
|
|
|
@data_addr = local_unnamed_addr global i32* @data, align 4
|
|
@data_addr_external = local_unnamed_addr global i32* @data_external, align 4
|
|
|
|
define hidden i32 @foo() {
|
|
entry:
|
|
; To ensure we use __stack_pointer
|
|
%ptr = alloca i32
|
|
%0 = load i32, i32* @data, align 4
|
|
%1 = load i32 ()*, i32 ()** @indirect_func, align 4
|
|
call i32 %1()
|
|
ret i32 %0
|
|
}
|
|
|
|
define default i32** @get_data_address() {
|
|
entry:
|
|
ret i32** @data_addr_external
|
|
}
|
|
|
|
define void @_start() {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: - Type: IMPORT
|
|
; CHECK-NEXT: Imports:
|
|
; CHECK-NEXT: - Module: env
|
|
; CHECK-NEXT: Field: __indirect_function_table
|
|
; CHECK-NEXT: Kind: TABLE
|
|
; CHECK-NEXT: Table:
|
|
; CHECK-NEXT: ElemType: FUNCREF
|
|
; CHECK-NEXT: Limits:
|
|
; CHECK-NEXT: Initial: 0x00000001
|
|
; CHECK-NEXT: - Module: env
|
|
; CHECK-NEXT: Field: __stack_pointer
|
|
; CHECK-NEXT: Kind: GLOBAL
|
|
; CHECK-NEXT: GlobalType: I32
|
|
; CHECK-NEXT: GlobalMutable: true
|
|
; CHECK-NEXT: - Module: env
|
|
; CHECK-NEXT: Field: __memory_base
|
|
; CHECK-NEXT: Kind: GLOBAL
|
|
; CHECK-NEXT: GlobalType: I32
|
|
; CHECK-NEXT: GlobalMutable: false
|
|
; CHECK-NEXT: - Module: env
|
|
; CHECK-NEXT: Field: __table_base
|
|
; CHECK-NEXT: Kind: GLOBAL
|
|
; CHECK-NEXT: GlobalType: I32
|
|
; CHECK-NEXT: GlobalMutable: false
|
|
|
|
|