r264808 - [CrashReproducer] Cleanup and move functionality around in ModuleDependencyCollector. NFC
Bruno Cardoso Lopes via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 29 16:47:40 PDT 2016
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;
}
More information about the cfe-commits
mailing list