[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