From b3974ffda08aeeb783d38fb67bba9031eb19af2b Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Tue, 5 Dec 2017 20:38:22 +0000 Subject: [PATCH] [WebAssembly] Fix stack pointer relocations This line was mistakenly deleted in rL319813 Add a test for stackpointer relocations. Differential Revision: https://reviews.llvm.org/D40847 llvm-svn: 319828 --- lld/test/wasm/stack-pointer.ll | 67 ++++++++++++++++++++++++++++++++++ lld/wasm/Driver.cpp | 1 + 2 files changed, 68 insertions(+) create mode 100644 lld/test/wasm/stack-pointer.ll diff --git a/lld/test/wasm/stack-pointer.ll b/lld/test/wasm/stack-pointer.ll new file mode 100644 index 000000000000..a443f5103061 --- /dev/null +++ b/lld/test/wasm/stack-pointer.ll @@ -0,0 +1,67 @@ +; RUN: llc -filetype=obj %s -o %t.o +; RUN: lld -flavor wasm --emit-relocs -o %t.wasm %t.o +; RUN: obj2yaml %t.wasm | FileCheck %s + +target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown-wasm" + +; Function Attrs: nounwind +define hidden i32 @_start() local_unnamed_addr { +entry: + %retval = alloca i32, align 4 + ret i32 0 +} + +; CHECK: --- !WASM +; CHECK-NEXT: FileHeader: +; CHECK-NEXT: Version: 0x00000001 +; CHECK-NEXT: Sections: +; CHECK-NEXT: - Type: TYPE +; CHECK-NEXT: Signatures: +; CHECK-NEXT: - Index: 0 +; CHECK-NEXT: ReturnType: I32 +; CHECK-NEXT: ParamTypes: +; CHECK-NEXT: - Type: FUNCTION +; CHECK-NEXT: FunctionTypes: [ 0 ] +; CHECK-NEXT: - Type: TABLE +; CHECK-NEXT: Tables: +; CHECK-NEXT: - ElemType: ANYFUNC +; CHECK-NEXT: Limits: +; CHECK-NEXT: Flags: 0x00000001 +; CHECK-NEXT: Initial: 0x00000001 +; CHECK-NEXT: Maximum: 0x00000001 +; CHECK-NEXT: - Type: MEMORY +; CHECK-NEXT: Memories: +; CHECK-NEXT: - Initial: 0x00000002 +; CHECK-NEXT: - Type: GLOBAL +; CHECK-NEXT: Globals: +; CHECK-NEXT: - Type: I32 +; CHECK-NEXT: Mutable: true +; CHECK-NEXT: InitExpr: +; CHECK-NEXT: Opcode: I32_CONST +; CHECK-NEXT: Value: 66560 +; CHECK-NEXT: - Type: EXPORT +; CHECK-NEXT: Exports: +; CHECK-NEXT: - Name: memory +; CHECK-NEXT: Kind: MEMORY +; CHECK-NEXT: Index: 0 +; CHECK-NEXT: - Name: _start +; CHECK-NEXT: Kind: FUNCTION +; CHECK-NEXT: Index: 0 +; CHECK-NEXT: - Type: CODE +; CHECK-NEXT: Relocations: +; CHECK-NEXT: - Type: R_WEBASSEMBLY_GLOBAL_INDEX_LEB +; CHECK-NEXT: Index: 0 +; CHECK-NEXT: Offset: 0x00000004 +; CHECK-NEXT: Functions: +; CHECK-NEXT: - Locals: +; CHECK-NEXT: Body: 23808080800041106B1A41000B +; CHECK-NEXT: - Type: CUSTOM +; CHECK-NEXT: Name: linking +; CHECK-NEXT: DataSize: 0 +; CHECK-NEXT: - Type: CUSTOM +; CHECK-NEXT: Name: name +; CHECK-NEXT: FunctionNames: +; CHECK-NEXT: - Index: 0 +; CHECK-NEXT: Name: _start +; CHECK-NEXT: ... diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp index 4f8f25f79c22..06db27dbbc98 100644 --- a/lld/wasm/Driver.cpp +++ b/lld/wasm/Driver.cpp @@ -142,6 +142,7 @@ static Symbol* addSyntheticGlobal(StringRef Name, int32_t Value) { log("injecting global: " + Name); Symbol *S = Symtab->addDefinedGlobal(Name); S->setVirtualAddress(Value); + S->setOutputIndex(Config->SyntheticGlobals.size()); Config->SyntheticGlobals.emplace_back(S); return S; }