20#include "pedigree/kernel/LockGuard.h"
21#include "pedigree/kernel/linker/SymbolTable.h"
22#include "pedigree/kernel/utilities/Iterator.h"
24#define RAII_LOCK ConstexprLockGuard<Mutex, THREADS> guard(m_Lock)
30 m_pOriginatingElf(pElf),
31 m_bPreallocated(false) {}
40 m_LocalSymbols = newSymtab.m_LocalSymbols;
41 m_GlobalSymbols = newSymtab.m_GlobalSymbols;
42 m_WeakSymbols = newSymtab.m_WeakSymbols;
48 doInsert(name, binding, pParent, value);
52 Elf* pParent, uintptr_t value) {
65 tree->reserve(numLocal);
68 tree->reserve(numGlobal);
71 tree->reserve(numWeak);
73 m_bPreallocated =
true;
81 tree->reserve(tree->count() + numGlobal);
84 tree->reserve(tree->count() + numWeak);
87 tree->reserve(tree->count() + numLocal);
89 m_bPreallocated =
true;
94 return m_bPreallocated;
98 Elf* pParent, uintptr_t value) {
108 tree->insert(name,
symbol);
111void SymbolTable::eraseByElf(
Elf* pParent) {
115 m_LocalSymbols.
remove(pParent);
116 m_GlobalSymbols.
remove(pParent);
117 m_WeakSymbols.
remove(pParent);
127 uintptr_t lookupResult = 0;
134 if (result.hasValue()) {
135 lookupResult = result.value()->getValue();
145 if (result.hasValue()) {
146 lookupResult = result.value()->getValue();
157 if (result.hasValue()) {
158 lookupResult = result.value()->getValue();
174 for (
const auto* table : tables) {
175 const auto& symbols = table->lookupRef(owner, missing);
177 auto found = symbols->lookup(name);
178 if (found.hasValue()) {
179 return found.value()->getValue();
193 tree = &m_LocalSymbols;
196 tree = &m_GlobalSymbols;
199 tree = &m_WeakSymbols;
205 return symbolTree.get();
209 auto result = newTree.get();
210 tree->
insert(p, pedigree_std::move(newTree));
static SharedPointer< T > allocate(Args...)
void insert(const String &name, Binding binding, Elf *pParent, uintptr_t value)
void preallocate(size_t numGlobal, size_t numWeak, Elf *localElf, size_t numLocal)
void insertMultiple(SymbolTable *pOther, const String &name, Binding binding, Elf *pParent, uintptr_t value)
uintptr_t lookupOwned(const HashedStringView &name, Elf *owner)
void copyTable(Elf *pNewElf, const SymbolTable &newSymtab)
SharedPointer< Symbol > doInsert(const String &name, Binding binding, Elf *pParent, uintptr_t value)
symbolTree_t * getOrInsertTree(Elf *, Binding table=Local)
void insertShared(const String &name, SharedPointer< Symbol > &symbol)
uintptr_t EXPORTED_PUBLIC lookup(const HashedStringView &name, Elf *pElf, Policy policy=LocalFirst, Binding *pBinding=0)
bool hasPreallocated() const
void preallocateAdditional(size_t numGlobal, size_t numWeak, Elf *localElf, size_t numLocal)
An iterator applicable for many data structures.
void remove(const K &key)
void insert(const K &key, const E &value)
const E & lookupRef(const K &key, const E &failed=E()) const