Index: lib/Core/Reproduce.cpp =================================================================== --- lib/Core/Reproduce.cpp +++ lib/Core/Reproduce.cpp @@ -52,9 +52,11 @@ // Converts path to use unix path separators so the cpio can be extracted on // both unix and windows. +#ifdef LLVM_ON_WIN32 static void convertToUnixPathSeparator(SmallString<128> &Path) { std::replace(Path.begin(), Path.end(), '\\', '/'); } +#endif void CpioFile::append(StringRef Path, StringRef Data) { if (!Seen.insert(Path).second) @@ -65,7 +67,10 @@ // (i.e. in that case we are creating baz.cpio.) SmallString<128> Fullpath; path::append(Fullpath, Basename, Path); + +#ifdef LLVM_ON_WIN32 convertToUnixPathSeparator(Fullpath); +#endif writeMember(*OS, Fullpath, Data); @@ -98,7 +103,9 @@ Res = Root.substr(2); path::append(Res, path::relative_path(Abs)); +#ifdef LLVM_ON_WIN32 convertToUnixPathSeparator(Res); +#endif return Res.str(); } Index: test/ELF/reproduce-backslash.s =================================================================== --- /dev/null +++ test/ELF/reproduce-backslash.s @@ -0,0 +1,13 @@ +# REQUIRES: x86, cpio, shell + +# Test that we don't erroneously replace \ with / on UNIX, as it's +# legal for a filename to contain backslashes. +# 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: cpio -t < repro.cpio | FileCheck %s + +# CHECK: repro/response.txt +# CHECK: repro/{{.*}}/build/foo\.o