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

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Mon May 3 18:05:26 PDT 2021


Author: Sam Clegg
Date: 2021-05-03T18:04:55-07:00
New Revision: 808fcddae406181cfc396df3dd065e821147c4c4

URL: https://github.com/llvm/llvm-project/commit/808fcddae406181cfc396df3dd065e821147c4c4
DIFF: https://github.com/llvm/llvm-project/commit/808fcddae406181cfc396df3dd065e821147c4c4.diff

LOG: [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

Added: 
    

Modified: 
    lld/test/wasm/pie.ll
    lld/wasm/Relocations.cpp
    lld/wasm/Writer.cpp

Removed: 
    


################################################################################
diff  --git a/lld/test/wasm/pie.ll b/lld/test/wasm/pie.ll
index 03e2c6cee1ce8..af28ddd06e89c 100644
--- a/lld/test/wasm/pie.ll
+++ b/lld/test/wasm/pie.ll
@@ -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
 

diff  --git a/lld/wasm/Relocations.cpp b/lld/wasm/Relocations.cpp
index bd07c0410dc57..18eb522ebe0b7 100644
--- a/lld/wasm/Relocations.cpp
+++ b/lld/wasm/Relocations.cpp
@@ -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);
     }
   }
 }

diff  --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp
index af30e13cbadf0..dbe947daf781c 100644
--- a/lld/wasm/Writer.cpp
+++ b/lld/wasm/Writer.cpp
@@ -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)


        


More information about the llvm-commits mailing list