Skip to content

Commit 8e9465b

Browse files
georgestaggtru
authored andcommitted
[WebAssembly] Handle symbols in .init_array sections (#119127)
Follow on from #111008. (cherry picked from commit ed91843)
1 parent 8069ce6 commit 8e9465b

File tree

2 files changed

+111
-2
lines changed

2 files changed

+111
-2
lines changed

llvm/lib/MC/WasmObjectWriter.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,6 +1326,22 @@ static bool isInSymtab(const MCSymbolWasm &Sym) {
13261326
return true;
13271327
}
13281328

1329+
static bool isSectionReferenced(MCAssembler &Asm, MCSectionWasm &Section) {
1330+
StringRef SectionName = Section.getName();
1331+
1332+
for (const MCSymbol &S : Asm.symbols()) {
1333+
const auto &WS = static_cast<const MCSymbolWasm &>(S);
1334+
if (WS.isData() && WS.isInSection()) {
1335+
auto &RefSection = static_cast<MCSectionWasm &>(WS.getSection());
1336+
if (RefSection.getName() == SectionName) {
1337+
return true;
1338+
}
1339+
}
1340+
}
1341+
1342+
return false;
1343+
}
1344+
13291345
void WasmObjectWriter::prepareImports(
13301346
SmallVectorImpl<wasm::WasmImport> &Imports, MCAssembler &Asm) {
13311347
// For now, always emit the memory import, since loads and stores are not
@@ -1482,8 +1498,10 @@ uint64_t WasmObjectWriter::writeOneObject(MCAssembler &Asm,
14821498
LLVM_DEBUG(dbgs() << "Processing Section " << SectionName << " group "
14831499
<< Section.getGroup() << "\n";);
14841500

1485-
// .init_array sections are handled specially elsewhere.
1486-
if (SectionName.starts_with(".init_array"))
1501+
// .init_array sections are handled specially elsewhere, include them in
1502+
// data segments if and only if referenced by a symbol.
1503+
if (SectionName.starts_with(".init_array") &&
1504+
!isSectionReferenced(Asm, Section))
14871505
continue;
14881506

14891507
// Code is handled separately
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)