From: George Rimar Date: Fri, 11 Nov 2016 13:23:13 +0000 (+0000) Subject: [ELF] - Use backward slashes inside response files X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e8936893313be000ae75b1a9e66057b84676f30e;p=platform%2Fupstream%2Fllvm.git [ELF] - Use backward slashes inside response files Patch replaces forward slashes with backward inside response.txt This is https://llvm.org/bugs/show_bug.cgi?id=30951. Differential revision: https://reviews.llvm.org/D26443 llvm-svn: 286589 --- diff --git a/lld/lib/Core/Reproduce.cpp b/lld/lib/Core/Reproduce.cpp index 47738ce..015e84e 100644 --- a/lld/lib/Core/Reproduce.cpp +++ b/lld/lib/Core/Reproduce.cpp @@ -50,6 +50,12 @@ static void writeMember(raw_fd_ostream &OS, StringRef Path, StringRef Data) { OS << Data; // c_filedata } +// Converts path to use unix path separators so the cpio can be extracted on +// both unix and windows. +static void convertToUnixPathSeparator(SmallString<128> &Path) { + std::replace(Path.begin(), Path.end(), '\\', '/'); +} + void CpioFile::append(StringRef Path, StringRef Data) { if (!Seen.insert(Path).second) return; @@ -59,10 +65,7 @@ void CpioFile::append(StringRef Path, StringRef Data) { // (i.e. in that case we are creating baz.cpio.) SmallString<128> Fullpath; path::append(Fullpath, Basename, Path); - - // Use unix path separators so the cpio can be extracted on both unix and - // windows. - std::replace(Fullpath.begin(), Fullpath.end(), '\\', '/'); + convertToUnixPathSeparator(Fullpath); writeMember(*OS, Fullpath, Data); @@ -76,6 +79,8 @@ void CpioFile::append(StringRef Path, StringRef Data) { // Makes a given pathname an absolute path first, and then remove // beginning /. For example, "../foo.o" is converted to "home/john/foo.o", // assuming that the current directory is "/home/john/bar". +// Returned string is a backslash-separated path even on Windows to avoid +// a mess with backslash-as-escape and backslash-as-path-separator. std::string lld::relativeToRoot(StringRef Path) { SmallString<128> Abs = Path; if (sys::fs::make_absolute(Abs)) @@ -93,6 +98,7 @@ std::string lld::relativeToRoot(StringRef Path) { Res = Root.substr(2); path::append(Res, path::relative_path(Abs)); + convertToUnixPathSeparator(Res); return Res.str(); } diff --git a/lld/test/ELF/reproduce-windows2.s b/lld/test/ELF/reproduce-windows2.s new file mode 100644 index 0000000..d428288 --- /dev/null +++ b/lld/test/ELF/reproduce-windows2.s @@ -0,0 +1,11 @@ +# REQUIRES: system-windows, x86, cpio + +# Test that a response.txt file always uses / instead of \. +# RUN: rm -rf %t.dir +# RUN: mkdir -p %t.dir/build +# RUN: llvm-mc %s -o %t.dir/build/foo.o -filetype=obj -triple=x86_64-pc-linux +# RUN: cd %t.dir +# RUN: ld.lld build/foo.o --reproduce repro +# RUN: echo "*response.txt" > list.txt +# RUN: cpio -i --to-stdout --pattern-file=list.txt < repro.cpio | FileCheck %s +# CHECK: {{.*}}/build/foo.o diff --git a/lld/test/lit.cfg b/lld/test/lit.cfg index 5cc10ad..ab34254 100644 --- a/lld/test/lit.cfg +++ b/lld/test/lit.cfg @@ -207,6 +207,10 @@ if platform.system() in ['Darwin']: if platform.system() in ['FreeBSD', 'Linux']: config.available_features.add('system-linker-elf') +# Running on Windows +if platform.system() in ['Windows']: + config.available_features.add('system-windows') + # Set if host-cxxabi's demangler can handle target's symbols. if platform.system() not in ['Windows']: config.available_features.add('demangler')