From beeb93e6ba48af2661eabc4872d8b159fb43e5db Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 26 Jan 2010 05:58:28 +0000 Subject: [PATCH] add a new MachineJumpTableInfo::getJTISymbol method, use it to implement the default TargetLowering::getPICJumpTableRelocBaseExpr git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94523 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/MachineJumpTableInfo.h | 6 ++++ lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 18 +++++------ lib/CodeGen/MachineFunction.cpp | 36 ++++++++++++++++----- lib/CodeGen/SelectionDAG/TargetLowering.cpp | 6 ++-- 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/include/llvm/CodeGen/MachineJumpTableInfo.h b/include/llvm/CodeGen/MachineJumpTableInfo.h index 7d47714fd24..87c2b0bf58c 100644 --- a/include/llvm/CodeGen/MachineJumpTableInfo.h +++ b/include/llvm/CodeGen/MachineJumpTableInfo.h @@ -90,6 +90,12 @@ public: const std::vector &getJumpTables() const { return JumpTables; } + + /// getJTISymbol - Return the MCSymbol for the specified non-empty jump table. + /// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a + /// normal 'L' label is returned. + MCSymbol *getJTISymbol(unsigned JTI, MCContext &Ctx, + bool isLinkerPrivate = false) const; /// RemoveJumpTable - Mark the specific index as being dead. This will /// prevent it from being emitted. diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index c1b45c3917c..35a77db43d0 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -527,6 +527,8 @@ void AsmPrinter::EmitJumpTableInfo(MachineFunction &MF) { // the assembler and linker the extents of the jump table object. The // second label is actually referenced by the code. if (JTInDiffSection && MAI->getLinkerPrivateGlobalPrefix()[0]) + // FIXME: This doesn't have to have any specific name, just any randomly + // named and numbered 'l' label would work. Simplify GetJTISymbol. OutStreamer.EmitLabel(GetJTISymbol(i, true)); OutStreamer.EmitLabel(GetJTISymbol(i)); @@ -1389,12 +1391,7 @@ MCSymbol *AsmPrinter::GetCPISymbol(unsigned CPID) const { /// GetJTISymbol - Return the symbol for the specified jump table entry. MCSymbol *AsmPrinter::GetJTISymbol(unsigned JTID, bool isLinkerPrivate) const { - const char *Prefix = isLinkerPrivate ? MAI->getLinkerPrivateGlobalPrefix() : - MAI->getPrivateGlobalPrefix(); - SmallString<60> Name; - raw_svector_ostream(Name) << Prefix << "JTI" << getFunctionNumber() << '_' - << JTID; - return OutContext.GetOrCreateSymbol(Name.str()); + return MF->getJumpTableInfo()->getJTISymbol(JTID, OutContext,isLinkerPrivate); } /// GetJTSetSymbol - Return the symbol for the specified jump table .set @@ -1549,12 +1546,13 @@ void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock *MBB) const { /// specified MachineBasicBlock for a jumptable entry. void AsmPrinter::printPICJumpTableSetLabel(unsigned uid, const MachineBasicBlock *MBB) const { - if (!MAI->getSetDirective()) - return; - + const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo(); + const TargetLowering *TLI = TM.getTargetLowering(); O << MAI->getSetDirective() << ' ' << MAI->getPrivateGlobalPrefix() << *GetJTSetSymbol(uid, MBB->getNumber()) << ',' - << *MBB->getSymbol(OutContext) << '-' << *GetJTISymbol(uid) << '\n'; + << *MBB->getSymbol(OutContext) << '-' + << *TLI->getPICJumpTableRelocBaseExpr(MJTI,uid,OutContext) + << '\n'; } void AsmPrinter::printVisibility(MCSymbol *Sym, unsigned Visibility) const { diff --git a/lib/CodeGen/MachineFunction.cpp b/lib/CodeGen/MachineFunction.cpp index faffe145e1f..deb639d542f 100644 --- a/lib/CodeGen/MachineFunction.cpp +++ b/lib/CodeGen/MachineFunction.cpp @@ -16,7 +16,6 @@ #include "llvm/DerivedTypes.h" #include "llvm/Function.h" #include "llvm/Instructions.h" -#include "llvm/ADT/STLExtras.h" #include "llvm/Config/config.h" #include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineFunction.h" @@ -26,12 +25,16 @@ #include "llvm/CodeGen/MachineJumpTableInfo.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/Passes.h" +#include "llvm/MC/MCAsmInfo.h" +#include "llvm/MC/MCContext.h" #include "llvm/Analysis/DebugInfo.h" #include "llvm/Support/Debug.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetLowering.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetFrameInfo.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/Support/GraphWriter.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; @@ -578,11 +581,29 @@ unsigned MachineJumpTableInfo::getJumpTableIndex( return JumpTables.size()-1; } +/// getJTISymbol - Return the MCSymbol for the specified non-empty jump table. +/// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a +/// normal 'L' label is returned. +MCSymbol *MachineJumpTableInfo::getJTISymbol(unsigned JTI, MCContext &Ctx, + bool isLinkerPrivate) const { + assert(JTI < JumpTables.size() && !JumpTables[JTI].MBBs.empty() && + "Invalid JTI!"); + const MachineFunction *MF = JumpTables[JTI].MBBs[0]->getParent(); + const MCAsmInfo &MAI = *MF->getTarget().getMCAsmInfo(); + + const char *Prefix = isLinkerPrivate ? MAI.getLinkerPrivateGlobalPrefix() : + MAI.getPrivateGlobalPrefix(); + SmallString<60> Name; + raw_svector_ostream(Name) + << Prefix << "JTI" << MF->getFunctionNumber() << '_' << JTI; + return Ctx.GetOrCreateSymbol(Name.str()); +} + + /// ReplaceMBBInJumpTables - If Old is the target of any jump tables, update /// the jump tables to branch to New instead. -bool -MachineJumpTableInfo::ReplaceMBBInJumpTables(MachineBasicBlock *Old, - MachineBasicBlock *New) { +bool MachineJumpTableInfo::ReplaceMBBInJumpTables(MachineBasicBlock *Old, + MachineBasicBlock *New) { assert(Old != New && "Not making a change?"); bool MadeChange = false; for (size_t i = 0, e = JumpTables.size(); i != e; ++i) @@ -592,10 +613,9 @@ MachineJumpTableInfo::ReplaceMBBInJumpTables(MachineBasicBlock *Old, /// ReplaceMBBInJumpTable - If Old is a target of the jump tables, update /// the jump table to branch to New instead. -bool -MachineJumpTableInfo::ReplaceMBBInJumpTable(unsigned Idx, - MachineBasicBlock *Old, - MachineBasicBlock *New) { +bool MachineJumpTableInfo::ReplaceMBBInJumpTable(unsigned Idx, + MachineBasicBlock *Old, + MachineBasicBlock *New) { assert(Old != New && "Not making a change?"); bool MadeChange = false; MachineJumpTableEntry &JTE = JumpTables[Idx]; diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 34a31788ed0..ccdedded90d 100644 --- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -13,6 +13,7 @@ #include "llvm/Target/TargetLowering.h" #include "llvm/MC/MCAsmInfo.h" +#include "llvm/MC/MCExpr.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Target/TargetMachine.h" @@ -812,6 +813,7 @@ unsigned TargetLowering::getJumpTableEncoding() const { SDValue TargetLowering::getPICJumpTableRelocBase(SDValue Table, SelectionDAG &DAG) const { + // FIXME: Eliminate usesGlobalOffsetTable() in favor of JTEntryKind. if (usesGlobalOffsetTable()) return DAG.getGLOBAL_OFFSET_TABLE(getPointerTy()); return Table; @@ -824,10 +826,10 @@ const MCExpr * TargetLowering::getPICJumpTableRelocBaseExpr(const MachineJumpTableInfo *MJTI, unsigned JTI, MCContext &Ctx) const { - assert(0 && "FIXME: IMPLEMENT ME"); + // The normal PIC reloc base is the label at the start of the jump table. + return MCSymbolRefExpr::Create(MJTI->getJTISymbol(JTI, Ctx), Ctx); } - bool TargetLowering::isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const { // Assume that everything is safe in static mode. -- 2.34.1