mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-26 23:29:22 +00:00
Move getJTISymbol from MachineJumpTableInfo to MachineFunction,
which is more convenient, and change getPICJumpTableRelocBaseExpr to take a MachineFunction to match. Next, move the X86 code that create a PICBase symbol to X86TargetLowering::getPICBaseSymbol from X86MCInstLower::GetPICBaseSymbol, which was an asmprinter specific library. This eliminates a 'gross hack', and allows us to implement X86ISelLowering::getPICJumpTableRelocBaseExpr which now calls it. This in turn allows us to eliminate the X86AsmPrinter::printPICJumpTableSetLabel method, which was the only overload of printPICJumpTableSetLabel. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94526 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
beeb93e6ba
commit
589c6f620e
@ -376,6 +376,17 @@ public:
|
||||
extractStoreMemRefs(MachineInstr::mmo_iterator Begin,
|
||||
MachineInstr::mmo_iterator End);
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Label Manipulation.
|
||||
//
|
||||
|
||||
/// 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;
|
||||
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Debug location.
|
||||
//
|
||||
|
@ -91,12 +91,6 @@ public:
|
||||
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.
|
||||
void RemoveJumpTable(unsigned Idx) {
|
||||
|
@ -776,7 +776,7 @@ public:
|
||||
/// given PIC jumptable, the same as getPICJumpTableRelocBase, but as an
|
||||
/// MCExpr.
|
||||
virtual const MCExpr *
|
||||
getPICJumpTableRelocBaseExpr(const MachineJumpTableInfo *MJTI,
|
||||
getPICJumpTableRelocBaseExpr(const MachineFunction *MF,
|
||||
unsigned JTI, MCContext &Ctx) const;
|
||||
|
||||
/// isOffsetFoldingLegal - Return true if folding a constant offset
|
||||
|
@ -1391,7 +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 {
|
||||
return MF->getJumpTableInfo()->getJTISymbol(JTID, OutContext,isLinkerPrivate);
|
||||
return MF->getJTISymbol(JTID, OutContext, isLinkerPrivate);
|
||||
}
|
||||
|
||||
/// GetJTSetSymbol - Return the symbol for the specified jump table .set
|
||||
@ -1546,12 +1546,11 @@ void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock *MBB) const {
|
||||
/// specified MachineBasicBlock for a jumptable entry.
|
||||
void AsmPrinter::printPICJumpTableSetLabel(unsigned uid,
|
||||
const MachineBasicBlock *MBB) const {
|
||||
const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
|
||||
const TargetLowering *TLI = TM.getTargetLowering();
|
||||
O << MAI->getSetDirective() << ' ' << MAI->getPrivateGlobalPrefix()
|
||||
<< *GetJTSetSymbol(uid, MBB->getNumber()) << ','
|
||||
<< *MBB->getSymbol(OutContext) << '-'
|
||||
<< *TLI->getPICJumpTableRelocBaseExpr(MJTI,uid,OutContext)
|
||||
<< *TLI->getPICJumpTableRelocBaseExpr(MF, uid, OutContext)
|
||||
<< '\n';
|
||||
}
|
||||
|
||||
|
@ -445,6 +445,27 @@ DILocation MachineFunction::getDILocation(DebugLoc DL) const {
|
||||
return DILocation(DebugLocInfo.DebugLocations[Idx]);
|
||||
}
|
||||
|
||||
|
||||
/// 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 *MachineFunction::getJTISymbol(unsigned JTI, MCContext &Ctx,
|
||||
bool isLinkerPrivate) const {
|
||||
assert(JumpTableInfo && "No jump tables");
|
||||
|
||||
const std::vector<MachineJumpTableEntry> &JTs =JumpTableInfo->getJumpTables();
|
||||
assert(JTI < JTs.size() && "Invalid JTI!");
|
||||
const MCAsmInfo &MAI = *getTarget().getMCAsmInfo();
|
||||
|
||||
const char *Prefix = isLinkerPrivate ? MAI.getLinkerPrivateGlobalPrefix() :
|
||||
MAI.getPrivateGlobalPrefix();
|
||||
SmallString<60> Name;
|
||||
raw_svector_ostream(Name)
|
||||
<< Prefix << "JTI" << getFunctionNumber() << '_' << JTI;
|
||||
return Ctx.GetOrCreateSymbol(Name.str());
|
||||
}
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// MachineFrameInfo implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -581,24 +602,6 @@ 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.
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineJumpTableInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
@ -823,11 +824,10 @@ SDValue TargetLowering::getPICJumpTableRelocBase(SDValue Table,
|
||||
/// given PIC jumptable, the same as getPICJumpTableRelocBase, but as an
|
||||
/// MCExpr.
|
||||
const MCExpr *
|
||||
TargetLowering::getPICJumpTableRelocBaseExpr(const MachineJumpTableInfo *MJTI,
|
||||
unsigned JTI,
|
||||
MCContext &Ctx) const {
|
||||
TargetLowering::getPICJumpTableRelocBaseExpr(const MachineFunction *MF,
|
||||
unsigned JTI,MCContext &Ctx) const{
|
||||
// The normal PIC reloc base is the label at the start of the jump table.
|
||||
return MCSymbolRefExpr::Create(MJTI->getJTISymbol(JTI, Ctx), Ctx);
|
||||
return MCSymbolRefExpr::Create(MF->getJTISymbol(JTI, Ctx), Ctx);
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -58,9 +58,9 @@ void X86AsmPrinter::printMCInst(const MCInst *MI) {
|
||||
}
|
||||
|
||||
void X86AsmPrinter::PrintPICBaseSymbol() const {
|
||||
// FIXME: Gross const cast hack.
|
||||
X86AsmPrinter *AP = const_cast<X86AsmPrinter*>(this);
|
||||
O << *X86MCInstLower(OutContext, 0, *AP).GetPICBaseSymbol();
|
||||
const TargetLowering *TLI = TM.getTargetLowering();
|
||||
O << *static_cast<const X86TargetLowering*>(TLI)->getPICBaseSymbol(MF,
|
||||
OutContext);
|
||||
}
|
||||
|
||||
void X86AsmPrinter::emitFunctionHeader(const MachineFunction &MF) {
|
||||
@ -453,21 +453,6 @@ void X86AsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op,
|
||||
printLeaMemReference(MI, Op, Modifier);
|
||||
}
|
||||
|
||||
void X86AsmPrinter::printPICJumpTableSetLabel(unsigned uid,
|
||||
const MachineBasicBlock *MBB) const {
|
||||
O << MAI->getSetDirective() << ' ' << *GetJTSetSymbol(uid, MBB->getNumber())
|
||||
<< ',' << *MBB->getSymbol(OutContext);
|
||||
|
||||
if (Subtarget->isPICStyleRIPRel())
|
||||
O << '-' << *GetJTISymbol(uid) << '\n';
|
||||
else {
|
||||
O << '-';
|
||||
PrintPICBaseSymbol();
|
||||
O << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void X86AsmPrinter::printPICLabel(const MachineInstr *MI, unsigned Op) {
|
||||
PrintPICBaseSymbol();
|
||||
O << '\n';
|
||||
|
@ -124,8 +124,6 @@ class VISIBILITY_HIDDEN X86AsmPrinter : public AsmPrinter {
|
||||
const char *Modifier=NULL);
|
||||
void printLeaMemReference(const MachineInstr *MI, unsigned Op,
|
||||
const char *Modifier=NULL);
|
||||
void printPICJumpTableSetLabel(unsigned uid,
|
||||
const MachineBasicBlock *MBB) const;
|
||||
|
||||
void printPICLabel(const MachineInstr *MI, unsigned Op);
|
||||
|
||||
|
@ -39,8 +39,9 @@ MachineModuleInfoMachO &X86MCInstLower::getMachOMMI() const {
|
||||
|
||||
|
||||
MCSymbol *X86MCInstLower::GetPICBaseSymbol() const {
|
||||
return Ctx.GetOrCreateSymbol(Twine(AsmPrinter.MAI->getPrivateGlobalPrefix())+
|
||||
Twine(AsmPrinter.getFunctionNumber())+"$pb");
|
||||
const TargetLowering *TLI = AsmPrinter.TM.getTargetLowering();
|
||||
return static_cast<const X86TargetLowering*>(TLI)->
|
||||
getPICBaseSymbol(AsmPrinter.MF, Ctx);
|
||||
}
|
||||
|
||||
/// LowerGlobalAddressOperand - Lower an MO_GlobalAddress operand to an
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/PseudoSourceValue.h"
|
||||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
@ -1108,6 +1109,16 @@ unsigned X86TargetLowering::getJumpTableEncoding() const {
|
||||
return TargetLowering::getJumpTableEncoding();
|
||||
}
|
||||
|
||||
/// getPICBaseSymbol - Return the X86-32 PIC base.
|
||||
MCSymbol *
|
||||
X86TargetLowering::getPICBaseSymbol(const MachineFunction *MF,
|
||||
MCContext &Ctx) const {
|
||||
const MCAsmInfo &MAI = *getTargetMachine().getMCAsmInfo();
|
||||
return Ctx.GetOrCreateSymbol(Twine(MAI.getPrivateGlobalPrefix())+
|
||||
Twine(MF->getFunctionNumber())+"$pb");
|
||||
}
|
||||
|
||||
|
||||
const MCExpr *
|
||||
X86TargetLowering::LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI,
|
||||
const MachineBasicBlock *MBB,
|
||||
@ -1134,6 +1145,20 @@ SDValue X86TargetLowering::getPICJumpTableRelocBase(SDValue Table,
|
||||
return Table;
|
||||
}
|
||||
|
||||
/// getPICJumpTableRelocBaseExpr - This returns the relocation base for the
|
||||
/// given PIC jumptable, the same as getPICJumpTableRelocBase, but as an
|
||||
/// MCExpr.
|
||||
const MCExpr *X86TargetLowering::
|
||||
getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI,
|
||||
MCContext &Ctx) const {
|
||||
// X86-64 uses RIP relative addressing based on the jump table label.
|
||||
if (Subtarget->isPICStyleRIPRel())
|
||||
return TargetLowering::getPICJumpTableRelocBaseExpr(MF, JTI, Ctx);
|
||||
|
||||
// Otherwise, the reference is relative to the PIC base.
|
||||
return MCSymbolRefExpr::Create(getPICBaseSymbol(MF, Ctx), Ctx);
|
||||
}
|
||||
|
||||
/// getFunctionAlignment - Return the Log2 alignment of this function.
|
||||
unsigned X86TargetLowering::getFunctionAlignment(const Function *F) const {
|
||||
return F->hasFnAttr(Attribute::OptimizeForSize) ? 0 : 4;
|
||||
|
@ -376,6 +376,9 @@ namespace llvm {
|
||||
public:
|
||||
explicit X86TargetLowering(X86TargetMachine &TM);
|
||||
|
||||
/// getPICBaseSymbol - Return the X86-32 PIC base.
|
||||
MCSymbol *getPICBaseSymbol(const MachineFunction *MF, MCContext &Ctx) const;
|
||||
|
||||
virtual unsigned getJumpTableEncoding() const;
|
||||
|
||||
virtual const MCExpr *
|
||||
@ -387,6 +390,9 @@ namespace llvm {
|
||||
/// jumptable.
|
||||
virtual SDValue getPICJumpTableRelocBase(SDValue Table,
|
||||
SelectionDAG &DAG) const;
|
||||
virtual const MCExpr *
|
||||
getPICJumpTableRelocBaseExpr(const MachineFunction *MF,
|
||||
unsigned JTI, MCContext &Ctx) const;
|
||||
|
||||
// Return the number of bytes that a function should pop when it returns (in
|
||||
// addition to the space used by the return address).
|
||||
|
Loading…
Reference in New Issue
Block a user