Skip to content

Commit f048af2

Browse files
committed
WasmObjectWriter: Handle symbols in .init_array sections
1 parent 9a24f21 commit f048af2

File tree

2 files changed

+111
-3
lines changed

2 files changed

+111
-3
lines changed

llvm/lib/MC/WasmObjectWriter.cpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1482,9 +1482,26 @@ uint64_t WasmObjectWriter::writeOneObject(MCAssembler &Asm,
14821482
LLVM_DEBUG(dbgs() << "Processing Section " << SectionName << " group "
14831483
<< Section.getGroup() << "\n";);
14841484

1485-
// .init_array sections are handled specially elsewhere.
1486-
if (SectionName.starts_with(".init_array"))
1487-
continue;
1485+
// .init_array sections are handled specially elsewhere, include them in
1486+
// data segments if and only if referenced by a symbol.
1487+
if (SectionName.starts_with(".init_array")) {
1488+
bool referenced = false;
1489+
1490+
for (const MCSymbol &S : Asm.symbols()) {
1491+
const auto &WS = static_cast<const MCSymbolWasm &>(S);
1492+
if (WS.isData() && WS.isInSection()) {
1493+
auto &RefSection = static_cast<MCSectionWasm &>(WS.getSection());
1494+
if (RefSection.getName() == SectionName) {
1495+
referenced = true;
1496+
break;
1497+
}
1498+
}
1499+
}
1500+
1501+
if (!referenced) {
1502+
continue;
1503+
}
1504+
}
14881505

14891506
// Code is handled separately
14901507
if (Section.isText())
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj < %s | obj2yaml | FileCheck %s
2+
3+
init1:
4+
.functype init1 () -> ()
5+
end_function
6+
7+
init2:
8+
.functype init2 () -> ()
9+
end_function
10+
11+
.section .init_array.42,"",@
12+
.p2align 2, 0x0
13+
.int32 init1
14+
15+
.section .init_array,"",@
16+
.globl p_init1
17+
.p2align 2, 0x0
18+
p_init1:
19+
.int32 init1
20+
.size p_init1, 4
21+
22+
.section .init_array,"",@
23+
.globl p_init2
24+
.p2align 2, 0x0
25+
p_init2:
26+
.int32 init1
27+
.int32 init2
28+
.size p_init2, 8
29+
30+
# CHECK: - Type: FUNCTION
31+
# CHECK-NEXT: FunctionTypes: [ 0, 0 ]
32+
# CHECK-NEXT: - Type: DATACOUNT
33+
# CHECK-NEXT: Count: 1
34+
# CHECK-NEXT: - Type: CODE
35+
# CHECK-NEXT: Functions:
36+
# CHECK-NEXT: - Index: 0
37+
# CHECK-NEXT: Locals: []
38+
# CHECK-NEXT: Body: 0B
39+
# CHECK-NEXT: - Index: 1
40+
# CHECK-NEXT: Locals: []
41+
# CHECK-NEXT: Body: 0B
42+
# CHECK-NEXT: - Type: DATA
43+
# CHECK-NEXT: Segments:
44+
# CHECK-NEXT: - SectionOffset: 6
45+
# CHECK-NEXT: InitFlags: 0
46+
# CHECK-NEXT: Offset:
47+
# CHECK-NEXT: Opcode: I32_CONST
48+
# CHECK-NEXT: Value: 0
49+
# CHECK-NEXT: Content: '000000000000000000000000'
50+
# CHECK-NEXT: - Type: CUSTOM
51+
# CHECK-NEXT: Name: linking
52+
# CHECK-NEXT: Version: 2
53+
# CHECK-NEXT: SymbolTable:
54+
# CHECK-NEXT: - Index: 0
55+
# CHECK-NEXT: Kind: FUNCTION
56+
# CHECK-NEXT: Name: init1
57+
# CHECK-NEXT: Flags: [ BINDING_LOCAL ]
58+
# CHECK-NEXT: Function: 0
59+
# CHECK-NEXT: - Index: 1
60+
# CHECK-NEXT: Kind: FUNCTION
61+
# CHECK-NEXT: Name: init2
62+
# CHECK-NEXT: Flags: [ BINDING_LOCAL ]
63+
# CHECK-NEXT: Function: 1
64+
# CHECK-NEXT: - Index: 2
65+
# CHECK-NEXT: Kind: DATA
66+
# CHECK-NEXT: Name: p_init1
67+
# CHECK-NEXT: Flags: [ ]
68+
# CHECK-NEXT: Segment: 0
69+
# CHECK-NEXT: Size: 4
70+
# CHECK-NEXT: - Index: 3
71+
# CHECK-NEXT: Kind: DATA
72+
# CHECK-NEXT: Name: p_init2
73+
# CHECK-NEXT: Flags: [ ]
74+
# CHECK-NEXT: Segment: 0
75+
# CHECK-NEXT: Offset: 4
76+
# CHECK-NEXT: Size: 8
77+
# CHECK-NEXT: SegmentInfo:
78+
# CHECK-NEXT: - Index: 0
79+
# CHECK-NEXT: Name: .init_array
80+
# CHECK-NEXT: Alignment: 2
81+
# CHECK-NEXT: Flags: [ ]
82+
# CHECK-NEXT: InitFunctions:
83+
# CHECK-NEXT: - Priority: 42
84+
# CHECK-NEXT: Symbol: 0
85+
# CHECK-NEXT: - Priority: 65535
86+
# CHECK-NEXT: Symbol: 0
87+
# CHECK-NEXT: - Priority: 65535
88+
# CHECK-NEXT: Symbol: 0
89+
# CHECK-NEXT: - Priority: 65535
90+
# CHECK-NEXT: Symbol: 1
91+
# CHECK-NEXT: ...

0 commit comments

Comments
 (0)