[llvm-ar] -s: don't convert a thin archive to a regular one
authorFangrui Song <i@maskray.me>
Tue, 1 Feb 2022 17:59:51 +0000 (09:59 -0800)
committerFangrui Song <i@maskray.me>
Tue, 1 Feb 2022 17:59:51 +0000 (09:59 -0800)
In binutils, ar -s and randlib don't convert a thin archive to a regular one.
This behavior makes sense and this patch ports the behavior.

Reviewed By: gbreynoo

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

llvm/test/tools/llvm-ar/symtab.test
llvm/tools/llvm-ar/llvm-ar.cpp

index 098b769..74d1bee 100644 (file)
 # RUN: llvm-nm --print-armap %t-thin.a \
 # RUN:   | FileCheck %s --check-prefix=SYMTAB
 
+## llvm-ranlib does not change a thin archive to a regular one.
+# RUN: rm -f %t-thin.a && llvm-ar rcTS %t-thin.a %t.o
+# RUN: llvm-nm --print-armap %t-thin.a | FileCheck %s --check-prefix=NO-SYMTAB
+# RUN: llvm-ranlib %t-thin.a
+# RUN: llvm-nm --print-armap %t-thin.a | FileCheck %s --check-prefix=SYMTAB
+# RUN: FileCheck --input-file=%t-thin.a %s --check-prefixes=THIN
+
+## llvm-ar -s is identical to ranlib and a duplicated operation does not change the output.
+# RUN: rm -f %t-thin2.a && llvm-ar rcTS %t-thin2.a %t.o
+# RUN: llvm-ar s %t-thin2.a && cmp %t-thin.a %t-thin2.a
+# RUN: llvm-ar s %t-thin2.a && cmp %t-thin.a %t-thin2.a
+
 # SYMTAB:        symbol in
 # NO-SYMTAB-NOT: symbol in
 
+# THIN: !<thin>
+
 --- !ELF
 FileHeader:
   Class:   ELFCLASS64
index 1ece120..8842162 100644 (file)
@@ -968,6 +968,8 @@ static void createSymbolTable(object::Archive *OldArchive) {
   if (OldArchive->hasSymbolTable())
     return;
 
+  if (OldArchive->isThin())
+    Thin = true;
   performWriteOperation(CreateSymTab, OldArchive, nullptr, nullptr);
 }