mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-17 03:07:06 +00:00
implement X86 @GOTOFF jump table entries with the new EK_Custom32
jump table entry kind, instead of overloading AsmPrinter::printPICJumpTableEntry. This has a pretty horrible and inefficient FIXME around how @GOTOFF is currently smashed into the mcsymbol name, but otherwise this is much cleaner. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94516 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f71cb015c1
commit
c64daabb70
@ -484,23 +484,6 @@ void X86AsmPrinter::printPICLabel(const MachineInstr *MI, unsigned Op) {
|
||||
O << ':';
|
||||
}
|
||||
|
||||
void X86AsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI,
|
||||
const MachineBasicBlock *MBB,
|
||||
unsigned uid) const {
|
||||
const char *JTEntryDirective = MJTI->getEntrySize(*TM.getTargetData()) == 4 ?
|
||||
MAI->getData32bitsDirective() : MAI->getData64bitsDirective();
|
||||
|
||||
O << JTEntryDirective << ' ';
|
||||
|
||||
if (Subtarget->isPICStyleRIPRel() || Subtarget->isPICStyleStubPIC()) {
|
||||
O << *GetJTSetSymbol(uid, MBB->getNumber());
|
||||
} else if (Subtarget->isPICStyleGOT())
|
||||
O << *MBB->getSymbol(OutContext) << "@GOTOFF";
|
||||
else // mdynamic-no-pic
|
||||
O << *MBB->getSymbol(OutContext);
|
||||
O << '\n';
|
||||
}
|
||||
|
||||
bool X86AsmPrinter::printAsmMRegister(const MachineOperand &MO, char Mode) {
|
||||
unsigned Reg = MO.getReg();
|
||||
switch (Mode) {
|
||||
|
@ -126,9 +126,6 @@ class VISIBILITY_HIDDEN X86AsmPrinter : public AsmPrinter {
|
||||
const char *Modifier=NULL);
|
||||
void printPICJumpTableSetLabel(unsigned uid,
|
||||
const MachineBasicBlock *MBB) const;
|
||||
void printPICJumpTableEntry(const MachineJumpTableInfo *MJTI,
|
||||
const MachineBasicBlock *MBB,
|
||||
unsigned uid) const;
|
||||
|
||||
void printPICLabel(const MachineInstr *MI, unsigned Op);
|
||||
|
||||
|
@ -26,8 +26,6 @@
|
||||
#include "llvm/Instructions.h"
|
||||
#include "llvm/Intrinsics.h"
|
||||
#include "llvm/LLVMContext.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/VectorExtras.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
@ -35,13 +33,18 @@
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/PseudoSourceValue.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/SmallSet.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/ADT/VectorExtras.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
using namespace llvm;
|
||||
|
||||
@ -1099,12 +1102,26 @@ unsigned X86TargetLowering::getJumpTableEncoding() const {
|
||||
// symbol.
|
||||
if (getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
|
||||
Subtarget->isPICStyleGOT())
|
||||
return MachineJumpTableInfo::EK_GPRel32BlockAddress;
|
||||
return MachineJumpTableInfo::EK_Custom32;
|
||||
|
||||
// Otherwise, use the normal jump table encoding heuristics.
|
||||
return TargetLowering::getJumpTableEncoding();
|
||||
}
|
||||
|
||||
const MCExpr *
|
||||
X86TargetLowering::LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI,
|
||||
const MachineBasicBlock *MBB,
|
||||
unsigned uid,MCContext &Ctx) const{
|
||||
assert(getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
|
||||
Subtarget->isPICStyleGOT());
|
||||
// In 32-bit ELF systems, our jump table entries are formed with @GOTOFF
|
||||
// entries.
|
||||
|
||||
// FIXME: @GOTOFF should be a property of MCSymbolRefExpr not in the MCSymbol.
|
||||
std::string Name = MBB->getSymbol(Ctx)->getName() + "@GOTOFF";
|
||||
return MCSymbolRefExpr::Create(Ctx.GetOrCreateSymbol(StringRef(Name)), Ctx);
|
||||
}
|
||||
|
||||
/// getPICJumpTableRelocaBase - Returns relocation base for the given PIC
|
||||
/// jumptable.
|
||||
SDValue X86TargetLowering::getPICJumpTableRelocBase(SDValue Table,
|
||||
|
@ -376,12 +376,17 @@ namespace llvm {
|
||||
public:
|
||||
explicit X86TargetLowering(X86TargetMachine &TM);
|
||||
|
||||
unsigned getJumpTableEncoding() const;
|
||||
virtual unsigned getJumpTableEncoding() const;
|
||||
|
||||
virtual const MCExpr *
|
||||
LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI,
|
||||
const MachineBasicBlock *MBB, unsigned uid,
|
||||
MCContext &Ctx) const;
|
||||
|
||||
/// getPICJumpTableRelocaBase - Returns relocation base for the given PIC
|
||||
/// jumptable.
|
||||
SDValue getPICJumpTableRelocBase(SDValue Table,
|
||||
SelectionDAG &DAG) const;
|
||||
virtual SDValue getPICJumpTableRelocBase(SDValue Table,
|
||||
SelectionDAG &DAG) 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