summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/modularize/Modularize.cpp
diff options
context:
space:
mode:
authorJohn Thompson <John.Thompson.JTSoftware@gmail.com>2015-02-13 14:29:22 +0000
committerJohn Thompson <John.Thompson.JTSoftware@gmail.com>2015-02-13 14:29:22 +0000
commitd845baecb47f4e74e2cd7ec94dc8d91c15660425 (patch)
treee6faf2b55328fb3e2cd97e7ff679da2cc4261ae8 /clang-tools-extra/modularize/Modularize.cpp
parent48bc169f046518388966dda68131350e91a3d65b (diff)
downloadbcm5719-llvm-d845baecb47f4e74e2cd7ec94dc8d91c15660425.tar.gz
bcm5719-llvm-d845baecb47f4e74e2cd7ec94dc8d91c15660425.zip
Moved header list loading to new class. This is staging for adding module map loading and checking support.
llvm-svn: 229108
Diffstat (limited to 'clang-tools-extra/modularize/Modularize.cpp')
-rw-r--r--clang-tools-extra/modularize/Modularize.cpp112
1 files changed, 19 insertions, 93 deletions
diff --git a/clang-tools-extra/modularize/Modularize.cpp b/clang-tools-extra/modularize/Modularize.cpp
index 078cc5437d3..9d91557fb0d 100644
--- a/clang-tools-extra/modularize/Modularize.cpp
+++ b/clang-tools-extra/modularize/Modularize.cpp
@@ -144,6 +144,7 @@
//===----------------------------------------------------------------------===//
#include "Modularize.h"
+#include "ModularizeUtilities.h"
#include "PreprocessorTracker.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/AST/ASTContext.h"
@@ -178,10 +179,10 @@ using namespace llvm::opt;
using namespace Modularize;
// Option to specify a file name for a list of header files to check.
-cl::list<std::string>
-ListFileNames(cl::Positional, cl::value_desc("list"),
- cl::desc("<list of one or more header list files>"),
- cl::CommaSeparated);
+cl::list<std::string>
+ListFileNames(cl::Positional, cl::value_desc("list"),
+ cl::desc("<list of one or more header list files>"),
+ cl::CommaSeparated);
// Collect all other arguments, which will be passed to the front end.
cl::list<std::string>
@@ -224,80 +225,6 @@ const char *Argv0;
// Save the command line for comments.
std::string CommandLine;
-// Read the header list file and collect the header file names and
-// optional dependencies.
-std::error_code
-getHeaderFileNames(SmallVectorImpl<std::string> &HeaderFileNames,
- DependencyMap &Dependencies, StringRef ListFileName,
- StringRef HeaderPrefix) {
- // By default, use the path component of the list file name.
- SmallString<256> HeaderDirectory(ListFileName);
- sys::path::remove_filename(HeaderDirectory);
- SmallString<256> CurrentDirectory;
- sys::fs::current_path(CurrentDirectory);
-
- // Get the prefix if we have one.
- if (HeaderPrefix.size() != 0)
- HeaderDirectory = HeaderPrefix;
-
- // Read the header list file into a buffer.
- ErrorOr<std::unique_ptr<MemoryBuffer>> listBuffer =
- MemoryBuffer::getFile(ListFileName);
- if (std::error_code EC = listBuffer.getError())
- return EC;
-
- // Parse the header list into strings.
- SmallVector<StringRef, 32> Strings;
- listBuffer.get()->getBuffer().split(Strings, "\n", -1, false);
-
- // Collect the header file names from the string list.
- for (SmallVectorImpl<StringRef>::iterator I = Strings.begin(),
- E = Strings.end();
- I != E; ++I) {
- StringRef Line = I->trim();
- // Ignore comments and empty lines.
- if (Line.empty() || (Line[0] == '#'))
- continue;
- std::pair<StringRef, StringRef> TargetAndDependents = Line.split(':');
- SmallString<256> HeaderFileName;
- // Prepend header file name prefix if it's not absolute.
- if (sys::path::is_absolute(TargetAndDependents.first))
- llvm::sys::path::native(TargetAndDependents.first, HeaderFileName);
- else {
- if (HeaderDirectory.size() != 0)
- HeaderFileName = HeaderDirectory;
- else
- HeaderFileName = CurrentDirectory;
- sys::path::append(HeaderFileName, TargetAndDependents.first);
- sys::path::native(HeaderFileName);
- }
- // Handle optional dependencies.
- DependentsVector Dependents;
- SmallVector<StringRef, 4> DependentsList;
- TargetAndDependents.second.split(DependentsList, " ", -1, false);
- int Count = DependentsList.size();
- for (int Index = 0; Index < Count; ++Index) {
- SmallString<256> Dependent;
- if (sys::path::is_absolute(DependentsList[Index]))
- Dependent = DependentsList[Index];
- else {
- if (HeaderDirectory.size() != 0)
- Dependent = HeaderDirectory;
- else
- Dependent = CurrentDirectory;
- sys::path::append(Dependent, DependentsList[Index]);
- }
- sys::path::native(Dependent);
- Dependents.push_back(Dependent.str());
- }
- // Save the resulting header file path and dependencies.
- HeaderFileNames.push_back(HeaderFileName.str());
- Dependencies[HeaderFileName.str()] = Dependents;
- }
-
- return std::error_code();
-}
-
// Helper function for finding the input file in an arguments list.
std::string findInputFile(const CommandLineArguments &CLArgs) {
std::unique_ptr<OptTable> Opts(createDriverOptTable());
@@ -706,22 +633,20 @@ int main(int Argc, const char **Argv) {
return 1;
}
+ std::unique_ptr<ModularizeUtilities> ModUtil;
+
+ ModUtil.reset(
+ ModularizeUtilities::createModularizeUtilities(
+ ListFileNames, HeaderPrefix));
+
// Get header file names and dependencies.
- SmallVector<std::string, 32> Headers;
- DependencyMap Dependencies;
- for (auto I : ListFileNames) {
- if (std::error_code EC =
- getHeaderFileNames(Headers, Dependencies, I, HeaderPrefix)) {
- errs() << Argv[0] << ": error: Unable to get header list '" << I
- << "': " << EC.message() << '\n';
- return 1;
- }
- }
+ ModUtil->loadAllHeaderListsAndDependencies();
+
// If we are in assistant mode, output the module map and quit.
if (ModuleMapPath.length() != 0) {
- if (!createModuleMap(ModuleMapPath, Headers, Dependencies, HeaderPrefix,
- RootModule))
+ if (!createModuleMap(ModuleMapPath, ModUtil->HeaderFileNames,
+ ModUtil->Dependencies, HeaderPrefix, RootModule))
return 1; // Failed.
return 0; // Success - Skip checks in assistant mode.
}
@@ -735,12 +660,13 @@ int main(int Argc, const char **Argv) {
// Create preprocessor tracker, to watch for macro and conditional problems.
std::unique_ptr<PreprocessorTracker> PPTracker(
- PreprocessorTracker::create(Headers, BlockCheckHeaderListOnly));
+ PreprocessorTracker::create(ModUtil->HeaderFileNames,
+ BlockCheckHeaderListOnly));
// Parse all of the headers, detecting duplicates.
EntityMap Entities;
- ClangTool Tool(*Compilations, Headers);
- Tool.appendArgumentsAdjuster(getAddDependenciesAdjuster(Dependencies));
+ ClangTool Tool(*Compilations, ModUtil->HeaderFileNames);
+ Tool.appendArgumentsAdjuster(getAddDependenciesAdjuster(ModUtil->Dependencies));
int HadErrors = 0;
ModularizeFrontendActionFactory Factory(Entities, *PPTracker, HadErrors);
HadErrors |= Tool.run(&Factory);
OpenPOWER on IntegriCloud