[PATCH] D129175: [ORC] Add AutoClaimWeakHiddenSymbols option in RTDyldObjectLinkingLayer.

Sunho Kim via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 6 01:23:30 PDT 2022


sunho created this revision.
sunho added reviewers: lhames, sgraenitz, v.g.vassilev.
Herald added subscribers: StephenFan, hiraditya.
Herald added a project: All.
sunho requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Add AutoClaimWeakHiddenSymbols option in RTDyldObjectLinkingLayer. This option claims responsibility for every weak hidden symbol if it didn't get added to responsibility set before in IRLayer/ObjectLayer step. In ppc linux, DW.ref symbols is emitted as weak hidden symbols in the later stage of MC pipeline. This means when using IRLayer (i.e. LLJIT), IRLayer will not claim responsibility for such symbols and RuntimeDyld will skip defining this symbol even though it couldn't resolve corresponding external symbol. Existing AutoClaimResponsibility option will not work too because the symbol is hidden and it will not be added to Resolved symbol set. Hence, the motivation for this option.

This allows to fix "JIT session error: Symbols not found: [ DW.ref.__gxx_personality_v0 ] error" which happens when trying to use exceptions in ppc linux.


https://reviews.llvm.org/D129175

Files:
  llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h
  llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp


Index: llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
===================================================================
--- llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
+++ llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
@@ -108,6 +108,7 @@
   // filter these later.
   auto InternalSymbols = std::make_shared<std::set<StringRef>>();
   {
+    SymbolFlagsMap ExtraSymbolsToClaim;
     for (auto &Sym : (*Obj)->symbols()) {
 
       // Skip file symbols.
@@ -128,6 +129,34 @@
         return;
       }
 
+      // Try to claim responsibility of weak hidden symbols
+      // if AutoClaimWeakHiddenSymbols flag is set.
+      if (AutoClaimWeakHiddenSymbols &&
+          (*SymFlagsOrErr & object::BasicSymbolRef::SF_Weak) &&
+          (*SymFlagsOrErr & object::BasicSymbolRef::SF_Hidden)) {
+        auto SymName = Sym.getName();
+        if (!SymName) {
+          ES.reportError(SymName.takeError());
+          R->failMaterialization();
+          return;
+        }
+
+        // Already included in responsibility set, skip it
+        if (R->getSymbols().count(ES.intern(*SymName))) {
+          continue;
+        }
+
+        auto SymFlags = JITSymbolFlags::fromObjectSymbol(Sym);
+        if (!SymFlags) {
+          ES.reportError(SymFlags.takeError());
+          R->failMaterialization();
+          return;
+        }
+
+        ExtraSymbolsToClaim[ES.intern(*SymName)] = *SymFlags;
+        continue;
+      }
+
       // Don't include symbols that aren't global.
       if (!(*SymFlagsOrErr & object::BasicSymbolRef::SF_Global)) {
         if (auto SymName = Sym.getName())
@@ -139,6 +168,13 @@
         }
       }
     }
+
+    if (!ExtraSymbolsToClaim.empty()) {
+      if (auto Err = R->defineMaterializing(ExtraSymbolsToClaim)) {
+        ES.reportError(std::move(Err));
+        R->failMaterialization();
+      }
+    }
   }
 
   auto MemMgr = GetMemoryManager();
Index: llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h
===================================================================
--- llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h
+++ llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h
@@ -118,6 +118,18 @@
     return *this;
   }
 
+  /// If set, this RTDyldObjectLinkingLayer instance will claim responsibility
+  /// for any weak hidden symbols provided by a given object file that were not
+  /// already in the MaterializationResponsibility instance. Setting this flag
+  /// allows to expose certain weak hidden symbols inserted later in the MC
+  /// pipeline. A notalbe example is DW.ref. symbols which are emitted as weak
+  /// hidden in ppc linux enviornment. (i.e. DW.ref.__gxx_personality_v0)
+  RTDyldObjectLinkingLayer &setAutoClaimResponsibilityForWeakHiddenSymbols(
+      bool AutoClaimWeakHiddenSymbols) {
+    this->AutoClaimWeakHiddenSymbols = AutoClaimWeakHiddenSymbols;
+    return *this;
+  }
+
   /// Register a JITEventListener.
   void registerJITEventListener(JITEventListener &L);
 
@@ -150,6 +162,7 @@
   bool ProcessAllSections = false;
   bool OverrideObjectFlags = false;
   bool AutoClaimObjectSymbols = false;
+  bool AutoClaimWeakHiddenSymbols = false;
   DenseMap<ResourceKey, std::vector<MemoryManagerUP>> MemMgrs;
   std::vector<JITEventListener *> EventListeners;
 };


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D129175.442461.patch
Type: text/x-patch
Size: 3320 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220706/a3df5b5b/attachment.bin>


More information about the llvm-commits mailing list