diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-08-22 23:42:09 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-08-22 23:42:09 +0000 |
commit | f4958d1f107e9f6c8b04f4d3a8c346f39ef7d2fb (patch) | |
tree | eac3437d7c7ad696f0255a73b9931d4bbf7831d4 /clang/lib/Sema/SemaStmtAsm.cpp | |
parent | d7b66968f93aa29cb3259c397e21407177f2e468 (diff) | |
download | bcm5719-llvm-f4958d1f107e9f6c8b04f4d3a8c346f39ef7d2fb.tar.gz bcm5719-llvm-f4958d1f107e9f6c8b04f4d3a8c346f39ef7d2fb.zip |
[ms-inline asm] Compute the inputs and outputs. No test case (yet) as this
requires codegen support.
llvm-svn: 162410
Diffstat (limited to 'clang/lib/Sema/SemaStmtAsm.cpp')
-rw-r--r-- | clang/lib/Sema/SemaStmtAsm.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp index ff5c5b3b735..eb8b343f4ce 100644 --- a/clang/lib/Sema/SemaStmtAsm.cpp +++ b/clang/lib/Sema/SemaStmtAsm.cpp @@ -24,6 +24,7 @@ #include "llvm/ADT/SmallString.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" +#include "llvm/MC/MCExpr.h" #include "llvm/MC/MCInst.h" #include "llvm/MC/MCInstPrinter.h" #include "llvm/MC/MCInstrInfo.h" @@ -31,6 +32,7 @@ #include "llvm/MC/MCRegisterInfo.h" #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCTargetAsmParser.h" #include "llvm/MC/MCParser/MCAsmLexer.h" #include "llvm/MC/MCParser/MCAsmParser.h" @@ -328,6 +330,19 @@ static bool isMSAsmKeyword(StringRef Name) { return Ret; } +// getIdentifierInfo - Given a Name and a range of tokens, find the associated +// IdentifierInfo*. +static IdentifierInfo *getIdentifierInfo(StringRef Name, + ArrayRef<Token> AsmToks, + unsigned Begin, unsigned End) { + for (unsigned i = Begin; i <= End; ++i) { + IdentifierInfo *II = AsmToks[i].getIdentifierInfo(); + if (II && II->getName() == Name) + return II; + } + return 0; +} + // getSpelling - Get the spelling of the AsmTok token. static StringRef getSpelling(Sema &SemaRef, Token AsmTok) { StringRef Asm; @@ -545,7 +560,7 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, llvm::MCInstPrinter *IP = TheTarget->createMCInstPrinter(1, *MAI, *MII, *MRI, *STI); - // Build the list of clobbers. + // Build the list of clobbers, outputs and inputs. unsigned NumDefs = Desc.getNumDefs(); for (unsigned j = 0, e = Inst.getNumOperands(); j != e; ++j) { const llvm::MCOperand &Op = Inst.getOperand(j); @@ -567,6 +582,18 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, return StmtError(Diag(AsmLoc, diag::err_asm_unknown_register_name) << Clobber); ClobberRegs.insert(Reg); + continue; + } + // Expr/Input or Output. + if (Op.isExpr()) { + const llvm::MCExpr *Expr = Op.getExpr(); + const llvm::MCSymbolRefExpr *SymRef; + if ((SymRef = dyn_cast<llvm::MCSymbolRefExpr>(Expr))) { + StringRef Name = SymRef->getSymbol().getName(); + IdentifierInfo *II = getIdentifierInfo(Name, AsmToks, AsmTokRanges[i].first, AsmTokRanges[i].second); + if (II) + isDef ? Outputs.push_back(II) : Inputs.push_back(II); + } } } } |