]> granicus.if.org Git - clang/commitdiff
Frontend: Add support (unused) for showing all "interesting" headers, not just
authorDaniel Dunbar <daniel@zuster.org>
Wed, 2 Feb 2011 21:11:24 +0000 (21:11 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 2 Feb 2011 21:11:24 +0000 (21:11 +0000)
ones outside the predefines buffer (which is what -H does).

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

include/clang/Frontend/Utils.h
lib/Frontend/HeaderIncludeGen.cpp

index 524db6e429d5dc87078a0e5b952b3efd15b235f4..485161b1bc38273d5c42a181373bfb1a27d7c166 100644 (file)
@@ -75,7 +75,15 @@ void AttachDependencyFileGen(Preprocessor &PP,
 
 /// AttachHeaderIncludeGen - Create a header include list generator, and attach
 /// it to the given preprocessor.
-void AttachHeaderIncludeGen(Preprocessor &PP);
+///
+/// \param ShowAllHeaders - If true, show all header information instead of just
+/// headers following the predefines buffer. This is useful for making sure
+/// includes mentioned on the command line are also reported, but differs from
+/// the default behavior used by -H.
+/// \param OutputPath - If non-empty, a path to write the header include
+/// information to, instead of writing to stderr.
+void AttachHeaderIncludeGen(Preprocessor &PP, bool ShowAllHeaders = false,
+                            llvm::StringRef OutputPath = "");
 
 /// CacheTokens - Cache tokens for use with PCH. Note that this requires
 /// a seekable stream.
index f29e8f159d72ebd802f341faa5c266a950d8c68c..480a97dd101d83fb5265395388e0be23c87fa308 100644 (file)
 #include "clang/Frontend/Utils.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/Lex/Preprocessor.h"
-/*
-#include "clang/Basic/Diagnostic.h"
-#include "clang/Frontend/PreprocessorOutputOptions.h"
-#include "clang/Lex/MacroInfo.h"
-#include "clang/Lex/PPCallbacks.h"
-#include "clang/Lex/Pragma.h"
-#include "clang/Lex/TokenConcatenation.h"
-#include "llvm/ADT/SmallString.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Config/config.h"
-#include "llvm/Support/raw_ostream.h"
-#include <cstdio>
-*/
 using namespace clang;
 
 namespace {
 class HeaderIncludesCallback : public PPCallbacks {
   SourceManager &SM;
   unsigned CurrentIncludeDepth;
+  bool ShowAllHeaders;
   bool HasProcessedPredefines;
 
 public:
-  HeaderIncludesCallback(const Preprocessor *PP)
+  HeaderIncludesCallback(const Preprocessor *PP, bool ShowAllHeaders_)
     : SM(PP->getSourceManager()), CurrentIncludeDepth(0),
-      HasProcessedPredefines(false) {}
+      ShowAllHeaders(ShowAllHeaders_), HasProcessedPredefines(false) {}
 
   virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason,
                            SrcMgr::CharacteristicKind FileType);
 };
 }
 
-void clang::AttachHeaderIncludeGen(Preprocessor &PP) {
-  PP.addPPCallbacks(new HeaderIncludesCallback(&PP));
+void clang::AttachHeaderIncludeGen(Preprocessor &PP, bool ShowAllHeaders,
+                                   llvm::StringRef OutputPath) {
+  PP.addPPCallbacks(new HeaderIncludesCallback(&PP, ShowAllHeaders));
 }
 
 void HeaderIncludesCallback::FileChanged(SourceLocation Loc,
@@ -67,9 +55,16 @@ void HeaderIncludesCallback::FileChanged(SourceLocation Loc,
     if (CurrentIncludeDepth == 0 && !HasProcessedPredefines)
       HasProcessedPredefines = true;
   }
-  
-  // Dump the header include information we are past the predefines buffer.
-  if (HasProcessedPredefines && Reason == PPCallbacks::EnterFile) {
+
+  // Show the header if we are (a) past the predefines, or (b) showing all
+  // headers and in the predefines at a depth past the initial file and command
+  // line buffers.
+  bool ShowHeader = (HasProcessedPredefines ||
+                     (ShowAllHeaders && CurrentIncludeDepth > 2));
+
+  // Dump the header include information we are past the predefines buffer or
+  // are showing all headers.
+  if (ShowHeader && Reason == PPCallbacks::EnterFile) {
     // Write to a temporary string to avoid unnecessary flushing on errs().
     llvm::SmallString<512> Filename(UserLoc.getFilename());
     Lexer::Stringify(Filename);