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

Sam Clegg via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat May 1 22:13:49 PDT 2021


sbc100 created this revision.
Herald added subscribers: wingo, ecnelises, sunfish, jgravelle-google, dschuff.
sbc100 requested review of this revision.
Herald added subscribers: llvm-commits, aheejin.
Herald added a project: LLVM.

`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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D101716

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


Index: lld/wasm/Writer.cpp
===================================================================
--- lld/wasm/Writer.cpp
+++ lld/wasm/Writer.cpp
@@ -559,7 +559,7 @@
   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)
Index: lld/wasm/Relocations.cpp
===================================================================
--- lld/wasm/Relocations.cpp
+++ lld/wasm/Relocations.cpp
@@ -150,10 +150,9 @@
           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);
     }
   }
 }
Index: lld/test/wasm/pie.ll
===================================================================
--- lld/test/wasm/pie.ll
+++ 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 @@
 }
 
 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 @@
 ; 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
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D101716.342219.patch
Type: text/x-patch
Size: 3453 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210502/4d894306/attachment.bin>


More information about the llvm-commits mailing list