[cfe-commits] r161518 - in /cfe/trunk: include/clang/AST/Stmt.h include/clang/Sema/Sema.h lib/AST/Stmt.cpp lib/Parse/ParseStmt.cpp lib/Sema/SemaStmt.cpp lib/Sema/TreeTransform.h
Chad Rosier
mcrosier at apple.com
Wed Aug 8 12:48:07 PDT 2012
Author: mcrosier
Date: Wed Aug 8 14:48:07 2012
New Revision: 161518
URL: http://llvm.org/viewvc/llvm-project?rev=161518&view=rev
Log:
[ms-inline asm] Refactor the logic to generate the AsmString into Sema. No
functional change intended.
Modified:
cfe/trunk/include/clang/AST/Stmt.h
cfe/trunk/include/clang/Sema/Sema.h
cfe/trunk/lib/AST/Stmt.cpp
cfe/trunk/lib/Parse/ParseStmt.cpp
cfe/trunk/lib/Sema/SemaStmt.cpp
cfe/trunk/lib/Sema/TreeTransform.h
Modified: cfe/trunk/include/clang/AST/Stmt.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Stmt.h?rev=161518&r1=161517&r2=161518&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Stmt.h (original)
+++ cfe/trunk/include/clang/AST/Stmt.h Wed Aug 8 14:48:07 2012
@@ -1627,13 +1627,16 @@
bool IsVolatile;
unsigned NumAsmToks;
+ unsigned NumLineEnds;
Token *AsmToks;
+ unsigned *LineEnds;
Stmt **Exprs;
public:
MSAsmStmt(ASTContext &C, SourceLocation asmloc, bool issimple,
- bool isvolatile, ArrayRef<Token> asmtoks, std::string &asmstr,
+ bool isvolatile, ArrayRef<Token> asmtoks,
+ ArrayRef<unsigned> lineends, std::string &asmstr,
SourceLocation endloc);
SourceLocation getAsmLoc() const { return AsmLoc; }
@@ -1643,6 +1646,8 @@
unsigned getNumAsmToks() { return NumAsmToks; }
Token *getAsmToks() { return AsmToks; }
+ unsigned getNumLineEnds() { return NumLineEnds; }
+ unsigned *getLineEnds() { return LineEnds; }
bool isVolatile() const { return IsVolatile; }
void setVolatile(bool V) { IsVolatile = V; }
Modified: cfe/trunk/include/clang/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=161518&r1=161517&r2=161518&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/Sema.h (original)
+++ cfe/trunk/include/clang/Sema/Sema.h Wed Aug 8 14:48:07 2012
@@ -2544,7 +2544,7 @@
StmtResult ActOnMSAsmStmt(SourceLocation AsmLoc,
ArrayRef<Token> AsmToks,
- std::string &AsmString,
+ ArrayRef<unsigned> LineEnds,
SourceLocation EndLoc);
VarDecl *BuildObjCExceptionDecl(TypeSourceInfo *TInfo, QualType ExceptionType,
Modified: cfe/trunk/lib/AST/Stmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Stmt.cpp?rev=161518&r1=161517&r2=161518&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Stmt.cpp (original)
+++ cfe/trunk/lib/AST/Stmt.cpp Wed Aug 8 14:48:07 2012
@@ -585,14 +585,19 @@
MSAsmStmt::MSAsmStmt(ASTContext &C, SourceLocation asmloc,
bool issimple, bool isvolatile, ArrayRef<Token> asmtoks,
- std::string &asmstr, SourceLocation endloc)
+ ArrayRef<unsigned> lineends, std::string &asmstr,
+ SourceLocation endloc)
: Stmt(MSAsmStmtClass), AsmLoc(asmloc), EndLoc(endloc),
AsmStr(asmstr), IsSimple(issimple), IsVolatile(isvolatile),
- NumAsmToks(asmtoks.size()) {
+ NumAsmToks(asmtoks.size()), NumLineEnds(lineends.size()) {
AsmToks = new (C) Token[NumAsmToks];
for (unsigned i = 0, e = NumAsmToks; i != e; ++i)
AsmToks[i] = asmtoks[i];
+
+ LineEnds = new (C) unsigned[NumLineEnds];
+ for (unsigned i = 0, e = NumLineEnds; i != e; ++i)
+ LineEnds[i] = lineends[i];
}
ObjCForCollectionStmt::ObjCForCollectionStmt(Stmt *Elem, Expr *Collect,
Modified: cfe/trunk/lib/Parse/ParseStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseStmt.cpp?rev=161518&r1=161517&r2=161518&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseStmt.cpp (original)
+++ cfe/trunk/lib/Parse/ParseStmt.cpp Wed Aug 8 14:48:07 2012
@@ -1638,41 +1638,6 @@
return Actions.ActOnReturnStmt(ReturnLoc, R.take());
}
-// needSpaceAsmToken - This function handles whitespace around asm punctuation.
-// Returns true if a space should be emitted.
-static inline bool needSpaceAsmToken(Token currTok) {
- static Token prevTok;
-
- // No need for space after prevToken.
- switch(prevTok.getKind()) {
- default:
- break;
- case tok::l_square:
- case tok::r_square:
- case tok::l_brace:
- case tok::r_brace:
- case tok::colon:
- prevTok = currTok;
- return false;
- }
-
- // No need for a space before currToken.
- switch(currTok.getKind()) {
- default:
- break;
- case tok::l_square:
- case tok::r_square:
- case tok::l_brace:
- case tok::r_brace:
- case tok::comma:
- case tok::colon:
- prevTok = currTok;
- return false;
- }
- prevTok = currTok;
- return true;
-}
-
/// ParseMicrosoftAsmStatement. When -fms-extensions/-fasm-blocks is enabled,
/// this routine is called to collect the tokens for an MS asm statement.
///
@@ -1795,31 +1760,9 @@
EndLoc = ConsumeToken();
} while (1);
- // Collect the tokens into a string
- SmallString<512> Asm;
- SmallString<512> TokenBuf;
- TokenBuf.resize(512);
- unsigned AsmLineNum = 0;
- for (unsigned i = 0, e = AsmToks.size(); i < e; ++i) {
- const char *ThisTokBuf = &TokenBuf[0];
- bool StringInvalid = false;
- unsigned ThisTokLen =
- Lexer::getSpelling(AsmToks[i], ThisTokBuf, PP.getSourceManager(),
- PP.getLangOpts(), &StringInvalid);
- if (i && (!AsmLineNum || i != LineEnds[AsmLineNum-1]) &&
- needSpaceAsmToken(AsmToks[i]))
- Asm += ' ';
- Asm += StringRef(ThisTokBuf, ThisTokLen);
- if (i + 1 == LineEnds[AsmLineNum] && i + 1 != AsmToks.size()) {
- Asm += '\n';
- ++AsmLineNum;
- }
- }
-
// FIXME: We should be passing source locations for better diagnostics.
- std::string AsmString = Asm.c_str();
- return Actions.ActOnMSAsmStmt(AsmLoc, llvm::makeArrayRef(AsmToks), AsmString,
- EndLoc);
+ return Actions.ActOnMSAsmStmt(AsmLoc, llvm::makeArrayRef(AsmToks),
+ llvm::makeArrayRef(LineEnds), EndLoc);
}
/// ParseAsmStatement - Parse a GNU extended asm statement.
Modified: cfe/trunk/lib/Sema/SemaStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=161518&r1=161517&r2=161518&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaStmt.cpp (original)
+++ cfe/trunk/lib/Sema/SemaStmt.cpp Wed Aug 8 14:48:07 2012
@@ -2749,9 +2749,6 @@
// needSpaceAsmToken - This function handles whitespace around asm punctuation.
// Returns true if a space should be emitted.
-//
-// FIXME: This is replicated in ParseStmt.cpp. Maybe we should defer building
-// the AsmString (i.e., non-patched AsmString) until Sema.
static inline bool needSpaceAsmToken(Token currTok) {
static Token prevTok;
@@ -2840,13 +2837,42 @@
return Res;
}
+// Build the unmodified MSAsmString.
+static std::string buildMSAsmString(Sema &SemaRef,
+ ArrayRef<Token> AsmToks,
+ ArrayRef<unsigned> LineEnds) {
+ // Collect the tokens into a string
+ SmallString<512> Asm;
+ SmallString<512> TokenBuf;
+ TokenBuf.resize(512);
+ unsigned AsmLineNum = 0;
+ for (unsigned i = 0, e = AsmToks.size(); i < e; ++i) {
+ const char *ThisTokBuf = &TokenBuf[0];
+ bool StringInvalid = false;
+ unsigned ThisTokLen =
+ Lexer::getSpelling(AsmToks[i], ThisTokBuf, SemaRef.getSourceManager(),
+ SemaRef.getLangOpts(), &StringInvalid);
+ if (i && (!AsmLineNum || i != LineEnds[AsmLineNum-1]) &&
+ needSpaceAsmToken(AsmToks[i]))
+ Asm += ' ';
+ Asm += StringRef(ThisTokBuf, ThisTokLen);
+ if (i + 1 == LineEnds[AsmLineNum] && i + 1 != AsmToks.size()) {
+ Asm += '\n';
+ ++AsmLineNum;
+ }
+ }
+ return Asm.c_str();
+}
+
StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc,
ArrayRef<Token> AsmToks,
- std::string &AsmString,
+ ArrayRef<unsigned> LineEnds,
SourceLocation EndLoc) {
// MS-style inline assembly is not fully supported, so emit a warning.
Diag(AsmLoc, diag::warn_unsupported_msasm);
+ std::string AsmString = buildMSAsmString(*this, AsmToks, LineEnds);
+
bool IsSimple;
// Rewrite operands to appease the AsmParser.
std::string PatchedAsmString =
@@ -2858,7 +2884,7 @@
MSAsmStmt *NS =
new (Context) MSAsmStmt(Context, AsmLoc, IsSimple, /* IsVolatile */ true,
- AsmToks, AsmString, EndLoc);
+ AsmToks, LineEnds, AsmString, EndLoc);
return Owned(NS);
}
Modified: cfe/trunk/lib/Sema/TreeTransform.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=161518&r1=161517&r2=161518&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/TreeTransform.h (original)
+++ cfe/trunk/lib/Sema/TreeTransform.h Wed Aug 8 14:48:07 2012
@@ -1186,9 +1186,9 @@
/// Subclasses may override this routine to provide different behavior.
StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc,
ArrayRef<Token> AsmToks,
- std::string &AsmString,
+ ArrayRef<unsigned> LineEnds,
SourceLocation EndLoc) {
- return getSema().ActOnMSAsmStmt(AsmLoc, AsmToks, AsmString, EndLoc);
+ return getSema().ActOnMSAsmStmt(AsmLoc, AsmToks, LineEnds, EndLoc);
}
/// \brief Build a new Objective-C \@try statement.
@@ -5612,10 +5612,11 @@
TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
ArrayRef<Token> AsmToks =
llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
+ ArrayRef<unsigned> LineEnds =
+ llvm::makeArrayRef(S->getLineEnds(), S->getNumLineEnds());
+
// No need to transform the asm string literal.
- return getDerived().RebuildMSAsmStmt(S->getAsmLoc(),
- AsmToks,
- *S->getAsmString(),
+ return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), AsmToks, LineEnds,
S->getEndLoc());
}
More information about the cfe-commits
mailing list