[PATCH] D138218: [llvm-ar] Fix when llvm-ar fails to replace existing members when updating a thin archive

Owen Reynolds via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 18 06:43:42 PST 2022


This revision was automatically updated to reflect the committed changes.
Closed by commit rGdcbf61b3520e: [llvm-ar] Fix when llvm-ar fails to replace existing members when updating a… (authored by gbreynoo).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D138218/new/

https://reviews.llvm.org/D138218

Files:
  llvm/test/tools/llvm-ar/thin-archive-relative-path.test
  llvm/tools/llvm-ar/llvm-ar.cpp


Index: llvm/tools/llvm-ar/llvm-ar.cpp
===================================================================
--- llvm/tools/llvm-ar/llvm-ar.cpp
+++ llvm/tools/llvm-ar/llvm-ar.cpp
@@ -875,8 +875,16 @@
 
   if (Operation == QuickAppend || Members.empty())
     return IA_AddOldMember;
-  auto MI = find_if(
-      Members, [Name](StringRef Path) { return comparePaths(Name, Path); });
+
+  auto MI = find_if(Members, [Name](StringRef Path) {
+    if (Thin && !sys::path::is_absolute(Path)) {
+      Expected<std::string> PathOrErr =
+          computeArchiveRelativePath(ArchiveName, Path);
+      return comparePaths(Name, PathOrErr ? *PathOrErr : Path);
+    } else {
+      return comparePaths(Name, Path);
+    }
+  });
 
   if (MI == Members.end())
     return IA_AddOldMember;
Index: llvm/test/tools/llvm-ar/thin-archive-relative-path.test
===================================================================
--- /dev/null
+++ llvm/test/tools/llvm-ar/thin-archive-relative-path.test
@@ -0,0 +1,19 @@
+RUN: rm -rf %t && mkdir -p %t/foo %t/bar 
+
+RUN: yaml2obj %S/Inputs/elf.yaml -o %t/foo/elf.o
+RUN: cp %t/foo/elf.o %t/bar/elf.o
+RUN: cd %t
+
+Test a case in which CWD does not contain the archive, ensure replacement behaves as expected
+
+RUN: llvm-ar cr --thin foo/lib.a foo/elf.o
+RUN: llvm-ar t foo/lib.a  | FileCheck %s --check-prefix=FOO --implicit-check-not {{.}}
+
+RUN: llvm-ar cr --thin foo/lib.a bar/elf.o
+RUN: llvm-ar t foo/lib.a  | FileCheck %s --check-prefixes=FOO,BAR --implicit-check-not {{.}}
+
+RUN: llvm-ar cr --thin foo/lib.a foo/elf.o
+RUN: llvm-ar t foo/lib.a  | FileCheck %s --check-prefixes=FOO,BAR --implicit-check-not {{.}}
+
+FOO: foo/elf.o
+BAR: foo/../bar/elf.o


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D138218.476456.patch
Type: text/x-patch
Size: 1694 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221118/3887fef0/attachment.bin>


More information about the llvm-commits mailing list