diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-09-12 20:41:59 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-09-12 20:41:59 +0000 |
commit | 1e44e0229288aa4826bdd2e62546b9156032f718 (patch) | |
tree | a396ecf7fd708f29746c6339a5c01fb0c0c0cf8e | |
parent | 4a9eb5f8dc613a9afe925ce3c277a7078e1bb8a1 (diff) | |
download | bcm5719-llvm-1e44e0229288aa4826bdd2e62546b9156032f718.tar.gz bcm5719-llvm-1e44e0229288aa4826bdd2e62546b9156032f718.zip |
Introduce a cc1-level option to provide the path to the module cache,
where the compiler will look for module files. Eliminates the
egregious hack where we looked into the header search paths for
modules.
llvm-svn: 139538
-rw-r--r-- | clang/include/clang/Driver/CC1Options.td | 4 | ||||
-rw-r--r-- | clang/include/clang/Frontend/HeaderSearchOptions.h | 3 | ||||
-rw-r--r-- | clang/include/clang/Lex/HeaderSearch.h | 15 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInstance.cpp | 8 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Frontend/InitHeaderSearch.cpp | 2 | ||||
-rw-r--r-- | clang/lib/Lex/HeaderSearch.cpp | 10 | ||||
-rw-r--r-- | clang/test/Modules/diamond.c | 8 | ||||
-rw-r--r-- | clang/test/Modules/load_failure.c | 4 | ||||
-rw-r--r-- | clang/test/Modules/lookup.cpp | 4 | ||||
-rw-r--r-- | clang/test/Modules/lookup.m | 4 | ||||
-rw-r--r-- | clang/test/Modules/macros.c | 2 | ||||
-rw-r--r-- | clang/test/Modules/module-private.cpp | 2 | ||||
-rw-r--r-- | clang/test/Modules/objc-categories.m | 8 |
14 files changed, 58 insertions, 25 deletions
diff --git a/clang/include/clang/Driver/CC1Options.td b/clang/include/clang/Driver/CC1Options.td index c1ceba87d1c..e3d79ac385a 100644 --- a/clang/include/clang/Driver/CC1Options.td +++ b/clang/include/clang/Driver/CC1Options.td @@ -605,6 +605,10 @@ def nostdincxx : Flag<"-nostdinc++">, HelpText<"Disable standard #include directories for the C++ standard library">; def nobuiltininc : Flag<"-nobuiltininc">, HelpText<"Disable builtin #include directories">; +def fmodule_cache_path : JoinedOrSeparate<"-fmodule-cache-path">, + MetaVarName<"<directory>">, + HelpText<"Specify the module cache path">; + def F : JoinedOrSeparate<"-F">, MetaVarName<"<directory>">, HelpText<"Add directory to framework include search path">; def I : JoinedOrSeparate<"-I">, MetaVarName<"<directory>">, diff --git a/clang/include/clang/Frontend/HeaderSearchOptions.h b/clang/include/clang/Frontend/HeaderSearchOptions.h index e1b1273ff4d..a81a0cb9929 100644 --- a/clang/include/clang/Frontend/HeaderSearchOptions.h +++ b/clang/include/clang/Frontend/HeaderSearchOptions.h @@ -75,6 +75,9 @@ public: /// etc.). std::string ResourceDir; + /// \brief The directory used for the module cache. + std::string ModuleCachePath; + /// Include the compiler builtin includes. unsigned UseBuiltinIncludes : 1; diff --git a/clang/include/clang/Lex/HeaderSearch.h b/clang/include/clang/Lex/HeaderSearch.h index 676a245305d..f6552a4014e 100644 --- a/clang/include/clang/Lex/HeaderSearch.h +++ b/clang/include/clang/Lex/HeaderSearch.h @@ -129,6 +129,9 @@ class HeaderSearch { unsigned SystemDirIdx; bool NoCurDirSearch; + /// \brief The path to the module cache. + std::string ModuleCachePath; + /// FileInfo - This contains all of the preprocessor-specific data about files /// that are included. The vector is indexed by the FileEntry's UID. /// @@ -193,6 +196,11 @@ public: //LookupFileCache.clear(); } + /// \brief Set the path to the module cache. + void setModuleCachePath(StringRef Path) { + ModuleCachePath = Path; + } + /// ClearFileInfo - Forget everything we know about headers so far. void ClearFileInfo() { FileInfo.clear(); @@ -308,6 +316,13 @@ public: /// FileEntry, uniquing them through the the 'HeaderMaps' datastructure. const HeaderMap *CreateHeaderMap(const FileEntry *FE); + /// \brief Search in the module cache path for a module with the given + /// name. + /// + /// \returns A file describing the named module, if available, or NULL to + /// indicate that the module could not be found. + const FileEntry *lookupModule(StringRef ModuleName); + void IncrementFrameworkLookupCount() { ++NumFrameworkLookups; } typedef std::vector<HeaderFileInfo>::const_iterator header_file_iterator; diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp index bd019e0cf23..1106e48e910 100644 --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/lib/Frontend/CompilerInstance.cpp @@ -636,14 +636,8 @@ ModuleKey CompilerInstance::loadModule(SourceLocation ImportLoc, CurFile = SourceMgr.getFileEntryForID(SourceMgr.getMainFileID()); // Search for a module with the given name. - std::string Filename = ModuleName.getName().str(); - Filename += ".pcm"; - const DirectoryLookup *CurDir = 0; const FileEntry *ModuleFile - = PP->getHeaderSearchInfo().LookupFile(Filename, /*isAngled=*/false, - /*FromDir=*/0, CurDir, CurFile, - /*SearchPath=*/0, - /*RelativePath=*/0); + = PP->getHeaderSearchInfo().lookupModule(ModuleName.getName()); if (!ModuleFile) { getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_found) << ModuleName.getName() diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 7ea31613bd3..e7b88542241 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -576,6 +576,10 @@ static void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts, Res.push_back("-resource-dir"); Res.push_back(Opts.ResourceDir); } + if (!Opts.ModuleCachePath.empty()) { + Res.push_back("-fmodule-cache-path"); + Res.push_back(Opts.ModuleCachePath); + } if (!Opts.UseStandardIncludes) Res.push_back("-nostdinc"); if (!Opts.UseStandardCXXIncludes) @@ -1378,7 +1382,8 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) { if (const Arg *A = Args.getLastArg(OPT_stdlib_EQ)) Opts.UseLibcxx = (strcmp(A->getValue(Args), "libc++") == 0); Opts.ResourceDir = Args.getLastArgValue(OPT_resource_dir); - + Opts.ModuleCachePath = Args.getLastArgValue(OPT_fmodule_cache_path); + // Add -I..., -F..., and -index-header-map options in order. bool IsIndexHeaderMap = false; for (arg_iterator it = Args.filtered_begin(OPT_I, OPT_F, @@ -1426,7 +1431,7 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) { ((*it)->getOption().matches(OPT_cxx_isystem) ? frontend::CXXSystem : frontend::System), true, false, !(*it)->getOption().matches(OPT_iwithsysroot)); - + // FIXME: Need options for the various environment variables! } diff --git a/clang/lib/Frontend/InitHeaderSearch.cpp b/clang/lib/Frontend/InitHeaderSearch.cpp index 08af5322675..05152a77b2f 100644 --- a/clang/lib/Frontend/InitHeaderSearch.cpp +++ b/clang/lib/Frontend/InitHeaderSearch.cpp @@ -1161,5 +1161,7 @@ void clang::ApplyHeaderSearchOptions(HeaderSearch &HS, if (HSOpts.UseStandardIncludes) Init.AddDefaultSystemIncludePaths(Lang, Triple, HSOpts); + HS.setModuleCachePath(HSOpts.ModuleCachePath); + Init.Realize(Lang); } diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp index 0ba76327421..36826756b8b 100644 --- a/clang/lib/Lex/HeaderSearch.cpp +++ b/clang/lib/Lex/HeaderSearch.cpp @@ -98,6 +98,16 @@ const HeaderMap *HeaderSearch::CreateHeaderMap(const FileEntry *FE) { return 0; } +const FileEntry *HeaderSearch::lookupModule(StringRef ModuleName) { + // If we don't have a module cache path, we can't do anything. + if (ModuleCachePath.empty()) + return 0; + + llvm::SmallString<256> FileName(ModuleCachePath); + llvm::sys::path::append(FileName, ModuleName + ".pcm"); + return getFileMgr().getFile(FileName); +} + //===----------------------------------------------------------------------===// // File lookup within a DirectoryLookup scope //===----------------------------------------------------------------------===// diff --git a/clang/test/Modules/diamond.c b/clang/test/Modules/diamond.c index 6f6ff7bf466..13389e2b6ac 100644 --- a/clang/test/Modules/diamond.c +++ b/clang/test/Modules/diamond.c @@ -21,7 +21,7 @@ void test_diamond(int i, float f, double d, char c) { } // RUN: %clang_cc1 -emit-module -o %T/diamond_top.pcm %S/Inputs/diamond_top.h -// RUN: %clang_cc1 -I %T -emit-module -o %T/diamond_left.pcm %S/Inputs/diamond_left.h -// RUN: %clang_cc1 -I %T -emit-module -o %T/diamond_right.pcm %S/Inputs/diamond_right.h -// RUN: %clang_cc1 -I %T -emit-module -o %T/diamond_bottom.pcm %S/Inputs/diamond_bottom.h -// RUN: %clang_cc1 -I %T %s -verify +// RUN: %clang_cc1 -fmodule-cache-path %T -emit-module -o %T/diamond_left.pcm %S/Inputs/diamond_left.h +// RUN: %clang_cc1 -fmodule-cache-path %T -emit-module -o %T/diamond_right.pcm %S/Inputs/diamond_right.h +// RUN: %clang_cc1 -fmodule-cache-path %T -emit-module -o %T/diamond_bottom.pcm %S/Inputs/diamond_bottom.h +// RUN: %clang_cc1 -fmodule-cache-path %T %s -verify diff --git a/clang/test/Modules/load_failure.c b/clang/test/Modules/load_failure.c index f034c787396..4685a41ef6b 100644 --- a/clang/test/Modules/load_failure.c +++ b/clang/test/Modules/load_failure.c @@ -7,10 +7,10 @@ __import_module__ load_failure; #endif // RUN: %clang_cc1 -x c++ -emit-module -o %T/load_failure.pcm %S/Inputs/load_failure.h -// RUN: %clang_cc1 -I %T %s -DNONEXISTENT 2>&1 | FileCheck -check-prefix=CHECK-NONEXISTENT %s +// RUN: %clang_cc1 -fmodule-cache-path %T %s -DNONEXISTENT 2>&1 | FileCheck -check-prefix=CHECK-NONEXISTENT %s // CHECK-NONEXISTENT: load_failure.c:2:19: fatal error: module 'load_nonexistent' not found -// RUN: not %clang_cc1 -I %T %s -DFAILURE 2> %t +// RUN: not %clang_cc1 -fmodule-cache-path %T %s -DFAILURE 2> %t // RUN: FileCheck -check-prefix=CHECK-FAILURE %s < %t // FIXME: Clean up diagnostic text below and give it a location diff --git a/clang/test/Modules/lookup.cpp b/clang/test/Modules/lookup.cpp index 7c53106e8a0..c8f7993540d 100644 --- a/clang/test/Modules/lookup.cpp +++ b/clang/test/Modules/lookup.cpp @@ -16,8 +16,8 @@ void test(int i, float f) { // RUN: %clang_cc1 -emit-module -x c++ -verify -o %T/lookup_left_cxx.pcm %S/Inputs/lookup_left.hpp // RUN: %clang_cc1 -emit-module -x c++ -o %T/lookup_right_cxx.pcm %S/Inputs/lookup_right.hpp -// RUN: %clang_cc1 -x c++ -I %T %s -verify -// RUN: %clang_cc1 -ast-print -x c++ -I %T %s | FileCheck -check-prefix=CHECK-PRINT %s +// RUN: %clang_cc1 -x c++ -fmodule-cache-path %T %s -verify +// RUN: %clang_cc1 -ast-print -x c++ -fmodule-cache-path %T %s | FileCheck -check-prefix=CHECK-PRINT %s // CHECK-PRINT: int *f0(int *); // CHECK-PRINT: float *f0(float *); diff --git a/clang/test/Modules/lookup.m b/clang/test/Modules/lookup.m index 02898a5dcfc..ca68e89e0e6 100644 --- a/clang/test/Modules/lookup.m +++ b/clang/test/Modules/lookup.m @@ -10,8 +10,8 @@ void test(id x) { // RUN: %clang_cc1 -emit-module -x objective-c -o %T/lookup_left_objc.pcm %S/Inputs/lookup_left.h // RUN: %clang_cc1 -emit-module -x objective-c -o %T/lookup_right_objc.pcm %S/Inputs/lookup_right.h -// RUN: %clang_cc1 -x objective-c -I %T -verify %s -// RUN: %clang_cc1 -ast-print -x objective-c -I %T %s | FileCheck -check-prefix=CHECK-PRINT %s +// RUN: %clang_cc1 -x objective-c -fmodule-cache-path %T -verify %s +// RUN: %clang_cc1 -ast-print -x objective-c -fmodule-cache-path %T %s | FileCheck -check-prefix=CHECK-PRINT %s // CHECK-PRINT: - (int) method; // CHECK-PRINT: - (double) method diff --git a/clang/test/Modules/macros.c b/clang/test/Modules/macros.c index 691e8ec0ec1..346f91f2215 100644 --- a/clang/test/Modules/macros.c +++ b/clang/test/Modules/macros.c @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -emit-module -o %t/macros.pcm -DMODULE %s -// RUN: %clang_cc1 -verify -I %t %s +// RUN: %clang_cc1 -verify -fmodule-cache-path %t %s #if defined(MODULE) #define INTEGER(X) int diff --git a/clang/test/Modules/module-private.cpp b/clang/test/Modules/module-private.cpp index 33ec32048af..539e591e093 100644 --- a/clang/test/Modules/module-private.cpp +++ b/clang/test/Modules/module-private.cpp @@ -1,7 +1,7 @@ // RUN: mkdir -p %t // RUN: %clang_cc1 -x c++ -emit-module -o %t/left.pcm %s -D MODULE_LEFT // RUN: %clang_cc1 -x c++ -emit-module -o %t/right.pcm %s -D MODULE_RIGHT -// RUN: %clang_cc1 -I %t %s -verify +// RUN: %clang_cc1 -fmodule-cache-path %t %s -verify #if defined(MODULE_LEFT) diff --git a/clang/test/Modules/objc-categories.m b/clang/test/Modules/objc-categories.m index 3bae4b8a99f..57978588700 100644 --- a/clang/test/Modules/objc-categories.m +++ b/clang/test/Modules/objc-categories.m @@ -1,9 +1,9 @@ // RUN: mkdir -p %t // RUN: %clang_cc1 -emit-module -o %t/diamond_top.pcm %s -D MODULE_TOP -// RUN: %clang_cc1 -I %t -emit-module -o %t/diamond_left.pcm %s -D MODULE_LEFT -// RUN: %clang_cc1 -I %t -emit-module -o %t/diamond_right.pcm %s -D MODULE_RIGHT -// RUN: %clang_cc1 -I %t -emit-module -o %t/diamond_bottom.pcm %s -D MODULE_BOTTOM -// RUN: %clang_cc1 -I %t %s -verify +// RUN: %clang_cc1 -fmodule-cache-path %t -emit-module -o %t/diamond_left.pcm %s -D MODULE_LEFT +// RUN: %clang_cc1 -fmodule-cache-path %t -emit-module -o %t/diamond_right.pcm %s -D MODULE_RIGHT +// RUN: %clang_cc1 -fmodule-cache-path %t -emit-module -o %t/diamond_bottom.pcm %s -D MODULE_BOTTOM +// RUN: %clang_cc1 -fmodule-cache-path %t %s -verify /*============================================================================*/ #ifdef MODULE_TOP |