Skip to content

Commit

Permalink
[WebAssembly] Handle symbols in .init_array sections (#119127)
Browse files Browse the repository at this point in the history
Follow on from #111008.
  • Loading branch information
georgestagg authored Dec 10, 2024
1 parent 4d06623 commit ed91843
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 2 deletions.
22 changes: 20 additions & 2 deletions llvm/lib/MC/WasmObjectWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1326,6 +1326,22 @@ static bool isInSymtab(const MCSymbolWasm &Sym) {
return true;
}

static bool isSectionReferenced(MCAssembler &Asm, MCSectionWasm &Section) {
StringRef SectionName = Section.getName();

for (const MCSymbol &S : Asm.symbols()) {
const auto &WS = static_cast<const MCSymbolWasm &>(S);
if (WS.isData() && WS.isInSection()) {
auto &RefSection = static_cast<MCSectionWasm &>(WS.getSection());
if (RefSection.getName() == SectionName) {
return true;
}
}
}

return false;
}

void WasmObjectWriter::prepareImports(
SmallVectorImpl<wasm::WasmImport> &Imports, MCAssembler &Asm) {
// For now, always emit the memory import, since loads and stores are not
Expand Down Expand Up @@ -1482,8 +1498,10 @@ uint64_t WasmObjectWriter::writeOneObject(MCAssembler &Asm,
LLVM_DEBUG(dbgs() << "Processing Section " << SectionName << " group "
<< Section.getGroup() << "\n";);

// .init_array sections are handled specially elsewhere.
if (SectionName.starts_with(".init_array"))
// .init_array sections are handled specially elsewhere, include them in
// data segments if and only if referenced by a symbol.
if (SectionName.starts_with(".init_array") &&
!isSectionReferenced(Asm, Section))
continue;

// Code is handled separately
Expand Down
91 changes: 91 additions & 0 deletions llvm/test/MC/WebAssembly/init-array-label.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj < %s | obj2yaml | FileCheck %s

init1:
.functype init1 () -> ()
end_function

init2:
.functype init2 () -> ()
end_function

.section .init_array.42,"",@
.p2align 2, 0x0
.int32 init1

.section .init_array,"",@
.globl p_init1
.p2align 2, 0x0
p_init1:
.int32 init1
.size p_init1, 4

.section .init_array,"",@
.globl p_init2
.p2align 2, 0x0
p_init2:
.int32 init1
.int32 init2
.size p_init2, 8

# CHECK: - Type: FUNCTION
# CHECK-NEXT: FunctionTypes: [ 0, 0 ]
# CHECK-NEXT: - Type: DATACOUNT
# CHECK-NEXT: Count: 1
# CHECK-NEXT: - Type: CODE
# CHECK-NEXT: Functions:
# CHECK-NEXT: - Index: 0
# CHECK-NEXT: Locals: []
# CHECK-NEXT: Body: 0B
# CHECK-NEXT: - Index: 1
# CHECK-NEXT: Locals: []
# CHECK-NEXT: Body: 0B
# CHECK-NEXT: - Type: DATA
# CHECK-NEXT: Segments:
# CHECK-NEXT: - SectionOffset: 6
# CHECK-NEXT: InitFlags: 0
# CHECK-NEXT: Offset:
# CHECK-NEXT: Opcode: I32_CONST
# CHECK-NEXT: Value: 0
# CHECK-NEXT: Content: '000000000000000000000000'
# CHECK-NEXT: - Type: CUSTOM
# CHECK-NEXT: Name: linking
# CHECK-NEXT: Version: 2
# CHECK-NEXT: SymbolTable:
# CHECK-NEXT: - Index: 0
# CHECK-NEXT: Kind: FUNCTION
# CHECK-NEXT: Name: init1
# CHECK-NEXT: Flags: [ BINDING_LOCAL ]
# CHECK-NEXT: Function: 0
# CHECK-NEXT: - Index: 1
# CHECK-NEXT: Kind: FUNCTION
# CHECK-NEXT: Name: init2
# CHECK-NEXT: Flags: [ BINDING_LOCAL ]
# CHECK-NEXT: Function: 1
# CHECK-NEXT: - Index: 2
# CHECK-NEXT: Kind: DATA
# CHECK-NEXT: Name: p_init1
# CHECK-NEXT: Flags: [ ]
# CHECK-NEXT: Segment: 0
# CHECK-NEXT: Size: 4
# CHECK-NEXT: - Index: 3
# CHECK-NEXT: Kind: DATA
# CHECK-NEXT: Name: p_init2
# CHECK-NEXT: Flags: [ ]
# CHECK-NEXT: Segment: 0
# CHECK-NEXT: Offset: 4
# CHECK-NEXT: Size: 8
# CHECK-NEXT: SegmentInfo:
# CHECK-NEXT: - Index: 0
# CHECK-NEXT: Name: .init_array
# CHECK-NEXT: Alignment: 2
# CHECK-NEXT: Flags: [ ]
# CHECK-NEXT: InitFunctions:
# CHECK-NEXT: - Priority: 42
# CHECK-NEXT: Symbol: 0
# CHECK-NEXT: - Priority: 65535
# CHECK-NEXT: Symbol: 0
# CHECK-NEXT: - Priority: 65535
# CHECK-NEXT: Symbol: 0
# CHECK-NEXT: - Priority: 65535
# CHECK-NEXT: Symbol: 1
# CHECK-NEXT: ...

0 comments on commit ed91843

Please sign in to comment.