Move utility functions to DriverUtils.cpp.
authorRui Ueyama <ruiu@google.com>
Tue, 26 Apr 2016 20:41:32 +0000 (20:41 +0000)
committerRui Ueyama <ruiu@google.com>
Tue, 26 Apr 2016 20:41:32 +0000 (20:41 +0000)
llvm-svn: 267602

lld/ELF/Driver.cpp
lld/ELF/Driver.h
lld/ELF/DriverUtils.cpp

index 8e8ab7f..d3cd994 100644 (file)
@@ -99,33 +99,6 @@ LinkerDriver::getArchiveMembers(MemoryBufferRef MB) {
   return V;
 }
 
-// Concatenates S and T so that the resulting path becomes S/T.
-// There are a few exceptions:
-//
-//  1. The result will never escape from S. Therefore, all ".."
-//     are removed from T before concatenatig them.
-//  2. Windows drive letters are removed from T before concatenation.
-static std::string concat(StringRef S, StringRef T) {
-  // Remove leading '/' or a drive letter, and then remove "..".
-  SmallString<128> T2(path::relative_path(T));
-  path::remove_dots(T2, /*remove_dot_dot=*/true);
-
-  SmallString<128> Res;
-  path::append(Res, S, T2);
-  return Res.str();
-}
-
-static void copyFile(StringRef Src, StringRef Dest) {
-  SmallString<128> Dir(Dest);
-  path::remove_filename(Dir);
-  if (std::error_code EC = sys::fs::create_directories(Dir)) {
-    error(EC, Dir + ": can't create directory");
-    return;
-  }
-  if (std::error_code EC = sys::fs::copy_file(Src, Dest))
-    error(EC, "failed to copy file: " + Dest);
-}
-
 // Opens and parses a file. Path has to be resolved already.
 // Newly created memory buffers are owned by this driver.
 void LinkerDriver::addFile(StringRef Path) {
@@ -133,7 +106,7 @@ void LinkerDriver::addFile(StringRef Path) {
   if (Config->Verbose)
     llvm::outs() << Path << "\n";
   if (!Config->Reproduce.empty())
-    copyFile(Path, concat(Config->Reproduce, Path));
+    copyFile(Path, concat_paths(Config->Reproduce, Path));
 
   Optional<MemoryBufferRef> Buffer = readFile(Path);
   if (!Buffer.hasValue())
index eb42e90..28231fb 100644 (file)
@@ -67,6 +67,9 @@ enum {
 void printHelp(const char *Argv0);
 void printVersion();
 
+std::string concat_paths(StringRef S, StringRef T);
+void copyFile(StringRef Src, StringRef Dest);
+
 std::string findFromSearchPaths(StringRef Path);
 std::string searchLibrary(StringRef Path);
 std::string buildSysrootedPath(llvm::StringRef Dir, llvm::StringRef File);
index 949ab95..3953d5f 100644 (file)
@@ -23,6 +23,7 @@
 #include "llvm/Support/StringSaver.h"
 
 using namespace llvm;
+using namespace llvm::sys;
 
 using namespace lld;
 using namespace lld::elf;
@@ -86,6 +87,33 @@ void elf::printVersion() {
   outs() << "\n";
 }
 
+// Concatenates S and T so that the resulting path becomes S/T.
+// There are a few exceptions:
+//
+//  1. The result will never escape from S. Therefore, all ".."
+//     are removed from T before concatenatig them.
+//  2. Windows drive letters are removed from T before concatenation.
+std::string elf::concat_paths(StringRef S, StringRef T) {
+  // Remove leading '/' or a drive letter, and then remove "..".
+  SmallString<128> T2(path::relative_path(T));
+  path::remove_dots(T2, /*remove_dot_dot=*/true);
+
+  SmallString<128> Res;
+  path::append(Res, S, T2);
+  return Res.str();
+}
+
+void elf::copyFile(StringRef Src, StringRef Dest) {
+  SmallString<128> Dir(Dest);
+  path::remove_filename(Dir);
+  if (std::error_code EC = sys::fs::create_directories(Dir)) {
+    error(EC, Dir + ": can't create directory");
+    return;
+  }
+  if (std::error_code EC = sys::fs::copy_file(Src, Dest))
+    error(EC, "failed to copy file: " + Dest);
+}
+
 std::string elf::findFromSearchPaths(StringRef Path) {
   for (StringRef Dir : Config->SearchPaths) {
     std::string FullPath = buildSysrootedPath(Dir, Path);