Skip to content

Commit 1ab27c7

Browse files
committed
[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 llvm-svn: 374913
1 parent 311dbb1 commit 1ab27c7

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

lld/test/wasm/pic-static.ll

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ declare i32 @ret32(float)
1212
declare i32 @missing_function(float)
1313
@global_float = global float 1.0
1414
@hidden_float = hidden global float 2.0
15+
@missing_float = extern_weak global float
1516

1617
@ret32_ptr = global i32 (float)* @ret32, align 4
1718

@@ -27,6 +28,10 @@ define i32 ()* @getaddr_hidden() {
2728
ret i32 ()* @hidden_func;
2829
}
2930

31+
define float* @getaddr_missing_float() {
32+
ret float* @missing_float
33+
}
34+
3035
define hidden i32 @hidden_func() {
3136
ret i32 1
3237
}
@@ -83,24 +88,32 @@ entry:
8388
; CHECK-NEXT: Opcode: I32_CONST
8489
; CHECK-NEXT: Value: 1
8590

86-
; GOT.mem.global_float
91+
; GOT.mem.missing_float
8792
; CHECK-NEXT: - Index: 4
8893
; CHECK-NEXT: Type: I32
8994
; CHECK-NEXT: Mutable: false
9095
; CHECK-NEXT: InitExpr:
9196
; CHECK-NEXT: Opcode: I32_CONST
97+
; CHECK-NEXT: Value: 0
98+
99+
; GOT.mem.global_float
100+
; CHECK-NEXT: - Index: 5
101+
; CHECK-NEXT: Type: I32
102+
; CHECK-NEXT: Mutable: false
103+
; CHECK-NEXT: InitExpr:
104+
; CHECK-NEXT: Opcode: I32_CONST
92105
; CHECK-NEXT: Value: 1024
93106

94107
; GOT.mem.ret32_ptr
95-
; CHECK-NEXT: - Index: 5
108+
; CHECK-NEXT: - Index: 6
96109
; CHECK-NEXT: Type: I32
97110
; CHECK-NEXT: Mutable: false
98111
; CHECK-NEXT: InitExpr:
99112
; CHECK-NEXT: Opcode: I32_CONST
100113
; CHECK-NEXT: Value: 1032
101114

102115
; __memory_base
103-
; CHECK-NEXT: - Index: 6
116+
; CHECK-NEXT: - Index: 7
104117
; CHECK-NEXT: Type: I32
105118
; CHECK-NEXT: Mutable: false
106119
; CHECK-NEXT: InitExpr:

lld/wasm/SyntheticSections.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,12 @@ void GlobalSection::writeBody() {
273273
global.InitExpr.Opcode = WASM_OPCODE_I32_CONST;
274274
if (auto *d = dyn_cast<DefinedData>(sym))
275275
global.InitExpr.Value.Int32 = d->getVirtualAddress();
276-
else if (auto *f = cast<FunctionSymbol>(sym))
276+
else if (auto *f = dyn_cast<FunctionSymbol>(sym))
277277
global.InitExpr.Value.Int32 = f->getTableIndex();
278+
else {
279+
assert(isa<UndefinedData>(sym));
280+
global.InitExpr.Value.Int32 = 0;
281+
}
278282
writeGlobal(os, global);
279283
}
280284
for (const DefinedData *sym : dataAddressGlobals) {

0 commit comments

Comments
 (0)