From 3498c7fbd0d8f7cecba9a494b4e5d615b8c0620b Mon Sep 17 00:00:00 2001 From: George Rimar Date: Thu, 10 Mar 2016 18:49:24 +0000 Subject: [PATCH] [ELF] - Refactor of SymbolBody::compare() That makes it a bit shorter. Differential revision: http://reviews.llvm.org/D18004 llvm-svn: 263144 --- lld/ELF/Symbols.cpp | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index f6786c27f585..7203d54ec9c8 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -106,10 +106,17 @@ static uint8_t getMinVisibility(uint8_t VA, uint8_t VB) { 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 @@ template int SymbolBody::compare(SymbolBody *Other) { if (L != R) return -1; - if (!std::get<0>(L) || !std::get<1>(L) || !std::get<2>(L)) + if (!isDefined() || isShared() || isWeak()) 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()) - 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,