Move utility functions to DriverUtils.cpp.

llvm-svn: 267602
This commit is contained in:
Rui Ueyama 2016-04-26 20:41:32 +00:00
parent 197e5cfe34
commit cf0dd1ebf2
3 changed files with 32 additions and 28 deletions

View 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())

View 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);

View 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);