Index: lld/trunk/ELF/Symbols.cpp =================================================================== --- lld/trunk/ELF/Symbols.cpp +++ lld/trunk/ELF/Symbols.cpp @@ -106,10 +106,17 @@ return std::min(VA, VB); } +static int compareCommons(DefinedCommon *A, DefinedCommon *B) { + A->MaxAlignment = B->MaxAlignment = + std::max(A->MaxAlignment, B->MaxAlignment); + if (A->Size < B->Size) + return -1; + return 1; +} + // Returns 1, 0 or -1 if this symbol should take precedence // over the Other, tie or lose, respectively. template int SymbolBody::compare(SymbolBody *Other) { - typedef typename ELFFile::uintX_t uintX_t; assert(!isLazy() && !Other->isLazy()); std::tuple L(isDefined(), !isShared(), !isWeak()); std::tuple R(Other->isDefined(), !Other->isShared(), @@ -134,24 +141,14 @@ if (L != R) return -1; - if (!std::get<0>(L) || !std::get<1>(L) || !std::get<2>(L)) - return 1; - if (isCommon()) { - if (!Other->isCommon()) - return -1; - auto *ThisC = cast(this); - auto *OtherC = cast(Other); - uintX_t Align = std::max(ThisC->MaxAlignment, OtherC->MaxAlignment); - if (ThisC->Size >= OtherC->Size) { - ThisC->MaxAlignment = Align; - return 1; - } - OtherC->MaxAlignment = Align; - return -1; - } - if (Other->isCommon()) + if (!isDefined() || isShared() || isWeak()) return 1; - return 0; + if (!isCommon() && !Other->isCommon()) + return 0; + if (isCommon() && Other->isCommon()) + return compareCommons(cast(this), + cast(Other)); + return isCommon() ? -1 : 1; } Defined::Defined(Kind K, StringRef Name, bool IsWeak, uint8_t Visibility,