diff --git a/llvm/lib/Target/LoongArch/LoongArchAsmPrinter.cpp b/llvm/lib/Target/LoongArch/LoongArchAsmPrinter.cpp index 0672570c4dcd0..9181e539f75cb 100644 --- a/llvm/lib/Target/LoongArch/LoongArchAsmPrinter.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchAsmPrinter.cpp @@ -265,13 +265,16 @@ void LoongArchAsmPrinter::emitJumpTableInfo() { assert(TM.getTargetTriple().isOSBinFormatELF()); - unsigned Size = getDataLayout().getPointerSize(); auto *LAFI = MF->getInfo(); unsigned EntrySize = LAFI->getJumpInfoSize(); + auto JTI = MF->getJumpTableInfo(); - if (0 == EntrySize) + if (!JTI || 0 == EntrySize) return; + unsigned Size = getDataLayout().getPointerSize(); + auto JT = JTI->getJumpTables(); + // Emit an additional section to store the correlation info as pairs of // addresses, each pair contains the address of a jump instruction (jr) and // the address of the jump table. @@ -279,14 +282,15 @@ void LoongArchAsmPrinter::emitJumpTableInfo() { ".discard.tablejump_annotate", ELF::SHT_PROGBITS, 0)); for (unsigned Idx = 0; Idx < EntrySize; ++Idx) { + int JTIIdx = LAFI->getJumpInfoJTIIndex(Idx); + if (JT[JTIIdx].MBBs.empty()) + continue; OutStreamer->emitValue( MCSymbolRefExpr::create(LAFI->getJumpInfoJrMI(Idx)->getPreInstrSymbol(), OutContext), Size); OutStreamer->emitValue( - MCSymbolRefExpr::create( - GetJTISymbol(LAFI->getJumpInfoJTIMO(Idx)->getIndex()), OutContext), - Size); + MCSymbolRefExpr::create(GetJTISymbol(JTIIdx), OutContext), Size); } } diff --git a/llvm/lib/Target/LoongArch/LoongArchExpandPseudoInsts.cpp b/llvm/lib/Target/LoongArch/LoongArchExpandPseudoInsts.cpp index 9e9c65a041bf7..7aef4ab53e4ea 100644 --- a/llvm/lib/Target/LoongArch/LoongArchExpandPseudoInsts.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchExpandPseudoInsts.cpp @@ -636,7 +636,8 @@ void LoongArchPreRAExpandPseudo::annotateTableJump( if (MO.isJTI()) { MBBI->setPreInstrSymbol( *MF, MF->getContext().createNamedTempSymbol("jrtb_")); - MF->getInfo()->setJumpInfo(&*MBBI, &MO); + MF->getInfo()->setJumpInfo( + &*MBBI, MO.getIndex()); IsFound = true; return; } diff --git a/llvm/lib/Target/LoongArch/LoongArchMachineFunctionInfo.h b/llvm/lib/Target/LoongArch/LoongArchMachineFunctionInfo.h index daa47c4dc7e32..904985c189dba 100644 --- a/llvm/lib/Target/LoongArch/LoongArchMachineFunctionInfo.h +++ b/llvm/lib/Target/LoongArch/LoongArchMachineFunctionInfo.h @@ -41,7 +41,7 @@ class LoongArchMachineFunctionInfo : public MachineFunctionInfo { /// Pairs of `jr` instructions and corresponding JTI operands, used for the /// `annotate-tablejump` option. - SmallVector, 4> JumpInfos; + SmallVector, 4> JumpInfos; public: LoongArchMachineFunctionInfo(const Function &F, @@ -76,14 +76,12 @@ class LoongArchMachineFunctionInfo : public MachineFunctionInfo { return is_contained(SExt32Registers, Reg); } - void setJumpInfo(MachineInstr *JrMI, MachineOperand *JTIMO) { - JumpInfos.push_back(std::make_pair(JrMI, JTIMO)); + void setJumpInfo(MachineInstr *JrMI, int JTIIdx) { + JumpInfos.push_back(std::make_pair(JrMI, JTIIdx)); } unsigned getJumpInfoSize() { return JumpInfos.size(); } MachineInstr *getJumpInfoJrMI(unsigned Idx) { return JumpInfos[Idx].first; } - MachineOperand *getJumpInfoJTIMO(unsigned Idx) { - return JumpInfos[Idx].second; - } + int getJumpInfoJTIIndex(unsigned Idx) { return JumpInfos[Idx].second; } }; } // end namespace llvm