]> granicus.if.org Git - clang/commitdiff
when preprocessing a .S file, unknown directives should just be passed through,
authorChris Lattner <sabre@nondot.org>
Wed, 18 Mar 2009 21:00:25 +0000 (21:00 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 18 Mar 2009 21:00:25 +0000 (21:00 +0000)
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

lib/Lex/PPDirectives.cpp
lib/Lex/PPLexerChange.cpp

index 8e76b920aab79c5bf79b61ec1876e96e84201900..5797b12ebc81216f95ab4a01edc9f0ca85af2fc5 100644 (file)
@@ -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);
   
index 7c1a08999826507c9d2e4dc0978abc6488245532..6f61c6516b323407c17ceb324175273660dcf556 100644 (file)
@@ -18,7 +18,6 @@
 #include "clang/Lex/LexDiagnostic.h"
 #include "clang/Basic/SourceManager.h"
 #include "llvm/Support/MemoryBuffer.h"
-
 using namespace clang;
 
 PPCallbacks::~PPCallbacks() {}