Skip to content

Commit

Permalink
[llvm-ar] Add --thin for creating a thin archive
Browse files Browse the repository at this point in the history
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
  • Loading branch information
MaskRay committed Feb 1, 2022
1 parent 83620bd commit dd6e7e0
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 11 deletions.
12 changes: 8 additions & 4 deletions llvm/docs/CommandGuide/llvm-ar.rst
Expand Up @@ -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

Expand Down Expand Up @@ -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.
Expand Down
12 changes: 8 additions & 4 deletions llvm/test/tools/llvm-ar/thin-archive.test
Expand Up @@ -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.

Expand Down
14 changes: 11 additions & 3 deletions llvm/tools/llvm-ar/llvm-ar.cpp
Expand Up @@ -90,6 +90,7 @@ USAGE: llvm-ar [options] [-]<operation>[modifiers] [relpos] [count] <archive> [f
--rsp-quoting - quoting style for response files
=posix - posix
=windows - windows
--thin - create a thin archive
--version - print the version and exit
@<file> - read options from <file>
Expand Down Expand Up @@ -118,7 +119,7 @@ USAGE: llvm-ar [options] [-]<operation>[modifiers] [relpos] [count] <archive> [f
[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
Expand Down Expand Up @@ -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;
Expand All @@ -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();
Expand Down Expand Up @@ -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<Format>(Match)
Expand Down

0 comments on commit dd6e7e0

Please sign in to comment.