From 1f71b5a38605a4f101af43288ae22feb89c8a469 Mon Sep 17 00:00:00 2001 From: gbreynoo Date: Thu, 21 Apr 2022 15:48:26 +0100 Subject: [PATCH] [llvm-ar] Fix thin archive being wrongly converted to a full archive When using the L option to quick append a full archive to a thin archive, the thin archive was being wrongly converted to a full archive. I've fixed the issue and added a check for it in thin-to-full-archive.test and expanded some tests. Differential Revision: https://reviews.llvm.org/D123142 --- llvm/test/tools/llvm-ar/flatten-thin-archive.test | 3 ++- .../tools/llvm-ar/regular-to-thin-archive.test | 24 +++++++++++++++++----- .../tools/llvm-ar/thin-to-regular-archive.test | 21 ++++++++++++++----- llvm/tools/llvm-ar/llvm-ar.cpp | 15 +++++++------- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/llvm/test/tools/llvm-ar/flatten-thin-archive.test b/llvm/test/tools/llvm-ar/flatten-thin-archive.test index 3d228ce..865d9f1 100644 --- a/llvm/test/tools/llvm-ar/flatten-thin-archive.test +++ b/llvm/test/tools/llvm-ar/flatten-thin-archive.test @@ -11,8 +11,9 @@ # RUN: llvm-ar rcs --thin %t-a-plus-b.a %t-a.txt %t-b.txt # RUN: llvm-ar rcs %t-d-plus-e.a %t-d.txt %t-e.txt # RUN: llvm-ar rcs --thin %t.a %t-a-plus-b.a %t-c.txt %t-d-plus-e.a -# RUN: llvm-ar t %t.a | FileCheck %s +# RUN: FileCheck --input-file=%t.a %s +# CHECK: ! # CHECK: a.txt # CHECK-NEXT: b.txt # CHECK-NEXT: c.txt diff --git a/llvm/test/tools/llvm-ar/regular-to-thin-archive.test b/llvm/test/tools/llvm-ar/regular-to-thin-archive.test index 65e7aa9..f216e47 100644 --- a/llvm/test/tools/llvm-ar/regular-to-thin-archive.test +++ b/llvm/test/tools/llvm-ar/regular-to-thin-archive.test @@ -2,14 +2,28 @@ ## Test regular archives do not convert to thin archives. # RUN: rm -rf %t && mkdir -p %t -# RUN: llvm-ar qc %t/archive.a %s +# RUN: llvm-ar qc %t/archive.a %S/Inputs/a.txt # RUN: not llvm-ar q --thin %t/archive.a %s 2>&1 | FileCheck %s # RUN: not llvm-ar r --thin %t/archive.a %s 2>&1 | FileCheck %s # CHECK: error: cannot convert a regular archive to a thin one -## Test that you can add a regular archive's contents to a thin archive with 'L' -# RUN: llvm-ar -qcL --thin %t/thin.a %t/archive.a -# RUN: FileCheck --check-prefixes=THIN --input-file=%t/thin.a %s +## Test that you can add a regular archive to a new thin archive with 'L'. +# RUN: llvm-ar -qcL --thin %t/thin1.a %S/Inputs/b.txt %t/archive.a +# RUN: FileCheck --check-prefixes=THIN --input-file=%t/thin1.a %s -THIN: ! +## Test that you can add a regular archive to an existing thin archive with 'L'. +# RUN: llvm-ar -qc --thin %t/thin2.a %S/Inputs/b.txt +# RUN: llvm-ar -qL --thin %t/thin2.a %t/archive.a +# RUN: FileCheck --check-prefixes=THIN --input-file=%t/thin2.a %s + +# THIN: ! +# THIN: archive.a + +## Test archives do not convert to thin archives with use of 'L' and '--thin'. +# RUN: not llvm-ar -qL --thin %t/archive.a %t/thin2.a 2>&1 | FileCheck %s + +## Test that a regular archive can be read despite use of --thin +# RUN: llvm-ar -t --thin %t/archive.a +# RUN: FileCheck --check-prefixes=REGULAR --input-file=%t/archive.a %s +# REGULAR: ! diff --git a/llvm/test/tools/llvm-ar/thin-to-regular-archive.test b/llvm/test/tools/llvm-ar/thin-to-regular-archive.test index 08b2e52..00af941 100644 --- a/llvm/test/tools/llvm-ar/thin-to-regular-archive.test +++ b/llvm/test/tools/llvm-ar/thin-to-regular-archive.test @@ -1,7 +1,7 @@ # XFAIL: system-aix ## Test thin archives do not siletly convert to regular archives on write. -# RUN: rm -f %tthin.a %tregular.a +# RUN: rm -f %tthin.a %tregular1.a %tregular2.a # RUN: llvm-ar -rc --thin %tthin.a %S/Inputs/a.txt # RUN: FileCheck --check-prefixes=THIN --input-file=%tthin.a %s @@ -20,8 +20,19 @@ # THIN: ! -## Test that you can add a thin archive's contents to a regular archive with 'L' -# RUN: llvm-ar -qcL %tregular.a %tthin.a -# RUN: FileCheck --check-prefixes=REGULAR --input-file=%tregular.a %s +## Test that you can add a thin archive's contents to a regular archive with 'L'. +# RUN: llvm-ar -qcL %tregular1.a %tthin.a +# RUN: FileCheck --check-prefixes=REGULAR --input-file=%tregular1.a --implicit-check-not=thin.a %s -REGULAR: ! +# REGULAR: ! +# REGULAR: a.txt +# REGULAR: b.txt + +## Test that you can add a thin archive's contents to an existing regular archive with 'L'. +# RUN: llvm-ar -q %tregular2.a %S/Inputs/d.txt +# RUN: llvm-ar -qL %tregular2.a %tthin.a +# RUN: FileCheck --check-prefixes=REGULAR --input-file=%tregular2.a %s + +## Test that thin archives do not convert to regular archives with 'L' and no use of '--thin'. +# RUN: llvm-ar -qL %tthin.a %tregular2.a +# RUN: FileCheck --check-prefixes=THIN --input-file=%tthin.a %s diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp index 0d87e25e..2b02883 100644 --- a/llvm/tools/llvm-ar/llvm-ar.cpp +++ b/llvm/tools/llvm-ar/llvm-ar.cpp @@ -653,13 +653,6 @@ static void performReadOperation(ArchiveOperation Operation, static void addChildMember(std::vector &Members, const object::Archive::Child &M, bool FlattenArchive = false) { - if (Thin && !M.getParent()->isThin()) - fail("cannot convert a regular archive to a thin one"); - - // Avoid converting an existing thin archive to a regular one. - if (!AddLibrary && M.getParent()->isThin()) - Thin = true; - Expected NMOrErr = NewArchiveMember::getOldMember(M, Deterministic); failIfError(NMOrErr.takeError()); @@ -927,6 +920,14 @@ static void performWriteOperation(ArchiveOperation Operation, object::Archive *OldArchive, std::unique_ptr OldArchiveBuf, std::vector *NewMembersP) { + if (OldArchive) { + if (Thin && !OldArchive->isThin()) + fail("cannot convert a regular archive to a thin one"); + + if (OldArchive->isThin()) + Thin = true; + } + std::vector NewMembers; if (!NewMembersP) NewMembers = computeNewArchiveMembers(Operation, OldArchive); -- 2.7.4