diff options
author | Fangrui Song <maskray@google.com> | 2019-08-14 01:52:47 +0000 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2019-08-14 01:52:47 +0000 |
commit | f1d538cce54b4a2ae06b07cf5323b0137f5385d3 (patch) | |
tree | 5c10ef2b4bd53df00f8cce38c3c20b8fc31f9f11 | |
parent | cee41ce223c7e5bd1a52a74e37d79bbbc785cf0a (diff) | |
download | bcm5719-llvm-f1d538cce54b4a2ae06b07cf5323b0137f5385d3.tar.gz bcm5719-llvm-f1d538cce54b4a2ae06b07cf5323b0137f5385d3.zip |
[ELF] Initialize 2 fields of Symbol in SymbolTable::insert
A new symbol is added to elf::symtab in 3 steps:
1) SymbolTable::insert creates a placeholder.
2) Symbol::mergeProperties
3) Symbol::replace
Fields referenced by steps 2) and 3) should be initialized in
SymbolTable::insert. `traced` and `referenced` were missed previously.
This did not cause problems because compilers generated code that
initialized them (bit fields) to 0.
Reviewed By: grimar
Differential Revision: https://reviews.llvm.org/D66130
llvm-svn: 368784
-rw-r--r-- | lld/ELF/SymbolTable.cpp | 4 | ||||
-rw-r--r-- | lld/ELF/Symbols.h | 2 |
2 files changed, 6 insertions, 0 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index e978e0b8c41..64dd1621cea 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -71,6 +71,8 @@ Symbol *SymbolTable::insert(StringRef name) { Symbol *sym = reinterpret_cast<Symbol *>(make<SymbolUnion>()); symVector.push_back(sym); + // *sym was not initialized by a constructor. Fields that may get referenced + // when it is a placeholder must be initialized here. sym->setName(name); sym->symbolKind = Symbol::PlaceholderKind; sym->versionId = VER_NDX_GLOBAL; @@ -79,6 +81,8 @@ Symbol *SymbolTable::insert(StringRef name) { sym->exportDynamic = false; sym->inDynamicList = false; sym->canInline = true; + sym->referenced = false; + sym->traced = false; sym->scriptDefined = false; sym->partition = 1; return sym; diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h index 501271010d8..713d8be9e3c 100644 --- a/lld/ELF/Symbols.h +++ b/lld/ELF/Symbols.h @@ -537,6 +537,8 @@ void Symbol::replace(const Symbol &newSym) { Symbol old = *this; memcpy(this, &newSym, newSym.getSymbolSize()); + // old may be a placeholder. The referenced fields must be initialized in + // SymbolTable::insert. versionId = old.versionId; visibility = old.visibility; isUsedInRegularObj = old.isUsedInRegularObj; |