|
@@ -271,91 +271,10 @@ const DirectoryEntry *FileManager::getDirectory(llvm::StringRef Filename) {
|
|
|
return &UDE;
|
|
|
}
|
|
|
|
|
|
-/// \brief Canonicalize a file or path name by eliminating redundant
|
|
|
-/// "foo/.." and "./" path components.
|
|
|
-///
|
|
|
-/// Uses the given scratch space to store the resulting string, if needed.
|
|
|
-static llvm::StringRef CanonicalizeFileName(llvm::StringRef Filename,
|
|
|
- llvm::SmallVectorImpl<char> &Scratch) {
|
|
|
- size_t Start = 0;
|
|
|
- bool Changed = false;
|
|
|
- size_t FirstSlash = Filename.find('/', Start);
|
|
|
- do {
|
|
|
- if (FirstSlash == llvm::StringRef::npos) {
|
|
|
- // No more components. Just copy the rest of the file name, if
|
|
|
- // we need to.
|
|
|
- if (Changed)
|
|
|
- Scratch.append(Filename.begin() + Start, Filename.end());
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- if (Start + 1 == FirstSlash && Filename[Start] == '.') {
|
|
|
- // We have './'; remove it.
|
|
|
-
|
|
|
- // If we haven't changed anything previously, copy the
|
|
|
- // starting bits here.
|
|
|
- if (!Changed) {
|
|
|
- Scratch.clear();
|
|
|
- Scratch.append(Filename.begin(), Filename.begin() + Start);
|
|
|
- Changed = true;
|
|
|
- }
|
|
|
-
|
|
|
- // Skip over the './'.
|
|
|
- Start = FirstSlash + 1;
|
|
|
- FirstSlash = Filename.find('/', Start);
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- size_t SecondSlash = Filename.find('/', FirstSlash + 1);
|
|
|
- if (SecondSlash != llvm::StringRef::npos &&
|
|
|
- SecondSlash - FirstSlash == 3 &&
|
|
|
- Filename[FirstSlash + 1] == '.' &&
|
|
|
- Filename[FirstSlash + 2] == '.') {
|
|
|
- // We have 'foo/../'; remove it.
|
|
|
-
|
|
|
- // If we haven't changed anything previously, copy the
|
|
|
- // starting bits here.
|
|
|
- if (!Changed) {
|
|
|
- Scratch.clear();
|
|
|
- Scratch.append(Filename.begin(), Filename.begin() + Start);
|
|
|
- Changed = true;
|
|
|
- }
|
|
|
-
|
|
|
- // Skip over the 'foo/..'.
|
|
|
- Start = SecondSlash + 1;
|
|
|
- FirstSlash = Filename.find('/', Start);
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- if (Changed)
|
|
|
- Scratch.append(Filename.begin() + Start,
|
|
|
- Filename.begin() + FirstSlash + 1);
|
|
|
- Start = FirstSlash + 1;
|
|
|
-
|
|
|
- if (SecondSlash == llvm::StringRef::npos)
|
|
|
- FirstSlash = Filename.find('/', Start);
|
|
|
- else
|
|
|
- FirstSlash = SecondSlash;
|
|
|
- } while (true);
|
|
|
-
|
|
|
- if (Changed) {
|
|
|
-#if 0
|
|
|
- llvm::errs() << "Canonicalized \"" << Filename << "\" to \""
|
|
|
- << llvm::StringRef(Scratch.data(), Scratch.size()) << "\"\n";
|
|
|
-#endif
|
|
|
- return llvm::StringRef(Scratch.data(), Scratch.size());
|
|
|
- }
|
|
|
-
|
|
|
- return Filename;
|
|
|
-}
|
|
|
-
|
|
|
/// getFile - Lookup, cache, and verify the specified file. This returns null
|
|
|
/// if the file doesn't exist.
|
|
|
///
|
|
|
const FileEntry *FileManager::getFile(llvm::StringRef Filename) {
|
|
|
- llvm::SmallString<128> FilenameScratch;
|
|
|
- Filename = CanonicalizeFileName(Filename, FilenameScratch);
|
|
|
-
|
|
|
++NumFileLookups;
|
|
|
|
|
|
// See if there is already an entry in the map.
|
|
@@ -424,9 +343,6 @@ const FileEntry *FileManager::getFile(llvm::StringRef Filename) {
|
|
|
const FileEntry *
|
|
|
FileManager::getVirtualFile(llvm::StringRef Filename, off_t Size,
|
|
|
time_t ModificationTime) {
|
|
|
- llvm::SmallString<128> FilenameScratch;
|
|
|
- Filename = CanonicalizeFileName(Filename, FilenameScratch);
|
|
|
-
|
|
|
++NumFileLookups;
|
|
|
|
|
|
// See if there is already an entry in the map.
|