]> granicus.if.org Git - clang/commitdiff
Improve the performance of filename canonicalization by avoiding
authorDouglas Gregor <dgregor@apple.com>
Thu, 3 Feb 2011 00:18:12 +0000 (00:18 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 3 Feb 2011 00:18:12 +0000 (00:18 +0000)
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

lib/Basic/FileManager.cpp

index 5bf1ae3689211893321c592b585dc715b74ca162..53d7c9a6bd552afdf7033a0245345d8d2939697f 100644 (file)
@@ -279,8 +279,8 @@ 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 {
-    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) {