[llvm] [JITLink] Use NonOwningSymbolStringPtrs in ExternalSymbolsMap. (PR #191634)
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 12 04:38:39 PDT 2026
https://github.com/lhames updated https://github.com/llvm/llvm-project/pull/191634
>From c68ddc06fcf5acab43cac47dddc4d81a22ebc69d Mon Sep 17 00:00:00 2001
From: Lang Hames <lhames at gmail.com>
Date: Sat, 11 Apr 2026 11:30:29 +1000
Subject: [PATCH] [JITLink] Use NonOwningSymbolStringPtrs in
ExternalSymbolsMap.
SymbolStringPtr comparisons should be more efficient that string comparisons.
Fixes a FIXME.
---
.../llvm/ExecutionEngine/JITLink/JITLink.h | 27 +++++++++++--------
1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
index d8edeed8a464a..f6794636df1f8 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
@@ -879,7 +879,7 @@ class SectionRange {
class LinkGraph {
private:
using SectionMap = DenseMap<StringRef, std::unique_ptr<Section>>;
- using ExternalSymbolMap = StringMap<Symbol *>;
+ using ExternalSymbolMap = DenseMap<orc::NonOwningSymbolStringPtr, Symbol *>;
using AbsoluteSymbolSet = DenseSet<Symbol *>;
using BlockSet = DenseSet<Block *>;
@@ -1293,11 +1293,13 @@ class LinkGraph {
Symbol &addExternalSymbol(orc::SymbolStringPtr Name,
orc::ExecutorAddrDiff Size,
bool IsWeaklyReferenced) {
- assert(!ExternalSymbols.contains(*Name) && "Duplicate external symbol");
+ assert(!ExternalSymbols.contains(orc::NonOwningSymbolStringPtr(Name)) &&
+ "Duplicate external symbol");
auto &Sym = Symbol::constructExternal(
Allocator, createAddressable(orc::ExecutorAddr(), false),
std::move(Name), Size, Linkage::Strong, IsWeaklyReferenced);
- ExternalSymbols.insert({*Sym.getName(), &Sym});
+ ExternalSymbols.insert(
+ {orc::NonOwningSymbolStringPtr(Sym.getName()), &Sym});
return Sym;
}
@@ -1468,7 +1470,8 @@ class LinkGraph {
Sec.removeSymbol(Sym);
Sym.makeExternal(createAddressable(orc::ExecutorAddr(), false));
}
- ExternalSymbols.insert({*Sym.getName(), &Sym});
+ ExternalSymbols.insert(
+ {orc::NonOwningSymbolStringPtr(Sym.getName()), &Sym});
}
/// Make the given symbol an absolute with the given address (must not already
@@ -1482,10 +1485,11 @@ class LinkGraph {
void makeAbsolute(Symbol &Sym, orc::ExecutorAddr Address) {
assert(!Sym.isAbsolute() && "Symbol is already absolute");
if (Sym.isExternal()) {
- assert(ExternalSymbols.contains(*Sym.getName()) &&
+ assert(ExternalSymbols.contains(
+ orc::NonOwningSymbolStringPtr(Sym.getName())) &&
"Sym is not in the absolute symbols set");
assert(Sym.getOffset() == 0 && "External is not at offset 0");
- ExternalSymbols.erase(*Sym.getName());
+ ExternalSymbols.erase(orc::NonOwningSymbolStringPtr(Sym.getName()));
auto &A = Sym.getAddressable();
A.setAbsolute(true);
A.setAddress(Address);
@@ -1510,9 +1514,10 @@ class LinkGraph {
"Symbol is not in the absolutes set");
AbsoluteSymbols.erase(&Sym);
} else {
- assert(ExternalSymbols.contains(*Sym.getName()) &&
+ assert(ExternalSymbols.contains(
+ orc::NonOwningSymbolStringPtr(Sym.getName())) &&
"Symbol is not in the externals set");
- ExternalSymbols.erase(*Sym.getName());
+ ExternalSymbols.erase(orc::NonOwningSymbolStringPtr(Sym.getName()));
}
Addressable &OldBase = *Sym.Base;
Sym.setBlock(Content);
@@ -1597,9 +1602,10 @@ class LinkGraph {
void removeExternalSymbol(Symbol &Sym) {
assert(!Sym.isDefined() && !Sym.isAbsolute() &&
"Sym is not an external symbol");
- assert(ExternalSymbols.contains(*Sym.getName()) &&
+ assert(ExternalSymbols.contains(
+ orc::NonOwningSymbolStringPtr(Sym.getName())) &&
"Symbol is not in the externals set");
- ExternalSymbols.erase(*Sym.getName());
+ ExternalSymbols.erase(orc::NonOwningSymbolStringPtr(Sym.getName()));
Addressable &Base = *Sym.Base;
assert(llvm::none_of(external_symbols(),
[&](Symbol *AS) { return AS->Base == &Base; }) &&
@@ -1675,7 +1681,6 @@ class LinkGraph {
SubtargetFeatures Features;
GetEdgeKindNameFunction GetEdgeKindName = nullptr;
DenseMap<StringRef, std::unique_ptr<Section>> Sections;
- // FIXME(jared): these should become dense maps
ExternalSymbolMap ExternalSymbols;
AbsoluteSymbolSet AbsoluteSymbols;
orc::shared::AllocActions AAs;
More information about the llvm-commits
mailing list