<div dir="ltr">That code was a straight move (just to move it outside the static methods), so I didn't look at it. I can see if convert_to_slash works.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Feb 14, 2019 at 10:57 AM Saleem Abdulrasool <<a href="mailto:compnerd@compnerd.org">compnerd@compnerd.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Is it not possible to use `sys::path::convert_to_slash` instead of the `#ifdef _WIN32`?  I think at the very least that should be `LLVM_ON_WIN32` (due to Cygwin's behaviours).<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Feb 13, 2019 at 3:39 PM Jordan Rupprecht via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: rupprecht<br>
Date: Wed Feb 13 15:39:41 2019<br>
New Revision: 353995<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=353995&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=353995&view=rev</a><br>
Log:<br>
[llvm-ar][libObject] Fix relative paths when nesting thin archives.<br>
<br>
Summary:<br>
When adding one thin archive to another, we currently chop off the relative path to the flattened members. For instance, when adding `foo/child.a` (which contains `x.txt`) to `parent.a`, when flattening it we should add it as `foo/x.txt` (which exists) instead of `x.txt` (which does not exist).<br>
<br>
As a note, this also undoes the `IsNew` parameter of handling relative paths in r288280. The unit test there still passes.<br>
<br>
This was reported as part of testing the kernel build with llvm-ar: <a href="https://patchwork.kernel.org/patch/10767545/" rel="noreferrer" target="_blank">https://patchwork.kernel.org/patch/10767545/</a> (see the second point).<br>
<br>
Reviewers: mstorsjo, pcc, ruiu, davide, david2050, inglorion<br>
<br>
Reviewed By: ruiu<br>
<br>
Subscribers: void, jdoerfert, tpimh, mgorny, hans, nickdesaulniers, hiraditya, llvm-commits<br>
<br>
Tags: #llvm<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D57842" rel="noreferrer" target="_blank">https://reviews.llvm.org/D57842</a><br>
<br>
Added:<br>
    llvm/trunk/test/tools/llvm-ar/flatten-thin-archive-directories.test<br>
    llvm/trunk/test/tools/llvm-lib/thin-relative.test<br>
Modified:<br>
    llvm/trunk/include/llvm/Object/ArchiveWriter.h<br>
    llvm/trunk/lib/Object/ArchiveWriter.cpp<br>
    llvm/trunk/lib/ToolDrivers/llvm-lib/CMakeLists.txt<br>
    llvm/trunk/lib/ToolDrivers/llvm-lib/LibDriver.cpp<br>
    llvm/trunk/test/tools/llvm-ar/flatten-thin-archive.test<br>
    llvm/trunk/tools/llvm-ar/llvm-ar.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/Object/ArchiveWriter.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ArchiveWriter.h?rev=353995&r1=353994&r2=353995&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ArchiveWriter.h?rev=353995&r1=353994&r2=353995&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Object/ArchiveWriter.h (original)<br>
+++ llvm/trunk/include/llvm/Object/ArchiveWriter.h Wed Feb 13 15:39:41 2019<br>
@@ -26,7 +26,6 @@ struct NewArchiveMember {<br>
   sys::TimePoint<std::chrono::seconds> ModTime;<br>
   unsigned UID = 0, GID = 0, Perms = 0644;<br>
<br>
-  bool IsNew = false;<br>
   NewArchiveMember() = default;<br>
   NewArchiveMember(MemoryBufferRef BufRef);<br>
<br>
@@ -37,6 +36,8 @@ struct NewArchiveMember {<br>
                                             bool Deterministic);<br>
 };<br>
<br>
+std::string computeArchiveRelativePath(StringRef From, StringRef To);<br>
+<br>
 Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers,<br>
                    bool WriteSymtab, object::Archive::Kind Kind,<br>
                    bool Deterministic, bool Thin,<br>
<br>
Modified: llvm/trunk/lib/Object/ArchiveWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ArchiveWriter.cpp?rev=353995&r1=353994&r2=353995&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ArchiveWriter.cpp?rev=353995&r1=353994&r2=353995&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Object/ArchiveWriter.cpp (original)<br>
+++ llvm/trunk/lib/Object/ArchiveWriter.cpp Wed Feb 13 15:39:41 2019<br>
@@ -48,7 +48,6 @@ NewArchiveMember::getOldMember(const obj<br>
     return BufOrErr.takeError();<br>
<br>
   NewArchiveMember M;<br>
-  assert(M.IsNew == false);<br>
   M.Buf = MemoryBuffer::getMemBuffer(*BufOrErr, false);<br>
   M.MemberName = M.Buf->getBufferIdentifier();<br>
   if (!Deterministic) {<br>
@@ -98,7 +97,6 @@ Expected<NewArchiveMember> NewArchiveMem<br>
     return errorCodeToError(std::error_code(errno, std::generic_category()));<br>
<br>
   NewArchiveMember M;<br>
-  M.IsNew = true;<br>
   M.Buf = std::move(*MemberBufferOrErr);<br>
   M.MemberName = M.Buf->getBufferIdentifier();<br>
   if (!Deterministic) {<br>
@@ -191,35 +189,6 @@ static bool useStringTable(bool Thin, St<br>
   return Thin || Name.size() >= 16 || Name.contains('/');<br>
 }<br>
<br>
-// Compute the relative path from From to To.<br>
-static std::string computeRelativePath(StringRef From, StringRef To) {<br>
-  if (sys::path::is_absolute(From) || sys::path::is_absolute(To))<br>
-    return To;<br>
-<br>
-  StringRef DirFrom = sys::path::parent_path(From);<br>
-  auto FromI = sys::path::begin(DirFrom);<br>
-  auto ToI = sys::path::begin(To);<br>
-  while (*FromI == *ToI) {<br>
-    ++FromI;<br>
-    ++ToI;<br>
-  }<br>
-<br>
-  SmallString<128> Relative;<br>
-  for (auto FromE = sys::path::end(DirFrom); FromI != FromE; ++FromI)<br>
-    sys::path::append(Relative, "..");<br>
-<br>
-  for (auto ToE = sys::path::end(To); ToI != ToE; ++ToI)<br>
-    sys::path::append(Relative, *ToI);<br>
-<br>
-#ifdef _WIN32<br>
-  // Replace backslashes with slashes so that the path is portable between *nix<br>
-  // and Windows.<br>
-  std::replace(Relative.begin(), Relative.end(), '\\', '/');<br>
-#endif<br>
-<br>
-  return Relative.str();<br>
-}<br>
-<br>
 static bool is64BitKind(object::Archive::Kind Kind) {<br>
   switch (Kind) {<br>
   case object::Archive::K_GNU:<br>
@@ -234,27 +203,11 @@ static bool is64BitKind(object::Archive:<br>
   llvm_unreachable("not supported for writting");<br>
 }<br>
<br>
-static void addToStringTable(raw_ostream &Out, StringRef ArcName,<br>
-                             const NewArchiveMember &M, bool Thin) {<br>
-  StringRef ID = M.Buf->getBufferIdentifier();<br>
-  if (Thin) {<br>
-    if (M.IsNew)<br>
-      Out << computeRelativePath(ArcName, ID);<br>
-    else<br>
-      Out << ID;<br>
-  } else<br>
-    Out << M.MemberName;<br>
-  Out << "/\n";<br>
-}<br>
-<br>
-static void printMemberHeader(raw_ostream &Out, uint64_t Pos,<br>
-                              raw_ostream &StringTable,<br>
-                              StringMap<uint64_t> &MemberNames,<br>
-                              object::Archive::Kind Kind, bool Thin,<br>
-                              StringRef ArcName, const NewArchiveMember &M,<br>
-                              sys::TimePoint<std::chrono::seconds> ModTime,<br>
-                              unsigned Size) {<br>
-<br>
+static void<br>
+printMemberHeader(raw_ostream &Out, uint64_t Pos, raw_ostream &StringTable,<br>
+                  StringMap<uint64_t> &MemberNames, object::Archive::Kind Kind,<br>
+                  bool Thin, const NewArchiveMember &M,<br>
+                  sys::TimePoint<std::chrono::seconds> ModTime, unsigned Size) {<br>
   if (isBSDLike(Kind))<br>
     return printBSDMemberHeader(Out, Pos, M.MemberName, ModTime, M.UID, M.GID,<br>
                                 M.Perms, Size);<br>
@@ -265,12 +218,12 @@ static void printMemberHeader(raw_ostrea<br>
   uint64_t NamePos;<br>
   if (Thin) {<br>
     NamePos = StringTable.tell();<br>
-    addToStringTable(StringTable, ArcName, M, Thin);<br>
+    StringTable << M.MemberName << "/\n";<br>
   } else {<br>
     auto Insertion = MemberNames.insert({M.MemberName, uint64_t(0)});<br>
     if (Insertion.second) {<br>
       Insertion.first->second = StringTable.tell();<br>
-      addToStringTable(StringTable, ArcName, M, Thin);<br>
+      StringTable << M.MemberName << "/\n";<br>
     }<br>
     NamePos = Insertion.first->second;<br>
   }<br>
@@ -432,8 +385,8 @@ getSymbols(MemoryBufferRef Buf, raw_ostr<br>
<br>
 static Expected<std::vector<MemberData>><br>
 computeMemberData(raw_ostream &StringTable, raw_ostream &SymNames,<br>
-                  object::Archive::Kind Kind, bool Thin, StringRef ArcName,<br>
-                  bool Deterministic, ArrayRef<NewArchiveMember> NewMembers) {<br>
+                  object::Archive::Kind Kind, bool Thin, bool Deterministic,<br>
+                  ArrayRef<NewArchiveMember> NewMembers) {<br>
   static char PaddingData[8] = {'\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n'};<br>
<br>
   // This ignores the symbol table, but we only need the value mod 8 and the<br>
@@ -520,8 +473,8 @@ computeMemberData(raw_ostream &StringTab<br>
       ModTime = sys::toTimePoint(FilenameCount[M.MemberName]++);<br>
     else<br>
       ModTime = M.ModTime;<br>
-    printMemberHeader(Out, Pos, StringTable, MemberNames, Kind, Thin, ArcName,<br>
-                      M, ModTime, Buf.getBufferSize() + MemberPadding);<br>
+    printMemberHeader(Out, Pos, StringTable, MemberNames, Kind, Thin, M,<br>
+                      ModTime, Buf.getBufferSize() + MemberPadding);<br>
     Out.flush();<br>
<br>
     Expected<std::vector<unsigned>> Symbols =<br>
@@ -540,11 +493,40 @@ computeMemberData(raw_ostream &StringTab<br>
   return Ret;<br>
 }<br>
<br>
-Error llvm::writeArchive(StringRef ArcName,<br>
-                         ArrayRef<NewArchiveMember> NewMembers,<br>
-                         bool WriteSymtab, object::Archive::Kind Kind,<br>
-                         bool Deterministic, bool Thin,<br>
-                         std::unique_ptr<MemoryBuffer> OldArchiveBuf) {<br>
+namespace llvm {<br>
+// Compute the relative path from From to To.<br>
+std::string computeArchiveRelativePath(StringRef From, StringRef To) {<br>
+  if (sys::path::is_absolute(From) || sys::path::is_absolute(To))<br>
+    return To;<br>
+<br>
+  StringRef DirFrom = sys::path::parent_path(From);<br>
+  auto FromI = sys::path::begin(DirFrom);<br>
+  auto ToI = sys::path::begin(To);<br>
+  while (*FromI == *ToI) {<br>
+    ++FromI;<br>
+    ++ToI;<br>
+  }<br>
+<br>
+  SmallString<128> Relative;<br>
+  for (auto FromE = sys::path::end(DirFrom); FromI != FromE; ++FromI)<br>
+    sys::path::append(Relative, "..");<br>
+<br>
+  for (auto ToE = sys::path::end(To); ToI != ToE; ++ToI)<br>
+    sys::path::append(Relative, *ToI);<br>
+<br>
+#ifdef _WIN32<br>
+  // Replace backslashes with slashes so that the path is portable between *nix<br>
+  // and Windows.<br>
+  std::replace(Relative.begin(), Relative.end(), '\\', '/');<br>
+#endif<br>
+<br>
+  return Relative.str();<br>
+}<br>
+<br>
+Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers,<br>
+                   bool WriteSymtab, object::Archive::Kind Kind,<br>
+                   bool Deterministic, bool Thin,<br>
+                   std::unique_ptr<MemoryBuffer> OldArchiveBuf) {<br>
   assert((!Thin || !isBSDLike(Kind)) && "Only the gnu format has a thin mode");<br>
<br>
   SmallString<0> SymNamesBuf;<br>
@@ -553,7 +535,7 @@ Error llvm::writeArchive(StringRef ArcNa<br>
   raw_svector_ostream StringTable(StringTableBuf);<br>
<br>
   Expected<std::vector<MemberData>> DataOrErr = computeMemberData(<br>
-      StringTable, SymNames, Kind, Thin, ArcName, Deterministic, NewMembers);<br>
+      StringTable, SymNames, Kind, Thin, Deterministic, NewMembers);<br>
   if (Error E = DataOrErr.takeError())<br>
     return E;<br>
   std::vector<MemberData> &Data = *DataOrErr;<br>
@@ -630,3 +612,5 @@ Error llvm::writeArchive(StringRef ArcNa<br>
<br>
   return Temp->keep(ArcName);<br>
 }<br>
+<br>
+} // namespace llvm<br>
<br>
Modified: llvm/trunk/lib/ToolDrivers/llvm-lib/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ToolDrivers/llvm-lib/CMakeLists.txt?rev=353995&r1=353994&r2=353995&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ToolDrivers/llvm-lib/CMakeLists.txt?rev=353995&r1=353994&r2=353995&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ToolDrivers/llvm-lib/CMakeLists.txt (original)<br>
+++ llvm/trunk/lib/ToolDrivers/llvm-lib/CMakeLists.txt Wed Feb 13 15:39:41 2019<br>
@@ -1,3 +1,10 @@<br>
+set(LLVM_LINK_COMPONENTS<br>
+  BinaryFormat<br>
+  Object<br>
+  Option<br>
+  Support<br>
+  )<br>
+<br>
 set(LLVM_TARGET_DEFINITIONS Options.td)<br>
 tablegen(LLVM Options.inc -gen-opt-parser-defs)<br>
 add_public_tablegen_target(LibOptionsTableGen)<br>
<br>
Modified: llvm/trunk/lib/ToolDrivers/llvm-lib/LibDriver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ToolDrivers/llvm-lib/LibDriver.cpp?rev=353995&r1=353994&r2=353995&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ToolDrivers/llvm-lib/LibDriver.cpp?rev=353995&r1=353994&r2=353995&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ToolDrivers/llvm-lib/LibDriver.cpp (original)<br>
+++ llvm/trunk/lib/ToolDrivers/llvm-lib/LibDriver.cpp Wed Feb 13 15:39:41 2019<br>
@@ -208,6 +208,13 @@ int llvm::libDriverMain(ArrayRef<const c<br>
<br>
   // Create an archive file.<br>
   std::string OutputPath = getOutputPath(&Args, Members[0]);<br>
+  // llvm-lib uses relative paths for both regular and thin archives, unlike<br>
+  // standard GNU ar, which only uses relative paths for thin archives and<br>
+  // basenames for regular archives.<br>
+  for (NewArchiveMember &Member : Members)<br>
+    Member.MemberName =<br>
+        Saver.save(computeArchiveRelativePath(OutputPath, Member.MemberName));<br>
+<br>
   if (Error E =<br>
           writeArchive(OutputPath, Members,<br>
                        /*WriteSymtab=*/true, object::Archive::K_GNU,<br>
<br>
Added: llvm/trunk/test/tools/llvm-ar/flatten-thin-archive-directories.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-ar/flatten-thin-archive-directories.test?rev=353995&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-ar/flatten-thin-archive-directories.test?rev=353995&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/llvm-ar/flatten-thin-archive-directories.test (added)<br>
+++ llvm/trunk/test/tools/llvm-ar/flatten-thin-archive-directories.test Wed Feb 13 15:39:41 2019<br>
@@ -0,0 +1,15 @@<br>
+# This test creates a thin archive in a directory and adds it to a thin archive<br>
+# in the parent directory. The relative path should be included when flattening<br>
+# the archive.<br>
+<br>
+RUN: mkdir -p %t/foo<br>
+RUN: touch %t/foo/a.txt<br>
+RUN: rm -f %t/archive.a %t/foo/archive.a<br>
+<br>
+# These tests must be run in the same directory as %t/archive.a. cd %t is<br>
+# included on each line to make debugging this test case easier.<br>
+RUN: cd %t && llvm-ar rcST foo/archive.a foo/a.txt<br>
+RUN: cd %t && llvm-ar rcST archive.a foo/archive.a<br>
+RUN: cd %t && llvm-ar t archive.a | FileCheck %s --match-full-lines<br>
+<br>
+CHECK: foo/a.txt<br>
<br>
Modified: llvm/trunk/test/tools/llvm-ar/flatten-thin-archive.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-ar/flatten-thin-archive.test?rev=353995&r1=353994&r2=353995&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-ar/flatten-thin-archive.test?rev=353995&r1=353994&r2=353995&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/llvm-ar/flatten-thin-archive.test (original)<br>
+++ llvm/trunk/test/tools/llvm-ar/flatten-thin-archive.test Wed Feb 13 15:39:41 2019<br>
@@ -6,7 +6,7 @@<br>
 # flattened members appearing together.<br>
<br>
 RUN: touch %t-a.txt %t-b.txt %t-c.txt %t-d.txt %t-e.txt<br>
-RUN: rm -f %t-a-plus-b.a %t.a<br>
+RUN: rm -f %t-a-plus-b.a %t-d-plus-e.a %t.a<br>
 RUN: llvm-ar rcsT %t-a-plus-b.a %t-a.txt %t-b.txt<br>
 RUN: llvm-ar rcs %t-d-plus-e.a %t-d.txt %t-e.txt<br>
 RUN: llvm-ar rcsT %t.a %t-a-plus-b.a %t-c.txt %t-d-plus-e.a<br>
<br>
Added: llvm/trunk/test/tools/llvm-lib/thin-relative.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lib/thin-relative.test?rev=353995&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lib/thin-relative.test?rev=353995&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/llvm-lib/thin-relative.test (added)<br>
+++ llvm/trunk/test/tools/llvm-lib/thin-relative.test Wed Feb 13 15:39:41 2019<br>
@@ -0,0 +1,13 @@<br>
+RUN: rm -rf %t<br>
+RUN: mkdir -p %t/foo<br>
+RUN: cd %t<br>
+<br>
+RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o foo/obj.o %S/Inputs/a.s<br>
+<br>
+RUN: llvm-lib -out:archive.a -llvmlibthin foo/obj.o<br>
+RUN: llvm-ar t archive.a | FileCheck %s --check-prefix=PARENT-DIR --match-full-lines<br>
+PARENT-DIR: foo/obj.o<br>
+<br>
+RUN: llvm-lib -out:foo/archive.a -llvmlibthin foo/obj.o<br>
+RUN: llvm-ar t foo/archive.a | FileCheck %s --check-prefix=SAME-DIR --match-full-lines<br>
+SAME-DIR: foo/obj.o<br>
<br>
Modified: llvm/trunk/tools/llvm-ar/llvm-ar.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/llvm-ar.cpp?rev=353995&r1=353994&r2=353995&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/llvm-ar.cpp?rev=353995&r1=353994&r2=353995&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-ar/llvm-ar.cpp (original)<br>
+++ llvm/trunk/tools/llvm-ar/llvm-ar.cpp Wed Feb 13 15:39:41 2019<br>
@@ -193,6 +193,9 @@ static std::string ArchiveName;<br>
 // on the command line.<br>
 static std::vector<StringRef> Members;<br>
<br>
+// Static buffer to hold StringRefs.<br>
+static BumpPtrAllocator Alloc;<br>
+<br>
 // Extract the member filename from the command line for the [relpos] argument<br>
 // associated with a, b, and i modifiers<br>
 static void getRelPos() {<br>
@@ -545,6 +548,15 @@ static void addChildMember(std::vector<N<br>
   Expected<NewArchiveMember> NMOrErr =<br>
       NewArchiveMember::getOldMember(M, Deterministic);<br>
   failIfError(NMOrErr.takeError());<br>
+  // If the child member we're trying to add is thin, use the path relative to<br>
+  // the archive it's in, so the file resolves correctly.<br>
+  if (Thin && FlattenArchive) {<br>
+    StringSaver Saver(Alloc);<br>
+    Expected<std::string> FileNameOrErr = M.getFullName();<br>
+    failIfError(FileNameOrErr.takeError());<br>
+    NMOrErr->MemberName =<br>
+        Saver.save(computeArchiveRelativePath(ArchiveName, *FileNameOrErr));<br>
+  }<br>
   if (FlattenArchive &&<br>
       identify_magic(NMOrErr->Buf->getBuffer()) == file_magic::archive) {<br>
     Expected<std::string> FileNameOrErr = M.getFullName();<br>
@@ -568,6 +580,13 @@ static void addMember(std::vector<NewArc<br>
   Expected<NewArchiveMember> NMOrErr =<br>
       NewArchiveMember::getFile(FileName, Deterministic);<br>
   failIfError(NMOrErr.takeError(), FileName);<br>
+  StringSaver Saver(Alloc);<br>
+  // For regular archives, use the basename of the object path for the member<br>
+  // name. For thin archives, use the full relative paths so the file resolves<br>
+  // correctly.<br>
+  NMOrErr->MemberName =<br>
+      Thin ? Saver.save(computeArchiveRelativePath(ArchiveName, FileName))<br>
+           : sys::path::filename(NMOrErr->MemberName);<br>
   if (FlattenArchive &&<br>
       identify_magic(NMOrErr->Buf->getBuffer()) == file_magic::archive) {<br>
     object::Archive &Lib = readLibrary(FileName);<br>
@@ -581,8 +600,6 @@ static void addMember(std::vector<NewArc<br>
       return;<br>
     }<br>
   }<br>
-  // Use the basename of the object path for the member name.<br>
-  NMOrErr->MemberName = sys::path::filename(NMOrErr->MemberName);<br>
   Members.push_back(std::move(*NMOrErr));<br>
 }<br>
<br>
@@ -672,7 +689,7 @@ computeNewArchiveMembers(ArchiveOperatio<br>
           computeInsertAction(Operation, Child, Name, MemberI);<br>
       switch (Action) {<br>
       case IA_AddOldMember:<br>
-        addChildMember(Ret, Child);<br>
+        addChildMember(Ret, Child, /*FlattenArchive=*/Thin);<br>
         break;<br>
       case IA_AddNewMember:<br>
         addMember(Ret, *MemberI);<br>
@@ -680,7 +697,7 @@ computeNewArchiveMembers(ArchiveOperatio<br>
       case IA_Delete:<br>
         break;<br>
       case IA_MoveOldMember:<br>
-        addChildMember(Moved, Child);<br>
+        addChildMember(Moved, Child, /*FlattenArchive=*/Thin);<br>
         break;<br>
       case IA_MoveNewMember:<br>
         addMember(Moved, *MemberI);<br>
@@ -899,7 +916,7 @@ static void runMRIScript() {<br>
       {<br>
         Error Err = Error::success();<br>
         for (auto &Member : Lib.children(Err))<br>
-          addChildMember(NewMembers, Member);<br>
+          addChildMember(NewMembers, Member, /*FlattenArchive=*/Thin);<br>
         failIfError(std::move(Err));<br>
       }<br>
       break;<br>
@@ -951,7 +968,6 @@ static bool handleGenericOption(StringRe<br>
<br>
 static int ar_main(int argc, char **argv) {<br>
   SmallVector<const char *, 0> Argv(argv, argv + argc);<br>
-  BumpPtrAllocator Alloc;<br>
   StringSaver Saver(Alloc);<br>
   cl::ExpandResponseFiles(Saver, cl::TokenizeGNUCommandLine, Argv);<br>
   for (size_t i = 1; i < Argv.size(); ++i) {<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail-m_1772685195147742825gmail_signature">Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org</div>
</blockquote></div>