From 76e24ea955b6c4c2b7d49b461dd3e77cd5146747 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 11 Aug 2015 17:57:05 +0000 Subject: [PATCH] Add support for weak undefined symbols. llvm-svn: 244640 --- lld/ELF/InputFiles.cpp | 3 ++- lld/ELF/Symbols.cpp | 1 + lld/ELF/Symbols.h | 12 +++++++++++- lld/test/elf2/resolution.s | 3 +++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 38d9b7a..0c78b19 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -83,7 +83,8 @@ SymbolBody *elf2::ObjectFile::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); } } diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index a2cee7f..de74e0d 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -42,6 +42,7 @@ int SymbolBody::compare(SymbolBody *Other) { return 0; case DefinedWeakKind: case UndefinedKind: + case UndefinedWeakKind: return 1; } llvm_unreachable("unknown symbol kind"); diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h index 5014366..1a60455 100644 --- a/lld/ELF/Symbols.h +++ b/lld/ELF/Symbols.h @@ -39,7 +39,8 @@ public: DefinedRegularKind = 0, DefinedWeakKind = 1, DefinedLast = 1, - UndefinedKind = 2 + UndefinedWeakKind = 2, + UndefinedKind = 3 }; Kind kind() const { return static_cast(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 diff --git a/lld/test/elf2/resolution.s b/lld/test/elf2/resolution.s index a49c7d5..b78cdb1 100644 --- a/lld/test/elf2/resolution.s +++ b/lld/test/elf2/resolution.s @@ -13,3 +13,6 @@ local: foo: .long bar + +.weak zed +.long zed -- 2.7.4