forked from OSchip/llvm-project
Make the Mips AsmPrinter independent of global subtarget
initialization. Initialize the subtarget once per function and migrate EmitStartOfAsmFile to either use calls on the TargetMachine or get information from the subtarget we'd use for assembling. The top-level-ness of the MIPS attribute output for assembly is, by nature, contrary to how we'd want to do this for an LTO situation where we have multiple cpu architectures so this solution is good enough for now. llvm-svn: 229596
This commit is contained in:
parent
bbe6ff50f3
commit
8af49b3214
|
@ -687,8 +687,21 @@ printRegisterList(const MachineInstr *MI, int opNum, raw_ostream &O) {
|
|||
}
|
||||
|
||||
void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) {
|
||||
bool IsABICalls = Subtarget->isABICalls();
|
||||
const MipsABIInfo &ABI = static_cast<const MipsTargetMachine &>(TM).getABI();
|
||||
|
||||
// Compute MIPS architecture attributes based on the default subtarget
|
||||
// that we'd have constructed. Module level directives aren't LTO
|
||||
// clean anyhow.
|
||||
// FIXME: For ifunc related functions we could iterate over and look
|
||||
// for a feature string that doesn't match the default one.
|
||||
StringRef TT = TM.getTargetTriple();
|
||||
StringRef CPU =
|
||||
MIPS_MC::selectMipsCPU(TM.getTargetTriple(), TM.getTargetCPU());
|
||||
StringRef FS = TM.getTargetFeatureString();
|
||||
const MipsTargetMachine &MTM = static_cast<const MipsTargetMachine &>(TM);
|
||||
const MipsSubtarget STI(TT, CPU, FS, MTM.isLittleEndian(), MTM);
|
||||
|
||||
bool IsABICalls = STI.isABICalls();
|
||||
const MipsABIInfo &ABI = MTM.getABI();
|
||||
if (IsABICalls) {
|
||||
getTargetStreamer().emitDirectiveAbiCalls();
|
||||
Reloc::Model RM = TM.getRelocationModel();
|
||||
|
@ -708,13 +721,13 @@ void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) {
|
|||
// NaN: At the moment we only support:
|
||||
// 1. .nan legacy (default)
|
||||
// 2. .nan 2008
|
||||
Subtarget->isNaN2008() ? getTargetStreamer().emitDirectiveNaN2008()
|
||||
STI.isNaN2008() ? getTargetStreamer().emitDirectiveNaN2008()
|
||||
: getTargetStreamer().emitDirectiveNaNLegacy();
|
||||
|
||||
// TODO: handle O64 ABI
|
||||
|
||||
if (ABI.IsEABI()) {
|
||||
if (Subtarget->isGP32bit())
|
||||
if (STI.isGP32bit())
|
||||
OutStreamer.SwitchSection(OutContext.getELFSection(".gcc_compiled_long32",
|
||||
ELF::SHT_PROGBITS, 0));
|
||||
else
|
||||
|
@ -722,19 +735,19 @@ void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) {
|
|||
ELF::SHT_PROGBITS, 0));
|
||||
}
|
||||
|
||||
getTargetStreamer().updateABIInfo(*Subtarget);
|
||||
getTargetStreamer().updateABIInfo(STI);
|
||||
|
||||
// We should always emit a '.module fp=...' but binutils 2.24 does not accept
|
||||
// it. We therefore emit it when it contradicts the ABI defaults (-mfpxx or
|
||||
// -mfp64) and omit it otherwise.
|
||||
if (ABI.IsO32() && (Subtarget->isABI_FPXX() || Subtarget->isFP64bit()))
|
||||
if (ABI.IsO32() && (STI.isABI_FPXX() || STI.isFP64bit()))
|
||||
getTargetStreamer().emitDirectiveModuleFP();
|
||||
|
||||
// We should always emit a '.module [no]oddspreg' but binutils 2.24 does not
|
||||
// accept it. We therefore emit it when it contradicts the default or an
|
||||
// option has changed the default (i.e. FPXX) and omit it otherwise.
|
||||
if (ABI.IsO32() && (!Subtarget->useOddSPReg() || Subtarget->isABI_FPXX()))
|
||||
getTargetStreamer().emitDirectiveModuleOddSPReg(Subtarget->useOddSPReg(),
|
||||
if (ABI.IsO32() && (!STI.useOddSPReg() || STI.isABI_FPXX()))
|
||||
getTargetStreamer().emitDirectiveModuleOddSPReg(STI.useOddSPReg(),
|
||||
ABI.IsO32());
|
||||
}
|
||||
|
||||
|
|
|
@ -102,8 +102,7 @@ public:
|
|||
explicit MipsAsmPrinter(TargetMachine &TM,
|
||||
std::unique_ptr<MCStreamer> Streamer)
|
||||
: AsmPrinter(TM, std::move(Streamer)), MCP(nullptr),
|
||||
InConstantPool(false), Subtarget(&TM.getSubtarget<MipsSubtarget>()),
|
||||
MCInstLowering(*this) {}
|
||||
InConstantPool(false), MCInstLowering(*this) {}
|
||||
|
||||
const char *getPassName() const override {
|
||||
return "Mips Assembly Printer";
|
||||
|
|
Loading…
Reference in New Issue