summaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorDavid Peixotto <dpeixott@codeaurora.org>2014-02-06 18:19:40 +0000
committerDavid Peixotto <dpeixott@codeaurora.org>2014-02-06 18:19:40 +0000
commit4ed2667c138442319f0c3dcc019def8735233a90 (patch)
tree20d16c37130694d9991bd7355a39fac1aa9f9a31 /lib/CodeGen
parent0c245b69f7a6b9eaa1386f7c2251a47a253ced62 (diff)
downloadllvm-4ed2667c138442319f0c3dcc019def8735233a90.tar.gz
llvm-4ed2667c138442319f0c3dcc019def8735233a90.tar.bz2
llvm-4ed2667c138442319f0c3dcc019def8735233a90.tar.xz
Remove const_cast for STI when parsing inline asm
In a previous commit (r199818) we added a const_cast to an existing subtarget info instead of creating a new one so that we could reuse it when creating the TargetAsmParser for parsing inline assembly. This cast was necessary because we needed to reuse the existing STI to avoid generating incorrect code when the inline asm contained mode-switching directives (e.g. .code 16). The root cause of the failure was that there was an implicit sharing of the STI between the parser and the MCCodeEmitter. To fix a different but related issue, we now explicitly pass the STI to the MCCodeEmitter (see commits r200345-r200351). The const_cast is no longer necessary and we can now create a fresh STI for the inline asm parser to use. Differential Revision: http://llvm-reviews.chandlerc.com/D2709 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200929 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp23
1 files changed, 13 insertions, 10 deletions
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp b/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
index aece69bca6..8badf429d2 100644
--- a/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
+++ b/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
@@ -117,14 +117,17 @@ void AsmPrinter::EmitInlineAsm(StringRef Str, const MDNode *LocMDNode,
OutContext, OutStreamer,
*MAI));
- // Reuse the existing Subtarget, because the AsmParser may need to
- // modify it. For example, when switching between ARM and
- // Thumb mode.
- MCSubtargetInfo* STI =
- const_cast<MCSubtargetInfo*>(&TM.getSubtarget<MCSubtargetInfo>());
-
- // Preserve a copy of the original STI because the parser may modify it.
- // The target can restore the original state in emitInlineAsmEnd().
+ // Initialize the parser with a fresh subtarget info. It is better to use a
+ // new STI here because the parser may modify it and we do not want those
+ // modifications to persist after parsing the inlineasm. The modifications
+ // made by the parser will be seen by the code emitters because it passes
+ // the current STI down to the EncodeInstruction() method.
+ OwningPtr<MCSubtargetInfo> STI(TM.getTarget().createMCSubtargetInfo(
+ TM.getTargetTriple(), TM.getTargetCPU(), TM.getTargetFeatureString()));
+
+ // Preserve a copy of the original STI because the parser may modify it. For
+ // example, when switching between arm and thumb mode. If the target needs to
+ // emit code to return to the original state it can do so in emitInlineAsmEnd().
MCSubtargetInfo STIOrig = *STI;
OwningPtr<MCTargetAsmParser>
@@ -138,7 +141,7 @@ void AsmPrinter::EmitInlineAsm(StringRef Str, const MDNode *LocMDNode,
// Don't implicitly switch to the text section before the asm.
int Res = Parser->Run(/*NoInitialTextSection*/ true,
/*NoFinalize*/ true);
- emitInlineAsmEnd(STIOrig, STI);
+ emitInlineAsmEnd(STIOrig, STI.get());
if (Res && !HasDiagHandler)
report_fatal_error("Error parsing inline asm\n");
}
@@ -550,4 +553,4 @@ bool AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
}
void AsmPrinter::emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
- MCSubtargetInfo *EndInfo) const {}
+ const MCSubtargetInfo *EndInfo) const {}