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

via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 18 06:43:30 PST 2022


Author: gbreynoo
Date: 2022-11-18T14:37:56Z
New Revision: dcbf61b3520ed7157688a269ad4dfa8545a00f79

URL: https://github.com/llvm/llvm-project/commit/dcbf61b3520ed7157688a269ad4dfa8545a00f79
DIFF: https://github.com/llvm/llvm-project/commit/dcbf61b3520ed7157688a269ad4dfa8545a00f79.diff

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

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.

Differential Revision: https://reviews.llvm.org/D138218

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

Modified: 
    llvm/tools/llvm-ar/llvm-ar.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-ar/thin-archive-relative-path.test b/llvm/test/tools/llvm-ar/thin-archive-relative-path.test
new file mode 100644
index 0000000000000..33ffd03706628
--- /dev/null
+++ b/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

diff  --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp
index b11ee5182f302..3cc6654f7fcca 100644
--- a/llvm/tools/llvm-ar/llvm-ar.cpp
+++ b/llvm/tools/llvm-ar/llvm-ar.cpp
@@ -875,8 +875,16 @@ static InsertAction computeInsertAction(ArchiveOperation Operation,
 
   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;


        


More information about the llvm-commits mailing list