[PATCH] D114210: [ORC] Fix materialization of weak local symbols

Ben Langmuir via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 18 16:55:26 PST 2021


benlangmuir created this revision.
benlangmuir added a reviewer: lhames.
Herald added a subscriber: hiraditya.
benlangmuir requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

We were adding all defined weak symbols to the materialization
responsibility, but local symbols will not be in the symbol table, so it
failed to materialize due to the "missing" symbol.

Local weak symbols come up in practice when using `ld -r` with a hidden
weak symbol.

rdar://85574696


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D114210

Files:
  llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
  llvm/test/ExecutionEngine/JITLink/X86/MachO_weak_local.s


Index: llvm/test/ExecutionEngine/JITLink/X86/MachO_weak_local.s
===================================================================
--- /dev/null
+++ llvm/test/ExecutionEngine/JITLink/X86/MachO_weak_local.s
@@ -0,0 +1,16 @@
+# RUN: llvm-mc -triple=x86_64-apple-macosx10.9 -filetype=obj -o %t %s
+# RUN: llvm-jitlink -noexec %t -show-graph | FileCheck %s
+
+# CHECK: linkage: weak, scope: local, live  -   _foo_weak
+
+# _foo_weak is weak and local. Make sure we can link it.
+  .section  __TEXT,__text,regular,pure_instructions
+  .weak_definition  _foo_weak
+  .p2align  4, 0x90
+_foo_weak:
+  retq
+
+  .globl  _main
+  .p2align  4, 0x90
+_main:
+  jmp _foo_weak
Index: llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
===================================================================
--- llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
+++ llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
@@ -423,7 +423,8 @@
     std::vector<std::pair<SymbolStringPtr, Symbol *>> NameToSym;
 
     auto ProcessSymbol = [&](Symbol *Sym) {
-      if (Sym->hasName() && Sym->getLinkage() == Linkage::Weak) {
+      if (Sym->hasName() && Sym->getLinkage() == Linkage::Weak &&
+          Sym->getScope() != Scope::Local) {
         auto Name = ES.intern(Sym->getName());
         if (!MR->getSymbols().count(ES.intern(Sym->getName()))) {
           JITSymbolFlags SF = JITSymbolFlags::Weak;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D114210.388355.patch
Type: text/x-patch
Size: 1385 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211119/3f29caa6/attachment.bin>


More information about the llvm-commits mailing list