summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaStmtAsm.cpp
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@apple.com>2012-08-22 20:30:58 +0000
committerChad Rosier <mcrosier@apple.com>2012-08-22 20:30:58 +0000
commit060c0ea89ad154e450b3cd1a40b2ecbea621f788 (patch)
tree311ae08e7f876299b29d8f2195cb917c60fae957 /clang/lib/Sema/SemaStmtAsm.cpp
parentd79f06cf12e0eed14f2d7e8139f2e3a114bcb74a (diff)
downloadbcm5719-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.cpp13
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;
OpenPOWER on IntegriCloud