diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Lex/HeaderSearch.cpp')
-rw-r--r-- | contrib/llvm/tools/clang/lib/Lex/HeaderSearch.cpp | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/contrib/llvm/tools/clang/lib/Lex/HeaderSearch.cpp b/contrib/llvm/tools/clang/lib/Lex/HeaderSearch.cpp index 4554aba..b028e33 100644 --- a/contrib/llvm/tools/clang/lib/Lex/HeaderSearch.cpp +++ b/contrib/llvm/tools/clang/lib/Lex/HeaderSearch.cpp @@ -15,7 +15,8 @@ #include "clang/Lex/HeaderMap.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/IdentifierTable.h" -#include "llvm/System/Path.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Support/Path.h" #include "llvm/ADT/SmallString.h" #include <cstdio> using namespace clang; @@ -32,11 +33,15 @@ HeaderFileInfo::getControllingMacro(ExternalIdentifierLookup *External) { return ControllingMacro; } -HeaderSearch::HeaderSearch(FileManager &FM) : FileMgr(FM), FrameworkMap(64) { +ExternalHeaderFileInfoSource::~ExternalHeaderFileInfoSource() {} + +HeaderSearch::HeaderSearch(FileManager &FM) + : FileMgr(FM), FrameworkMap(64) { SystemDirIdx = 0; NoCurDirSearch = false; ExternalLookup = 0; + ExternalSource = 0; NumIncluded = 0; NumMultiIncludeFileOptzn = 0; NumFrameworkLookups = NumSubFrameworkLookups = 0; @@ -83,7 +88,7 @@ const HeaderMap *HeaderSearch::CreateHeaderMap(const FileEntry *FE) { return HeaderMaps[i].second; } - if (const HeaderMap *HM = HeaderMap::Create(FE)) { + if (const HeaderMap *HM = HeaderMap::Create(FE, FileMgr)) { HeaderMaps.push_back(std::make_pair(FE, HM)); return HM; } @@ -118,7 +123,7 @@ const FileEntry *DirectoryLookup::LookupFile(llvm::StringRef Filename, TmpDir += getDir()->getName(); TmpDir.push_back('/'); TmpDir.append(Filename.begin(), Filename.end()); - return HS.getFileMgr().getFile(TmpDir.begin(), TmpDir.end()); + return HS.getFileMgr().getFile(TmpDir.str()); } if (isFramework()) @@ -169,8 +174,8 @@ const FileEntry *DirectoryLookup::DoFrameworkLookup(llvm::StringRef Filename, // If the framework dir doesn't exist, we fail. // FIXME: It's probably more efficient to query this with FileMgr.getDir. - if (!llvm::sys::Path(std::string(FrameworkName.begin(), - FrameworkName.end())).exists()) + bool Exists; + if (llvm::sys::fs::exists(FrameworkName.str(), Exists) || !Exists) return 0; // Otherwise, if it does, remember that this is the right direntry for this @@ -183,16 +188,14 @@ const FileEntry *DirectoryLookup::DoFrameworkLookup(llvm::StringRef Filename, FrameworkName += "Headers/"; FrameworkName.append(Filename.begin()+SlashPos+1, Filename.end()); - if (const FileEntry *FE = FileMgr.getFile(FrameworkName.begin(), - FrameworkName.end())) { + if (const FileEntry *FE = FileMgr.getFile(FrameworkName.str())) return FE; - } // Check "/System/Library/Frameworks/Cocoa.framework/PrivateHeaders/file.h" const char *Private = "Private"; FrameworkName.insert(FrameworkName.begin()+OrigSize, Private, Private+strlen(Private)); - return FileMgr.getFile(FrameworkName.begin(), FrameworkName.end()); + return FileMgr.getFile(FrameworkName.str()); } @@ -212,7 +215,7 @@ const FileEntry *HeaderSearch::LookupFile(llvm::StringRef Filename, const DirectoryLookup *&CurDir, const FileEntry *CurFileEnt) { // If 'Filename' is absolute, check to see if it exists and no searching. - if (llvm::sys::Path::isAbsolute(Filename.begin(), Filename.size())) { + if (llvm::sys::path::is_absolute(Filename)) { CurDir = 0; // If this was an #include_next "/absolute/file", fail. @@ -329,7 +332,7 @@ LookupSubframeworkHeader(llvm::StringRef Filename, FrameworkName += ".framework/"; llvm::StringMapEntry<const DirectoryEntry *> &CacheLookup = - FrameworkMap.GetOrCreateValue(Filename.begin(), Filename.begin()+SlashPos); + FrameworkMap.GetOrCreateValue(Filename.substr(0, SlashPos)); // Some other location? if (CacheLookup.getValue() && @@ -343,8 +346,7 @@ LookupSubframeworkHeader(llvm::StringRef Filename, ++NumSubFrameworkLookups; // If the framework dir doesn't exist, we fail. - const DirectoryEntry *Dir = FileMgr.getDirectory(FrameworkName.begin(), - FrameworkName.end()); + const DirectoryEntry *Dir = FileMgr.getDirectory(FrameworkName.str()); if (Dir == 0) return 0; // Otherwise, if it does, remember that this is the right direntry for this @@ -358,14 +360,13 @@ LookupSubframeworkHeader(llvm::StringRef Filename, llvm::SmallString<1024> HeadersFilename(FrameworkName); HeadersFilename += "Headers/"; HeadersFilename.append(Filename.begin()+SlashPos+1, Filename.end()); - if (!(FE = FileMgr.getFile(HeadersFilename.begin(), - HeadersFilename.end()))) { + if (!(FE = FileMgr.getFile(HeadersFilename.str()))) { // Check ".../Frameworks/HIToolbox.framework/PrivateHeaders/HIToolbox.h" HeadersFilename = FrameworkName; HeadersFilename += "PrivateHeaders/"; HeadersFilename.append(Filename.begin()+SlashPos+1, Filename.end()); - if (!(FE = FileMgr.getFile(HeadersFilename.begin(), HeadersFilename.end()))) + if (!(FE = FileMgr.getFile(HeadersFilename.str()))) return 0; } @@ -389,12 +390,19 @@ LookupSubframeworkHeader(llvm::StringRef Filename, HeaderFileInfo &HeaderSearch::getFileInfo(const FileEntry *FE) { if (FE->getUID() >= FileInfo.size()) FileInfo.resize(FE->getUID()+1); - return FileInfo[FE->getUID()]; + + HeaderFileInfo &HFI = FileInfo[FE->getUID()]; + if (ExternalSource && !HFI.Resolved) { + HFI = ExternalSource->GetHeaderFileInfo(FE); + HFI.Resolved = true; + } + return HFI; } void HeaderSearch::setHeaderFileInfoForUID(HeaderFileInfo HFI, unsigned UID) { if (UID >= FileInfo.size()) FileInfo.resize(UID+1); + HFI.Resolved = true; FileInfo[UID] = HFI; } |