From cf0dd1ebf27d0c5c50d4c64a7f3cdb89f8e45f08 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Tue, 26 Apr 2016 20:41:32 +0000 Subject: [PATCH] Move utility functions to DriverUtils.cpp. llvm-svn: 267602 --- lld/ELF/Driver.cpp | 29 +---------------------------- lld/ELF/Driver.h | 3 +++ lld/ELF/DriverUtils.cpp | 28 ++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 8e8ab7f..d3cd994 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -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 Buffer = readFile(Path); if (!Buffer.hasValue()) diff --git a/lld/ELF/Driver.h b/lld/ELF/Driver.h index eb42e90..28231fb 100644 --- a/lld/ELF/Driver.h +++ b/lld/ELF/Driver.h @@ -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); diff --git a/lld/ELF/DriverUtils.cpp b/lld/ELF/DriverUtils.cpp index 949ab95..3953d5f 100644 --- a/lld/ELF/DriverUtils.cpp +++ b/lld/ELF/DriverUtils.cpp @@ -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); -- 2.7.4