From: Douglas Gregor Date: Thu, 3 Feb 2011 00:18:12 +0000 (+0000) Subject: Improve the performance of filename canonicalization by avoiding X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b9d4cb38815fd2173a9f0512dfe2024d61bbcec7;p=clang Improve the performance of filename canonicalization by avoiding redundant searches in the string. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124760 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/FileManager.cpp b/lib/Basic/FileManager.cpp index 5bf1ae3689..53d7c9a6bd 100644 --- a/lib/Basic/FileManager.cpp +++ b/lib/Basic/FileManager.cpp @@ -279,8 +279,8 @@ static llvm::StringRef CanonicalizeFileName(llvm::StringRef Filename, llvm::SmallVectorImpl &Scratch) { size_t Start = 0; bool Changed = false; + size_t FirstSlash = Filename.find('/', Start); do { - size_t FirstSlash = Filename.find('/', Start); if (FirstSlash == llvm::StringRef::npos) { // No more components. Just copy the rest of the file name, if // we need to. @@ -302,6 +302,7 @@ static llvm::StringRef CanonicalizeFileName(llvm::StringRef Filename, // Skip over the './'. Start = FirstSlash + 1; + FirstSlash = Filename.find('/', Start); continue; } @@ -322,6 +323,7 @@ static llvm::StringRef CanonicalizeFileName(llvm::StringRef Filename, // Skip over the 'foo/..'. Start = SecondSlash + 1; + FirstSlash = Filename.find('/', Start); continue; } @@ -329,6 +331,11 @@ static llvm::StringRef CanonicalizeFileName(llvm::StringRef Filename, 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) {