diff --git a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp index 6ce06b434b2c0..15d959d7712dd 100644 --- a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp +++ b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp @@ -503,23 +503,22 @@ int llvm::libDriverMain(ArrayRef ArgsArr) { return 1; } } - // llvm-lib uses relative paths for both regular and thin archives, unlike - // standard GNU ar, which only uses relative paths for thin archives and - // basenames for regular archives. - for (NewArchiveMember &Member : Members) { - if (sys::path::is_relative(Member.MemberName)) { - Expected PathOrErr = - computeArchiveRelativePath(OutputPath, Member.MemberName); - if (PathOrErr) - Member.MemberName = Saver.save(*PathOrErr); + + bool Thin = Args.hasArg(OPT_llvmlibthin); + if (Thin) { + for (NewArchiveMember &Member : Members) { + if (sys::path::is_relative(Member.MemberName)) { + Expected PathOrErr = + computeArchiveRelativePath(OutputPath, Member.MemberName); + if (PathOrErr) + Member.MemberName = Saver.save(*PathOrErr); + } } } // For compatibility with MSVC, reverse member vector after de-duplication. std::reverse(Members.begin(), Members.end()); - bool Thin = Args.hasArg(OPT_llvmlibthin); - auto Symtab = Args.hasFlag(OPT_llvmlibindex, OPT_llvmlibindex_no, /*default=*/true) ? SymtabWritingMode::NormalSymtab diff --git a/llvm/test/tools/llvm-lib/member-names.test b/llvm/test/tools/llvm-lib/member-names.test new file mode 100644 index 0000000000000..75437a02f30a2 --- /dev/null +++ b/llvm/test/tools/llvm-lib/member-names.test @@ -0,0 +1,37 @@ +RUN: rm -rf %t +RUN: mkdir -p %t/foo +RUN: split-file %s %t +RUN: cd %t + +RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o foo/obj.o %S/Inputs/a.s + +# For a regular, non-thin archive, check that we store the path in the form +# it was passed (foo/obj.o), not as a path relative to the archive. +RUN: llvm-lib -out:foo/regular.a foo/obj.o +RUN: llvm-lib -list foo/regular.a | FileCheck %s --check-prefix=REGULAR --match-full-lines +REGULAR: foo/obj.o + +# When merging two import libraries, make sure that the member names stay +# unchanged. +RUN: llvm-lib -machine:x64 -out:foo.lib -def:foo.def +RUN: llvm-lib -machine:x64 -out:bar.lib -def:bar.def +RUN: llvm-lib -out:foo/merged.lib foo.lib bar.lib +RUN: llvm-lib -list foo/merged.lib | FileCheck %s --check-prefix=MERGED --match-full-lines +MERGED: foo.dll +MERGED: foo.dll +MERGED: foo.dll +MERGED: foo.dll +MERGED: bar.dll +MERGED: bar.dll +MERGED: bar.dll +MERGED: bar.dll + +#--- foo.def +LIBRARY foo.dll +EXPORTS + func1 + +#--- bar.def +LIBRARY bar.dll +EXPORTS + func2