[lld] r360402 - [WebAssembly] Don't assume that strongly defined symbols are DSO-local

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Thu May 9 18:52:09 PDT 2019


Author: sbc
Date: Thu May  9 18:52:08 2019
New Revision: 360402

URL: http://llvm.org/viewvc/llvm-project?rev=360402&view=rev
Log:
[WebAssembly] Don't assume that strongly defined symbols are DSO-local

The current PIC model for WebAssembly is more like ELF in that it
allows symbol interposition.

This means that more functions end up being addressed via the GOT
and fewer directly added to the wasm table.

One effect is a reduction in the number of wasm table entries similar
to the previous attempt in https://reviews.llvm.org/D61539 which was
reverted.

Differential Revision: https://reviews.llvm.org/D61772

Modified:
    lld/trunk/test/wasm/pie.ll
    lld/trunk/test/wasm/shared.ll
    lld/trunk/wasm/InputFiles.cpp
    lld/trunk/wasm/Writer.cpp

Modified: lld/trunk/test/wasm/pie.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/pie.ll?rev=360402&r1=360401&r2=360402&view=diff
==============================================================================
--- lld/trunk/test/wasm/pie.ll (original)
+++ lld/trunk/test/wasm/pie.ll Thu May  9 18:52:08 2019
@@ -11,7 +11,7 @@ target triple = "wasm32-unknown-unknown"
 @data_addr = local_unnamed_addr global i32* @data, align 4
 @data_addr_external = local_unnamed_addr global i32* @data_external, align 4
 
-define i32 @foo() {
+define hidden i32 @foo() {
 entry:
   ; To ensure we use __stack_pointer
   %ptr = alloca i32

Modified: lld/trunk/test/wasm/shared.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/shared.ll?rev=360402&r1=360401&r2=360402&view=diff
==============================================================================
--- lld/trunk/test/wasm/shared.ll (original)
+++ lld/trunk/test/wasm/shared.ll Thu May  9 18:52:08 2019
@@ -28,12 +28,12 @@ entry:
   ret i32 %0
 }
 
-define default i32* @get_data_address() {
+define hidden i32* @get_data_address() {
 entry:
   ret i32* @data_external
 }
 
-define default i8* @get_func_address() {
+define hidden i8* @get_func_address() {
 entry:
   ret i8* bitcast (void ()* @func_external to i8*)
 }
@@ -54,7 +54,7 @@ declare void @func_external()
 ; CHECK-NEXT:     Name:            dylink
 ; CHECK-NEXT:     MemorySize:      24
 ; CHECK-NEXT:     MemoryAlignment: 2
-; CHECK-NEXT:     TableSize:       3
+; CHECK-NEXT:     TableSize:       2
 ; CHECK-NEXT:     TableAlignment:  0
 ; CHECK-NEXT:     Needed:          []
 ; CHECK-NEXT:   - Type:            TYPE
@@ -74,7 +74,7 @@ declare void @func_external()
 ; CHECK-NEXT:         Table:
 ; CHECK-NEXT:           ElemType:        FUNCREF
 ; CHECK-NEXT:           Limits:
-; CHECK-NEXT:             Initial:         0x00000003
+; CHECK-NEXT:             Initial:         0x00000002
 ; CHECK-NEXT:       - Module:          env
 ; CHECK-NEXT:         Field:           __stack_pointer
 ; CHECK-NEXT:         Kind:            GLOBAL
@@ -95,7 +95,7 @@ declare void @func_external()
 ; CHECK-NEXT:         Kind:            FUNCTION
 ; CHECK-NEXT:         SigIndex:        1
 ; CHECK-NEXT:       - Module:          GOT.mem
-; CHECK-NEXT:         Field:           data_external
+; CHECK-NEXT:         Field:           indirect_func
 ; CHECK-NEXT:         Kind:            GLOBAL
 ; CHECK-NEXT:         GlobalType:      I32
 ; CHECK-NEXT:         GlobalMutable:   true
@@ -105,6 +105,11 @@ declare void @func_external()
 ; CHECK-NEXT:         GlobalType:      I32
 ; CHECK-NEXT:         GlobalMutable:   true
 ; CHECK-NEXT:       - Module:          GOT.mem
+; CHECK-NEXT:         Field:           data_external
+; CHECK-NEXT:         Kind:            GLOBAL
+; CHECK-NEXT:         GlobalType:      I32
+; CHECK-NEXT:         GlobalMutable:   true
+; CHECK-NEXT:       - Module:          GOT.mem
 ; CHECK-NEXT:         Field:           extern_struct
 ; CHECK-NEXT:         Kind:            GLOBAL
 ; CHECK-NEXT:         GlobalType:      I32
@@ -124,7 +129,7 @@ declare void @func_external()
 ; CHECK-NEXT:       - Offset:
 ; CHECK-NEXT:           Opcode:          GLOBAL_GET
 ; CHECK-NEXT:           Index:           2
-; CHECK-NEXT:         Functions:       [ 5, 3, 0 ]
+; CHECK-NEXT:         Functions:       [ 4, 3 ]
 
 ; check the generated code in __wasm_call_ctors and __wasm_apply_relocs functions
 ; TODO(sbc): Disassemble and verify instructions.
@@ -136,7 +141,7 @@ declare void @func_external()
 ; CHECK-NEXT:         Body:            10020B
 ; CHECK-NEXT:       - Index:           2
 ; CHECK-NEXT:         Locals:          []
-; CHECK-NEXT:         Body:            230141046A230241016A360200230141086A23043602002301410C6A230141006A360200230141106A2303360200230141146A230541046A3602000B
+; CHECK-NEXT:         Body:            230141046A230241016A360200230141086A23043602002301410C6A230141006A360200230141106A2305360200230141146A230641046A3602000B
 
 ; check the data segment initialized with __memory_base global as offset
 
@@ -147,4 +152,4 @@ declare void @func_external()
 ; CHECK-NEXT:         Offset:
 ; CHECK-NEXT:           Opcode:          GLOBAL_GET
 ; CHECK-NEXT:           Index:           1
-; CHECK-NEXT:         Content:         '020000000100000002000000000000000000000000000000'
+; CHECK-NEXT:         Content:         '020000000100000000000000000000000000000000000000'

Modified: lld/trunk/wasm/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/InputFiles.cpp?rev=360402&r1=360401&r2=360402&view=diff
==============================================================================
--- lld/trunk/wasm/InputFiles.cpp (original)
+++ lld/trunk/wasm/InputFiles.cpp Thu May  9 18:52:08 2019
@@ -171,6 +171,8 @@ uint32_t ObjFile::calcNewValue(const Was
   case R_WASM_TABLE_INDEX_I32:
   case R_WASM_TABLE_INDEX_SLEB:
   case R_WASM_TABLE_INDEX_REL_SLEB:
+    if (Config->Pic && !getFunctionSymbol(Reloc.Index)->hasTableIndex())
+      return 0;
     return getFunctionSymbol(Reloc.Index)->getTableIndex();
   case R_WASM_MEMORY_ADDR_SLEB:
   case R_WASM_MEMORY_ADDR_I32:

Modified: lld/trunk/wasm/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Writer.cpp?rev=360402&r1=360401&r2=360402&view=diff
==============================================================================
--- lld/trunk/wasm/Writer.cpp (original)
+++ lld/trunk/wasm/Writer.cpp Thu May  9 18:52:08 2019
@@ -1142,6 +1142,10 @@ void Writer::calculateTypes() {
     registerType(E->Signature);
 }
 
+static bool requiresGOTAccess(const Symbol* Sym) {
+  return Config->Pic && !Sym->isHidden() && !Sym->isLocal();
+}
+
 void Writer::processRelocations(InputChunk *Chunk) {
   if (!Chunk->Live)
     return;
@@ -1153,8 +1157,8 @@ void Writer::processRelocations(InputChu
     case R_WASM_TABLE_INDEX_SLEB:
     case R_WASM_TABLE_INDEX_REL_SLEB: {
       FunctionSymbol *Sym = File->getFunctionSymbol(Reloc.Index);
-      if (Sym->hasTableIndex() || !Sym->hasFunctionIndex())
-        continue;
+      if (Sym->hasTableIndex() || !Sym->hasFunctionIndex() || requiresGOTAccess(Sym))
+        break;
       Sym->setTableIndex(TableBase + IndirectFunctions.size());
       IndirectFunctions.emplace_back(Sym);
       break;
@@ -1206,7 +1210,7 @@ void Writer::processRelocations(InputChu
         // will be converted into code by `generateRelocationCode`.  This code
         // requires the symbols to have GOT entires.
         auto* Sym = File->getSymbols()[Reloc.Index];
-        if (!Sym->isHidden() && !Sym->isLocal() && !Sym->isInGOT()) {
+        if (requiresGOTAccess(Sym) && !Sym->isInGOT()) {
           Sym->setGOTIndex(NumImportedGlobals++);
           GOTSymbols.push_back(Sym);
         }




More information about the llvm-commits mailing list