[llvm-ar] Access ADDLIB in llvm-ar via command line

ADDLIB is called to add the contents of an archive to another archive. 
Previously this was only accessible through the use of an MRI script.

With the use of a new "L" modifier, archive files can treated in the 
manner above when using quick append.

llvm-svn: 345383
diff --git a/llvm/test/tools/llvm-ar/Inputs/add-lib1.yaml b/llvm/test/tools/llvm-ar/Inputs/add-lib1.yaml
new file mode 100644
index 0000000..7ae9fd9
--- /dev/null
+++ b/llvm/test/tools/llvm-ar/Inputs/add-lib1.yaml
@@ -0,0 +1,30 @@
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
+Sections:
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    AddressAlign:    0x0000000000000004
+    Content:         ''
+  - Name:            .comment
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x0000000000000001
+    Content:         00636C616E672076657273696F6E20332E392E3020287472756E6B203237333632342920286C6C766D2F7472756E6B203237333633362900
+  - Name:            .note.GNU-stack
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x0000000000000001
+    Content:         ''
+Symbols:
+  Global:
+    - Name:     lib1
+      Index:    SHN_ABS
+      Value:    0x1234
+  Local:
+    - Name:            '-'
+      Type:            STT_FILE
+...
diff --git a/llvm/test/tools/llvm-ar/Inputs/add-lib2.yaml b/llvm/test/tools/llvm-ar/Inputs/add-lib2.yaml
new file mode 100644
index 0000000..8d224b9
--- /dev/null
+++ b/llvm/test/tools/llvm-ar/Inputs/add-lib2.yaml
@@ -0,0 +1,30 @@
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
+Sections:
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    AddressAlign:    0x0000000000000004
+    Content:         ''
+  - Name:            .comment
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x0000000000000001
+    Content:         00636C616E672076657273696F6E20332E392E3020287472756E6B203237333632342920286C6C766D2F7472756E6B203237333633362900
+  - Name:            .note.GNU-stack
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x0000000000000001
+    Content:         ''
+Symbols:
+  Global:
+    - Name:     lib2
+      Index:    SHN_ABS
+      Value:    0x1234
+  Local:
+    - Name:            '-'
+      Type:            STT_FILE
+...
diff --git a/llvm/test/tools/llvm-ar/Inputs/add-lib3.yaml b/llvm/test/tools/llvm-ar/Inputs/add-lib3.yaml
new file mode 100644
index 0000000..0f1cfe7
--- /dev/null
+++ b/llvm/test/tools/llvm-ar/Inputs/add-lib3.yaml
@@ -0,0 +1,30 @@
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
+Sections:
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    AddressAlign:    0x0000000000000004
+    Content:         ''
+  - Name:            .comment
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x0000000000000001
+    Content:         00636C616E672076657273696F6E20332E392E3020287472756E6B203237333632342920286C6C766D2F7472756E6B203237333633362900
+  - Name:            .note.GNU-stack
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x0000000000000001
+    Content:         ''
+Symbols:
+  Global:
+    - Name:     lib3
+      Index:    SHN_ABS
+      Value:    0x1234
+  Local:
+    - Name:            '-'
+      Type:            STT_FILE
+...
diff --git a/llvm/test/tools/llvm-ar/add-library.test b/llvm/test/tools/llvm-ar/add-library.test
new file mode 100644
index 0000000..bd44a7e
--- /dev/null
+++ b/llvm/test/tools/llvm-ar/add-library.test
@@ -0,0 +1,43 @@
+RUN: yaml2obj %S/Inputs/add-lib1.yaml -o %t-add-lib1.o
+RUN: yaml2obj %S/Inputs/add-lib2.yaml -o %t-add-lib2.o
+RUN: yaml2obj %S/Inputs/add-lib2.yaml -o %t-add-lib3.o
+
+RUN: rm -f %t.ar
+RUN: llvm-ar crs %t.ar %t-add-lib1.o
+RUN: llvm-ar cqs %t.ar %t-add-lib2.o
+
+RUN: llvm-ar tv %t.ar | FileCheck %s --check-prefix=CHECK-NAMES-NO-ADDLIB
+CHECK-NAMES-NO-ADDLIB: add-library.test.tmp-add-lib1.o
+CHECK-NAMES-NO-ADDLIB: add-library.test.tmp-add-lib2.o
+
+RUN: llvm-nm %t.ar | FileCheck %s --check-prefix=CHECK-SYMBOLS-NO-ADDLIB
+CHECK-SYMBOLS-NO-ADDLIB: add-lib1
+CHECK-SYMBOLS-NO-ADDLIB: add-lib2
+
+RUN: rm -f %t1.ar
+RUN: llvm-ar crs %t1.ar %t-add-lib3.o
+RUN: llvm-ar cqLs %t1.ar %t.ar
+
+RUN: llvm-ar tv %t1.ar | FileCheck %s --check-prefix=CHECK-NAMES-ADDLIB
+CHECK-NAMES-ADDLIB: add-library.test.tmp-add-lib3.o
+CHECK-NAMES-ADDLIB: add-library.test.tmp-add-lib1.o
+CHECK-NAMES-ADDLIB: add-library.test.tmp-add-lib2.o
+
+RUN: llvm-nm %t1.ar | FileCheck %s --check-prefix=CHECK-SYMBOLS-ADDLIB
+CHECK-SYMBOLS-ADDLIB: add-lib3
+CHECK-SYMBOLS-ADDLIB: add-lib1
+CHECK-SYMBOLS-ADDLIB: add-lib2
+
+RUN: llvm-ar cqLs %t1.ar %t-add-lib1.o
+
+RUN: llvm-ar tv %t1.ar | FileCheck %s --check-prefix=CHECK-NAMES-DUPLICATE
+CHECK-NAMES-DUPLICATE: add-library.test.tmp-add-lib3.o
+CHECK-NAMES-DUPLICATE: add-library.test.tmp-add-lib1.o
+CHECK-NAMES-DUPLICATE: add-library.test.tmp-add-lib2.o
+CHECK-NAMES-DUPLICATE: add-library.test.tmp-add-lib1.o
+
+RUN: llvm-nm %t1.ar | FileCheck %s --check-prefix=CHECK-SYMBOLS-DUPLICATE
+CHECK-SYMBOLS-DUPLICATE: add-lib3
+CHECK-SYMBOLS-DUPLICATE: add-lib1
+CHECK-SYMBOLS-DUPLICATE: add-lib2
+CHECK-SYMBOLS-DUPLICATE: add-lib1