diff options
author | Toma Tabacu <toma.tabacu@imgtec.com> | 2014-12-17 10:56:16 +0000 |
---|---|---|
committer | Toma Tabacu <toma.tabacu@imgtec.com> | 2014-12-17 10:56:16 +0000 |
commit | a23f13c3b092a8866508143f9e840dee599f8789 (patch) | |
tree | f208540119a9550b61c3ec24f2127731bba976f2 /llvm/lib | |
parent | 43fae93da8b5c927d22e7ad0e63cf733c644b440 (diff) | |
download | bcm5719-llvm-a23f13c3b092a8866508143f9e840dee599f8789.tar.gz bcm5719-llvm-a23f13c3b092a8866508143f9e840dee599f8789.zip |
[mips] Set GCC-compatible MIPS asssembler options before inline asm blocks.
Summary:
When generating MIPS assembly, LLVM always overrides the default assembler options by emitting the '.set noreorder', '.set nomacro' and '.set noat' directives,
while GCC uses the default options if an assembly-level function contains inline assembly code.
This becomes a problem when the code generated by LLVM is interleaved with inline assembly which assumes GCC-like assembler options (from Linux, for example).
This patch fixes these conflicts by setting the appropriate assembler options at the beginning of an inline asm block and popping them at the end.
Reviewers: dsanders
Reviewed By: dsanders
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D6637
llvm-svn: 224425
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/Mips16HardFloat.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MipsAsmPrinter.cpp | 19 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MipsAsmPrinter.h | 7 |
4 files changed, 28 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp index 8cfaba68d20..f6ce4a08db5 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp @@ -90,6 +90,7 @@ void AsmPrinter::EmitInlineAsm(StringRef Str, const MDNode *LocMDNode, assert(MCAI && "No MCAsmInfo"); if (!MCAI->useIntegratedAssembler() && !OutStreamer.isIntegratedAssemblerRequired()) { + emitInlineAsmStart(TM.getSubtarget<MCSubtargetInfo>()); OutStreamer.EmitRawText(Str); emitInlineAsmEnd(TM.getSubtarget<MCSubtargetInfo>(), nullptr); return; @@ -152,6 +153,7 @@ void AsmPrinter::EmitInlineAsm(StringRef Str, const MDNode *LocMDNode, TAP->SetFrameRegister(TRI->getFrameRegister(*MF)); } + emitInlineAsmStart(STIOrig); // Don't implicitly switch to the text section before the asm. int Res = Parser->Run(/*NoInitialTextSection*/ true, /*NoFinalize*/ true); @@ -567,5 +569,7 @@ bool AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, return true; } +void AsmPrinter::emitInlineAsmStart(const MCSubtargetInfo &StartInfo) const {} + void AsmPrinter::emitInlineAsmEnd(const MCSubtargetInfo &StartInfo, const MCSubtargetInfo *EndInfo) const {} diff --git a/llvm/lib/Target/Mips/Mips16HardFloat.cpp b/llvm/lib/Target/Mips/Mips16HardFloat.cpp index 9488e637a7e..ecdf2793fe7 100644 --- a/llvm/lib/Target/Mips/Mips16HardFloat.cpp +++ b/llvm/lib/Target/Mips/Mips16HardFloat.cpp @@ -458,7 +458,6 @@ static void createFPFnStub(Function *F, Module *M, FPParamVariant PV, FStub->setSection(SectionName); BasicBlock *BB = BasicBlock::Create(Context, "entry", FStub); InlineAsmHelper IAH(Context, BB); - IAH.Out(" .set macro"); if (PicMode) { IAH.Out(".set noreorder"); IAH.Out(".cpload $$25"); @@ -467,7 +466,6 @@ static void createFPFnStub(Function *F, Module *M, FPParamVariant PV, IAH.Out("la $$25," + LocalName); } else { - IAH.Out(".set reorder"); IAH.Out("la $$25," + Name); } swapFPIntParams(PV, M, IAH, LE, false); diff --git a/llvm/lib/Target/Mips/MipsAsmPrinter.cpp b/llvm/lib/Target/Mips/MipsAsmPrinter.cpp index 832fa05be0d..bcb14a45645 100644 --- a/llvm/lib/Target/Mips/MipsAsmPrinter.cpp +++ b/llvm/lib/Target/Mips/MipsAsmPrinter.cpp @@ -53,7 +53,7 @@ using namespace llvm; #define DEBUG_TYPE "mips-asm-printer" -MipsTargetStreamer &MipsAsmPrinter::getTargetStreamer() { +MipsTargetStreamer &MipsAsmPrinter::getTargetStreamer() const { return static_cast<MipsTargetStreamer &>(*OutStreamer.getTargetStreamer()); } @@ -743,6 +743,23 @@ void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) { Subtarget->isABI_O32()); } +void MipsAsmPrinter::emitInlineAsmStart( + const MCSubtargetInfo &StartInfo) const { + MipsTargetStreamer &TS = getTargetStreamer(); + + TS.emitDirectiveSetPush(); + TS.emitDirectiveSetAt(); + TS.emitDirectiveSetMacro(); + TS.emitDirectiveSetReorder(); + OutStreamer.AddBlankLine(); +} + +void MipsAsmPrinter::emitInlineAsmEnd(const MCSubtargetInfo &StartInfo, + const MCSubtargetInfo *EndInfo) const { + OutStreamer.AddBlankLine(); + getTargetStreamer().emitDirectiveSetPop(); +} + void MipsAsmPrinter::EmitJal(MCSymbol *Symbol) { MCInst I; I.setOpcode(Mips::JAL); diff --git a/llvm/lib/Target/Mips/MipsAsmPrinter.h b/llvm/lib/Target/Mips/MipsAsmPrinter.h index 0582e210e9c..723155f5dd6 100644 --- a/llvm/lib/Target/Mips/MipsAsmPrinter.h +++ b/llvm/lib/Target/Mips/MipsAsmPrinter.h @@ -31,7 +31,7 @@ class Module; class raw_ostream; class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter { - MipsTargetStreamer &getTargetStreamer(); + MipsTargetStreamer &getTargetStreamer() const; void EmitInstrWithMacroNoAT(const MachineInstr *MI); @@ -60,6 +60,11 @@ private: std::map<const char *, const llvm::Mips16HardFloatInfo::FuncSignature *> StubsNeeded; + void emitInlineAsmStart(const MCSubtargetInfo &StartInfo) const override; + + void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo, + const MCSubtargetInfo *EndInfo) const override; + void EmitJal(MCSymbol *Symbol); void EmitInstrReg(unsigned Opcode, unsigned Reg); |