summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFangrui Song <maskray@google.com>2019-08-14 01:52:47 +0000
committerFangrui Song <maskray@google.com>2019-08-14 01:52:47 +0000
commitf1d538cce54b4a2ae06b07cf5323b0137f5385d3 (patch)
tree5c10ef2b4bd53df00f8cce38c3c20b8fc31f9f11
parentcee41ce223c7e5bd1a52a74e37d79bbbc785cf0a (diff)
downloadbcm5719-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.cpp4
-rw-r--r--lld/ELF/Symbols.h2
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;
OpenPOWER on IntegriCloud