[lld][WebAssembly] Fix crash with `-pie` without `--allow-undefined`

`shouldImport` was not returning true in PIC mode even though out
assumption elsewhere (in Relocations.cpp:scanRelocations) is that we
don't report undefined symbols in PIC mode today.  This was resulting
functions that were undefined and but also not imported which hits an
assert later on that all functions have valid indexes.

Differential Revision: https://reviews.llvm.org/D101716
This commit is contained in:
Sam Clegg 2021-05-01 15:37:40 -07:00
parent 24ce194cfe
commit 808fcddae4
3 changed files with 19 additions and 15 deletions

View File

@ -1,5 +1,5 @@
; RUN: llc -relocation-model=pic -mattr=+mutable-globals -filetype=obj %s -o %t.o
; RUN: wasm-ld --no-gc-sections --allow-undefined --experimental-pic -pie -o %t.wasm %t.o
; RUN: wasm-ld --no-gc-sections --experimental-pic -pie -o %t.wasm %t.o
target triple = "wasm32-unknown-emscripten"
@ -26,9 +26,12 @@ entry:
}
define void @_start() {
call void @external_func()
ret void
}
declare void @external_func()
; CHECK: Sections:
; CHECK-NEXT: - Type: CUSTOM
; CHECK-NEXT: Name: dylink
@ -88,27 +91,29 @@ define void @_start() {
; RUN: obj2yaml %t.shmem.wasm | FileCheck %s --check-prefix=SHMEM
; SHMEM: - Type: CODE
; SHMEM: - Index: 5
; SHMEM: - Index: 6
; SHMEM-NEXT: Locals: []
; SHMEM-NEXT: Body: 100210040B
; SHMEM-NEXT: Body: 100310050B
; SHMEM: FunctionNames:
; SHMEM-NEXT: - Index: 0
; SHMEM-NEXT: Name: __wasm_call_ctors
; SHMEM-NEXT: Name: external_func
; SHMEM-NEXT: - Index: 1
; SHMEM-NEXT: Name: __wasm_init_tls
; SHMEM-NEXT: Name: __wasm_call_ctors
; SHMEM-NEXT: - Index: 2
; SHMEM-NEXT: Name: __wasm_init_memory
; SHMEM-NEXT: Name: __wasm_init_tls
; SHMEM-NEXT: - Index: 3
; SHMEM-NEXT: Name: __wasm_apply_data_relocs
; SHMEM-NEXT: Name: __wasm_init_memory
; SHMEM-NEXT: - Index: 4
; SHMEM-NEXT: Name: __wasm_apply_global_relocs
; SHMEM-NEXT: Name: __wasm_apply_data_relocs
; SHMEM-NEXT: - Index: 5
; SHMEM-NEXT: Name: __wasm_start
; SHMEM-NEXT: Name: __wasm_apply_global_relocs
; SHMEM-NEXT: - Index: 6
; SHMEM-NEXT: Name: foo
; SHMEM-NEXT: Name: __wasm_start
; SHMEM-NEXT: - Index: 7
; SHMEM-NEXT: Name: get_data_address
; SHMEM-NEXT: Name: foo
; SHMEM-NEXT: - Index: 8
; SHMEM-NEXT: Name: get_data_address
; SHMEM-NEXT: - Index: 9
; SHMEM-NEXT: Name: _start

View File

@ -150,10 +150,9 @@ void scanRelocations(InputChunk *chunk) {
addGOTEntry(sym);
break;
}
} else {
} else if (sym->isUndefined() && !config->relocatable && !sym->isWeak()) {
// Report undefined symbols
if (sym->isUndefined() && !config->relocatable && !sym->isWeak())
reportUndefined(sym);
reportUndefined(sym);
}
}
}

View File

@ -560,7 +560,7 @@ static bool shouldImport(Symbol *sym) {
if (isa<DataSymbol>(sym))
return false;
if (config->relocatable ||
if ((config->isPic || config->relocatable) ||
config->unresolvedSymbols == UnresolvedPolicy::ImportFuncs)
return true;
if (config->allowUndefinedSymbols.count(sym->getName()) != 0)