mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-23 04:28:30 +00:00
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
This commit is contained in:
parent
13e97a29d9
commit
beeb93e6ba
@ -90,6 +90,12 @@ public:
|
||||
const std::vector<MachineJumpTableEntry> &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.
|
||||
|
@ -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 {
|
||||
|
@ -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];
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user