Author: George Stagg Date: 2024-12-17T10:12:46+01:00 New Revision: 8e9465bd150bcbe2d200efc7c0e31abf8ddebe58
URL: https://github.com/llvm/llvm-project/commit/8e9465bd150bcbe2d200efc7c0e31abf8ddebe58 DIFF: https://github.com/llvm/llvm-project/commit/8e9465bd150bcbe2d200efc7c0e31abf8ddebe58.diff LOG: [WebAssembly] Handle symbols in `.init_array` sections (#119127) Follow on from #111008. (cherry picked from commit ed91843d435d0cd2c39ebb1a50f2907c621f07ed) Added: llvm/test/MC/WebAssembly/init-array-label.s Modified: llvm/lib/MC/WasmObjectWriter.cpp Removed: ################################################################################ diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp index a66c5713ff8a6e..85264692456767 100644 --- a/llvm/lib/MC/WasmObjectWriter.cpp +++ b/llvm/lib/MC/WasmObjectWriter.cpp @@ -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 @@ -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 diff --git a/llvm/test/MC/WebAssembly/init-array-label.s b/llvm/test/MC/WebAssembly/init-array-label.s new file mode 100644 index 00000000000000..0b4a5ea2da0b59 --- /dev/null +++ b/llvm/test/MC/WebAssembly/init-array-label.s @@ -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: ... _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits