diff options
author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2016-12-11 04:27:31 +0000 |
---|---|---|
committer | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2016-12-11 04:27:31 +0000 |
commit | 66e9627b0242bdeef0cb0488167397f847c2e80d (patch) | |
tree | 18b0a401557e98652530f9ffb84e9b5749d69d2f /clang/lib/Frontend/ModuleDependencyCollector.cpp | |
parent | 181225b8a3134b2a78be3734a409645045106ecd (diff) | |
download | llvm-66e9627b0242bdeef0cb0488167397f847c2e80d.zip llvm-66e9627b0242bdeef0cb0488167397f847c2e80d.tar.gz llvm-66e9627b0242bdeef0cb0488167397f847c2e80d.tar.bz2 |
[CrashReproducer] Setup a module collector callback for HeaderInclude
Collect missing include that cannot be fetched otherwise (e.g. when
using headermaps).
rdar://problem/27913709
llvm-svn: 289361
Diffstat (limited to 'clang/lib/Frontend/ModuleDependencyCollector.cpp')
-rw-r--r-- | clang/lib/Frontend/ModuleDependencyCollector.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/clang/lib/Frontend/ModuleDependencyCollector.cpp b/clang/lib/Frontend/ModuleDependencyCollector.cpp index cc655f6..578910a 100644 --- a/clang/lib/Frontend/ModuleDependencyCollector.cpp +++ b/clang/lib/Frontend/ModuleDependencyCollector.cpp @@ -38,6 +38,24 @@ public: } }; +struct ModuleDependencyPPCallbacks : public PPCallbacks { + ModuleDependencyCollector &Collector; + SourceManager &SM; + ModuleDependencyPPCallbacks(ModuleDependencyCollector &Collector, + SourceManager &SM) + : Collector(Collector), SM(SM) {} + + void InclusionDirective(SourceLocation HashLoc, const Token &IncludeTok, + StringRef FileName, bool IsAngled, + CharSourceRange FilenameRange, const FileEntry *File, + StringRef SearchPath, StringRef RelativePath, + const Module *Imported) override { + if (!File) + return; + Collector.addFile(File->getName()); + } +}; + struct ModuleDependencyMMCallbacks : public ModuleMapCallbacks { ModuleDependencyCollector &Collector; ModuleDependencyMMCallbacks(ModuleDependencyCollector &Collector) @@ -102,6 +120,8 @@ void ModuleDependencyCollector::attachToASTReader(ASTReader &R) { } void ModuleDependencyCollector::attachToPreprocessor(Preprocessor &PP) { + PP.addPPCallbacks(llvm::make_unique<ModuleDependencyPPCallbacks>( + *this, PP.getSourceManager())); PP.getHeaderSearchInfo().getModuleMap().addModuleMapCallbacks( llvm::make_unique<ModuleDependencyMMCallbacks>(*this)); } |