From 4159746b2cb2077a5a10b1ba65d8c865d35f6bd3 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Sat, 5 Jan 2019 19:27:12 +0000 Subject: [PATCH] CodeGen: fix autolink emission on ELF The autolinking extension for ELF uses a slightly different format for encoding the autolink information compared to COFF and MachO. Account for this in the CGM to ensure that we do not assert when emitting assembly or an object file. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@350476 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenModule.cpp | 20 +++++++++++++++----- test/Modules/autolink.m | 4 ++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index b9466fe87c..54190493f0 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -1692,6 +1692,8 @@ static void addLinkOptionsPostorder(CodeGenModule &CGM, Module *Mod, // Add linker options to link against the libraries/frameworks // described by this module. llvm::LLVMContext &Context = CGM.getLLVMContext(); + bool IsELF = CGM.getTarget().getTriple().isOSBinFormatELF(); + bool IsPS4 = CGM.getTarget().getTriple().isPS4(); // For modules that use export_as for linking, use that module // name instead. @@ -1711,11 +1713,19 @@ static void addLinkOptionsPostorder(CodeGenModule &CGM, Module *Mod, } // Link against a library. - llvm::SmallString<24> Opt; - CGM.getTargetCodeGenInfo().getDependentLibraryOption( - Mod->LinkLibraries[I-1].Library, Opt); - auto *OptString = llvm::MDString::get(Context, Opt); - Metadata.push_back(llvm::MDNode::get(Context, OptString)); + if (IsELF && !IsPS4) { + llvm::Metadata *Args[2] = { + llvm::MDString::get(Context, "lib"), + llvm::MDString::get(Context, Mod->LinkLibraries[I - 1].Library), + }; + Metadata.push_back(llvm::MDNode::get(Context, Args)); + } else { + llvm::SmallString<24> Opt; + CGM.getTargetCodeGenInfo().getDependentLibraryOption( + Mod->LinkLibraries[I - 1].Library, Opt); + auto *OptString = llvm::MDString::get(Context, Opt); + Metadata.push_back(llvm::MDNode::get(Context, OptString)); + } } } diff --git a/test/Modules/autolink.m b/test/Modules/autolink.m index 6aee0e11b1..f15472692d 100644 --- a/test/Modules/autolink.m +++ b/test/Modules/autolink.m @@ -37,9 +37,9 @@ int use_autolink_sub3() { // NOTE: "autolink_sub" is intentionally not linked. // CHECK: !llvm.linker.options = !{![[AUTOLINK_PCH:[0-9]+]], ![[AUTOLINK_FRAMEWORK:[0-9]+]], ![[AUTOLINK:[0-9]+]], ![[DEPENDSONMODULE:[0-9]+]], ![[MODULE:[0-9]+]], ![[NOUMBRELLA:[0-9]+]]} -// CHECK: ![[AUTOLINK_PCH]] = !{!"{{(\\01|-l|/DEFAULTLIB:)}}autolink_from_pch{{(\.lib)?}}"} +// CHECK: ![[AUTOLINK_PCH]] = !{!"{{(\\01|-l|/DEFAULTLIB:|lib", !")}}autolink_from_pch{{(\.lib)?}}"} // CHECK: ![[AUTOLINK_FRAMEWORK]] = !{!"-framework", !"autolink_framework"} -// CHECK: ![[AUTOLINK]] = !{!"{{(\\01|-l|/DEFAULTLIB:)}}autolink{{(\.lib)?}}"} +// CHECK: ![[AUTOLINK]] = !{!"{{(\\01|-l|/DEFAULTLIB:|lib", !")}}autolink{{(\.lib)?}}"} // CHECK: ![[DEPENDSONMODULE]] = !{!"-framework", !"DependsOnModule"} // CHECK: ![[MODULE]] = !{!"-framework", !"Module"} // CHECK: ![[NOUMBRELLA]] = !{!"-framework", !"NoUmbrella"} -- 2.50.1