[lld] r374913 - [lld][WebAssembly] Fix static linking of -fPIC code with external undefined data

James Clarke via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 15 10:05:42 PDT 2019


Author: jrtc27
Date: Tue Oct 15 10:05:42 2019
New Revision: 374913

URL: http://llvm.org/viewvc/llvm-project?rev=374913&view=rev
Log:
[lld][WebAssembly] Fix static linking of -fPIC code with external undefined data

Reviewers: ruiu, sbc100

Reviewed By: sbc100

Subscribers: dschuff, jgravelle-google, aheejin, sunfish, llvm-commits

Tags: #llvm

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

Modified:
    lld/trunk/test/wasm/pic-static.ll
    lld/trunk/wasm/SyntheticSections.cpp

Modified: lld/trunk/test/wasm/pic-static.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/pic-static.ll?rev=374913&r1=374912&r2=374913&view=diff
==============================================================================
--- lld/trunk/test/wasm/pic-static.ll (original)
+++ lld/trunk/test/wasm/pic-static.ll Tue Oct 15 10:05:42 2019
@@ -12,6 +12,7 @@ declare i32 @ret32(float)
 declare i32 @missing_function(float)
 @global_float = global float 1.0
 @hidden_float = hidden global float 2.0
+ at missing_float = extern_weak global float
 
 @ret32_ptr = global i32 (float)* @ret32, align 4
 
@@ -27,6 +28,10 @@ define i32 ()* @getaddr_hidden() {
   ret i32 ()* @hidden_func;
 }
 
+define float* @getaddr_missing_float() {
+  ret float* @missing_float
+}
+
 define hidden i32 @hidden_func() {
   ret i32 1
 }
@@ -83,16 +88,24 @@ entry:
 ; CHECK-NEXT:           Opcode:          I32_CONST
 ; CHECK-NEXT:           Value:           1
 
-; GOT.mem.global_float
+; GOT.mem.missing_float
 ; CHECK-NEXT:       - Index:           4
 ; CHECK-NEXT:         Type:            I32
 ; CHECK-NEXT:         Mutable:         false
 ; CHECK-NEXT:         InitExpr:
 ; CHECK-NEXT:           Opcode:          I32_CONST
+; CHECK-NEXT:           Value:           0
+
+; GOT.mem.global_float
+; CHECK-NEXT:       - Index:           5
+; CHECK-NEXT:         Type:            I32
+; CHECK-NEXT:         Mutable:         false
+; CHECK-NEXT:         InitExpr:
+; CHECK-NEXT:           Opcode:          I32_CONST
 ; CHECK-NEXT:           Value:           1024
 
 ; GOT.mem.ret32_ptr
-; CHECK-NEXT:       - Index:           5
+; CHECK-NEXT:       - Index:           6
 ; CHECK-NEXT:         Type:            I32
 ; CHECK-NEXT:         Mutable:         false
 ; CHECK-NEXT:         InitExpr:
@@ -100,7 +113,7 @@ entry:
 ; CHECK-NEXT:           Value:           1032
 
 ; __memory_base
-; CHECK-NEXT:       - Index:           6
+; CHECK-NEXT:       - Index:           7
 ; CHECK-NEXT:         Type:            I32
 ; CHECK-NEXT:         Mutable:         false
 ; CHECK-NEXT:         InitExpr:

Modified: lld/trunk/wasm/SyntheticSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/SyntheticSections.cpp?rev=374913&r1=374912&r2=374913&view=diff
==============================================================================
--- lld/trunk/wasm/SyntheticSections.cpp (original)
+++ lld/trunk/wasm/SyntheticSections.cpp Tue Oct 15 10:05:42 2019
@@ -273,8 +273,12 @@ void GlobalSection::writeBody() {
     global.InitExpr.Opcode = WASM_OPCODE_I32_CONST;
     if (auto *d = dyn_cast<DefinedData>(sym))
       global.InitExpr.Value.Int32 = d->getVirtualAddress();
-    else if (auto *f = cast<FunctionSymbol>(sym))
+    else if (auto *f = dyn_cast<FunctionSymbol>(sym))
       global.InitExpr.Value.Int32 = f->getTableIndex();
+    else {
+      assert(isa<UndefinedData>(sym));
+      global.InitExpr.Value.Int32 = 0;
+    }
     writeGlobal(os, global);
   }
   for (const DefinedData *sym : dataAddressGlobals) {




More information about the llvm-commits mailing list