bool SrcIsDeclaration = isDeclaration(Src);
bool DestIsDeclaration = isDeclaration(Dest);
+ // FIXME: Make datalayout mandatory and just use getDataLayout().
+ DataLayout DL(Dest.getParent());
+
if (SrcIsDeclaration) {
// If Src is external or if both Src & Dest are external.. Just link the
// external globals, we aren't adding anything.
// If Dest is external but Src is not:
return true;
+ if (Src.hasCommonLinkage()) {
+ if (Dest.hasLinkOnceLinkage() || Dest.hasWeakLinkage())
+ return true;
+
+ if (!Dest.hasCommonLinkage())
+ return false;
+
+ uint64_t DestSize = DL.getTypeAllocSize(Dest.getType()->getElementType());
+ uint64_t SrcSize = DL.getTypeAllocSize(Src.getType()->getElementType());
+ return SrcSize > DestSize;
+ }
+
if (Src.isWeakForLinker()) {
assert(!Dest.hasExternalWeakLinkage());
assert(!Dest.hasAvailableExternallyLinkage());
+
if (Dest.hasLinkOnceLinkage() && Src.hasWeakLinkage())
return true;
- return (Dest.hasLinkOnceLinkage() || Dest.hasWeakLinkage()) &&
- Src.hasCommonLinkage();
+ return false;
}
if (Dest.isWeakForLinker()) {
; RUN: llvm-link %p/Inputs/linkage2.ll %s -S | FileCheck %s
@test1_a = common global i8 0
-; CHECK: @test1_a = common global i8 0
+; CHECK-DAG: @test1_a = common global i8 0
@test2_a = global i8 0
-; CHECK: @test2_a = global i8 0
+; CHECK-DAG: @test2_a = global i8 0
+
+@test3_a = common global i8 0
+; CHECK-DAG: @test3_a = common global i16 0