[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
Thu Nov 17 08:50:45 PST 2022


gbreynoo created this revision.
gbreynoo added reviewers: MaskRay, jhenderson, DiggerLin, chrisjackson.
Herald added a subscriber: StephenFan.
Herald added a project: All.
gbreynoo requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

As seen in https://github.com/llvm/llvm-project/issues/55023 when a thin archive is updated when not in the CWD replacement does not work as expected. This change fixes the relative file path comparison so the correct files are updated.


Repository:
  rG LLVM Github Monorepo

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.476146.patch
Type: text/x-patch
Size: 1694 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221117/850bbb74/attachment.bin>


More information about the llvm-commits mailing list