llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-backend-aarch64 Author: Mingming Liu (mingmingl-llvm) <details> <summary>Changes</summary> With https://github.com/llvm/llvm-project/commit/3feb724496238ce10d32e8c2bd84b4ea50f9977e, AsmPrinter can place jump table entries into `.hot` or `.unlikely` prefixed data sections. This change refactors AsmPrinter and AArch64AsmPrinter to prepare for the aarch64 port. * Before this patch, the AsmPrinter class exposes `emitJumpTableInfo` as a virtual method, and AArch64AsmPrinter overrides `emitJumpTableInfo` for jump table emission. * After this patch, both AsmPrinter and AArch64AsmPrinter shares `AsmPrinter::emitJumpTableInfo`, and class-specific code are moved inside `emitJumpTableImpl` respectively. This is a follow-up of https://github.com/llvm/llvm-project/pull/125987 --- Full diff: https://github.com/llvm/llvm-project/pull/125993.diff 4 Files Affected: - (modified) llvm/include/llvm/CodeGen/AsmPrinter.h (+2-3) - (modified) llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (+21-25) - (modified) llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp (+9-9) - (modified) llvm/test/CodeGen/AArch64/jump-table-partition.ll (+11-8) ``````````diff diff --git a/llvm/include/llvm/CodeGen/AsmPrinter.h b/llvm/include/llvm/CodeGen/AsmPrinter.h index 3da63af5ba5716c..9ef9888af990c63 100644 --- a/llvm/include/llvm/CodeGen/AsmPrinter.h +++ b/llvm/include/llvm/CodeGen/AsmPrinter.h @@ -893,9 +893,8 @@ class AsmPrinter : public MachineFunctionPass { // Internal Implementation Details //===------------------------------------------------------------------===// - void emitJumpTableImpl(const MachineJumpTableInfo &MJTI, - ArrayRef<unsigned> JumpTableIndices, - bool JTInDiffSection); + virtual void emitJumpTableImpl(const MachineJumpTableInfo &MJTI, + ArrayRef<unsigned> JumpTableIndices); void emitJumpTableEntry(const MachineJumpTableInfo &MJTI, const MachineBasicBlock *MBB, unsigned uid) const; diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 44b10c3ef997267..07fe589fcbbd065 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -2855,22 +2855,12 @@ void AsmPrinter::emitConstantPool() { void AsmPrinter::emitJumpTableInfo() { const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo(); if (!MJTI) return; - if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_Inline) return; + const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables(); if (JT.empty()) return; - // Pick the directive to use to print the jump table entries, and switch to - // the appropriate section. - const Function &F = MF->getFunction(); - const TargetLoweringObjectFile &TLOF = getObjFileLowering(); - bool JTInDiffSection = !TLOF.shouldPutJumpTableInFunctionSection( - MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 || - MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64, - F); - if (!TM.Options.EnableStaticDataPartitioning) { - emitJumpTableImpl(*MJTI, llvm::to_vector(llvm::seq<unsigned>(JT.size())), - JTInDiffSection); + emitJumpTableImpl(*MJTI, llvm::to_vector(llvm::seq<unsigned>(JT.size()))); return; } @@ -2886,33 +2876,39 @@ void AsmPrinter::emitJumpTableInfo() { } } - emitJumpTableImpl(*MJTI, HotJumpTableIndices, JTInDiffSection); - emitJumpTableImpl(*MJTI, ColdJumpTableIndices, JTInDiffSection); + emitJumpTableImpl(*MJTI, HotJumpTableIndices); + emitJumpTableImpl(*MJTI, ColdJumpTableIndices); } void AsmPrinter::emitJumpTableImpl(const MachineJumpTableInfo &MJTI, - ArrayRef<unsigned> JumpTableIndices, - bool JTInDiffSection) { - if (JumpTableIndices.empty()) + ArrayRef<unsigned> JumpTableIndices) { + if (MJTI.getEntryKind() == MachineJumpTableInfo::EK_Inline || + JumpTableIndices.empty()) return; const TargetLoweringObjectFile &TLOF = getObjFileLowering(); const Function &F = MF->getFunction(); const std::vector<MachineJumpTableEntry> &JT = MJTI.getJumpTables(); MCSection *JumpTableSection = nullptr; - if (TM.Options.EnableStaticDataPartitioning) { - JumpTableSection = - TLOF.getSectionForJumpTable(F, TM, &JT[JumpTableIndices.front()]); - } else { - JumpTableSection = TLOF.getSectionForJumpTable(F, TM); - } - const DataLayout &DL = MF->getDataLayout(); + // Pick the directive to use to print the jump table entries, and switch to + // the appropriate section. + const bool JTInDiffSection = !TLOF.shouldPutJumpTableInFunctionSection( + MJTI.getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 || + MJTI.getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64, + F); if (JTInDiffSection) { + if (TM.Options.EnableStaticDataPartitioning) { + JumpTableSection = + TLOF.getSectionForJumpTable(F, TM, &JT[JumpTableIndices.front()]); + } else { + JumpTableSection = TLOF.getSectionForJumpTable(F, TM); + } OutStreamer->switchSection(JumpTableSection); } - emitAlignment(Align(MJTI.getEntryAlignment(MF->getDataLayout()))); + const DataLayout &DL = MF->getDataLayout(); + emitAlignment(Align(MJTI.getEntryAlignment(DL))); // Jump tables in code sections are marked with a data_region directive // where that's supported. diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp index f1f25b65fc53fac..c92c203f247954b 100644 --- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp +++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp @@ -112,7 +112,8 @@ class AArch64AsmPrinter : public AsmPrinter { const MCExpr *lowerBlockAddressConstant(const BlockAddress &BA) override; void emitStartOfAsmFile(Module &M) override; - void emitJumpTableInfo() override; + void emitJumpTableImpl(const MachineJumpTableInfo &MJTI, + ArrayRef<unsigned> JumpTableIndices) override; std::tuple<const MCSymbol *, uint64_t, const MCSymbol *, codeview::JumpTableEntrySize> getCodeViewJumpTableInfo(int JTI, const MachineInstr *BranchInstr, @@ -1273,19 +1274,18 @@ void AArch64AsmPrinter::PrintDebugValueComment(const MachineInstr *MI, printOperand(MI, NOps - 2, OS); } -void AArch64AsmPrinter::emitJumpTableInfo() { - const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo(); - if (!MJTI) return; - - const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables(); - if (JT.empty()) return; - +void AArch64AsmPrinter::emitJumpTableImpl(const MachineJumpTableInfo &MJTI, + ArrayRef<unsigned> JumpTableIndices) { + // Fast return if there is nothing to emit to avoid creating empty sections. + if (JumpTableIndices.empty()) + return; const TargetLoweringObjectFile &TLOF = getObjFileLowering(); MCSection *ReadOnlySec = TLOF.getSectionForJumpTable(MF->getFunction(), TM); OutStreamer->switchSection(ReadOnlySec); + const std::vector<MachineJumpTableEntry> &JT = MJTI.getJumpTables(); auto AFI = MF->getInfo<AArch64FunctionInfo>(); - for (unsigned JTI = 0, e = JT.size(); JTI != e; ++JTI) { + for (unsigned JTI : JumpTableIndices) { const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs; // If this jump table was deleted, ignore it. diff --git a/llvm/test/CodeGen/AArch64/jump-table-partition.ll b/llvm/test/CodeGen/AArch64/jump-table-partition.ll index 122bbaef09185a2..e0525d0384a978e 100644 --- a/llvm/test/CodeGen/AArch64/jump-table-partition.ll +++ b/llvm/test/CodeGen/AArch64/jump-table-partition.ll @@ -37,26 +37,29 @@ ; A function's section prefix is used for all jump tables of this function. ; @foo is hot so its jump table data section has a hot prefix. -; NUM: .section .rodata.hot.,"a",@progbits,unique,2 +; NUM: .section .rodata.hot.,"a",@progbits,unique,2 ; FUNC: .section .rodata.hot.foo,"a",@progbits ; FUNCLESS: .section .rodata.hot.,"a",@progbits ; JT: .LJTI0_0: -; JT: .LJTI0_1: ; JT: .LJTI0_2: +; NUM: .section .rodata.hot.,"a",@progbits,unique,3 +; FUNC-NOT: .section .rodata.hot.foo +; FUNCLESS-NOT: .section .rodata.hot.,"a",@progbits +; JT: .LJTI0_1: ; JT: .LJTI0_3: ; func_without_profile doesn't have profiles, so its jumptable doesn't have ; hotness-based prefix. -; NUM: .section .rodata,"a",@progbits,unique,4 -; FUNC: .section .rodata.func_without_profile,"a",@progbits -; FUNCLESS: .section .rodata,"a",@progbits +; NUM: .section .rodata,"a",@progbits,unique,5 +; FUNC: .section .rodata.func_without_profile,"a",@progbits +; FUNCLESS: .section .rodata,"a",@progbits ; JT: .LJTI1_0: ; @bar doesn't have profile information and it has a section prefix. ; Tests that its jump tables are placed in sections with function prefixes. -; NUM: .section .rodata.bar_prefix.,"a",@progbits,unique, -; FUNC: .section .rodata.bar_prefix.bar -; FUNCLESS: .section .rodata.bar_prefix.,"a" +; NUM: .section .rodata.bar_prefix.,"a",@progbits,unique,7 +; FUNC: .section .rodata.bar_prefix.bar +; FUNCLESS: .section .rodata.bar_prefix.,"a" ; JT: .LJTI2_0 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" `````````` </details> https://github.com/llvm/llvm-project/pull/125993 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits