diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-01-30 06:01:29 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-01-30 06:01:29 +0000 |
commit | 899292827456532bc66219f9d778595c57614f77 (patch) | |
tree | fa9971f4bad44e176c13d13bc80d68f4dce77e25 /clang | |
parent | 829400bb22fc72d291fd3e5057b0880d7b09aafa (diff) | |
download | bcm5719-llvm-899292827456532bc66219f9d778595c57614f77.tar.gz bcm5719-llvm-899292827456532bc66219f9d778595c57614f77.zip |
Thread a TargetInfo through to the module map; we'll need it for
target-specific module requirements.
llvm-svn: 149224
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/Module.h | 13 | ||||
-rw-r--r-- | clang/include/clang/Lex/HeaderSearch.h | 6 | ||||
-rw-r--r-- | clang/include/clang/Lex/ModuleMap.h | 12 | ||||
-rw-r--r-- | clang/lib/Basic/Module.cpp | 13 | ||||
-rw-r--r-- | clang/lib/Frontend/ASTUnit.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInstance.cpp | 5 | ||||
-rw-r--r-- | clang/lib/Frontend/FrontendActions.cpp | 2 | ||||
-rw-r--r-- | clang/lib/Lex/HeaderSearch.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Lex/ModuleMap.cpp | 13 | ||||
-rw-r--r-- | clang/lib/Lex/Preprocessor.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 3 | ||||
-rw-r--r-- | clang/unittests/Basic/SourceManagerTest.cpp | 4 | ||||
-rw-r--r-- | clang/unittests/Lex/LexerTest.cpp | 2 |
13 files changed, 64 insertions, 25 deletions
diff --git a/clang/include/clang/Basic/Module.h b/clang/include/clang/Basic/Module.h index e75f43e0e94..82dbd5b0c02 100644 --- a/clang/include/clang/Basic/Module.h +++ b/clang/include/clang/Basic/Module.h @@ -33,6 +33,7 @@ namespace clang { class DirectoryEntry; class FileEntry; class LangOptions; +class TargetInfo; /// \brief Describes the name of a module. typedef llvm::SmallVector<std::pair<std::string, SourceLocation>, 2> @@ -178,10 +179,14 @@ public: /// \param LangOpts The language options used for the current /// translation unit. /// + /// \param Target The target options used for the current translation unit. + /// /// \param Feature If this module is unavailable, this parameter /// will be set to one of the features that is required for use of /// this module (but is not available). - bool isAvailable(const LangOptions &LangOpts, StringRef &Feature) const; + bool isAvailable(const LangOptions &LangOpts, + const TargetInfo &Target, + StringRef &Feature) const; /// \brief Determine whether this module is a submodule. bool isSubModule() const { return Parent != 0; } @@ -246,7 +251,11 @@ public: /// /// \param LangOpts The set of language options that will be used to /// evaluate the availability of this feature. - void addRequirement(StringRef Feature, const LangOptions &LangOpts); + /// + /// \param Target The target options that will be used to evaluate the + /// availability of this feature. + void addRequirement(StringRef Feature, const LangOptions &LangOpts, + const TargetInfo &Target); /// \brief Find the submodule with the given name. /// diff --git a/clang/include/clang/Lex/HeaderSearch.h b/clang/include/clang/Lex/HeaderSearch.h index c5969489f51..84bb37da3a4 100644 --- a/clang/include/clang/Lex/HeaderSearch.h +++ b/clang/include/clang/Lex/HeaderSearch.h @@ -189,7 +189,7 @@ class HeaderSearch { public: HeaderSearch(FileManager &FM, DiagnosticsEngine &Diags, - const LangOptions &LangOpts); + const LangOptions &LangOpts, const TargetInfo *Target); ~HeaderSearch(); FileManager &getFileMgr() const { return FileMgr; } @@ -243,6 +243,10 @@ public: ExternalSource = ES; } + /// \brief Set the target information for the header search, if not + /// already known. + void setTarget(const TargetInfo &Target); + /// LookupFile - Given a "foo" or <foo> reference, look up the indicated file, /// return null on failure. /// diff --git a/clang/include/clang/Lex/ModuleMap.h b/clang/include/clang/Lex/ModuleMap.h index 3e794f5c009..6176ed8c30a 100644 --- a/clang/include/clang/Lex/ModuleMap.h +++ b/clang/include/clang/Lex/ModuleMap.h @@ -39,7 +39,8 @@ class ModuleMap { SourceManager *SourceMgr; llvm::IntrusiveRefCntPtr<DiagnosticsEngine> Diags; const LangOptions &LangOpts; - + const TargetInfo *Target; + /// \brief Language options used to parse the module map itself. /// /// These are always simple C language options. @@ -89,13 +90,18 @@ public: /// diagnostics. /// /// \param LangOpts Language options for this translation unit. + /// + /// \param Target The target for this translation unit. ModuleMap(FileManager &FileMgr, const DiagnosticConsumer &DC, - const LangOptions &LangOpts); + const LangOptions &LangOpts, const TargetInfo *Target); /// \brief Destroy the module map. /// ~ModuleMap(); - + + /// \brief Set the target information. + void setTarget(const TargetInfo &Target); + /// \brief Retrieve the module that owns the given header file, if any. /// /// \param File The header file that is likely to be included. diff --git a/clang/lib/Basic/Module.cpp b/clang/lib/Basic/Module.cpp index 015f421f9db..3052532650e 100644 --- a/clang/lib/Basic/Module.cpp +++ b/clang/lib/Basic/Module.cpp @@ -47,7 +47,8 @@ Module::~Module() { /// \brief Determine whether a translation unit built using the current /// language options has the given feature. -static bool hasFeature(StringRef Feature, const LangOptions &LangOpts) { +static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, + const TargetInfo &Target) { return llvm::StringSwitch<bool>(Feature) .Case("blocks", LangOpts.Blocks) .Case("cplusplus", LangOpts.CPlusPlus) @@ -58,13 +59,14 @@ static bool hasFeature(StringRef Feature, const LangOptions &LangOpts) { } bool -Module::isAvailable(const LangOptions &LangOpts, StringRef &Feature) const { +Module::isAvailable(const LangOptions &LangOpts, const TargetInfo &Target, + StringRef &Feature) const { if (IsAvailable) return true; for (const Module *Current = this; Current; Current = Current->Parent) { for (unsigned I = 0, N = Current->Requires.size(); I != N; ++I) { - if (!hasFeature(Current->Requires[I], LangOpts)) { + if (!hasFeature(Current->Requires[I], LangOpts, Target)) { Feature = Current->Requires[I]; return false; } @@ -121,11 +123,12 @@ const DirectoryEntry *Module::getUmbrellaDir() const { return Umbrella.dyn_cast<const DirectoryEntry *>(); } -void Module::addRequirement(StringRef Feature, const LangOptions &LangOpts) { +void Module::addRequirement(StringRef Feature, const LangOptions &LangOpts, + const TargetInfo &Target) { Requires.push_back(Feature); // If this feature is currently available, we're done. - if (hasFeature(Feature, LangOpts)) + if (hasFeature(Feature, LangOpts, Target)) return; if (!IsAvailable) diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index abeb3174bd3..ff75e3a4f25 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -673,7 +673,8 @@ ASTUnit *ASTUnit::LoadFromASTFile(const std::string &Filename, AST->getFileManager()); AST->HeaderInfo.reset(new HeaderSearch(AST->getFileManager(), AST->getDiagnostics(), - AST->ASTFileLangOpts)); + AST->ASTFileLangOpts, + /*Target=*/0)); for (unsigned I = 0; I != NumRemappedFiles; ++I) { FilenameOrMemBuf fileOrBuf = RemappedFiles[I].second; diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp index e8afe6dba1f..1501da4ff4c 100644 --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/lib/Frontend/CompilerInstance.cpp @@ -242,7 +242,8 @@ void CompilerInstance::createPreprocessor() { // Create the Preprocessor. HeaderSearch *HeaderInfo = new HeaderSearch(getFileManager(), getDiagnostics(), - getLangOpts()); + getLangOpts(), + &getTarget()); PP = new Preprocessor(getDiagnostics(), getLangOpts(), &getTarget(), getSourceManager(), *HeaderInfo, *this, PTHMgr, /*OwnsHeaderSearch=*/true); @@ -1045,7 +1046,7 @@ Module *CompilerInstance::loadModule(SourceLocation ImportLoc, // Check whether this module is available. StringRef Feature; - if (!Module->isAvailable(getLangOpts(), Feature)) { + if (!Module->isAvailable(getLangOpts(), getTarget(), Feature)) { getDiagnostics().Report(ImportLoc, diag::err_module_unavailable) << Module->getFullModuleName() << Feature diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp index 669fe4acb37..c0302329c1e 100644 --- a/clang/lib/Frontend/FrontendActions.cpp +++ b/clang/lib/Frontend/FrontendActions.cpp @@ -237,7 +237,7 @@ bool GenerateModuleAction::BeginSourceFileAction(CompilerInstance &CI, // Check whether we can build this module at all. StringRef Feature; - if (!Module->isAvailable(CI.getLangOpts(), Feature)) { + if (!Module->isAvailable(CI.getLangOpts(), CI.getTarget(), Feature)) { CI.getDiagnostics().Report(diag::err_module_unavailable) << Module->getFullModuleName() << Feature; diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp index e56eb6c915c..e3a6c52ff4d 100644 --- a/clang/lib/Lex/HeaderSearch.cpp +++ b/clang/lib/Lex/HeaderSearch.cpp @@ -39,9 +39,10 @@ HeaderFileInfo::getControllingMacro(ExternalIdentifierLookup *External) { ExternalHeaderFileInfoSource::~ExternalHeaderFileInfoSource() {} HeaderSearch::HeaderSearch(FileManager &FM, DiagnosticsEngine &Diags, - const LangOptions &LangOpts) + const LangOptions &LangOpts, + const TargetInfo *Target) : FileMgr(FM), Diags(Diags), FrameworkMap(64), - ModMap(FileMgr, *Diags.getClient(), LangOpts) + ModMap(FileMgr, *Diags.getClient(), LangOpts, Target) { AngledDirIdx = 0; SystemDirIdx = 0; @@ -365,6 +366,10 @@ const FileEntry *DirectoryLookup::DoFrameworkLookup( return FE; } +void HeaderSearch::setTarget(const TargetInfo &Target) { + ModMap.setTarget(Target); +} + //===----------------------------------------------------------------------===// // Header File Location. diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index 708da945856..3583b034d53 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -70,8 +70,8 @@ ModuleMap::resolveExport(Module *Mod, } ModuleMap::ModuleMap(FileManager &FileMgr, const DiagnosticConsumer &DC, - const LangOptions &LangOpts) - : LangOpts(LangOpts) + const LangOptions &LangOpts, const TargetInfo *Target) + : LangOpts(LangOpts), Target(Target) { llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs); Diags = llvm::IntrusiveRefCntPtr<DiagnosticsEngine>( @@ -90,6 +90,12 @@ ModuleMap::~ModuleMap() { delete SourceMgr; } +void ModuleMap::setTarget(const TargetInfo &Target) { + assert((!this->Target || this->Target == &Target) && + "Improper target override"); + this->Target = &Target; +} + Module *ModuleMap::findModuleForHeader(const FileEntry *File) { llvm::DenseMap<const FileEntry *, Module *>::iterator Known = Headers.find(File); @@ -992,7 +998,7 @@ void ModuleMapParser::parseRequiresDecl() { consumeToken(); // Add this feature. - ActiveModule->addRequirement(Feature, Map.LangOpts); + ActiveModule->addRequirement(Feature, Map.LangOpts, *Map.Target); if (!Tok.is(MMToken::Comma)) break; @@ -1360,6 +1366,7 @@ bool ModuleMapParser::parseModuleMapFile() { } bool ModuleMap::parseModuleMapFile(const FileEntry *File) { + assert(Target != 0 && "Missing target information"); FileID ID = SourceMgr->createFileID(File, SourceLocation(), SrcMgr::C_User); const llvm::MemoryBuffer *Buffer = SourceMgr->getBuffer(ID); if (!Buffer) diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp index 05cbffdfd12..fc6efb60689 100644 --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/lib/Lex/Preprocessor.cpp @@ -167,7 +167,9 @@ void Preprocessor::Initialize(const TargetInfo &Target) { Ident__exception_info = Ident__exception_code = Ident__abnormal_termination = 0; Ident___exception_info = Ident___exception_code = Ident___abnormal_termination = 0; Ident_GetExceptionInfo = Ident_GetExceptionCode = Ident_AbnormalTermination = 0; - } + } + + HeaderInfo.setTarget(Target); } void Preprocessor::setPTHManager(PTHManager* pm) { diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 71734027bfb..0bf1da75be4 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -3307,7 +3307,8 @@ ASTReader::ASTReadResult ASTReader::ReadSubmoduleBlock(ModuleFile &F) { break; CurrentModule->addRequirement(StringRef(BlobStart, BlobLen), - Context.getLangOptions()); + Context.getLangOptions(), + Context.getTargetInfo()); break; } } diff --git a/clang/unittests/Basic/SourceManagerTest.cpp b/clang/unittests/Basic/SourceManagerTest.cpp index 2dd64f9ac69..1b067b0d0bf 100644 --- a/clang/unittests/Basic/SourceManagerTest.cpp +++ b/clang/unittests/Basic/SourceManagerTest.cpp @@ -63,7 +63,7 @@ TEST_F(SourceManagerTest, isBeforeInTranslationUnit) { FileID mainFileID = SourceMgr.createMainFileIDForMemBuffer(buf); VoidModuleLoader ModLoader; - HeaderSearch HeaderInfo(FileMgr, Diags, LangOpts); + HeaderSearch HeaderInfo(FileMgr, Diags, LangOpts, &*Target); Preprocessor PP(Diags, LangOpts, Target.getPtr(), SourceMgr, HeaderInfo, ModLoader, @@ -130,7 +130,7 @@ TEST_F(SourceManagerTest, getMacroArgExpandedLocation) { SourceMgr.overrideFileContents(headerFile, headerBuf); VoidModuleLoader ModLoader; - HeaderSearch HeaderInfo(FileMgr, Diags, LangOpts); + HeaderSearch HeaderInfo(FileMgr, Diags, LangOpts, &*Target); Preprocessor PP(Diags, LangOpts, Target.getPtr(), SourceMgr, HeaderInfo, ModLoader, diff --git a/clang/unittests/Lex/LexerTest.cpp b/clang/unittests/Lex/LexerTest.cpp index de94d1d0164..2742f66663b 100644 --- a/clang/unittests/Lex/LexerTest.cpp +++ b/clang/unittests/Lex/LexerTest.cpp @@ -69,7 +69,7 @@ TEST_F(LexerTest, LexAPI) { SourceMgr.createMainFileIDForMemBuffer(buf); VoidModuleLoader ModLoader; - HeaderSearch HeaderInfo(FileMgr, Diags, LangOpts); + HeaderSearch HeaderInfo(FileMgr, Diags, LangOpts, &*Target); Preprocessor PP(Diags, LangOpts, Target.getPtr(), SourceMgr, HeaderInfo, ModLoader, |