diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-08-24 17:05:45 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-08-24 17:05:45 +0000 |
commit | 14836bab367fb1c47bb92c8585265dff971ebaf5 (patch) | |
tree | 328334b80643386cb89a020679410cd00259b1d1 /clang/lib/AST/Stmt.cpp | |
parent | cc27317a622f9fa1b415a93346b55d5d71acc29c (diff) | |
download | bcm5719-llvm-14836bab367fb1c47bb92c8585265dff971ebaf5.tar.gz bcm5719-llvm-14836bab367fb1c47bb92c8585265dff971ebaf5.zip |
[ms-inline asm] Refactor code. No functional change intended.
llvm-svn: 162568
Diffstat (limited to 'clang/lib/AST/Stmt.cpp')
-rw-r--r-- | clang/lib/AST/Stmt.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/clang/lib/AST/Stmt.cpp b/clang/lib/AST/Stmt.cpp index 6b14ae5fd2f..ec9b4c45684 100644 --- a/clang/lib/AST/Stmt.cpp +++ b/clang/lib/AST/Stmt.cpp @@ -20,6 +20,7 @@ #include "clang/AST/ASTContext.h" #include "clang/AST/ASTDiagnostic.h" #include "clang/Basic/TargetInfo.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/Support/raw_ostream.h" using namespace clang; @@ -547,6 +548,26 @@ unsigned AsmStmt::AnalyzeAsmString(SmallVectorImpl<AsmStringPiece>&Pieces, return diag::err_asm_invalid_escape; } } +/// GenerateAsmString - Assemble final asm string. +std::string AsmStmt::GenerateAsmString(ASTContext &C) const { + // Analyze the asm string to decompose it into its pieces. We know that Sema + // has already done this, so it is guaranteed to be successful. + SmallVector<AsmStmt::AsmStringPiece, 4> Pieces; + unsigned DiagOffs; + AnalyzeAsmString(Pieces, C, DiagOffs); + + std::string AsmString; + for (unsigned i = 0, e = Pieces.size(); i != e; ++i) { + if (Pieces[i].isString()) + AsmString += Pieces[i].getString(); + else if (Pieces[i].getModifier() == '\0') + AsmString += '$' + llvm::utostr(Pieces[i].getOperandNo()); + else + AsmString += "${" + llvm::utostr(Pieces[i].getOperandNo()) + ':' + + Pieces[i].getModifier() + '}'; + } + return AsmString; +} Expr *MSAsmStmt::getOutputExpr(unsigned i) { return cast<Expr>(Exprs[i]); |