[llvm-ar] Prevent automatic conversion from thin to full archive

llvm-ar silently converts a thin archive to a regular archive when you
specify a modification operation (e.g. 'r') without the 'T' modifier.
This change stops this from occuring. If a user is trying to convert
between thin and full archives then they can explicitly use the 'L'
command to createa new archive.

Differential Revision: https://reviews.llvm.org/D118693
This commit is contained in:
gbreynoo 2022-02-03 11:33:49 +00:00
parent 309b48ca5e
commit d17c54d17d
3 changed files with 37 additions and 0 deletions

View File

@ -6,3 +6,9 @@
# RUN: not llvm-ar rT %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 full archive's contents to a thin archive with 'L'
# RUN: llvm-ar -TqcL %t/thin.a %t/archive.a
# RUN: FileCheck --check-prefixes=THIN --input-file=%t/thin.a %s
THIN: !<thin>

View File

@ -0,0 +1,26 @@
## Test thin archives do not siletly convert to full archives on write.
# RUN: rm -f %tthin.a %tfull.a
# RUN: llvm-ar -Trc %tthin.a %S/Inputs/a.txt
# RUN: FileCheck --check-prefixes=THIN --input-file=%tthin.a %s
# RUN: llvm-ar -q %tthin.a %S/Inputs/b.txt
# RUN: FileCheck --check-prefixes=THIN --input-file=%tthin.a %s
# RUN: llvm-ar -r %tthin.a %S/Inputs/c.txt
# RUN: FileCheck --check-prefixes=THIN --input-file=%tthin.a %s
# RUN: llvm-ar -am %S/Inputs/a.txt %tthin.a %S/Inputs/c.txt
# RUN: FileCheck --check-prefixes=THIN --input-file=%tthin.a %s
# RUN: llvm-ar -d %tthin.a %S/Inputs/c.txt
# RUN: FileCheck --check-prefixes=THIN --input-file=%tthin.a %s
THIN: !<thin>
## Test that you can add a thin archive's contents to a full archive with 'L'
# RUN: llvm-ar -qcL %tfull.a %tthin.a
# RUN: FileCheck --check-prefixes=FULL --input-file=%tfull.a %s
FULL: !<arch>

View File

@ -654,6 +654,11 @@ static void addChildMember(std::vector<NewArchiveMember> &Members,
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<NewArchiveMember> NMOrErr =
NewArchiveMember::getOldMember(M, Deterministic);
failIfError(NMOrErr.takeError());