diff options
| author | Igor Kudrin <ikudrin.dev@gmail.com> | 2015-10-09 09:58:39 +0000 |
|---|---|---|
| committer | Igor Kudrin <ikudrin.dev@gmail.com> | 2015-10-09 09:58:39 +0000 |
| commit | 65bddeaacf2e53d11a12a7993a0fc6af83315a4e (patch) | |
| tree | 644fd9805e7210c9551acb850982eaeed8573cb0 /lld/ELF/Symbols.h | |
| parent | b352b9ce69ad164e4420c85777b61c884f226f9b (diff) | |
| download | bcm5719-llvm-65bddeaacf2e53d11a12a7993a0fc6af83315a4e.tar.gz bcm5719-llvm-65bddeaacf2e53d11a12a7993a0fc6af83315a4e.zip | |
[ELF2] Check for TLS mismatch in symbol resolution.
The linker should generate an error if a TLS symbol is resolved
for a non-TLS reference and vice versa.
The patch addresses PR24244 (https://llvm.org/bugs/show_bug.cgi?id=24244)
Differential Revision: http://reviews.llvm.org/D13550
llvm-svn: 249817
Diffstat (limited to 'lld/ELF/Symbols.h')
| -rw-r--r-- | lld/ELF/Symbols.h | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h index a6e62fc4b43..0e8c005a359 100644 --- a/lld/ELF/Symbols.h +++ b/lld/ELF/Symbols.h @@ -63,6 +63,7 @@ public: bool isUsedInRegularObj() const { return IsUsedInRegularObj; } bool isUsedInDynamicReloc() const { return IsUsedInDynamicReloc; } void setUsedInDynamicReloc() { IsUsedInDynamicReloc = true; } + bool isTLS() const { return IsTLS; } // Returns the symbol name. StringRef getName() const { return Name; } @@ -96,9 +97,10 @@ public: template <class ELFT> int compare(SymbolBody *Other); protected: - SymbolBody(Kind K, StringRef Name, bool IsWeak, uint8_t Visibility) + SymbolBody(Kind K, StringRef Name, bool IsWeak, uint8_t Visibility, + bool IsTLS) : SymbolKind(K), IsWeak(IsWeak), MostConstrainingVisibility(Visibility), - Name(Name) { + IsTLS(IsTLS), Name(Name) { IsUsedInRegularObj = K != SharedKind && K != LazyKind; IsUsedInDynamicReloc = 0; } @@ -108,6 +110,7 @@ protected: unsigned MostConstrainingVisibility : 2; unsigned IsUsedInRegularObj : 1; unsigned IsUsedInDynamicReloc : 1; + unsigned IsTLS : 1; unsigned DynamicSymbolTableIndex = 0; StringRef Name; Symbol *Backref = nullptr; @@ -125,7 +128,7 @@ protected: typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; ELFSymbolBody(Kind K, StringRef Name, const Elf_Sym &Sym) : SymbolBody(K, Name, Sym.getBinding() == llvm::ELF::STB_WEAK, - Sym.getVisibility()), + Sym.getVisibility(), Sym.getType() == llvm::ELF::STT_TLS), Sym(Sym) {} public: @@ -272,7 +275,7 @@ public: class Lazy : public SymbolBody { public: Lazy(ArchiveFile *F, const llvm::object::Archive::Symbol S) - : SymbolBody(LazyKind, S.getName(), false, llvm::ELF::STV_DEFAULT), + : SymbolBody(LazyKind, S.getName(), false, llvm::ELF::STV_DEFAULT, false), File(F), Sym(S) {} static bool classof(const SymbolBody *S) { return S->kind() == LazyKind; } |

