diff options
author | Chris Lattner <sabre@nondot.org> | 2009-03-18 21:00:25 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-03-18 21:00:25 +0000 |
commit | 42aa16cccb3d6cd4195ccff9c32d8cb50a25a094 (patch) | |
tree | bc5db4b28d460e299b94c7593181e31404d20fad | |
parent | e91e93225db2e66906878513c6ef4dd6a7ee2b6a (diff) |
when preprocessing a .S file, unknown directives should just be passed through,
and the token after the # should be expanded if it is not a valid directive.
This allows us to transform things like:
#define FOO BAR
# FOO
into # BAR, even though FOO is not normally expanded for directives.
This should fix PR3833
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67236 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Lex/PPDirectives.cpp | 19 | ||||
-rw-r--r-- | lib/Lex/PPLexerChange.cpp | 1 |
2 files changed, 19 insertions, 1 deletions
diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index 8e76b920aa..5797b12ebc 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -476,6 +476,9 @@ void Preprocessor::HandleDirective(Token &Result) { // pp-directive. bool ReadAnyTokensBeforeDirective = CurPPLexer->MIOpt.getHasReadAnyTokensVal(); + // Save the '#' token in case we need to return it later. + Token SavedHash = Result; + // Read the next token, the directive flavor. This isn't expanded due to // C99 6.10.3p8. LexUnexpandedToken(Result); @@ -568,6 +571,22 @@ TryAgain: break; } + // If this is a .S file, treat unknown # directives as non-preprocessor + // directives. This is important because # may be a comment or introduce + // various pseudo-ops. Just return the # token and push back the following + // token to be lexed next time. + if (getLangOptions().AsmPreprocessor) { + Token *Toks = new Token[2](); + // Return the # and the token after it. + Toks[0] = SavedHash; + Toks[1] = Result; + // Enter this token stream so that we re-lex the tokens. Make sure to + // enable macro expansion, in case the token after the # is an identifier + // that is expanded. + EnterTokenStream(Toks, 2, false, true); + return; + } + // If we reached here, the preprocessing token is not valid! Diag(Result, diag::err_pp_invalid_directive); diff --git a/lib/Lex/PPLexerChange.cpp b/lib/Lex/PPLexerChange.cpp index 7c1a089998..6f61c6516b 100644 --- a/lib/Lex/PPLexerChange.cpp +++ b/lib/Lex/PPLexerChange.cpp @@ -18,7 +18,6 @@ #include "clang/Lex/LexDiagnostic.h" #include "clang/Basic/SourceManager.h" #include "llvm/Support/MemoryBuffer.h" - using namespace clang; PPCallbacks::~PPCallbacks() {} |