Add support for weak absolute symbols.

On ELF being weak is independent of what we call the kind of the symbol. So
this also makes the code simpler.

llvm-svn: 246326
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 244d4fd..dc4fcde 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -246,7 +246,7 @@
         if (!Body)
           continue;
         // Skip undefined weak for now.
-        if (isa<UndefinedWeak<ELFT>>(Body))
+        if (isa<Undefined<ELFT>>(Body) && Body->isWeak())
           continue;
         if (!isa<DefinedRegular<ELFT>>(Body))
           error(Twine("Can't relocate symbol ") + Body->getName());
@@ -300,18 +300,17 @@
     const Elf_Sym *InputSym = nullptr;
 
     switch (Body->kind()) {
-    case SymbolBody::UndefinedKind:
     case SymbolBody::UndefinedSyntheticKind:
       llvm_unreachable("Should be defined by now");
-    case SymbolBody::DefinedWeakKind:
     case SymbolBody::DefinedRegularKind: {
-      auto *Def = cast<DefinedInSection<ELFT>>(Body);
+      auto *Def = cast<DefinedRegular<ELFT>>(Body);
       InputSym = &Def->Sym;
       Section = &Def->Section;
       break;
     }
+    case SymbolBody::UndefinedKind:
+      assert(Body->isWeak() && "Should be defined by now");
     case SymbolBody::DefinedAbsoluteKind:
-    case SymbolBody::UndefinedWeakKind:
       InputSym = &cast<ELFSymbolBody<ELFT>>(Body)->Sym;
       break;
     }