diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-08-22 20:30:58 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-08-22 20:30:58 +0000 |
commit | 060c0ea89ad154e450b3cd1a40b2ecbea621f788 (patch) | |
tree | 311ae08e7f876299b29d8f2195cb917c60fae957 /clang/lib/Sema/SemaStmtAsm.cpp | |
parent | d79f06cf12e0eed14f2d7e8139f2e3a114bcb74a (diff) | |
download | bcm5719-llvm-060c0ea89ad154e450b3cd1a40b2ecbea621f788.tar.gz bcm5719-llvm-060c0ea89ad154e450b3cd1a40b2ecbea621f788.zip |
[ms-inline asm] Compute the token range for each instruction within the asm.
Eventually, we'll need a way of mapping tokens (and their IdentifierInfo*) to
the operands computed by buildMSAsmPieces().
llvm-svn: 162388
Diffstat (limited to 'clang/lib/Sema/SemaStmtAsm.cpp')
-rw-r--r-- | clang/lib/Sema/SemaStmtAsm.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp index 732688d5446..f5852ae45ce 100644 --- a/clang/lib/Sema/SemaStmtAsm.cpp +++ b/clang/lib/Sema/SemaStmtAsm.cpp @@ -388,13 +388,14 @@ static void buildMSAsmPieces(StringRef Asm, std::vector<StringRef> &Pieces) { } // Build the unmodified MSAsmString. -static std::string buildMSAsmString(Sema &SemaRef, - ArrayRef<Token> AsmToks, - std::vector<std::string> &AsmStrings) { +static std::string buildMSAsmString(Sema &SemaRef, ArrayRef<Token> AsmToks, + std::vector<std::string> &AsmStrings, + std::vector<std::pair<unsigned,unsigned> > &AsmTokRanges) { assert (!AsmToks.empty() && "Didn't expect an empty AsmToks!"); SmallString<512> Res; SmallString<512> Asm; + unsigned startTok = 0; for (unsigned i = 0, e = AsmToks.size(); i < e; ++i) { bool isNewAsm = i == 0 || AsmToks[i].isAtStartOfLine() || AsmToks[i].is(tok::kw_asm); @@ -402,6 +403,8 @@ static std::string buildMSAsmString(Sema &SemaRef, if (isNewAsm) { if (i) { AsmStrings.push_back(Asm.c_str()); + AsmTokRanges.push_back(std::make_pair(startTok, i-1)); + startTok = i; Res += Asm; Asm.clear(); Res += '\n'; @@ -418,6 +421,7 @@ static std::string buildMSAsmString(Sema &SemaRef, Asm += getSpelling(SemaRef, AsmToks[i]); } AsmStrings.push_back(Asm.c_str()); + AsmTokRanges.push_back(std::make_pair(startTok, AsmToks.size()-1)); Res += Asm; return Res.c_str(); } @@ -448,7 +452,8 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, unsigned NumAsmStrings; std::vector<std::string> AsmStrings; - std::string AsmString = buildMSAsmString(*this, AsmToks, AsmStrings); + std::vector<std::pair<unsigned,unsigned> > AsmTokRanges; + std::string AsmString = buildMSAsmString(*this, AsmToks, AsmStrings, AsmTokRanges); NumAsmStrings = AsmStrings.size(); std::vector<std::vector<StringRef> > Pieces; |