]> granicus.if.org Git - clang/commitdiff
[Preprocessor] Enhance Ifdef/Ifndef/Defined preprocessor callbacks to also pass
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sat, 8 Dec 2012 02:21:11 +0000 (02:21 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sat, 8 Dec 2012 02:21:11 +0000 (02:21 +0000)
a MacroInfo object if the identifier was a macro name.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@169665 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Lex/PPCallbacks.h
include/clang/Lex/PPConditionalDirectiveRecord.h
lib/Lex/PPConditionalDirectiveRecord.cpp
lib/Lex/PPDirectives.cpp
lib/Lex/PPExpressions.cpp

index 9d1444738b37662dba846a8406e0fe5382f99a5b..a32e163049c93762fb11c85854b40d1a084113ef 100644 (file)
@@ -199,7 +199,8 @@ public:
   }
   
   /// \brief Hook called whenever the 'defined' operator is seen.
-  virtual void Defined(const Token &MacroNameTok) {
+  /// \param MI The MacroInfo if the name was a macro, null otherwise.
+  virtual void Defined(const Token &MacroNameTok, const MacroInfo *MI) {
   }
   
   /// \brief Hook called when a source range is skipped.
@@ -228,13 +229,17 @@ public:
   /// \brief Hook called whenever an \#ifdef is seen.
   /// \param Loc the source location of the directive.
   /// \param MacroNameTok Information on the token being tested.
-  virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok) {
+  /// \param MI The MacroInfo if the name was a macro, null otherwise.
+  virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok,
+                     const MacroInfo *MI) {
   }
 
   /// \brief Hook called whenever an \#ifndef is seen.
   /// \param Loc the source location of the directive.
   /// \param MacroNameTok Information on the token being tested.
-  virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok) {
+  /// \param MI The MacroInfo if the name was a macro, null otherwise.
+  virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok,
+                      const MacroInfo *MI) {
   }
 
   /// \brief Hook called whenever an \#else is seen.
@@ -362,9 +367,9 @@ public:
     Second->MacroUndefined(MacroNameTok, MI);
   }
 
-  virtual void Defined(const Token &MacroNameTok) {
-    First->Defined(MacroNameTok);
-    Second->Defined(MacroNameTok);
+  virtual void Defined(const Token &MacroNameTok, const MacroInfo *MI) {
+    First->Defined(MacroNameTok, MI);
+    Second->Defined(MacroNameTok, MI);
   }
 
   virtual void SourceRangeSkipped(SourceRange Range) {
@@ -386,15 +391,17 @@ public:
   }
 
   /// \brief Hook called whenever an \#ifdef is seen.
-  virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok) {
-    First->Ifdef(Loc, MacroNameTok);
-    Second->Ifdef(Loc, MacroNameTok);
+  virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok,
+                     const MacroInfo *MI) {
+    First->Ifdef(Loc, MacroNameTok, MI);
+    Second->Ifdef(Loc, MacroNameTok, MI);
   }
 
   /// \brief Hook called whenever an \#ifndef is seen.
-  virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok) {
-    First->Ifndef(Loc, MacroNameTok);
-    Second->Ifndef(Loc, MacroNameTok);
+  virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok,
+                      const MacroInfo *MI) {
+    First->Ifndef(Loc, MacroNameTok, MI);
+    Second->Ifndef(Loc, MacroNameTok, MI);
   }
 
   /// \brief Hook called whenever an \#else is seen.
index d552c2735aba7c2ab56b5474320a9748a54a1372..29d9289274bf2565e191c222df4e07ff758c163b 100644 (file)
@@ -89,8 +89,10 @@ private:
   virtual void If(SourceLocation Loc, SourceRange ConditionRange);
   virtual void Elif(SourceLocation Loc, SourceRange ConditionRange,
                     SourceLocation IfLoc);
-  virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok);
-  virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok);
+  virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok,
+                     const MacroInfo *MI);
+  virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok,
+                      const MacroInfo *MI);
   virtual void Else(SourceLocation Loc, SourceLocation IfLoc);
   virtual void Endif(SourceLocation Loc, SourceLocation IfLoc);
 };
index edcde871a038cb180ab314b3c094c616f7415270..063c556b4a5edf968b49cd4aba666d0da9474b34 100644 (file)
@@ -82,13 +82,15 @@ void PPConditionalDirectiveRecord::If(SourceLocation Loc,
 }
 
 void PPConditionalDirectiveRecord::Ifdef(SourceLocation Loc,
-                                         const Token &MacroNameTok) {
+                                         const Token &MacroNameTok,
+                                         const MacroInfo *MI) {
   addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));
   CondDirectiveStack.push_back(Loc);
 }
 
 void PPConditionalDirectiveRecord::Ifndef(SourceLocation Loc,
-                                          const Token &MacroNameTok) {
+                                          const Token &MacroNameTok,
+                                          const MacroInfo *MI) {
   addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));
   CondDirectiveStack.push_back(Loc);
 }
index 74a787daa90723442925912116b1de8c6dfe3dc8..7b5df9c314875a0f5d130bea668f20aa63650fa0 100644 (file)
@@ -2047,9 +2047,9 @@ void Preprocessor::HandleIfdefDirective(Token &Result, bool isIfndef,
 
   if (Callbacks) {
     if (isIfndef)
-      Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok);
+      Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok, MI);
     else
-      Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok);
+      Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok, MI);
   }
 
   // Should we include the stuff contained by this directive?
index 868f2dda647074203b850759dc42d005aa7e8883..9b33c91bcb5b9a587800861f519427ee91fbc21c 100644 (file)
@@ -111,15 +111,21 @@ static bool EvaluateDefined(PPValue &Result, Token &PeekTok, DefinedTracker &DT,
   Result.Val = II->hasMacroDefinition();
   Result.Val.setIsUnsigned(false);  // Result is signed intmax_t.
 
+  MacroInfo *Macro = 0;
   // If there is a macro, mark it used.
   if (Result.Val != 0 && ValueLive) {
-    MacroInfo *Macro = PP.getMacroInfo(II);
+    Macro = PP.getMacroInfo(II);
     PP.markMacroAsUsed(Macro);
   }
 
   // Invoke the 'defined' callback.
-  if (PPCallbacks *Callbacks = PP.getPPCallbacks())
-    Callbacks->Defined(PeekTok);
+  if (PPCallbacks *Callbacks = PP.getPPCallbacks()) {
+    MacroInfo *MI = Macro;
+    // Pass the MacroInfo for the macro name even if the value is dead.
+    if (!MI && Result.Val != 0)
+      MI = PP.getMacroInfo(II);
+    Callbacks->Defined(PeekTok, MI);
+  }
 
   // If we are in parens, ensure we have a trailing ).
   if (LParenLoc.isValid()) {