Split out the ELF kind from the InputFile Kind.
There were at least two issues with having them together:
* For compatibility checks, we only want to look at the ELF kind.
* Adding support for shared libraries should introduce one InputFile kind,
  not 4.
llvm-svn: 246707
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 55c2412..843fa65 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -99,17 +99,17 @@
 
   // Write the result.
   ObjectFileBase &FirstObj = *Symtab.ObjectFiles[0];
-  switch (FirstObj.kind()) {
-  case InputFile::Object32LEKind:
+  switch (FirstObj.getELFKind()) {
+  case ELF32LEKind:
     writeResult<object::ELF32LE>(&Symtab);
     return;
-  case InputFile::Object32BEKind:
+  case ELF32BEKind:
     writeResult<object::ELF32BE>(&Symtab);
     return;
-  case InputFile::Object64LEKind:
+  case ELF64LEKind:
     writeResult<object::ELF64LE>(&Symtab);
     return;
-  case InputFile::Object64BEKind:
+  case ELF64BEKind:
     writeResult<object::ELF64BE>(&Symtab);
     return;
   }
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index 8e3b168..7cc47de 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -20,7 +20,7 @@
 
 template <class ELFT>
 bool ObjectFile<ELFT>::isCompatibleWith(const ObjectFileBase &Other) const {
-  if (kind() != Other.kind())
+  if (getELFKind() != Other.getELFKind())
     return false;
   return getObj()->getHeader()->e_machine ==
          cast<ObjectFile<ELFT>>(Other).getObj()->getHeader()->e_machine;
diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h
index 4a57481..78996ee 100644
--- a/lld/ELF/InputFiles.h
+++ b/lld/ELF/InputFiles.h
@@ -23,7 +23,7 @@
 // The root class of input files.
 class InputFile {
 public:
-  enum Kind { Object32LEKind, Object32BEKind, Object64LEKind, Object64BEKind };
+  enum Kind { ObjectKind };
   Kind kind() const { return FileKind; }
   virtual ~InputFile() {}
 
@@ -43,24 +43,27 @@
   const Kind FileKind;
 };
 
+enum ELFKind { ELF32LEKind, ELF32BEKind, ELF64LEKind, ELF64BEKind };
+
 // .o file.
 class ObjectFileBase : public InputFile {
 public:
-  explicit ObjectFileBase(Kind K, MemoryBufferRef M) : InputFile(K, M) {}
-  static bool classof(const InputFile *F) {
-    Kind K = F->kind();
-    return K >= Object32LEKind && K <= Object64BEKind;
-  }
+  explicit ObjectFileBase(ELFKind EKind, MemoryBufferRef M)
+      : InputFile(ObjectKind, M), EKind(EKind) {}
+  static bool classof(const InputFile *F) { return F->kind() == ObjectKind; }
 
   ArrayRef<SymbolBody *> getSymbols() override { return SymbolBodies; }
 
   virtual bool isCompatibleWith(const ObjectFileBase &Other) const = 0;
 
+  ELFKind getELFKind() const { return EKind; }
+
 protected:
   // List of all symbols referenced or defined by this file.
   std::vector<SymbolBody *> SymbolBodies;
 
   llvm::BumpPtrAllocator Alloc;
+  const ELFKind EKind;
 };
 
 template <class ELFT> class ObjectFile : public ObjectFileBase {
@@ -72,20 +75,24 @@
 public:
   bool isCompatibleWith(const ObjectFileBase &Other) const override;
 
-  static Kind getKind() {
+  static ELFKind getStaticELFKind() {
     if (!ELFT::Is64Bits) {
       if (ELFT::TargetEndianness == llvm::support::little)
-        return Object32LEKind;
-      return Object32BEKind;
+        return ELF32LEKind;
+      return ELF32BEKind;
     }
     if (ELFT::TargetEndianness == llvm::support::little)
-      return Object64LEKind;
-    return Object64BEKind;
+      return ELF64LEKind;
+    return ELF64BEKind;
   }
 
-  static bool classof(const InputFile *F) { return F->kind() == getKind(); }
+  static bool classof(const InputFile *F) {
+    return F->kind() == ObjectKind &&
+           cast<ObjectFileBase>(F)->getELFKind() == getStaticELFKind();
+  }
 
-  explicit ObjectFile(MemoryBufferRef M) : ObjectFileBase(getKind(), M) {}
+  explicit ObjectFile(MemoryBufferRef M)
+      : ObjectFileBase(getStaticELFKind(), M) {}
   void parse() override;
 
   // Returns the underying ELF file.
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index ee87f78..2d1b5c8 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -38,17 +38,17 @@
     if (!Old.isCompatibleWith(*File))
       error(Twine(Old.getName() + " is incompatible with " + File->getName()));
   } else {
-    switch (File->kind()) {
-    case InputFile::Object32LEKind:
+    switch (File->getELFKind()) {
+    case ELF32LEKind:
       init<ELF32LE>();
       break;
-    case InputFile::Object32BEKind:
+    case ELF32BEKind:
       init<ELF32BE>();
       break;
-    case InputFile::Object64LEKind:
+    case ELF64LEKind:
       init<ELF64LE>();
       break;
-    case InputFile::Object64BEKind:
+    case ELF64BEKind:
       init<ELF64BE>();
       break;
     }
@@ -56,17 +56,17 @@
 
   ObjectFiles.emplace_back(File);
   for (SymbolBody *Body : File->getSymbols()) {
-    switch (File->kind()) {
-    case InputFile::Object32LEKind:
+    switch (File->getELFKind()) {
+    case ELF32LEKind:
       resolve<ELF32LE>(Body);
       break;
-    case InputFile::Object32BEKind:
+    case ELF32BEKind:
       resolve<ELF32BE>(Body);
       break;
-    case InputFile::Object64LEKind:
+    case ELF64LEKind:
       resolve<ELF64LE>(Body);
       break;
-    case InputFile::Object64BEKind:
+    case ELF64BEKind:
       resolve<ELF64BE>(Body);
       break;
     }