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:
Eric Christopher 2015-02-18 01:01:57 +00:00
parent bbe6ff50f3
commit 8af49b3214
2 changed files with 23 additions and 11 deletions

View File

@ -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()
: getTargetStreamer().emitDirectiveNaNLegacy();
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());
}

View File

@ -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";