diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-08-09 20:47:38 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-08-09 20:47:38 +0000 |
commit | 11ede938e98e73592e3a79fa6f50e1259c40e2c7 (patch) | |
tree | fe3b54d88c874f6dda7453adca191e77212e28a5 | |
parent | 27a6c1ed9130782f44003c3e603db0d5623a24fc (diff) | |
download | bcm5719-llvm-11ede938e98e73592e3a79fa6f50e1259c40e2c7.tar.gz bcm5719-llvm-11ede938e98e73592e3a79fa6f50e1259c40e2c7.zip |
[ms-inline asm] Instantiate the various parts to the AsmParser.
llvm-svn: 161614
-rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 260001dabbe..f2d155513ae 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -32,6 +32,17 @@ #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/Triple.h" +#include "llvm/MC/MCAsmInfo.h" +#include "llvm/MC/MCContext.h" +#include "llvm/MC/MCObjectFileInfo.h" +#include "llvm/MC/MCRegisterInfo.h" +#include "llvm/MC/MCStreamer.h" +#include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/MC/MCTargetAsmParser.h" +#include "llvm/MC/MCParser/MCAsmParser.h" +#include "llvm/Support/SourceMgr.h" +#include "llvm/Support/TargetRegistry.h" #include "llvm/Support/TargetSelect.h" using namespace clang; using namespace sema; @@ -2884,15 +2895,40 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, std::string PatchedAsmString = PatchMSAsmString(*this, IsSimple, AsmLoc, AsmToks, Context.getTargetInfo()); - // Silence compiler warnings. Eventually, the PatchedAsmString will be - // passed to the AsmParser. - (void)PatchedAsmString; - // Initialize targets and assembly printers/parsers. llvm::InitializeAllTargetInfos(); llvm::InitializeAllTargetMCs(); llvm::InitializeAllAsmParsers(); + // Get the target specific parser. + std::string Error; + const std::string &TT = Context.getTargetInfo().getTriple().getTriple(); + const llvm::Target *TheTarget(llvm::TargetRegistry::lookupTarget(TT, Error)); + + llvm::SourceMgr SrcMgr; + llvm::MemoryBuffer *Buffer = + llvm::MemoryBuffer::getMemBuffer(PatchedAsmString, "<inline asm>"); + + // Tell SrcMgr about this buffer, which is what the parser will pick up. + SrcMgr.AddNewSourceBuffer(Buffer, llvm::SMLoc()); + + OwningPtr<llvm::MCAsmInfo> MAI(TheTarget->createMCAsmInfo(TT)); + OwningPtr<llvm::MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TT)); + OwningPtr<llvm::MCObjectFileInfo> MOFI(new llvm::MCObjectFileInfo()); + llvm::MCContext Ctx(*MAI, *MRI, MOFI.get(), &SrcMgr); + OwningPtr<llvm::MCSubtargetInfo> + STI(TheTarget->createMCSubtargetInfo(TT, "", "")); + + OwningPtr<llvm::MCStreamer> Str; + OwningPtr<llvm::MCAsmParser> + Parser(createMCAsmParser(SrcMgr, Ctx, *Str.get(), *MAI)); + OwningPtr<llvm::MCTargetAsmParser> + TargetParser(TheTarget->createMCAsmParser(*STI, *Parser)); + + // Change to the Intel syntax. + Parser->setAssemblerDialect(1); + Parser->setTargetParser(*TargetParser.get()); + MSAsmStmt *NS = new (Context) MSAsmStmt(Context, AsmLoc, IsSimple, /* IsVolatile */ true, AsmToks, LineEnds, AsmString, EndLoc); |