diff options
Diffstat (limited to 'lld/ELF/SymbolTable.cpp')
-rw-r--r-- | lld/ELF/SymbolTable.cpp | 230 |
1 files changed, 115 insertions, 115 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index cf83e907a73..0fd0eab9bda 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -30,73 +30,73 @@ using namespace llvm::ELF; using namespace lld; using namespace lld::elf; -SymbolTable *elf::Symtab; +SymbolTable *elf::symtab; -void SymbolTable::wrap(Symbol *Sym, Symbol *Real, Symbol *Wrap) { +void SymbolTable::wrap(Symbol *sym, Symbol *real, Symbol *wrap) { // Swap symbols as instructed by -wrap. - int &Idx1 = SymMap[CachedHashStringRef(Sym->getName())]; - int &Idx2 = SymMap[CachedHashStringRef(Real->getName())]; - int &Idx3 = SymMap[CachedHashStringRef(Wrap->getName())]; + int &idx1 = symMap[CachedHashStringRef(sym->getName())]; + int &idx2 = symMap[CachedHashStringRef(real->getName())]; + int &idx3 = symMap[CachedHashStringRef(wrap->getName())]; - Idx2 = Idx1; - Idx1 = Idx3; + idx2 = idx1; + idx1 = idx3; // Now renaming is complete. No one refers Real symbol. We could leave // Real as-is, but if Real is written to the symbol table, that may // contain irrelevant values. So, we copy all values from Sym to Real. - StringRef S = Real->getName(); - memcpy(Real, Sym, sizeof(SymbolUnion)); - Real->setName(S); + StringRef s = real->getName(); + memcpy(real, sym, sizeof(SymbolUnion)); + real->setName(s); } // Find an existing symbol or create a new one. -Symbol *SymbolTable::insert(StringRef Name) { +Symbol *SymbolTable::insert(StringRef name) { // <name>@@<version> means the symbol is the default version. In that // case <name>@@<version> will be used to resolve references to <name>. // // Since this is a hot path, the following string search code is // optimized for speed. StringRef::find(char) is much faster than // StringRef::find(StringRef). - size_t Pos = Name.find('@'); - if (Pos != StringRef::npos && Pos + 1 < Name.size() && Name[Pos + 1] == '@') - Name = Name.take_front(Pos); - - auto P = SymMap.insert({CachedHashStringRef(Name), (int)SymVector.size()}); - int &SymIndex = P.first->second; - bool IsNew = P.second; - - if (!IsNew) - return SymVector[SymIndex]; - - Symbol *Sym = reinterpret_cast<Symbol *>(make<SymbolUnion>()); - SymVector.push_back(Sym); - - Sym->setName(Name); - Sym->SymbolKind = Symbol::PlaceholderKind; - Sym->VersionId = Config->DefaultSymbolVersion; - Sym->Visibility = STV_DEFAULT; - Sym->IsUsedInRegularObj = false; - Sym->ExportDynamic = false; - Sym->CanInline = true; - Sym->ScriptDefined = false; - Sym->Partition = 1; - return Sym; + size_t pos = name.find('@'); + if (pos != StringRef::npos && pos + 1 < name.size() && name[pos + 1] == '@') + name = name.take_front(pos); + + auto p = symMap.insert({CachedHashStringRef(name), (int)symVector.size()}); + int &symIndex = p.first->second; + bool isNew = p.second; + + if (!isNew) + return symVector[symIndex]; + + Symbol *sym = reinterpret_cast<Symbol *>(make<SymbolUnion>()); + symVector.push_back(sym); + + sym->setName(name); + sym->symbolKind = Symbol::PlaceholderKind; + sym->versionId = config->defaultSymbolVersion; + sym->visibility = STV_DEFAULT; + sym->isUsedInRegularObj = false; + sym->exportDynamic = false; + sym->canInline = true; + sym->scriptDefined = false; + sym->partition = 1; + return sym; } Symbol *SymbolTable::addSymbol(const Symbol &New) { - Symbol *Sym = Symtab->insert(New.getName()); - Sym->resolve(New); - return Sym; + Symbol *sym = symtab->insert(New.getName()); + sym->resolve(New); + return sym; } -Symbol *SymbolTable::find(StringRef Name) { - auto It = SymMap.find(CachedHashStringRef(Name)); - if (It == SymMap.end()) +Symbol *SymbolTable::find(StringRef name) { + auto it = symMap.find(CachedHashStringRef(name)); + if (it == symMap.end()) return nullptr; - Symbol *Sym = SymVector[It->second]; - if (Sym->isPlaceholder()) + Symbol *sym = symVector[it->second]; + if (sym->isPlaceholder()) return nullptr; - return Sym; + return sym; } // Initialize DemangledSyms with a map from demangled symbols to symbol @@ -113,119 +113,119 @@ Symbol *SymbolTable::find(StringRef Name) { // So, if "extern C++" feature is used, we need to demangle all known // symbols. StringMap<std::vector<Symbol *>> &SymbolTable::getDemangledSyms() { - if (!DemangledSyms) { - DemangledSyms.emplace(); - for (Symbol *Sym : SymVector) { - if (!Sym->isDefined() && !Sym->isCommon()) + if (!demangledSyms) { + demangledSyms.emplace(); + for (Symbol *sym : symVector) { + if (!sym->isDefined() && !sym->isCommon()) continue; - if (Optional<std::string> S = demangleItanium(Sym->getName())) - (*DemangledSyms)[*S].push_back(Sym); + if (Optional<std::string> s = demangleItanium(sym->getName())) + (*demangledSyms)[*s].push_back(sym); else - (*DemangledSyms)[Sym->getName()].push_back(Sym); + (*demangledSyms)[sym->getName()].push_back(sym); } } - return *DemangledSyms; + return *demangledSyms; } -std::vector<Symbol *> SymbolTable::findByVersion(SymbolVersion Ver) { - if (Ver.IsExternCpp) - return getDemangledSyms().lookup(Ver.Name); - if (Symbol *B = find(Ver.Name)) - if (B->isDefined() || B->isCommon()) - return {B}; +std::vector<Symbol *> SymbolTable::findByVersion(SymbolVersion ver) { + if (ver.isExternCpp) + return getDemangledSyms().lookup(ver.name); + if (Symbol *b = find(ver.name)) + if (b->isDefined() || b->isCommon()) + return {b}; return {}; } -std::vector<Symbol *> SymbolTable::findAllByVersion(SymbolVersion Ver) { - std::vector<Symbol *> Res; - StringMatcher M(Ver.Name); +std::vector<Symbol *> SymbolTable::findAllByVersion(SymbolVersion ver) { + std::vector<Symbol *> res; + StringMatcher m(ver.name); - if (Ver.IsExternCpp) { - for (auto &P : getDemangledSyms()) - if (M.match(P.first())) - Res.insert(Res.end(), P.second.begin(), P.second.end()); - return Res; + if (ver.isExternCpp) { + for (auto &p : getDemangledSyms()) + if (m.match(p.first())) + res.insert(res.end(), p.second.begin(), p.second.end()); + return res; } - for (Symbol *Sym : SymVector) - if ((Sym->isDefined() || Sym->isCommon()) && M.match(Sym->getName())) - Res.push_back(Sym); - return Res; + for (Symbol *sym : symVector) + if ((sym->isDefined() || sym->isCommon()) && m.match(sym->getName())) + res.push_back(sym); + return res; } // If there's only one anonymous version definition in a version // script file, the script does not actually define any symbol version, // but just specifies symbols visibilities. void SymbolTable::handleAnonymousVersion() { - for (SymbolVersion &Ver : Config->VersionScriptGlobals) - assignExactVersion(Ver, VER_NDX_GLOBAL, "global"); - for (SymbolVersion &Ver : Config->VersionScriptGlobals) - assignWildcardVersion(Ver, VER_NDX_GLOBAL); - for (SymbolVersion &Ver : Config->VersionScriptLocals) - assignExactVersion(Ver, VER_NDX_LOCAL, "local"); - for (SymbolVersion &Ver : Config->VersionScriptLocals) - assignWildcardVersion(Ver, VER_NDX_LOCAL); + for (SymbolVersion &ver : config->versionScriptGlobals) + assignExactVersion(ver, VER_NDX_GLOBAL, "global"); + for (SymbolVersion &ver : config->versionScriptGlobals) + assignWildcardVersion(ver, VER_NDX_GLOBAL); + for (SymbolVersion &ver : config->versionScriptLocals) + assignExactVersion(ver, VER_NDX_LOCAL, "local"); + for (SymbolVersion &ver : config->versionScriptLocals) + assignWildcardVersion(ver, VER_NDX_LOCAL); } // Handles -dynamic-list. void SymbolTable::handleDynamicList() { - for (SymbolVersion &Ver : Config->DynamicList) { - std::vector<Symbol *> Syms; - if (Ver.HasWildcard) - Syms = findAllByVersion(Ver); + for (SymbolVersion &ver : config->dynamicList) { + std::vector<Symbol *> syms; + if (ver.hasWildcard) + syms = findAllByVersion(ver); else - Syms = findByVersion(Ver); + syms = findByVersion(ver); - for (Symbol *B : Syms) { - if (!Config->Shared) - B->ExportDynamic = true; - else if (B->includeInDynsym()) - B->IsPreemptible = true; + for (Symbol *b : syms) { + if (!config->shared) + b->exportDynamic = true; + else if (b->includeInDynsym()) + b->isPreemptible = true; } } } // Set symbol versions to symbols. This function handles patterns // containing no wildcard characters. -void SymbolTable::assignExactVersion(SymbolVersion Ver, uint16_t VersionId, - StringRef VersionName) { - if (Ver.HasWildcard) +void SymbolTable::assignExactVersion(SymbolVersion ver, uint16_t versionId, + StringRef versionName) { + if (ver.hasWildcard) return; // Get a list of symbols which we need to assign the version to. - std::vector<Symbol *> Syms = findByVersion(Ver); - if (Syms.empty()) { - if (!Config->UndefinedVersion) - error("version script assignment of '" + VersionName + "' to symbol '" + - Ver.Name + "' failed: symbol not defined"); + std::vector<Symbol *> syms = findByVersion(ver); + if (syms.empty()) { + if (!config->undefinedVersion) + error("version script assignment of '" + versionName + "' to symbol '" + + ver.name + "' failed: symbol not defined"); return; } // Assign the version. - for (Symbol *Sym : Syms) { + for (Symbol *sym : syms) { // Skip symbols containing version info because symbol versions // specified by symbol names take precedence over version scripts. // See parseSymbolVersion(). - if (Sym->getName().contains('@')) + if (sym->getName().contains('@')) continue; - if (Sym->VersionId != Config->DefaultSymbolVersion && - Sym->VersionId != VersionId) - error("duplicate symbol '" + Ver.Name + "' in version script"); - Sym->VersionId = VersionId; + if (sym->versionId != config->defaultSymbolVersion && + sym->versionId != versionId) + error("duplicate symbol '" + ver.name + "' in version script"); + sym->versionId = versionId; } } -void SymbolTable::assignWildcardVersion(SymbolVersion Ver, uint16_t VersionId) { - if (!Ver.HasWildcard) +void SymbolTable::assignWildcardVersion(SymbolVersion ver, uint16_t versionId) { + if (!ver.hasWildcard) return; // Exact matching takes precendence over fuzzy matching, // so we set a version to a symbol only if no version has been assigned // to the symbol. This behavior is compatible with GNU. - for (Symbol *B : findAllByVersion(Ver)) - if (B->VersionId == Config->DefaultSymbolVersion) - B->VersionId = VersionId; + for (Symbol *b : findAllByVersion(ver)) + if (b->versionId == config->defaultSymbolVersion) + b->versionId = versionId; } // This function processes version scripts by updating VersionId @@ -241,21 +241,21 @@ void SymbolTable::scanVersionScript() { // First, we assign versions to exact matching symbols, // i.e. version definitions not containing any glob meta-characters. - for (VersionDefinition &V : Config->VersionDefinitions) - for (SymbolVersion &Ver : V.Globals) - assignExactVersion(Ver, V.Id, V.Name); + for (VersionDefinition &v : config->versionDefinitions) + for (SymbolVersion &ver : v.globals) + assignExactVersion(ver, v.id, v.name); // Next, we assign versions to fuzzy matching symbols, // i.e. version definitions containing glob meta-characters. // Note that because the last match takes precedence over previous matches, // we iterate over the definitions in the reverse order. - for (VersionDefinition &V : llvm::reverse(Config->VersionDefinitions)) - for (SymbolVersion &Ver : V.Globals) - assignWildcardVersion(Ver, V.Id); + for (VersionDefinition &v : llvm::reverse(config->versionDefinitions)) + for (SymbolVersion &ver : v.globals) + assignWildcardVersion(ver, v.id); // Symbol themselves might know their versions because symbols // can contain versions in the form of <name>@<version>. // Let them parse and update their names to exclude version suffix. - for (Symbol *Sym : SymVector) - Sym->parseSymbolVersion(); + for (Symbol *sym : symVector) + sym->parseSymbolVersion(); } |