Add support for weak undefined symbols.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 11 Aug 2015 17:57:05 +0000 (17:57 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 11 Aug 2015 17:57:05 +0000 (17:57 +0000)
llvm-svn: 244640

lld/ELF/InputFiles.cpp
lld/ELF/Symbols.cpp
lld/ELF/Symbols.h
lld/test/elf2/resolution.s

index 38d9b7a..0c78b19 100644 (file)
@@ -83,7 +83,8 @@ SymbolBody *elf2::ObjectFile<ELFT>::createSymbolBody(StringRef StringTable,
       return new (Alloc) Undefined(Name);
     return new (Alloc) DefinedRegular(Name);
   case STB_WEAK:
-    // FIXME: add support for weak undefined
+    if (Sym->isUndefined())
+      return new (Alloc) UndefinedWeak(Name);
     return new (Alloc) DefinedWeak(Name);
   }
 }
index a2cee7f..de74e0d 100644 (file)
@@ -42,6 +42,7 @@ int SymbolBody::compare(SymbolBody *Other) {
     return 0;
   case DefinedWeakKind:
   case UndefinedKind:
+  case UndefinedWeakKind:
     return 1;
   }
   llvm_unreachable("unknown symbol kind");
index 5014366..1a60455 100644 (file)
@@ -39,7 +39,8 @@ public:
     DefinedRegularKind = 0,
     DefinedWeakKind = 1,
     DefinedLast = 1,
-    UndefinedKind = 2
+    UndefinedWeakKind = 2,
+    UndefinedKind = 3
   };
 
   Kind kind() const { return static_cast<Kind>(SymbolKind); }
@@ -112,6 +113,15 @@ public:
   }
 };
 
+class UndefinedWeak : public SymbolBody {
+public:
+  explicit UndefinedWeak(StringRef N) : SymbolBody(UndefinedWeakKind, N) {}
+
+  static bool classof(const SymbolBody *S) {
+    return S->kind() == UndefinedWeakKind;
+  }
+};
+
 } // namespace elf2
 } // namespace lld
 
index a49c7d5..b78cdb1 100644 (file)
@@ -13,3 +13,6 @@ local:
 foo:
 
 .long bar
+
+.weak zed
+.long zed