[lld] r243321 - ELF2: Devirtualize SymbolBody::compare. NFC.

Rui Ueyama ruiu at google.com
Mon Jul 27 13:39:02 PDT 2015


Author: ruiu
Date: Mon Jul 27 15:39:01 2015
New Revision: 243321

URL: http://llvm.org/viewvc/llvm-project?rev=243321&view=rev
Log:
ELF2: Devirtualize SymbolBody::compare. NFC.

This is to make it consistent with COFF.

Modified:
    lld/trunk/ELF/Symbols.cpp
    lld/trunk/ELF/Symbols.h

Modified: lld/trunk/ELF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=243321&r1=243320&r2=243321&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.cpp (original)
+++ lld/trunk/ELF/Symbols.cpp Mon Jul 27 15:39:01 2015
@@ -21,28 +21,30 @@ DefinedRegular<ELFT>::DefinedRegular(Str
 
 // Returns 1, 0 or -1 if this symbol should take precedence
 // over the Other, tie or lose, respectively.
-template <class ELFT> int DefinedRegular<ELFT>::compare(SymbolBody *Other) {
-  if (Other->kind() < kind())
+int SymbolBody::compare(SymbolBody *Other) {
+  Kind LK = kind();
+  Kind RK = Other->kind();
+
+  // Normalize so that the smaller kind is on the left.
+  if (LK > RK)
     return -Other->compare(this);
-  auto *R = dyn_cast<DefinedRegular>(Other);
-  if (!R)
-    return 1;
 
-  return 0;
-}
+  // First handle comparisons between two different kinds.
+  if (LK != RK) {
+    assert(LK == DefinedRegularKind);
+    assert(RK == UndefinedKind);
+    return 1;
+  }
 
-int Defined::compare(SymbolBody *Other) {
-  if (Other->kind() < kind())
-    return -Other->compare(this);
-  if (isa<Defined>(Other))
+  // Now handle the case where the kinds are the same.
+  switch (LK) {
+  case DefinedRegularKind:
     return 0;
-  return 1;
-}
-
-int Undefined::compare(SymbolBody *Other) {
-  if (Other->kind() < kind())
-    return -Other->compare(this);
-  return 1;
+  case UndefinedKind:
+    return 1;
+  default:
+    llvm_unreachable("unknown symbol kind");
+  }
 }
 
 template <class ELFT> StringRef DefinedRegular<ELFT>::getName() { return Name; }

Modified: lld/trunk/ELF/Symbols.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=243321&r1=243320&r2=243321&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.h (original)
+++ lld/trunk/ELF/Symbols.h Mon Jul 27 15:39:01 2015
@@ -61,7 +61,7 @@ public:
   // Decides which symbol should "win" in the symbol table, this or
   // the Other. Returns 1 if this wins, -1 if the Other wins, or 0 if
   // they are duplicate (conflicting) symbols.
-  virtual int compare(SymbolBody *Other) = 0;
+  int compare(SymbolBody *Other);
 
 protected:
   SymbolBody(Kind K) : SymbolKind(K) {}
@@ -81,8 +81,6 @@ public:
     Kind K = S->kind();
     return DefinedFirst <= K && K <= DefinedLast;
   }
-
-  int compare(SymbolBody *Other) override;
 };
 
 // Regular defined symbols read from object file symbol tables.
@@ -95,7 +93,6 @@ public:
   }
 
   StringRef getName() override;
-  int compare(SymbolBody *Other) override;
 
 private:
   StringRef Name;
@@ -111,8 +108,6 @@ public:
   }
   StringRef getName() override { return Name; }
 
-  int compare(SymbolBody *Other) override;
-
 private:
   StringRef Name;
 };





More information about the llvm-commits mailing list