Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 24 additions & 3 deletions lld/test/wasm/pie.s
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-emscripten %S/Inputs/internal_func.s -o %t.internal_func.o
# RUN: wasm-ld --no-gc-sections --experimental-pic -pie --unresolved-symbols=import-dynamic -o %t.wasm %t.o %t.internal_func.o
# RUN: obj2yaml %t.wasm | FileCheck %s
# RUN: llvm-objdump --disassemble-symbols=__wasm_call_ctors,__wasm_apply_data_relocs --no-show-raw-insn --no-leading-addr %t.wasm | FileCheck %s --check-prefixes DISASSEM
# RUN: llvm-objdump --disassemble-symbols=__wasm_call_ctors,__wasm_apply_data_relocs,__wasm_apply_global_relocs --no-show-raw-insn --no-leading-addr %t.wasm | FileCheck %s --check-prefixes DISASSEM

.functype external_func () -> ()
.functype internal_func1 () -> (i32)
Expand Down Expand Up @@ -41,6 +41,9 @@ foo:
drop

global.get __stack_pointer
drop

global.get __wasm_first_page_end@GOT
end_function

get_data_address:
Expand Down Expand Up @@ -145,6 +148,18 @@ _start:
# DISASSEM-LABEL: <__wasm_apply_data_relocs>:
# DISASSEM: end

# global 6 is __wasm_first_page_end, which is ABSOLUTE and
# thus should not be relocated.
#
# DISASSEM-LABEL: <__wasm_apply_global_relocs>:
# DISASSEM: global.set 4
# DISASSEM: global.set 5
# DISASSEM-NOT: global.set 6
# DISASSEM: global.set 7
# DISASSEM: global.set 8
# DISASSEM: global.set 9
# DISASSEM: end

# Run the same test with extended-const support. When this is available
# we don't need __wasm_apply_global_relocs and instead rely on the add
# instruction in the InitExpr. We also, therefore, do not need these globals
Expand Down Expand Up @@ -173,17 +188,23 @@ _start:
# EXTENDED-CONST-NEXT: Type: I32
# EXTENDED-CONST-NEXT: Mutable: false
# EXTENDED-CONST-NEXT: InitExpr:
# EXTENDED-CONST-NEXT: Opcode: I32_CONST
# EXTENDED-CONST-NEXT: Value: 65536
# EXTENDED-CONST-NEXT: - Index: 7
# EXTENDED-CONST-NEXT: Type: I32
# EXTENDED-CONST-NEXT: Mutable: false
# EXTENDED-CONST-NEXT: InitExpr:
# EXTENDED-CONST-NEXT: Extended: true
# This instruction sequence decodes to:
# (global.get[0x23] 0x1 i32.const[0x41] 0x0C i32.add[0x6A] end[0x0b])
# EXTENDED-CONST-NEXT: Body: 2301410C6A0B
# EXTENDED-CONST-NEXT: - Index: 7
# EXTENDED-CONST-NEXT: - Index: 8
# EXTENDED-CONST-NEXT: Type: I32
# EXTENDED-CONST-NEXT: Mutable: false
# EXTENDED-CONST-NEXT: InitExpr:
# EXTENDED-CONST-NEXT: Opcode: GLOBAL_GET
# EXTENDED-CONST-NEXT: Index: 2
# EXTENDED-CONST-NEXT: - Index: 8
# EXTENDED-CONST-NEXT: - Index: 9
# EXTENDED-CONST-NEXT: Type: I32
# EXTENDED-CONST-NEXT: Mutable: false
# EXTENDED-CONST-NEXT: InitExpr:
Expand Down
5 changes: 4 additions & 1 deletion lld/wasm/SyntheticSections.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,8 @@ void GlobalSection::generateRelocationCode(raw_ostream &os, bool TLS) const {
: WASM_OPCODE_I32_ADD;

for (const Symbol *sym : internalGotSymbols) {
if (sym->flags & WASM_SYMBOL_ABSOLUTE)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe do this 2 lines up before the TLS check?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why? just because it can be slightly cheaper?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

continue;
if (TLS != sym->isTLS())
continue;

Expand Down Expand Up @@ -503,7 +505,8 @@ void GlobalSection::writeBody() {
bool useExtendedConst = false;
uint32_t globalIdx;
int64_t offset;
if (ctx.arg.extendedConst && ctx.isPic) {
if (ctx.arg.extendedConst && ctx.isPic &&
(sym->flags & WASM_SYMBOL_ABSOLUTE) == 0) {
if (auto *d = dyn_cast<DefinedData>(sym)) {
if (!sym->isTLS()) {
globalIdx = ctx.sym.memoryBase->getGlobalIndex();
Expand Down