mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-12 13:30:51 +00:00
Overhaul my earlier submission due to feedback. It's a large patch, but most of
them are generic changes. - Use the "fast" flag that's already being passed into the asm printers instead of shoving it into the DwarfWriter. - Instead of calling "MI->getParent()->getParent()" for every MI, set the machine function when calling "runOnMachineFunction" in the asm printers. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@65379 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3d8bde8dfb
commit
57f0db833d
@ -65,6 +65,8 @@ namespace llvm {
|
||||
// Necessary for external weak linkage support
|
||||
std::set<const GlobalValue*> ExtWeakSymbols;
|
||||
|
||||
/// Fast - Generating code via fast instruction selection.
|
||||
bool Fast;
|
||||
public:
|
||||
/// Output stream on which we're printing assembly code.
|
||||
///
|
||||
@ -82,6 +84,9 @@ namespace llvm {
|
||||
///
|
||||
const TargetRegisterInfo *TRI;
|
||||
|
||||
/// The current machine function.
|
||||
const MachineFunction *MF;
|
||||
|
||||
/// Name-mangler for global names.
|
||||
///
|
||||
Mangler *Mang;
|
||||
@ -101,7 +106,8 @@ namespace llvm {
|
||||
bool IsInTextSection;
|
||||
|
||||
protected:
|
||||
AsmPrinter(raw_ostream &o, TargetMachine &TM, const TargetAsmInfo *T);
|
||||
AsmPrinter(raw_ostream &o, TargetMachine &TM,
|
||||
const TargetAsmInfo *T, bool F);
|
||||
|
||||
public:
|
||||
virtual ~AsmPrinter();
|
||||
|
@ -49,9 +49,6 @@ private:
|
||||
///
|
||||
DwarfException *DE;
|
||||
|
||||
/// FastCodeGen - True if generating code via the "fast" isel.
|
||||
///
|
||||
bool FastCodeGen;
|
||||
public:
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
|
||||
@ -107,9 +104,6 @@ public:
|
||||
/// ShouldEmitDwarfDebug - Returns true if Dwarf debugging declarations should
|
||||
/// be emitted.
|
||||
bool ShouldEmitDwarfDebug() const;
|
||||
|
||||
bool getFastCodeGen() const { return FastCodeGen; }
|
||||
void setFastCodeGen(bool Fast) { FastCodeGen = Fast; }
|
||||
};
|
||||
|
||||
|
||||
|
@ -37,8 +37,8 @@ using namespace llvm;
|
||||
|
||||
char AsmPrinter::ID = 0;
|
||||
AsmPrinter::AsmPrinter(raw_ostream &o, TargetMachine &tm,
|
||||
const TargetAsmInfo *T)
|
||||
: MachineFunctionPass(&ID), FunctionNumber(0), O(o),
|
||||
const TargetAsmInfo *T, bool F)
|
||||
: MachineFunctionPass(&ID), FunctionNumber(0), Fast(F), O(o),
|
||||
TM(tm), TAI(T), TRI(tm.getRegisterInfo()),
|
||||
IsInTextSection(false)
|
||||
{}
|
||||
|
@ -370,7 +370,6 @@ bool FastISel::SelectCall(User *I) {
|
||||
unsigned Line = Subprogram.getLineNumber();
|
||||
unsigned LabelID = DW->RecordSourceLine(Line, 0, SrcFile);
|
||||
setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(SrcFile, Line, 0)));
|
||||
DW->setFastCodeGen(true);
|
||||
|
||||
if (DW->getRecordSourceLineCount() != 1) {
|
||||
const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);
|
||||
|
@ -3915,7 +3915,6 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
|
||||
if (Fast)
|
||||
DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getCurDebugLoc(),
|
||||
getRoot(), LabelID));
|
||||
DW->setFastCodeGen(Fast);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -89,7 +89,9 @@ inline static const char *ARMCondCodeToString(ARMCC::CondCodes CC) {
|
||||
}
|
||||
|
||||
FunctionPass *createARMISelDag(ARMTargetMachine &TM);
|
||||
FunctionPass *createARMCodePrinterPass(raw_ostream &O, ARMTargetMachine &TM);
|
||||
FunctionPass *createARMCodePrinterPass(raw_ostream &O,
|
||||
ARMTargetMachine &TM,
|
||||
bool Fast);
|
||||
FunctionPass *createARMCodeEmitterPass(ARMTargetMachine &TM,
|
||||
MachineCodeEmitter &MCE);
|
||||
FunctionPass *createARMLoadStoreOptimizationPass();
|
||||
|
@ -157,7 +157,7 @@ bool ARMTargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast,
|
||||
// Output assembly language.
|
||||
assert(AsmPrinterCtor && "AsmPrinter was not linked in");
|
||||
if (AsmPrinterCtor)
|
||||
PM.add(AsmPrinterCtor(Out, *this));
|
||||
PM.add(AsmPrinterCtor(Out, *this, Fast));
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -174,7 +174,7 @@ bool ARMTargetMachine::addCodeEmitter(PassManagerBase &PM, bool Fast,
|
||||
if (DumpAsm) {
|
||||
assert(AsmPrinterCtor && "AsmPrinter was not linked in");
|
||||
if (AsmPrinterCtor)
|
||||
PM.add(AsmPrinterCtor(errs(), *this));
|
||||
PM.add(AsmPrinterCtor(errs(), *this, Fast));
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -187,7 +187,7 @@ bool ARMTargetMachine::addSimpleCodeEmitter(PassManagerBase &PM, bool Fast,
|
||||
if (DumpAsm) {
|
||||
assert(AsmPrinterCtor && "AsmPrinter was not linked in");
|
||||
if (AsmPrinterCtor)
|
||||
PM.add(AsmPrinterCtor(errs(), *this));
|
||||
PM.add(AsmPrinterCtor(errs(), *this, Fast));
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -40,7 +40,8 @@ protected:
|
||||
// To avoid having target depend on the asmprinter stuff libraries, asmprinter
|
||||
// set this functions to ctor pointer at startup time if they are linked in.
|
||||
typedef FunctionPass *(*AsmPrinterCtorFn)(raw_ostream &o,
|
||||
ARMTargetMachine &tm);
|
||||
ARMTargetMachine &tm,
|
||||
bool fast);
|
||||
static AsmPrinterCtorFn AsmPrinterCtor;
|
||||
|
||||
public:
|
||||
|
@ -42,13 +42,7 @@ using namespace llvm;
|
||||
STATISTIC(EmittedInsts, "Number of machine instrs printed");
|
||||
|
||||
namespace {
|
||||
struct VISIBILITY_HIDDEN ARMAsmPrinter : public AsmPrinter {
|
||||
ARMAsmPrinter(raw_ostream &O, TargetMachine &TM, const TargetAsmInfo *T)
|
||||
: AsmPrinter(O, TM, T), DW(0), MMI(NULL), AFI(NULL), MCP(NULL),
|
||||
InCPMode(false) {
|
||||
Subtarget = &TM.getSubtarget<ARMSubtarget>();
|
||||
}
|
||||
|
||||
class VISIBILITY_HIDDEN ARMAsmPrinter : public AsmPrinter {
|
||||
DwarfWriter *DW;
|
||||
MachineModuleInfo *MMI;
|
||||
|
||||
@ -85,7 +79,14 @@ namespace {
|
||||
|
||||
/// True if asm printer is printing a series of CONSTPOOL_ENTRY.
|
||||
bool InCPMode;
|
||||
|
||||
public:
|
||||
ARMAsmPrinter(raw_ostream &O, TargetMachine &TM,
|
||||
const TargetAsmInfo *T, bool F)
|
||||
: AsmPrinter(O, TM, T, F), DW(0), MMI(NULL), AFI(NULL), MCP(NULL),
|
||||
InCPMode(false) {
|
||||
Subtarget = &TM.getSubtarget<ARMSubtarget>();
|
||||
}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "ARM Assembly Printer";
|
||||
}
|
||||
@ -183,6 +184,8 @@ namespace {
|
||||
/// method to print assembly for each instruction.
|
||||
///
|
||||
bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
this->MF = &MF;
|
||||
|
||||
AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
MCP = MF.getConstantPool();
|
||||
|
||||
@ -1039,8 +1042,9 @@ bool ARMAsmPrinter::doFinalization(Module &M) {
|
||||
/// regardless of whether the function is in SSA form.
|
||||
///
|
||||
FunctionPass *llvm::createARMCodePrinterPass(raw_ostream &o,
|
||||
ARMTargetMachine &tm) {
|
||||
return new ARMAsmPrinter(o, tm, tm.getTargetAsmInfo());
|
||||
ARMTargetMachine &tm,
|
||||
bool fast) {
|
||||
return new ARMAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
@ -25,7 +25,8 @@ namespace llvm {
|
||||
|
||||
FunctionPass *createAlphaISelDag(AlphaTargetMachine &TM);
|
||||
FunctionPass *createAlphaCodePrinterPass(raw_ostream &OS,
|
||||
TargetMachine &TM);
|
||||
TargetMachine &TM,
|
||||
bool Fast);
|
||||
FunctionPass *createAlphaPatternInstructionSelector(TargetMachine &TM);
|
||||
FunctionPass *createAlphaCodeEmitterPass(AlphaTargetMachine &TM,
|
||||
MachineCodeEmitter &MCE);
|
||||
|
@ -88,14 +88,14 @@ bool AlphaTargetMachine::addPreEmitPass(PassManagerBase &PM, bool Fast) {
|
||||
bool AlphaTargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast,
|
||||
raw_ostream &Out) {
|
||||
PM.add(createAlphaLLRPPass(*this));
|
||||
PM.add(createAlphaCodePrinterPass(Out, *this));
|
||||
PM.add(createAlphaCodePrinterPass(Out, *this, Fast));
|
||||
return false;
|
||||
}
|
||||
bool AlphaTargetMachine::addCodeEmitter(PassManagerBase &PM, bool Fast,
|
||||
bool DumpAsm, MachineCodeEmitter &MCE) {
|
||||
PM.add(createAlphaCodeEmitterPass(*this, MCE));
|
||||
if (DumpAsm)
|
||||
PM.add(createAlphaCodePrinterPass(errs(), *this));
|
||||
PM.add(createAlphaCodePrinterPass(errs(), *this, Fast));
|
||||
return false;
|
||||
}
|
||||
bool AlphaTargetMachine::addSimpleCodeEmitter(PassManagerBase &PM,
|
||||
|
@ -33,13 +33,12 @@ STATISTIC(EmittedInsts, "Number of machine instrs printed");
|
||||
|
||||
namespace {
|
||||
struct VISIBILITY_HIDDEN AlphaAsmPrinter : public AsmPrinter {
|
||||
|
||||
/// Unique incrementer for label values for referencing Global values.
|
||||
///
|
||||
|
||||
AlphaAsmPrinter(raw_ostream &o, TargetMachine &tm, const TargetAsmInfo *T)
|
||||
: AsmPrinter(o, tm, T) {
|
||||
}
|
||||
AlphaAsmPrinter(raw_ostream &o, TargetMachine &tm,
|
||||
const TargetAsmInfo *T, bool F)
|
||||
: AsmPrinter(o, tm, T, F) {}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "Alpha Assembly Printer";
|
||||
@ -68,8 +67,9 @@ namespace {
|
||||
/// regardless of whether the function is in SSA form.
|
||||
///
|
||||
FunctionPass *llvm::createAlphaCodePrinterPass(raw_ostream &o,
|
||||
TargetMachine &tm) {
|
||||
return new AlphaAsmPrinter(o, tm, tm.getTargetAsmInfo());
|
||||
TargetMachine &tm,
|
||||
bool fast) {
|
||||
return new AlphaAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast);
|
||||
}
|
||||
|
||||
#include "AlphaGenAsmWriter.inc"
|
||||
@ -139,6 +139,8 @@ void AlphaAsmPrinter::printOp(const MachineOperand &MO, bool IsCallOp) {
|
||||
/// method to print assembly for each instruction.
|
||||
///
|
||||
bool AlphaAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
this->MF = &MF;
|
||||
|
||||
SetupMachineFunction(MF);
|
||||
O << "\n\n";
|
||||
|
||||
|
@ -45,13 +45,12 @@ namespace {
|
||||
|
||||
const std::string bss_section(".bss");
|
||||
|
||||
struct VISIBILITY_HIDDEN SPUAsmPrinter : public AsmPrinter {
|
||||
class VISIBILITY_HIDDEN SPUAsmPrinter : public AsmPrinter {
|
||||
std::set<std::string> FnStubs, GVStubs;
|
||||
|
||||
SPUAsmPrinter(raw_ostream &O, TargetMachine &TM, const TargetAsmInfo *T) :
|
||||
AsmPrinter(O, TM, T)
|
||||
{
|
||||
}
|
||||
public:
|
||||
SPUAsmPrinter(raw_ostream &O, TargetMachine &TM,
|
||||
const TargetAsmInfo *T, bool F) :
|
||||
AsmPrinter(O, TM, T, F) {}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "STI CBEA SPU Assembly Printer";
|
||||
@ -285,17 +284,13 @@ namespace {
|
||||
};
|
||||
|
||||
/// LinuxAsmPrinter - SPU assembly printer, customized for Linux
|
||||
struct VISIBILITY_HIDDEN LinuxAsmPrinter : public SPUAsmPrinter {
|
||||
|
||||
class VISIBILITY_HIDDEN LinuxAsmPrinter : public SPUAsmPrinter {
|
||||
DwarfWriter *DW;
|
||||
MachineModuleInfo *MMI;
|
||||
|
||||
public:
|
||||
LinuxAsmPrinter(raw_ostream &O, SPUTargetMachine &TM,
|
||||
const TargetAsmInfo *T) :
|
||||
SPUAsmPrinter(O, TM, T),
|
||||
DW(0),
|
||||
MMI(0)
|
||||
{ }
|
||||
const TargetAsmInfo *T, bool F)
|
||||
: SPUAsmPrinter(O, TM, T, F), DW(0), MMI(0) {}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "STI CBEA SPU Assembly Printer";
|
||||
@ -427,6 +422,8 @@ void SPUAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
||||
bool
|
||||
LinuxAsmPrinter::runOnMachineFunction(MachineFunction &MF)
|
||||
{
|
||||
this->MF = &MF;
|
||||
|
||||
SetupMachineFunction(MF);
|
||||
O << "\n\n";
|
||||
|
||||
@ -613,6 +610,7 @@ bool LinuxAsmPrinter::doFinalization(Module &M) {
|
||||
/// that the Linux SPU assembler can deal with.
|
||||
///
|
||||
FunctionPass *llvm::createSPUAsmPrinterPass(raw_ostream &o,
|
||||
SPUTargetMachine &tm) {
|
||||
return new LinuxAsmPrinter(o, tm, tm.getTargetAsmInfo());
|
||||
SPUTargetMachine &tm,
|
||||
bool fast) {
|
||||
return new LinuxAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast);
|
||||
}
|
||||
|
@ -23,7 +23,9 @@ namespace llvm {
|
||||
class raw_ostream;
|
||||
|
||||
FunctionPass *createSPUISelDag(SPUTargetMachine &TM);
|
||||
FunctionPass *createSPUAsmPrinterPass(raw_ostream &o, SPUTargetMachine &tm);
|
||||
FunctionPass *createSPUAsmPrinterPass(raw_ostream &o,
|
||||
SPUTargetMachine &tm,
|
||||
bool fast);
|
||||
|
||||
/*--== Utility functions/predicates/etc used all over the place: --==*/
|
||||
//! Predicate test for a signed 10-bit value
|
||||
|
@ -90,6 +90,6 @@ SPUTargetMachine::addInstSelector(PassManagerBase &PM, bool Fast)
|
||||
|
||||
bool SPUTargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast,
|
||||
raw_ostream &Out) {
|
||||
PM.add(createSPUAsmPrinterPass(Out, *this));
|
||||
PM.add(createSPUAsmPrinterPass(Out, *this, Fast));
|
||||
return false;
|
||||
}
|
||||
|
@ -35,7 +35,9 @@ FunctionPass *createIA64BundlingPass(IA64TargetMachine &TM);
|
||||
/// using the given target machine description. This should work
|
||||
/// regardless of whether the function is in SSA form.
|
||||
///
|
||||
FunctionPass *createIA64CodePrinterPass(raw_ostream &o, IA64TargetMachine &tm);
|
||||
FunctionPass *createIA64CodePrinterPass(raw_ostream &o,
|
||||
IA64TargetMachine &tm,
|
||||
bool fast);
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
|
@ -34,12 +34,12 @@ using namespace llvm;
|
||||
STATISTIC(EmittedInsts, "Number of machine instrs printed");
|
||||
|
||||
namespace {
|
||||
struct IA64AsmPrinter : public AsmPrinter {
|
||||
class IA64AsmPrinter : public AsmPrinter {
|
||||
std::set<std::string> ExternalFunctionNames, ExternalObjectNames;
|
||||
|
||||
IA64AsmPrinter(raw_ostream &O, TargetMachine &TM, const TargetAsmInfo *T)
|
||||
: AsmPrinter(O, TM, T) {
|
||||
}
|
||||
public:
|
||||
IA64AsmPrinter(raw_ostream &O, TargetMachine &TM,
|
||||
const TargetAsmInfo *T, bool F)
|
||||
: AsmPrinter(O, TM, T, F) {}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "IA64 Assembly Printer";
|
||||
@ -124,6 +124,8 @@ namespace {
|
||||
/// method to print assembly for each instruction.
|
||||
///
|
||||
bool IA64AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
this->MF = &MF;
|
||||
|
||||
SetupMachineFunction(MF);
|
||||
O << "\n\n";
|
||||
|
||||
@ -365,6 +367,7 @@ bool IA64AsmPrinter::doFinalization(Module &M) {
|
||||
/// the given target machine description.
|
||||
///
|
||||
FunctionPass *llvm::createIA64CodePrinterPass(raw_ostream &o,
|
||||
IA64TargetMachine &tm) {
|
||||
return new IA64AsmPrinter(o, tm, tm.getTargetAsmInfo());
|
||||
IA64TargetMachine &tm,
|
||||
bool fast) {
|
||||
return new IA64AsmPrinter(o, tm, tm.getTargetAsmInfo(), fast);
|
||||
}
|
||||
|
@ -84,7 +84,7 @@ bool IA64TargetMachine::addPreEmitPass(PassManagerBase &PM, bool Fast) {
|
||||
}
|
||||
bool IA64TargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast,
|
||||
raw_ostream &Out) {
|
||||
PM.add(createIA64CodePrinterPass(Out, *this));
|
||||
PM.add(createIA64CodePrinterPass(Out, *this, Fast));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,8 @@ namespace llvm {
|
||||
FunctionPass *createMipsISelDag(MipsTargetMachine &TM);
|
||||
FunctionPass *createMipsDelaySlotFillerPass(MipsTargetMachine &TM);
|
||||
FunctionPass *createMipsCodePrinterPass(raw_ostream &OS,
|
||||
MipsTargetMachine &TM);
|
||||
MipsTargetMachine &TM,
|
||||
bool Fast);
|
||||
} // end namespace llvm;
|
||||
|
||||
// Defines symbolic names for Mips registers. This defines a mapping from
|
||||
|
@ -46,13 +46,12 @@ using namespace llvm;
|
||||
STATISTIC(EmittedInsts, "Number of machine instrs printed");
|
||||
|
||||
namespace {
|
||||
struct VISIBILITY_HIDDEN MipsAsmPrinter : public AsmPrinter {
|
||||
|
||||
class VISIBILITY_HIDDEN MipsAsmPrinter : public AsmPrinter {
|
||||
const MipsSubtarget *Subtarget;
|
||||
|
||||
public:
|
||||
MipsAsmPrinter(raw_ostream &O, MipsTargetMachine &TM,
|
||||
const TargetAsmInfo *T):
|
||||
AsmPrinter(O, TM, T) {
|
||||
const TargetAsmInfo *T, bool F)
|
||||
: AsmPrinter(O, TM, T, F) {
|
||||
Subtarget = &TM.getSubtarget<MipsSubtarget>();
|
||||
}
|
||||
|
||||
@ -91,9 +90,9 @@ namespace {
|
||||
/// using the given target machine description. This should work
|
||||
/// regardless of whether the function is in SSA form.
|
||||
FunctionPass *llvm::createMipsCodePrinterPass(raw_ostream &o,
|
||||
MipsTargetMachine &tm)
|
||||
{
|
||||
return new MipsAsmPrinter(o, tm, tm.getTargetAsmInfo());
|
||||
MipsTargetMachine &tm,
|
||||
bool fast) {
|
||||
return new MipsAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -266,6 +265,8 @@ emitFunctionEnd(MachineFunction &MF)
|
||||
bool MipsAsmPrinter::
|
||||
runOnMachineFunction(MachineFunction &MF)
|
||||
{
|
||||
this->MF = &MF;
|
||||
|
||||
SetupMachineFunction(MF);
|
||||
|
||||
// Print out constants referenced by the function
|
||||
|
@ -128,6 +128,6 @@ addAssemblyEmitter(PassManagerBase &PM, bool Fast,
|
||||
raw_ostream &Out)
|
||||
{
|
||||
// Output assembly language.
|
||||
PM.add(createMipsCodePrinterPass(Out, *this));
|
||||
PM.add(createMipsCodePrinterPass(Out, *this, Fast));
|
||||
return false;
|
||||
}
|
||||
|
@ -74,7 +74,8 @@ namespace PIC16CC {
|
||||
|
||||
FunctionPass *createPIC16ISelDag(PIC16TargetMachine &TM);
|
||||
FunctionPass *createPIC16CodePrinterPass(raw_ostream &OS,
|
||||
PIC16TargetMachine &TM);
|
||||
PIC16TargetMachine &TM,
|
||||
bool Fast);
|
||||
} // end namespace llvm;
|
||||
|
||||
// Defines symbolic names for PIC16 registers. This defines a mapping from
|
||||
|
@ -90,6 +90,8 @@ bool PIC16AsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
||||
/// method to print assembly for each instruction.
|
||||
///
|
||||
bool PIC16AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
this->MF = &MF;
|
||||
|
||||
// This calls the base class function required to be called at beginning
|
||||
// of runOnMachineFunction.
|
||||
SetupMachineFunction(MF);
|
||||
@ -133,8 +135,9 @@ bool PIC16AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
/// regardless of whether the function is in SSA form.
|
||||
///
|
||||
FunctionPass *llvm::createPIC16CodePrinterPass(raw_ostream &o,
|
||||
PIC16TargetMachine &tm) {
|
||||
return new PIC16AsmPrinter(o, tm, tm.getTargetAsmInfo());
|
||||
PIC16TargetMachine &tm,
|
||||
bool fast) {
|
||||
return new PIC16AsmPrinter(o, tm, tm.getTargetAsmInfo(), fast);
|
||||
}
|
||||
|
||||
void PIC16AsmPrinter::printOperand(const MachineInstr *MI, int opNum) {
|
||||
|
@ -24,8 +24,9 @@
|
||||
|
||||
namespace llvm {
|
||||
struct VISIBILITY_HIDDEN PIC16AsmPrinter : public AsmPrinter {
|
||||
PIC16AsmPrinter(raw_ostream &O, TargetMachine &TM, const TargetAsmInfo *T)
|
||||
: AsmPrinter(O, TM, T) {
|
||||
PIC16AsmPrinter(raw_ostream &O, TargetMachine &TM,
|
||||
const TargetAsmInfo *T, bool F)
|
||||
: AsmPrinter(O, TM, T, F) {
|
||||
CurrentBankselLabelInBasicBlock = "";
|
||||
IsRomData = false;
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ bool PIC16TargetMachine::addInstSelector(PassManagerBase &PM, bool Fast) {
|
||||
bool PIC16TargetMachine::
|
||||
addAssemblyEmitter(PassManagerBase &PM, bool Fast, raw_ostream &Out) {
|
||||
// Output assembly language.
|
||||
PM.add(createPIC16CodePrinterPass(Out, *this));
|
||||
PM.add(createPIC16CodePrinterPass(Out, *this, Fast));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -49,13 +49,15 @@ using namespace llvm;
|
||||
STATISTIC(EmittedInsts, "Number of machine instrs printed");
|
||||
|
||||
namespace {
|
||||
struct VISIBILITY_HIDDEN PPCAsmPrinter : public AsmPrinter {
|
||||
class VISIBILITY_HIDDEN PPCAsmPrinter : public AsmPrinter {
|
||||
protected:
|
||||
StringSet<> FnStubs, GVStubs, HiddenGVStubs;
|
||||
const PPCSubtarget &Subtarget;
|
||||
|
||||
PPCAsmPrinter(raw_ostream &O, TargetMachine &TM, const TargetAsmInfo *T)
|
||||
: AsmPrinter(O, TM, T), Subtarget(TM.getSubtarget<PPCSubtarget>()) {
|
||||
}
|
||||
public:
|
||||
PPCAsmPrinter(raw_ostream &O, TargetMachine &TM,
|
||||
const TargetAsmInfo *T, bool F)
|
||||
: AsmPrinter(O, TM, T, F),
|
||||
Subtarget(TM.getSubtarget<PPCSubtarget>()) {}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "PowerPC Assembly Printer";
|
||||
@ -291,14 +293,13 @@ namespace {
|
||||
};
|
||||
|
||||
/// PPCLinuxAsmPrinter - PowerPC assembly printer, customized for Linux
|
||||
struct VISIBILITY_HIDDEN PPCLinuxAsmPrinter : public PPCAsmPrinter {
|
||||
class VISIBILITY_HIDDEN PPCLinuxAsmPrinter : public PPCAsmPrinter {
|
||||
DwarfWriter *DW;
|
||||
MachineModuleInfo *MMI;
|
||||
|
||||
public:
|
||||
PPCLinuxAsmPrinter(raw_ostream &O, PPCTargetMachine &TM,
|
||||
const TargetAsmInfo *T)
|
||||
: PPCAsmPrinter(O, TM, T), DW(0), MMI(0) {
|
||||
}
|
||||
const TargetAsmInfo *T, bool F)
|
||||
: PPCAsmPrinter(O, TM, T, F), DW(0), MMI(0) {}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "Linux PPC Assembly Printer";
|
||||
@ -320,15 +321,14 @@ namespace {
|
||||
|
||||
/// PPCDarwinAsmPrinter - PowerPC assembly printer, customized for Darwin/Mac
|
||||
/// OS X
|
||||
struct VISIBILITY_HIDDEN PPCDarwinAsmPrinter : public PPCAsmPrinter {
|
||||
|
||||
class VISIBILITY_HIDDEN PPCDarwinAsmPrinter : public PPCAsmPrinter {
|
||||
DwarfWriter *DW;
|
||||
MachineModuleInfo *MMI;
|
||||
raw_ostream &OS;
|
||||
public:
|
||||
PPCDarwinAsmPrinter(raw_ostream &O, PPCTargetMachine &TM,
|
||||
const TargetAsmInfo *T)
|
||||
: PPCAsmPrinter(O, TM, T), DW(0), MMI(0), OS(O) {
|
||||
}
|
||||
const TargetAsmInfo *T, bool F)
|
||||
: PPCAsmPrinter(O, TM, T, F), DW(0), MMI(0), OS(O) {}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "Darwin PPC Assembly Printer";
|
||||
@ -571,6 +571,7 @@ void PPCAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
||||
/// method to print assembly for each instruction.
|
||||
///
|
||||
bool PPCLinuxAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
this->MF = &MF;
|
||||
|
||||
SetupMachineFunction(MF);
|
||||
O << "\n\n";
|
||||
@ -764,6 +765,8 @@ bool PPCLinuxAsmPrinter::doFinalization(Module &M) {
|
||||
/// method to print assembly for each instruction.
|
||||
///
|
||||
bool PPCDarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
this->MF = &MF;
|
||||
|
||||
SetupMachineFunction(MF);
|
||||
O << "\n\n";
|
||||
|
||||
@ -1146,13 +1149,14 @@ bool PPCDarwinAsmPrinter::doFinalization(Module &M) {
|
||||
/// Darwin assembler can deal with.
|
||||
///
|
||||
FunctionPass *llvm::createPPCAsmPrinterPass(raw_ostream &o,
|
||||
PPCTargetMachine &tm) {
|
||||
PPCTargetMachine &tm,
|
||||
bool fast) {
|
||||
const PPCSubtarget *Subtarget = &tm.getSubtarget<PPCSubtarget>();
|
||||
|
||||
if (Subtarget->isDarwin()) {
|
||||
return new PPCDarwinAsmPrinter(o, tm, tm.getTargetAsmInfo());
|
||||
return new PPCDarwinAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast);
|
||||
} else {
|
||||
return new PPCLinuxAsmPrinter(o, tm, tm.getTargetAsmInfo());
|
||||
return new PPCLinuxAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,8 @@ namespace llvm {
|
||||
FunctionPass *createPPCBranchSelectionPass();
|
||||
FunctionPass *createPPCISelDag(PPCTargetMachine &TM);
|
||||
FunctionPass *createPPCAsmPrinterPass(raw_ostream &OS,
|
||||
PPCTargetMachine &TM);
|
||||
PPCTargetMachine &TM,
|
||||
bool Fast);
|
||||
FunctionPass *createPPCCodeEmitterPass(PPCTargetMachine &TM,
|
||||
MachineCodeEmitter &MCE);
|
||||
} // end namespace llvm;
|
||||
|
@ -146,7 +146,7 @@ bool PPCTargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast,
|
||||
raw_ostream &Out) {
|
||||
assert(AsmPrinterCtor && "AsmPrinter was not linked in");
|
||||
if (AsmPrinterCtor)
|
||||
PM.add(AsmPrinterCtor(Out, *this));
|
||||
PM.add(AsmPrinterCtor(Out, *this, Fast));
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -176,7 +176,7 @@ bool PPCTargetMachine::addCodeEmitter(PassManagerBase &PM, bool Fast,
|
||||
if (DumpAsm) {
|
||||
assert(AsmPrinterCtor && "AsmPrinter was not linked in");
|
||||
if (AsmPrinterCtor)
|
||||
PM.add(AsmPrinterCtor(errs(), *this));
|
||||
PM.add(AsmPrinterCtor(errs(), *this, Fast));
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -189,7 +189,7 @@ bool PPCTargetMachine::addSimpleCodeEmitter(PassManagerBase &PM, bool Fast,
|
||||
if (DumpAsm) {
|
||||
assert(AsmPrinterCtor && "AsmPrinter was not linked in");
|
||||
if (AsmPrinterCtor)
|
||||
PM.add(AsmPrinterCtor(errs(), *this));
|
||||
PM.add(AsmPrinterCtor(errs(), *this, Fast));
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -45,7 +45,8 @@ protected:
|
||||
// To avoid having target depend on the asmprinter stuff libraries, asmprinter
|
||||
// set this functions to ctor pointer at startup time if they are linked in.
|
||||
typedef FunctionPass *(*AsmPrinterCtorFn)(raw_ostream &o,
|
||||
PPCTargetMachine &tm);
|
||||
PPCTargetMachine &tm,
|
||||
bool fast);
|
||||
static AsmPrinterCtorFn AsmPrinterCtor;
|
||||
|
||||
public:
|
||||
|
@ -40,17 +40,17 @@ using namespace llvm;
|
||||
STATISTIC(EmittedInsts, "Number of machine instrs printed");
|
||||
|
||||
namespace {
|
||||
struct VISIBILITY_HIDDEN SparcAsmPrinter : public AsmPrinter {
|
||||
SparcAsmPrinter(raw_ostream &O, TargetMachine &TM, const TargetAsmInfo *T)
|
||||
: AsmPrinter(O, TM, T) {
|
||||
}
|
||||
|
||||
class VISIBILITY_HIDDEN SparcAsmPrinter : public AsmPrinter {
|
||||
/// We name each basic block in a Function with a unique number, so
|
||||
/// that we can consistently refer to them later. This is cleared
|
||||
/// at the beginning of each call to runOnMachineFunction().
|
||||
///
|
||||
typedef std::map<const Value *, unsigned> ValueMapTy;
|
||||
ValueMapTy NumberForBB;
|
||||
public:
|
||||
SparcAsmPrinter(raw_ostream &O, TargetMachine &TM,
|
||||
const TargetAsmInfo *T, bool F)
|
||||
: AsmPrinter(O, TM, T, F) {}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "Sparc Assembly Printer";
|
||||
@ -81,14 +81,17 @@ namespace {
|
||||
/// regardless of whether the function is in SSA form.
|
||||
///
|
||||
FunctionPass *llvm::createSparcCodePrinterPass(raw_ostream &o,
|
||||
TargetMachine &tm) {
|
||||
return new SparcAsmPrinter(o, tm, tm.getTargetAsmInfo());
|
||||
TargetMachine &tm,
|
||||
bool fast) {
|
||||
return new SparcAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast);
|
||||
}
|
||||
|
||||
/// runOnMachineFunction - This uses the printInstruction()
|
||||
/// method to print assembly for each instruction.
|
||||
///
|
||||
bool SparcAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
this->MF = &MF;
|
||||
|
||||
SetupMachineFunction(MF);
|
||||
|
||||
// Print out constants referenced by the function
|
||||
|
@ -24,7 +24,8 @@ namespace llvm {
|
||||
class raw_ostream;
|
||||
|
||||
FunctionPass *createSparcISelDag(SparcTargetMachine &TM);
|
||||
FunctionPass *createSparcCodePrinterPass(raw_ostream &OS, TargetMachine &TM);
|
||||
FunctionPass *createSparcCodePrinterPass(raw_ostream &OS,
|
||||
TargetMachine &TM, bool Fast);
|
||||
FunctionPass *createSparcDelaySlotFillerPass(TargetMachine &TM);
|
||||
FunctionPass *createSparcFPMoverPass(TargetMachine &TM);
|
||||
} // end namespace llvm;
|
||||
|
@ -85,6 +85,6 @@ bool SparcTargetMachine::addPreEmitPass(PassManagerBase &PM, bool Fast) {
|
||||
bool SparcTargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast,
|
||||
raw_ostream &Out) {
|
||||
// Output assembly language.
|
||||
PM.add(createSparcCodePrinterPass(Out, *this));
|
||||
PM.add(createSparcCodePrinterPass(Out, *this, Fast));
|
||||
return false;
|
||||
}
|
||||
|
@ -28,15 +28,14 @@ namespace llvm {
|
||||
|
||||
struct MachineJumpTableInfo;
|
||||
|
||||
struct VISIBILITY_HIDDEN X86ATTAsmPrinter : public AsmPrinter {
|
||||
MachineFunction *MF;
|
||||
class VISIBILITY_HIDDEN X86ATTAsmPrinter : public AsmPrinter {
|
||||
DwarfWriter *DW;
|
||||
MachineModuleInfo *MMI;
|
||||
const X86Subtarget *Subtarget;
|
||||
|
||||
public:
|
||||
X86ATTAsmPrinter(raw_ostream &O, X86TargetMachine &TM,
|
||||
const TargetAsmInfo *T)
|
||||
: AsmPrinter(O, TM, T), DW(0), MMI(0) {
|
||||
const TargetAsmInfo *T, bool F)
|
||||
: AsmPrinter(O, TM, T, F), DW(0), MMI(0) {
|
||||
Subtarget = &TM.getSubtarget<X86Subtarget>();
|
||||
}
|
||||
|
||||
|
@ -24,13 +24,14 @@ using namespace llvm;
|
||||
/// machine description.
|
||||
///
|
||||
FunctionPass *llvm::createX86CodePrinterPass(raw_ostream &o,
|
||||
X86TargetMachine &tm) {
|
||||
X86TargetMachine &tm,
|
||||
bool fast) {
|
||||
const X86Subtarget *Subtarget = &tm.getSubtarget<X86Subtarget>();
|
||||
|
||||
if (Subtarget->isFlavorIntel()) {
|
||||
return new X86IntelAsmPrinter(o, tm, tm.getTargetAsmInfo());
|
||||
return new X86IntelAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast);
|
||||
} else {
|
||||
return new X86ATTAsmPrinter(o, tm, tm.getTargetAsmInfo());
|
||||
return new X86ATTAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -122,6 +122,7 @@ void X86IntelAsmPrinter::decorateName(std::string &Name,
|
||||
/// method to print assembly for each instruction.
|
||||
///
|
||||
bool X86IntelAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
this->MF = &MF;
|
||||
SetupMachineFunction(MF);
|
||||
O << "\n\n";
|
||||
|
||||
|
@ -26,9 +26,8 @@ namespace llvm {
|
||||
|
||||
struct VISIBILITY_HIDDEN X86IntelAsmPrinter : public AsmPrinter {
|
||||
X86IntelAsmPrinter(raw_ostream &O, X86TargetMachine &TM,
|
||||
const TargetAsmInfo *T)
|
||||
: AsmPrinter(O, TM, T) {
|
||||
}
|
||||
const TargetAsmInfo *T, bool F)
|
||||
: AsmPrinter(O, TM, T, F) {}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "X86 Intel-Style Assembly Printer";
|
||||
|
@ -42,7 +42,9 @@ FunctionPass *createX87FPRegKillInserterPass();
|
||||
/// assembly code for a MachineFunction to the given output stream,
|
||||
/// using the given target machine description.
|
||||
///
|
||||
FunctionPass *createX86CodePrinterPass(raw_ostream &o, X86TargetMachine &tm);
|
||||
FunctionPass *createX86CodePrinterPass(raw_ostream &o,
|
||||
X86TargetMachine &tm,
|
||||
bool fast);
|
||||
|
||||
/// createX86CodeEmitterPass - Return a pass that emits the collected X86 code
|
||||
/// to the specified MCE object.
|
||||
|
@ -210,7 +210,7 @@ bool X86TargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast,
|
||||
raw_ostream &Out) {
|
||||
assert(AsmPrinterCtor && "AsmPrinter was not linked in");
|
||||
if (AsmPrinterCtor)
|
||||
PM.add(AsmPrinterCtor(Out, *this));
|
||||
PM.add(AsmPrinterCtor(Out, *this, Fast));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -236,7 +236,7 @@ bool X86TargetMachine::addCodeEmitter(PassManagerBase &PM, bool Fast,
|
||||
if (DumpAsm) {
|
||||
assert(AsmPrinterCtor && "AsmPrinter was not linked in");
|
||||
if (AsmPrinterCtor)
|
||||
PM.add(AsmPrinterCtor(errs(), *this));
|
||||
PM.add(AsmPrinterCtor(errs(), *this, Fast));
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -248,7 +248,7 @@ bool X86TargetMachine::addSimpleCodeEmitter(PassManagerBase &PM, bool Fast,
|
||||
if (DumpAsm) {
|
||||
assert(AsmPrinterCtor && "AsmPrinter was not linked in");
|
||||
if (AsmPrinterCtor)
|
||||
PM.add(AsmPrinterCtor(errs(), *this));
|
||||
PM.add(AsmPrinterCtor(errs(), *this, Fast));
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -44,7 +44,8 @@ protected:
|
||||
// To avoid having target depend on the asmprinter stuff libraries, asmprinter
|
||||
// set this functions to ctor pointer at startup time if they are linked in.
|
||||
typedef FunctionPass *(*AsmPrinterCtorFn)(raw_ostream &o,
|
||||
X86TargetMachine &tm);
|
||||
X86TargetMachine &tm,
|
||||
bool fast);
|
||||
static AsmPrinterCtorFn AsmPrinterCtor;
|
||||
|
||||
public:
|
||||
|
@ -23,7 +23,8 @@ namespace llvm {
|
||||
|
||||
FunctionPass *createXCoreISelDag(XCoreTargetMachine &TM);
|
||||
FunctionPass *createXCoreCodePrinterPass(raw_ostream &OS,
|
||||
XCoreTargetMachine &TM);
|
||||
XCoreTargetMachine &TM,
|
||||
bool Fast);
|
||||
} // end namespace llvm;
|
||||
|
||||
// Defines symbolic names for XCore registers. This defines a mapping from
|
||||
|
@ -53,14 +53,14 @@ static cl::opt<unsigned> MaxThreads("xcore-max-threads", cl::Optional,
|
||||
cl::init(8));
|
||||
|
||||
namespace {
|
||||
struct VISIBILITY_HIDDEN XCoreAsmPrinter : public AsmPrinter {
|
||||
XCoreAsmPrinter(raw_ostream &O, XCoreTargetMachine &TM,
|
||||
const TargetAsmInfo *T)
|
||||
: AsmPrinter(O, TM, T), DW(0),
|
||||
Subtarget(*TM.getSubtargetImpl()) { }
|
||||
|
||||
class VISIBILITY_HIDDEN XCoreAsmPrinter : public AsmPrinter {
|
||||
DwarfWriter *DW;
|
||||
const XCoreSubtarget &Subtarget;
|
||||
public:
|
||||
XCoreAsmPrinter(raw_ostream &O, XCoreTargetMachine &TM,
|
||||
const TargetAsmInfo *T, bool F)
|
||||
: AsmPrinter(O, TM, T, F), DW(0),
|
||||
Subtarget(*TM.getSubtargetImpl()) {}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "XCore Assembly Printer";
|
||||
@ -104,8 +104,9 @@ namespace {
|
||||
/// regardless of whether the function is in SSA form.
|
||||
///
|
||||
FunctionPass *llvm::createXCoreCodePrinterPass(raw_ostream &o,
|
||||
XCoreTargetMachine &tm) {
|
||||
return new XCoreAsmPrinter(o, tm, tm.getTargetAsmInfo());
|
||||
XCoreTargetMachine &tm,
|
||||
bool fast) {
|
||||
return new XCoreAsmPrinter(o, tm, tm.getTargetAsmInfo(), fast);
|
||||
}
|
||||
|
||||
// PrintEscapedString - Print each character of the specified string, escaping
|
||||
@ -293,6 +294,8 @@ emitFunctionEnd(MachineFunction &MF)
|
||||
///
|
||||
bool XCoreAsmPrinter::runOnMachineFunction(MachineFunction &MF)
|
||||
{
|
||||
this->MF = &MF;
|
||||
|
||||
SetupMachineFunction(MF);
|
||||
|
||||
// Print out constants referenced by the function
|
||||
|
@ -63,6 +63,6 @@ bool XCoreTargetMachine::addInstSelector(PassManagerBase &PM, bool Fast) {
|
||||
bool XCoreTargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast,
|
||||
raw_ostream &Out) {
|
||||
// Output assembly language.
|
||||
PM.add(createXCoreCodePrinterPass(Out, *this));
|
||||
PM.add(createXCoreCodePrinterPass(Out, *this, Fast));
|
||||
return false;
|
||||
}
|
||||
|
@ -641,9 +641,7 @@ void AsmWriterEmitter::run(std::ostream &O) {
|
||||
O << "\";\n\n";
|
||||
|
||||
O << " if (TAI->doesSupportDebugInformation() &&\n"
|
||||
<< " DW->ShouldEmitDwarfDebug() &&\n"
|
||||
<< " !DW->getFastCodeGen()) {\n"
|
||||
<< " const MachineFunction *MF = MI->getParent()->getParent();\n"
|
||||
<< " DW->ShouldEmitDwarfDebug() && !Fast) {\n"
|
||||
<< " DebugLoc CurDL = MI->getDebugLoc();\n\n"
|
||||
<< " if (!CurDL.isUnknown()) {\n"
|
||||
<< " static DebugLocTuple PrevDLT(~0U, ~0U, ~0U);\n"
|
||||
|
Loading…
Reference in New Issue
Block a user