diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-08-11 17:57:05 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-08-11 17:57:05 +0000 |
| commit | 76e24ea955b6c4c2b7d49b461dd3e77cd5146747 (patch) | |
| tree | 90d4c18db00d37791a36eb6044dd4a091f4792bb | |
| parent | 791e9f9c5928fad353d214baddaa87816b21daa7 (diff) | |
| download | bcm5719-llvm-76e24ea955b6c4c2b7d49b461dd3e77cd5146747.tar.gz bcm5719-llvm-76e24ea955b6c4c2b7d49b461dd3e77cd5146747.zip | |
Add support for weak undefined symbols.
llvm-svn: 244640
| -rw-r--r-- | lld/ELF/InputFiles.cpp | 3 | ||||
| -rw-r--r-- | lld/ELF/Symbols.cpp | 1 | ||||
| -rw-r--r-- | lld/ELF/Symbols.h | 12 | ||||
| -rw-r--r-- | 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 38d9b7ab4c8..0c78b194c51 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -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); } } diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index a2cee7f777f..de74e0d4166 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 50143660e17..1a60455a0c7 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<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 diff --git a/lld/test/elf2/resolution.s b/lld/test/elf2/resolution.s index a49c7d5a1a5..b78cdb16a5c 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 |

