diff --git a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp --- a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp +++ b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp @@ -133,12 +133,14 @@ object::Archive Archive(B.get()->getMemBufferRef(), Err); fatalOpenError(std::move(Err), B->getBufferIdentifier()); + std::vector Names; for (auto &C : Archive.children(Err)) { Expected NameOrErr = C.getName(); fatalOpenError(NameOrErr.takeError(), B->getBufferIdentifier()); - StringRef Name = NameOrErr.get(); - llvm::outs() << Name << '\n'; + Names.push_back(NameOrErr.get()); } + for (auto Name : reverse(Names)) + llvm::outs() << Name << '\n'; fatalOpenError(std::move(Err), B->getBufferIdentifier()); } @@ -392,6 +394,9 @@ } } + // For compatibility with MSVC, reverse member vector after de-duplication. + std::reverse(Members.begin(), Members.end()); + if (Error E = writeArchive(OutputPath, Members, /*WriteSymtab=*/true, object::Archive::K_GNU, diff --git a/llvm/test/tools/llvm-lib/Inputs/abc.s b/llvm/test/tools/llvm-lib/Inputs/abc.s new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-lib/Inputs/abc.s @@ -0,0 +1,6 @@ +.globl c +c: +.globl a +a: +.globl b +b: diff --git a/llvm/test/tools/llvm-lib/duplicate.test b/llvm/test/tools/llvm-lib/duplicate.test --- a/llvm/test/tools/llvm-lib/duplicate.test +++ b/llvm/test/tools/llvm-lib/duplicate.test @@ -6,9 +6,11 @@ RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o %t/foo.o %S/Inputs/a.s RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o %t/bar.o %S/Inputs/b.s -RUN: llvm-lib -out:%t/foo.lib %t/foo.o %t/foo.o %t/bar.o +RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o %t/abc.o %S/Inputs/abc.s +RUN: llvm-lib -out:%t/foo.lib %t/foo.o %t/foo.o %t/abc.o %t/bar.o %t/foo.o %t/foo.o RUN: llvm-ar t %t/foo.lib | FileCheck %s -CHECK: foo.o -CHECK-NOT: foo.o CHECK: bar.o +CHECK-NEXT: abc.o +CHECK-NEXT: foo.o +CHECK-NOT: foo.o diff --git a/llvm/test/tools/llvm-lib/nest.test b/llvm/test/tools/llvm-lib/nest.test --- a/llvm/test/tools/llvm-lib/nest.test +++ b/llvm/test/tools/llvm-lib/nest.test @@ -10,6 +10,6 @@ RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o %t/bar.o %S/Inputs/b.s RUN: llvm-lib -out:%t/bar.lib %t/foo.lib %t/bar.o -RUN: llvm-ar t %t/bar.lib | FileCheck %s +RUN: llvm-lib -list %t/bar.lib | FileCheck %s CHECK: foo.o CHECK: bar.o diff --git a/llvm/test/tools/llvm-lib/use-paths.test b/llvm/test/tools/llvm-lib/use-paths.test --- a/llvm/test/tools/llvm-lib/use-paths.test +++ b/llvm/test/tools/llvm-lib/use-paths.test @@ -13,12 +13,12 @@ RUN: llvm-ar t foo.lib | FileCheck %s FIXME: We should probably use backslashes on Windows to better match MSVC tools. -CHECK: foo/a.obj CHECK: foo/b.obj +CHECK: foo/a.obj Do it again with absolute paths and see that we get something. RUN: llvm-lib -out:foo.lib %t/foo/a.obj %t/foo/b.obj RUN: llvm-ar t foo.lib | FileCheck %s --check-prefix=ABS -ABS: {{.*}}/foo/a.obj ABS: {{.*}}/foo/b.obj +ABS: {{.*}}/foo/a.obj diff --git a/llvm/test/tools/llvm-lib/xfghashmap-list.test b/llvm/test/tools/llvm-lib/xfghashmap-list.test --- a/llvm/test/tools/llvm-lib/xfghashmap-list.test +++ b/llvm/test/tools/llvm-lib/xfghashmap-list.test @@ -1,7 +1,7 @@ # RUN: rm -rf %t && mkdir -p %t && cd %t # RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o a.obj %S/Inputs/a.s # RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o b.obj %S/Inputs/b.s -# RUN: llvm-lib /out:xfghashmap.lib a.obj b.obj +# RUN: llvm-lib /out:xfghashmap.lib b.obj a.obj ## Replace a section in the library file with // emulating ## a library from the Windows SDK for Windows 11. @@ -10,9 +10,9 @@ ## This should print the // section as well as an .obj one. # RUN: llvm-lib /list %t/xfghashmap.lib | FileCheck %s -# CHECK: a.obj # CHECK: // # CHECK-NOT: b.obj +# CHECK: a.obj import sys