//===- SymbolTable.cpp ----------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Symbol table is a bag of all known symbols. We put all symbols of // all input files to the symbol table. The symbol table is basically // a hash table with the logic to resolve symbol name conflicts using // the symbol types. // //===----------------------------------------------------------------------===// #include "SymbolTable.h" #include "Config.h" #include "InputFiles.h" #include "Symbols.h" #include "lld/Common/ErrorHandler.h" #include "lld/Common/Memory.h" #include "lld/Common/Strings.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Demangle/Demangle.h" usingnamespacellvm; usingnamespacellvm::object; usingnamespacellvm::ELF; usingnamespacelld; usingnamespacelld::elf; void SymbolTable::wrap(Symbol *sym, Symbol *real, Symbol *wrap) { … } // Find an existing symbol or create a new one. Symbol *SymbolTable::insert(StringRef name) { … } // This variant of addSymbol is used by BinaryFile::parse to check duplicate // symbol errors. Symbol *SymbolTable::addAndCheckDuplicate(const Defined &newSym) { … } Symbol *SymbolTable::find(StringRef name) { … } // A version script/dynamic list is only meaningful for a Defined symbol. // A CommonSymbol will be converted to a Defined in replaceCommonSymbols(). // A lazy symbol may be made Defined if an LTO libcall extracts it. static bool canBeVersioned(const Symbol &sym) { … } // Initialize demangledSyms with a map from demangled symbols to symbol // objects. Used to handle "extern C++" directive in version scripts. // // The map will contain all demangled symbols. That can be very large, // and in LLD we generally want to avoid do anything for each symbol. // Then, why are we doing this? Here's why. // // Users can use "extern C++ {}" directive to match against demangled // C++ symbols. For example, you can write a pattern such as // "llvm::*::foo(int, ?)". Obviously, there's no way to handle this // other than trying to match a pattern against all demangled symbols. // So, if "extern C++" feature is used, we need to demangle all known // symbols. StringMap<SmallVector<Symbol *, 0>> &SymbolTable::getDemangledSyms() { … } SmallVector<Symbol *, 0> SymbolTable::findByVersion(SymbolVersion ver) { … } SmallVector<Symbol *, 0> SymbolTable::findAllByVersion(SymbolVersion ver, bool includeNonDefault) { … } void SymbolTable::handleDynamicList() { … } // Set symbol versions to symbols. This function handles patterns containing no // wildcard characters. Return false if no symbol definition matches ver. bool SymbolTable::assignExactVersion(SymbolVersion ver, uint16_t versionId, StringRef versionName, bool includeNonDefault) { … } void SymbolTable::assignWildcardVersion(SymbolVersion ver, uint16_t versionId, bool includeNonDefault) { … } // This function processes version scripts by updating the versionId // member of symbols. // 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::scanVersionScript() { … } Symbol *SymbolTable::addUnusedUndefined(StringRef name, uint8_t binding) { … }