]> granicus.if.org Git - clang/commitdiff
Frontend: Disentangle removePathTraversal from concatenating paths
authorJustin Bogner <mail@justinbogner.com>
Fri, 20 Jun 2014 03:28:46 +0000 (03:28 +0000)
committerJustin Bogner <mail@justinbogner.com>
Fri, 20 Jun 2014 03:28:46 +0000 (03:28 +0000)
This reimplements part of r211303 in a bit of a cleaner way. Doing so
allows us to use a proper absolute path when calling addFileMapping
rather than relying on a substring being one, which should fix the
tests on Windows.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@211338 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Frontend/ModuleDependencyCollector.cpp

index e6e67739a828b40bd03fc950bac4d2296eacc838..d30f9214f82e97918681b6c4f0114d95ac460581 100644 (file)
@@ -57,13 +57,14 @@ void ModuleDependencyCollector::writeFileMap() {
   VFSWriter.write(OS);
 }
 
-/// Append the absolute path in Nested to the path given by Root. This will
-/// remove directory traversal from the resulting nested path.
-static void appendNestedPath(SmallVectorImpl<char> &Root, StringRef Nested) {
+/// Remove traversal (ie, . or ..) from the given absolute path.
+static void removePathTraversal(SmallVectorImpl<char> &Path) {
   using namespace llvm::sys;
   SmallVector<StringRef, 16> ComponentStack;
+  StringRef P(Path.data(), Path.size());
 
-  StringRef Rel = path::relative_path(Nested);
+  // Skip the root path, then look for traversal in the components.
+  StringRef Rel = path::relative_path(P);
   for (StringRef C : llvm::make_range(path::begin(Rel), path::end(Rel))) {
     if (C == ".")
       continue;
@@ -73,9 +74,14 @@ static void appendNestedPath(SmallVectorImpl<char> &Root, StringRef Nested) {
     } else
       ComponentStack.push_back(C);
   }
+
   // The stack is now the path without any directory traversal.
+  SmallString<256> Buffer = path::root_path(P);
   for (StringRef C : ComponentStack)
-    path::append(Root, C);
+    path::append(Buffer, C);
+
+  // Put the result in Path.
+  Path.swap(Buffer);
 }
 
 std::error_code ModuleDependencyListener::copyToRoot(StringRef Src) {
@@ -84,10 +90,11 @@ std::error_code ModuleDependencyListener::copyToRoot(StringRef Src) {
   // We need an absolute path to append to the root.
   SmallString<256> AbsoluteSrc = Src;
   fs::make_absolute(AbsoluteSrc);
+  removePathTraversal(AbsoluteSrc);
+
   // Build the destination path.
   SmallString<256> Dest = Collector.getDest();
-  size_t RootLen = Dest.size();
-  appendNestedPath(Dest, AbsoluteSrc);
+  path::append(Dest, path::relative_path(AbsoluteSrc));
 
   // Copy the file into place.
   if (std::error_code EC = fs::create_directories(path::parent_path(Dest),
@@ -96,7 +103,7 @@ std::error_code ModuleDependencyListener::copyToRoot(StringRef Src) {
   if (std::error_code EC = fs::copy_file(AbsoluteSrc.str(), Dest.str()))
     return EC;
   // Use the absolute path under the root for the file mapping.
-  Collector.addFileMapping(Dest.substr(RootLen), Dest.str());
+  Collector.addFileMapping(AbsoluteSrc.str(), Dest.str());
   return std::error_code();
 }