Skip to content

Commit e9f1ed2

Browse files
committed
[WebAssembly] MC layer writes table symbols to object files
Now that the linker handles table symbols, we can allow the frontend to produce them. Depends on D91870. Differential Revision: https://reviews.llvm.org/D92215
1 parent 1dfd5c9 commit e9f1ed2

File tree

8 files changed

+71
-18
lines changed

8 files changed

+71
-18
lines changed

llvm/lib/MC/WasmObjectWriter.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,13 @@ void WasmObjectWriter::recordRelocation(MCAssembler &Asm,
519519
Sym->setUndefined();
520520
}
521521
Sym->setUsedInReloc();
522+
// Any time we have a TABLE_INDEX relocation against a function symbol, we
523+
// need to ensure that table itself is part of the final output too. In the
524+
// future we may want to define a new kind of reloc against both the
525+
// function and the table, so that the linker can see that the function
526+
// symbol keeps the table alive, but for now manually mark the table as
527+
// live.
528+
Sym->setNoStrip();
522529
Asm.registerSymbol(*Sym);
523530
}
524531

@@ -1670,10 +1677,6 @@ uint64_t WasmObjectWriter::writeOneObject(MCAssembler &Asm,
16701677
WS.setIndex(InvalidIndex);
16711678
continue;
16721679
}
1673-
if (WS.isTable() && WS.getName() == "__indirect_function_table") {
1674-
// For the moment, don't emit table symbols -- wasm-ld can't handle them.
1675-
continue;
1676-
}
16771680
LLVM_DEBUG(dbgs() << "adding to symtab: " << WS << "\n");
16781681

16791682
uint32_t Flags = 0;

llvm/test/MC/WebAssembly/debug-info.ll

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,44 +89,44 @@
8989
; CHECK-NEXT: }
9090
; CHECK-NEXT: Section {
9191
; CHECK-NEXT: Type: CUSTOM (0x0)
92-
; CHECK-NEXT: Size: 91
92+
; CHECK-NEXT: Size: 95
9393
; CHECK-NEXT: Offset: 731
9494
; CHECK-NEXT: Name: linking
9595
; CHECK-NEXT: }
9696
; CHECK-NEXT: Section {
9797
; CHECK-NEXT: Type: CUSTOM (0x0)
9898
; CHECK-NEXT: Size: 9
99-
; CHECK-NEXT: Offset: 836
99+
; CHECK-NEXT: Offset: 840
100100
; CHECK-NEXT: Name: reloc.DATA
101101
; CHECK-NEXT: }
102102
; CHECK-NEXT: Section {
103103
; CHECK-NEXT: Type: CUSTOM (0x0)
104104
; CHECK-NEXT: Size: 61
105-
; CHECK-NEXT: Offset: 862
105+
; CHECK-NEXT: Offset: 866
106106
; CHECK-NEXT: Name: reloc..debug_info
107107
; CHECK-NEXT: }
108108
; CHECK-NEXT: Section {
109109
; CHECK-NEXT: Type: CUSTOM (0x0)
110110
; CHECK-NEXT: Size: 6
111-
; CHECK-NEXT: Offset: 947
111+
; CHECK-NEXT: Offset: 951
112112
; CHECK-NEXT: Name: reloc..debug_pubnames
113113
; CHECK-NEXT: }
114114
; CHECK-NEXT: Section {
115115
; CHECK-NEXT: Type: CUSTOM (0x0)
116116
; CHECK-NEXT: Size: 6
117-
; CHECK-NEXT: Offset: 981
117+
; CHECK-NEXT: Offset: 985
118118
; CHECK-NEXT: Name: reloc..debug_pubtypes
119119
; CHECK-NEXT: }
120120
; CHECK-NEXT: Section {
121121
; CHECK-NEXT: Type: CUSTOM (0x0)
122122
; CHECK-NEXT: Size: 6
123-
; CHECK-NEXT: Offset: 1015
123+
; CHECK-NEXT: Offset: 1019
124124
; CHECK-NEXT: Name: reloc..debug_line
125125
; CHECK-NEXT: }
126126
; CHECK-NEXT: Section {
127127
; CHECK-NEXT: Type: CUSTOM (0x0)
128128
; CHECK-NEXT: Size: 77
129-
; CHECK-NEXT: Offset: 1045
129+
; CHECK-NEXT: Offset: 1049
130130
; CHECK-NEXT: Name: producers
131131
; CHECK-NEXT: }
132132
; CHECK-NEXT:]
@@ -238,6 +238,16 @@
238238
; CHECK-NEXT: ]
239239
; CHECK-NEXT: ElementIndex: 0xC
240240
; CHECK-NEXT: }
241+
; CHECK-NEXT: Symbol {
242+
; CHECK-NEXT: Name: __indirect_function_table
243+
; CHECK-NEXT: Type: TABLE (0x5)
244+
; CHECK-NEXT: Flags [ (0x90)
245+
; CHECK-NEXT: NO_STRIP (0x80)
246+
; CHECK-NEXT: UNDEFINED (0x10)
247+
; CHECK-NEXT: ]
248+
; CHECK-NEXT: ImportModule: env
249+
; CHECK-NEXT: ElementIndex: 0x0
250+
; CHECK-NEXT: }
241251
; CHECK-NEXT:]
242252

243253
; generated from the following C code using: clang --target=wasm32 -g -O0 -S -emit-llvm test.c

llvm/test/MC/WebAssembly/debug-info64.ll

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,44 +89,44 @@
8989
; CHECK-NEXT: }
9090
; CHECK-NEXT: Section {
9191
; CHECK-NEXT: Type: CUSTOM (0x0)
92-
; CHECK-NEXT: Size: 91
92+
; CHECK-NEXT: Size: 95
9393
; CHECK-NEXT: Offset: 759
9494
; CHECK-NEXT: Name: linking
9595
; CHECK-NEXT: }
9696
; CHECK-NEXT: Section {
9797
; CHECK-NEXT: Type: CUSTOM (0x0)
9898
; CHECK-NEXT: Size: 9
99-
; CHECK-NEXT: Offset: 864
99+
; CHECK-NEXT: Offset: 868
100100
; CHECK-NEXT: Name: reloc.DATA
101101
; CHECK-NEXT: }
102102
; CHECK-NEXT: Section {
103103
; CHECK-NEXT: Type: CUSTOM (0x0)
104104
; CHECK-NEXT: Size: 61
105-
; CHECK-NEXT: Offset: 890
105+
; CHECK-NEXT: Offset: 894
106106
; CHECK-NEXT: Name: reloc..debug_info
107107
; CHECK-NEXT: }
108108
; CHECK-NEXT: Section {
109109
; CHECK-NEXT: Type: CUSTOM (0x0)
110110
; CHECK-NEXT: Size: 6
111-
; CHECK-NEXT: Offset: 975
111+
; CHECK-NEXT: Offset: 979
112112
; CHECK-NEXT: Name: reloc..debug_pubnames
113113
; CHECK-NEXT: }
114114
; CHECK-NEXT: Section {
115115
; CHECK-NEXT: Type: CUSTOM (0x0)
116116
; CHECK-NEXT: Size: 6
117-
; CHECK-NEXT: Offset: 1009
117+
; CHECK-NEXT: Offset: 1013
118118
; CHECK-NEXT: Name: reloc..debug_pubtypes
119119
; CHECK-NEXT: }
120120
; CHECK-NEXT: Section {
121121
; CHECK-NEXT: Type: CUSTOM (0x0)
122122
; CHECK-NEXT: Size: 6
123-
; CHECK-NEXT: Offset: 1043
123+
; CHECK-NEXT: Offset: 1047
124124
; CHECK-NEXT: Name: reloc..debug_line
125125
; CHECK-NEXT: }
126126
; CHECK-NEXT: Section {
127127
; CHECK-NEXT: Type: CUSTOM (0x0)
128128
; CHECK-NEXT: Size: 77
129-
; CHECK-NEXT: Offset: 1073
129+
; CHECK-NEXT: Offset: 1077
130130
; CHECK-NEXT: Name: producers
131131
; CHECK-NEXT: }
132132
; CHECK-NEXT: ]
@@ -238,6 +238,16 @@
238238
; CHECK-NEXT: ]
239239
; CHECK-NEXT: ElementIndex: 0xC
240240
; CHECK-NEXT: }
241+
; CHECK-NEXT: Symbol {
242+
; CHECK-NEXT: Name: __indirect_function_table
243+
; CHECK-NEXT: Type: TABLE (0x5)
244+
; CHECK-NEXT: Flags [ (0x90)
245+
; CHECK-NEXT: NO_STRIP (0x80)
246+
; CHECK-NEXT: UNDEFINED (0x10)
247+
; CHECK-NEXT: ]
248+
; CHECK-NEXT: ImportModule: env
249+
; CHECK-NEXT: ElementIndex: 0x0
250+
; CHECK-NEXT: }
241251
; CHECK-NEXT: ]
242252

243253
; generated from the following C code using: clang --target=wasm64 -g -O0 -S -emit-llvm test.c

llvm/test/MC/WebAssembly/function-alias.ll

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,14 @@ define i8* @func() {
4141
; CHECK-NEXT: ]
4242
; CHECK-NEXT: ElementIndex: 0x0
4343
; CHECK-NEXT: }
44+
; CHECK-NEXT: Symbol {
45+
; CHECK-NEXT: Name: __indirect_function_table
46+
; CHECK-NEXT: Type: TABLE (0x5)
47+
; CHECK-NEXT: Flags [ (0x90)
48+
; CHECK-NEXT: NO_STRIP (0x80)
49+
; CHECK-NEXT: UNDEFINED (0x10)
50+
; CHECK-NEXT: ]
51+
; CHECK-NEXT: ImportModule: env
52+
; CHECK-NEXT: ElementIndex: 0x0
53+
; CHECK-NEXT: }
4454
; CHECK-NEXT: ]

llvm/test/MC/WebAssembly/global-ctor-dtor.ll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,11 @@ declare void @func3()
170170
; CHECK-NEXT: Name: func0
171171
; CHECK-NEXT: Flags: [ UNDEFINED ]
172172
; CHECK-NEXT: Function: 4
173+
; CHECK-NEXT: - Index: 11
174+
; CHECK-NEXT: Kind: TABLE
175+
; CHECK-NEXT: Name: __indirect_function_table
176+
; CHECK-NEXT: Flags: [ UNDEFINED, NO_STRIP ]
177+
; CHECK-NEXT: Table: 0
173178
; CHECK-NEXT: SegmentInfo:
174179
; CHECK-NEXT: - Index: 0
175180
; CHECK-NEXT: Name: .data.global1

llvm/test/MC/WebAssembly/reloc-pic.s

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,11 @@ hidden_func:
190190
# CHECK-NEXT: Name: hidden_func
191191
# CHECK-NEXT: Flags: [ BINDING_LOCAL ]
192192
# CHECK-NEXT: Function: 5
193+
# CHECK-NEXT: - Index: 10
194+
# CHECK-NEXT: Kind: TABLE
195+
# CHECK-NEXT: Name: __indirect_function_table
196+
# CHECK-NEXT: Flags: [ UNDEFINED, NO_STRIP ]
197+
# CHECK-NEXT: Table: 0
193198
# CHECK-NEXT: SegmentInfo:
194199
# CHECK-NEXT: - Index: 0
195200
# CHECK-NEXT: Name: .rodata.hidden_data

llvm/test/MC/WebAssembly/type-index.s

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,9 @@ test0:
6666
# BIN-NEXT: Name: test0
6767
# BIN-NEXT: Flags: [ BINDING_LOCAL ]
6868
# BIN-NEXT: Function: 0
69+
# BIN-NEXT: - Index: 1
70+
# BIN-NEXT: Kind: TABLE
71+
# BIN-NEXT: Name: __indirect_function_table
72+
# BIN-NEXT: Flags: [ UNDEFINED, NO_STRIP ]
73+
# BIN-NEXT: Table: 0
6974
# BIN-NEXT: ...

llvm/test/MC/WebAssembly/weak-alias.s

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,11 @@ alias_address:
227227
# CHECK-NEXT: Flags: [ BINDING_WEAK, VISIBILITY_HIDDEN, NO_STRIP ]
228228
# CHECK-NEXT: Segment: 0
229229
# CHECK-NEXT: Size: 4
230+
# CHECK-NEXT: - Index: 10
231+
# CHECK-NEXT: Kind: TABLE
232+
# CHECK-NEXT: Name: __indirect_function_table
233+
# CHECK-NEXT: Flags: [ UNDEFINED, NO_STRIP ]
234+
# CHECK-NEXT: Table: 0
230235
# CHECK-NEXT: SegmentInfo:
231236
# CHECK-NEXT: - Index: 0
232237
# CHECK-NEXT: Name: .data.bar

0 commit comments

Comments
 (0)