From: Yaxun Liu Date: Tue, 28 May 2019 21:18:59 +0000 (+0000) Subject: [CUDA][HIP] Emit dependent libs for host only X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b02a79e8d08f9feeba075e41162adf1566f0cbbc;p=clang [CUDA][HIP] Emit dependent libs for host only Recently D60274 was introduced to allow lld to handle dependent libs. However current usage of dependent libs (e.g. pragma comment(lib, *) in windows header files) are intended for host only. Emitting the metadata in device IR causes link error in device path. Until there is a way to different it dependent libs for device or host, metadata for dependent libs should be emitted for host only. This patch enforces that. Differential Revision: https://reviews.llvm.org/D62483 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@361880 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 6daea41928..8c9e240a68 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -457,7 +457,12 @@ void CodeGenModule::Release() { // that ELF linkers tend to handle libraries in a more complicated fashion // than on other platforms. This forces us to defer handling the dependent // libs to the linker. - if (!ELFDependentLibraries.empty()) { + // + // CUDA/HIP device and host libraries are different. Currently there is no + // way to differentiate dependent libraries for host or device. Existing + // usage of #pragma comment(lib, *) is intended for host libraries on + // Windows. Therefore emit llvm.dependent-libraries only for host. + if (!ELFDependentLibraries.empty() && !Context.getLangOpts().CUDAIsDevice) { auto *NMD = getModule().getOrInsertNamedMetadata("llvm.dependent-libraries"); for (auto *MD : ELFDependentLibraries) NMD->addOperand(MD); diff --git a/test/CodeGenCUDA/dependent-libs.cu b/test/CodeGenCUDA/dependent-libs.cu new file mode 100644 index 0000000000..6f59e667d3 --- /dev/null +++ b/test/CodeGenCUDA/dependent-libs.cu @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -emit-llvm -o - -fcuda-is-device -x hip %s | FileCheck --check-prefix=DEV %s +// RUN: %clang_cc1 -emit-llvm -o - -x hip %s | FileCheck --check-prefix=HOST %s + +// DEV-NOT: llvm.dependent-libraries +// HOST: llvm.dependent-libraries +#pragma comment(lib, "libabc")