Author: bruno Date: Tue Mar 29 18:47:40 2016 New Revision: 264808 URL: http://llvm.org/viewvc/llvm-project?rev=264808&view=rev Log: [CrashReproducer] Cleanup and move functionality around in ModuleDependencyCollector. NFC
- Make ModuleDependencyCollector use the DependencyCollector interface - Move some methods from ModuleDependencyListener to ModuleDependencyCollector in order to share common functionality with other future possible callbacks. Modified: cfe/trunk/include/clang/Frontend/Utils.h cfe/trunk/lib/Frontend/CompilerInstance.cpp cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp Modified: cfe/trunk/include/clang/Frontend/Utils.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/Utils.h?rev=264808&r1=264807&r2=264808&view=diff ============================================================================== --- cfe/trunk/include/clang/Frontend/Utils.h (original) +++ cfe/trunk/include/clang/Frontend/Utils.h Tue Mar 29 18:47:40 2016 @@ -73,12 +73,12 @@ void DoPrintPreprocessedInput(Preprocess /// An interface for collecting the dependencies of a compilation. Users should /// use \c attachToPreprocessor and \c attachToASTReader to get all of the /// dependencies. -// FIXME: Migrate DependencyFileGen, DependencyGraphGen, ModuleDepCollectory to -// use this interface. +/// FIXME: Migrate DependencyFileGen and DependencyGraphGen to use this +/// interface. class DependencyCollector { public: void attachToPreprocessor(Preprocessor &PP); - void attachToASTReader(ASTReader &R); + virtual void attachToASTReader(ASTReader &R); llvm::ArrayRef<std::string> getDependencies() const { return Dependencies; } /// Called when a new file is seen. Return true if \p Filename should be added @@ -118,25 +118,29 @@ public: /// Collects the dependencies for imported modules into a directory. Users /// should attach to the AST reader whenever a module is loaded. -class ModuleDependencyCollector { +class ModuleDependencyCollector : public DependencyCollector { std::string DestDir; - bool HasErrors; + bool HasErrors = false; llvm::StringSet<> Seen; vfs::YAMLVFSWriter VFSWriter; + llvm::StringMap<std::string> SymLinkMap; + + bool getRealPath(StringRef SrcPath, SmallVectorImpl<char> &Result); + std::error_code copyToRoot(StringRef Src); public: StringRef getDest() { return DestDir; } bool insertSeen(StringRef Filename) { return Seen.insert(Filename).second; } - void setHasErrors() { HasErrors = true; } + void addFile(StringRef Filename); void addFileMapping(StringRef VPath, StringRef RPath) { VFSWriter.addFileMapping(VPath, RPath); } - void attachToASTReader(ASTReader &R); + void attachToASTReader(ASTReader &R) override; + void writeFileMap(); bool hasErrors() { return HasErrors; } - ModuleDependencyCollector(std::string DestDir) - : DestDir(DestDir), HasErrors(false) {} + ModuleDependencyCollector(std::string DestDir) : DestDir(DestDir) {} ~ModuleDependencyCollector() { writeFileMap(); } }; Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.cpp?rev=264808&r1=264807&r2=264808&view=diff ============================================================================== --- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original) +++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Tue Mar 29 18:47:40 2016 @@ -349,14 +349,18 @@ void CompilerInstance::createPreprocesso AttachDependencyGraphGen(*PP, DepOpts.DOTOutputFile, getHeaderSearchOpts().Sysroot); - for (auto &Listener : DependencyCollectors) - Listener->attachToPreprocessor(*PP); - // If we don't have a collector, but we are collecting module dependencies, // then we're the top level compiler instance and need to create one. - if (!ModuleDepCollector && !DepOpts.ModuleDependencyOutputDir.empty()) + if (!ModuleDepCollector && !DepOpts.ModuleDependencyOutputDir.empty()) { ModuleDepCollector = std::make_shared<ModuleDependencyCollector>( DepOpts.ModuleDependencyOutputDir); + } + + if (ModuleDepCollector) + addDependencyCollector(ModuleDepCollector); + + for (auto &Listener : DependencyCollectors) + Listener->attachToPreprocessor(*PP); // Handle generating header include information, if requested. if (DepOpts.ShowHeaderIncludes) @@ -1319,8 +1323,6 @@ void CompilerInstance::createModuleManag if (TheDependencyFileGenerator) TheDependencyFileGenerator->AttachToASTReader(*ModuleManager); - if (ModuleDepCollector) - ModuleDepCollector->attachToASTReader(*ModuleManager); for (auto &Listener : DependencyCollectors) Listener->attachToASTReader(*ModuleManager); } Modified: cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp?rev=264808&r1=264807&r2=264808&view=diff ============================================================================== --- cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp (original) +++ cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp Tue Mar 29 18:47:40 2016 @@ -25,17 +25,16 @@ namespace { /// Private implementation for ModuleDependencyCollector class ModuleDependencyListener : public ASTReaderListener { ModuleDependencyCollector &Collector; - llvm::StringMap<std::string> SymLinkMap; - - bool getRealPath(StringRef SrcPath, SmallVectorImpl<char> &Result); - std::error_code copyToRoot(StringRef Src); public: ModuleDependencyListener(ModuleDependencyCollector &Collector) : Collector(Collector) {} bool needsInputFileVisitation() override { return true; } bool needsSystemInputFileVisitation() override { return true; } bool visitInputFile(StringRef Filename, bool IsSystem, bool IsOverridden, - bool IsExplicitModule) override; + bool IsExplicitModule) override { + Collector.addFile(Filename); + return true; + } }; } @@ -57,7 +56,7 @@ void ModuleDependencyCollector::writeFil std::error_code EC; llvm::raw_fd_ostream OS(Dest, EC, llvm::sys::fs::F_Text); if (EC) { - setHasErrors(); + HasErrors = true; return; } VFSWriter.write(OS); @@ -81,8 +80,8 @@ static bool real_path(StringRef SrcPath, #endif } -bool ModuleDependencyListener::getRealPath(StringRef SrcPath, - SmallVectorImpl<char> &Result) { +bool ModuleDependencyCollector::getRealPath(StringRef SrcPath, + SmallVectorImpl<char> &Result) { using namespace llvm::sys; SmallString<256> RealPath; StringRef FileName = path::filename(SrcPath); @@ -105,7 +104,7 @@ bool ModuleDependencyListener::getRealPa return true; } -std::error_code ModuleDependencyListener::copyToRoot(StringRef Src) { +std::error_code ModuleDependencyCollector::copyToRoot(StringRef Src) { using namespace llvm::sys; // We need an absolute path to append to the root. @@ -131,7 +130,7 @@ std::error_code ModuleDependencyListener !StringRef(CanonicalPath).equals(RealPath); // Build the destination path. - SmallString<256> Dest = Collector.getDest(); + SmallString<256> Dest = getDest(); path::append(Dest, path::relative_path(HasRemovedSymlinkComponent ? RealPath : CanonicalPath)); @@ -145,18 +144,15 @@ std::error_code ModuleDependencyListener // Use the canonical path under the root for the file mapping. Also create // an additional entry for the real path. - Collector.addFileMapping(CanonicalPath, Dest); + addFileMapping(CanonicalPath, Dest); if (HasRemovedSymlinkComponent) - Collector.addFileMapping(RealPath, Dest); + addFileMapping(RealPath, Dest); return std::error_code(); } -bool ModuleDependencyListener::visitInputFile(StringRef Filename, bool IsSystem, - bool IsOverridden, - bool IsExplicitModule) { - if (Collector.insertSeen(Filename)) +void ModuleDependencyCollector::addFile(StringRef Filename) { + if (insertSeen(Filename)) if (copyToRoot(Filename)) - Collector.setHasErrors(); - return true; + HasErrors = true; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits