зеркало из https://github.com/microsoft/clang-1.git
Thread a TargetInfo through to the module map; we'll need it for
target-specific module requirements. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149224 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
add5adb9aa
Коммит
dc58aa7102
|
@ -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.
|
||||
///
|
||||
|
|
|
@ -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.
|
||||
///
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -3307,7 +3307,8 @@ ASTReader::ASTReadResult ASTReader::ReadSubmoduleBlock(ModuleFile &F) {
|
|||
break;
|
||||
|
||||
CurrentModule->addRequirement(StringRef(BlobStart, BlobLen),
|
||||
Context.getLangOptions());
|
||||
Context.getLangOptions(),
|
||||
Context.getTargetInfo());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче