From dd6e7e0d5722d6396f8a0e94146f0b5e50dfa028 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Tue, 1 Feb 2022 09:56:50 -0800 Subject: [PATCH] [llvm-ar] Add --thin for creating a thin archive In GNU ar (since 2008), the modifier 'T' means creating a thin archive. In many other ar implementations (FreeBSD, macOS, elfutils, etc), -T means "allow filename truncation of extracted files", as specified by X/Open System Interface. For portability, 'T' with thin archive semantics should be avoided. See https://sourceware.org/bugzilla/show_bug.cgi?id=28759 binutils 2.38 will deprecate 'T' (without diagnostic) and add --thin. Reviewed By: jhenderson Differential Revision: https://reviews.llvm.org/D116979 --- llvm/docs/CommandGuide/llvm-ar.rst | 12 ++++++++---- llvm/test/tools/llvm-ar/thin-archive.test | 12 ++++++++---- llvm/tools/llvm-ar/llvm-ar.cpp | 14 +++++++++++--- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/llvm/docs/CommandGuide/llvm-ar.rst b/llvm/docs/CommandGuide/llvm-ar.rst index f1385ad..0f36252 100644 --- a/llvm/docs/CommandGuide/llvm-ar.rst +++ b/llvm/docs/CommandGuide/llvm-ar.rst @@ -201,10 +201,8 @@ section to determine which modifiers are applicable to which operations. .. option:: T - When creating or modifying an archive, this option specifies that the - ``archive`` will be thin. By default, archives are not created as thin - archives and when modifying a thin archive, it will be converted to a regular - archive. + Alias for ``--thin``. In many ar implementations ``T`` has a different + meaning, as specified by X/Open System interface. .. option:: v @@ -281,6 +279,12 @@ Other ``posix`` or ``windows``. The default when on Windows is ``windows``, otherwise the default is ``posix``. +.. option:: --thin + + When creating or modifying an archive, this option specifies that the + ``archive`` will be thin. By default, archives are not created as thin archives + and when modifying a thin archive, it will be converted to a regular archive. + .. option:: --version Display the version of the :program:`llvm-ar` executable. diff --git a/llvm/test/tools/llvm-ar/thin-archive.test b/llvm/test/tools/llvm-ar/thin-archive.test index fca8e11..d62f9ae 100644 --- a/llvm/test/tools/llvm-ar/thin-archive.test +++ b/llvm/test/tools/llvm-ar/thin-archive.test @@ -6,11 +6,15 @@ RUN: cp %t/foo/bar/elf.o %t/delete.o Test that modules can be added with absolute paths when the archive is created using an absolute path -RUN: llvm-ar rTc %t/absolute-1.ar %t/foo/elf.o %t/delete.o %t/foo/bar/elf.o -RUN: llvm-ar dT %t/absolute-1.ar delete.o +RUN: llvm-ar rc --thin %t/absolute-1a.ar %t/foo/elf.o %t/delete.o %t/foo/bar/elf.o +RUN: llvm-ar --thin d %t/absolute-1a.ar delete.o -RUN: FileCheck -input-file=%t/absolute-1.ar --check-prefixes=THIN,CHECK %s -DPATH=%/t/ -RUN: llvm-ar t %t/absolute-1.ar | FileCheck %s -DPATH=%/t/ +RUN: FileCheck --input-file=%t/absolute-1a.ar --check-prefixes=THIN,CHECK %s -DPATH=%/t/ +RUN: llvm-ar t %t/absolute-1a.ar | FileCheck %s -DPATH=%/t/ + +RUN: llvm-ar rTc %t/absolute-1b.ar %t/foo/elf.o %t/delete.o %t/foo/bar/elf.o +RUN: llvm-ar dT %t/absolute-1b.ar delete.o +RUN: cmp %t/absolute-1a.ar %t/absolute-1b.ar These tests must be run in %t/foo. cd %t is included on each line to make debugging this test case easier. diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp index f7b29b8..1ece120 100644 --- a/llvm/tools/llvm-ar/llvm-ar.cpp +++ b/llvm/tools/llvm-ar/llvm-ar.cpp @@ -90,6 +90,7 @@ OPTIONS: --rsp-quoting - quoting style for response files =posix - posix =windows - windows + --thin - create a thin archive --version - print the version and exit @ - read options from @@ -118,7 +119,7 @@ MODIFIERS: [P] - use full names when matching (implied for thin archives) [s] - create an archive index (cf. ranlib) [S] - do not build a symbol table - [T] - create a thin archive + [T] - deprecated, use --thin instead [u] - update only [files] newer than archive contents [U] - use actual timestamps and uids/gids [v] - be verbose about actions taken @@ -390,8 +391,6 @@ static ArchiveOperation parseCommandLine() { break; case 'T': Thin = true; - // Thin archives store path names, so P should be forced. - CompareFullPath = true; break; case 'L': AddLibrary = true; @@ -407,6 +406,10 @@ static ArchiveOperation parseCommandLine() { } } + // Thin archives store path names, so P should be forced. + if (Thin) + CompareFullPath = true; + // At this point, the next thing on the command line must be // the archive name. getArchive(); @@ -1202,6 +1205,11 @@ static int ar_main(int argc, char **argv) { continue; } + if (strcmp(*ArgIt, "--thin") == 0) { + Thin = true; + continue; + } + Match = matchFlagWithArg("format", ArgIt, Argv); if (Match) { FormatType = StringSwitch(Match) -- 2.7.4