diff --git a/llvm/lib/Linker/LinkModules.cpp b/llvm/lib/Linker/LinkModules.cpp index 485ac106d4ebb..ef582331b30a0 100644 --- a/llvm/lib/Linker/LinkModules.cpp +++ b/llvm/lib/Linker/LinkModules.cpp @@ -321,8 +321,21 @@ bool ModuleLinker::shouldLinkFromSource(bool &LinkFromSrc, assert(!Dest.hasExternalWeakLinkage()); assert(Dest.hasExternalLinkage() && Src.hasExternalLinkage() && "Unexpected linkage type!"); - return emitError("Linking globals named '" + Src.getName() + - "': symbol multiply defined!"); + + std::string message = ("Linking globals named '" + Src.getName() + + "': symbol multiply defined!").str(); + if (auto SrcParent = Src.getParent(); SrcParent != nullptr) { + message += " (source: "; + message += SrcParent->getName(); + message += ")"; + } + + if (auto DestParent = Dest.getParent(); DestParent != nullptr) { + message += " (dest: "; + message += DestParent->getName(); + message += ")"; + } + return emitError(message); } bool ModuleLinker::linkIfNeeded(GlobalValue &GV, diff --git a/llvm/test/LTO/X86/Inputs/duplicate1.ll b/llvm/test/LTO/X86/Inputs/duplicate1.ll new file mode 100644 index 0000000000000..a5db7c17e90d1 --- /dev/null +++ b/llvm/test/LTO/X86/Inputs/duplicate1.ll @@ -0,0 +1,6 @@ +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +define void @this_function_is_duplicated() { +entry: + ret void +} diff --git a/llvm/test/LTO/X86/Inputs/duplicate2.ll b/llvm/test/LTO/X86/Inputs/duplicate2.ll new file mode 100644 index 0000000000000..a5db7c17e90d1 --- /dev/null +++ b/llvm/test/LTO/X86/Inputs/duplicate2.ll @@ -0,0 +1,6 @@ +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +define void @this_function_is_duplicated() { +entry: + ret void +} diff --git a/llvm/test/LTO/X86/duplicate_symbol.test b/llvm/test/LTO/X86/duplicate_symbol.test new file mode 100644 index 0000000000000..df1fb438b4c1b --- /dev/null +++ b/llvm/test/LTO/X86/duplicate_symbol.test @@ -0,0 +1,5 @@ +RUN: llvm-as %S/Inputs/duplicate1.ll -o %t.duplicate1.bc +RUN: llvm-as %S/Inputs/duplicate2.ll -o %t.duplicate2.bc +RUN: not llvm-lto %t.duplicate1.bc %t.duplicate2.bc -o %t.lto.obj 2>&1 | FileCheck %s +CHECK: symbol multiply defined! +CHECK: duplicate2 diff --git a/llvm/test/tools/llvm-link/Inputs/duplicate1.ll b/llvm/test/tools/llvm-link/Inputs/duplicate1.ll new file mode 100644 index 0000000000000..a5db7c17e90d1 --- /dev/null +++ b/llvm/test/tools/llvm-link/Inputs/duplicate1.ll @@ -0,0 +1,6 @@ +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +define void @this_function_is_duplicated() { +entry: + ret void +} diff --git a/llvm/test/tools/llvm-link/Inputs/duplicate2.ll b/llvm/test/tools/llvm-link/Inputs/duplicate2.ll new file mode 100644 index 0000000000000..a5db7c17e90d1 --- /dev/null +++ b/llvm/test/tools/llvm-link/Inputs/duplicate2.ll @@ -0,0 +1,6 @@ +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +define void @this_function_is_duplicated() { +entry: + ret void +} diff --git a/llvm/test/tools/llvm-link/duplicate_symbol.test b/llvm/test/tools/llvm-link/duplicate_symbol.test new file mode 100644 index 0000000000000..4633e11e3a12a --- /dev/null +++ b/llvm/test/tools/llvm-link/duplicate_symbol.test @@ -0,0 +1,5 @@ +RUN: llvm-as %S/Inputs/duplicate1.ll -o %t.duplicate1.bc +RUN: llvm-as %S/Inputs/duplicate2.ll -o %t.duplicate2.bc +RUN: not llvm-link %t.duplicate1.bc %t.duplicate2.bc -o %t.duplicate.linked.bc 2>&1 | FileCheck %s +CHECK: symbol multiply defined! +CHECK: duplicate2