diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-08-24 00:07:09 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-08-24 00:07:09 +0000 |
commit | 633abb0ea01d37ab9c8e4ce1ee9e48894a12dfca (patch) | |
tree | 2abbddcfc5221de0fab55c2a4cd2ddf1e020d313 /lib/AST/Stmt.cpp | |
parent | 5a90193ad825656d4a03099cd5e9c928d1782b5e (diff) |
[ms-inline asm] Add the basic APIs for Exprs to the MSAsmStmt AST. Next we need
generate the Input/Output expressions using Sema::ActOnIdExpression().
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@162509 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/Stmt.cpp')
-rw-r--r-- | lib/AST/Stmt.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/lib/AST/Stmt.cpp b/lib/AST/Stmt.cpp index 963a20c338..6b14ae5fd2 100644 --- a/lib/AST/Stmt.cpp +++ b/lib/AST/Stmt.cpp @@ -548,6 +548,17 @@ unsigned AsmStmt::AnalyzeAsmString(SmallVectorImpl<AsmStringPiece>&Pieces, } } +Expr *MSAsmStmt::getOutputExpr(unsigned i) { + return cast<Expr>(Exprs[i]); +} + +Expr *MSAsmStmt::getInputExpr(unsigned i) { + return cast<Expr>(Exprs[i + NumOutputs]); +} +void MSAsmStmt::setInputExpr(unsigned i, Expr *E) { + Exprs[i + NumOutputs] = E; +} + QualType CXXCatchStmt::getCaughtType() const { if (ExceptionDecl) return ExceptionDecl->getType(); @@ -585,12 +596,16 @@ AsmStmt::AsmStmt(ASTContext &C, SourceLocation asmloc, bool issimple, MSAsmStmt::MSAsmStmt(ASTContext &C, SourceLocation asmloc, SourceLocation lbraceloc, bool issimple, bool isvolatile, ArrayRef<Token> asmtoks, ArrayRef<IdentifierInfo*> inputs, - ArrayRef<IdentifierInfo*> outputs, StringRef asmstr, - ArrayRef<StringRef> clobbers, SourceLocation endloc) + ArrayRef<IdentifierInfo*> outputs, + ArrayRef<Expr*> inputexprs, ArrayRef<Expr*> outputexprs, + StringRef asmstr, ArrayRef<StringRef> clobbers, + SourceLocation endloc) : Stmt(MSAsmStmtClass), AsmLoc(asmloc), LBraceLoc(lbraceloc), EndLoc(endloc), AsmStr(asmstr.str()), IsSimple(issimple), IsVolatile(isvolatile), NumAsmToks(asmtoks.size()), NumInputs(inputs.size()), NumOutputs(outputs.size()), NumClobbers(clobbers.size()) { + assert (inputs.size() == inputexprs.size() && "Input expr size mismatch!"); + assert (outputs.size() == outputexprs.size() && "Input expr size mismatch!"); unsigned NumExprs = NumOutputs + NumInputs; @@ -600,6 +615,12 @@ MSAsmStmt::MSAsmStmt(ASTContext &C, SourceLocation asmloc, for (unsigned i = NumOutputs, e = NumExprs; i != e; ++i) Names[i] = inputs[i]; + Exprs = new (C) Stmt*[NumExprs]; + for (unsigned i = 0, e = NumOutputs; i != e; ++i) + Exprs[i] = outputexprs[i]; + for (unsigned i = NumOutputs, e = NumExprs; i != e; ++i) + Exprs[i] = inputexprs[i]; + AsmToks = new (C) Token[NumAsmToks]; for (unsigned i = 0, e = NumAsmToks; i != e; ++i) AsmToks[i] = asmtoks[i]; |