[llvm] 36f0dfd - [ORC][JITLink] Fix MachO absolute symbol handling, add test case.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 7 20:55:04 PST 2022


Author: Lang Hames
Date: 2022-03-07T20:54:55-08:00
New Revision: 36f0dfd07a77fc801e3b54af66442778a4728868

URL: https://github.com/llvm/llvm-project/commit/36f0dfd07a77fc801e3b54af66442778a4728868
DIFF: https://github.com/llvm/llvm-project/commit/36f0dfd07a77fc801e3b54af66442778a4728868.diff

LOG: [ORC][JITLink] Fix MachO absolute symbol handling, add test case.

This patch removes the unintended resolution of locally scoped absolute symbols
(which was causing unexpected definition errors).

It stops using the JITSymbolFlags::Absolute flag (it isn't set or used elsewhere,
and causes mismatch-flags asserts), and adds JITSymbolFlags::Exported to default
scoped absolute symbols.

Finally, we now set the scope of absolute symbols correctly in
MachOLinkGraphBuilder.

Added: 
    llvm/test/ExecutionEngine/JITLink/X86/Inputs/MachO_global_absolute_def.s
    llvm/test/ExecutionEngine/JITLink/X86/Inputs/MachO_local_absolute_def.s
    llvm/test/ExecutionEngine/JITLink/X86/MachO_absolute_symbols.s

Modified: 
    llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp
    llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp
index 8ab44154d4230..0475117eec39c 100644
--- a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp
@@ -368,7 +368,7 @@ Error MachOLinkGraphBuilder::graphifyRegularSymbols() {
                                         Twine(KV.first));
       NSym.GraphSymbol = &G->addAbsoluteSymbol(
           *NSym.Name, orc::ExecutorAddr(NSym.Value), 0, Linkage::Strong,
-          Scope::Default, NSym.Desc & MachO::N_NO_DEAD_STRIP);
+          getScope(*NSym.Name, NSym.Type), NSym.Desc & MachO::N_NO_DEAD_STRIP);
       break;
     case MachO::N_SECT:
       SecIndexToSymbols[NSym.Sect - 1].push_back(&NSym);

diff  --git a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
index 481f5f61f201b..4461b6c6d3d40 100644
--- a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
@@ -226,12 +226,13 @@ class ObjectLinkingLayerJITLinkContext final : public JITLinkContext {
       }
 
     for (auto *Sym : G.absolute_symbols())
-      if (Sym->hasName()) {
+      if (Sym->hasName() && Sym->getScope() != Scope::Local) {
         auto InternedName = ES.intern(Sym->getName());
         JITSymbolFlags Flags;
-        Flags |= JITSymbolFlags::Absolute;
         if (Sym->isCallable())
           Flags |= JITSymbolFlags::Callable;
+        if (Sym->getScope() == Scope::Default)
+          Flags |= JITSymbolFlags::Exported;
         if (Sym->getLinkage() == Linkage::Weak)
           Flags |= JITSymbolFlags::Weak;
         InternedResult[InternedName] =

diff  --git a/llvm/test/ExecutionEngine/JITLink/X86/Inputs/MachO_global_absolute_def.s b/llvm/test/ExecutionEngine/JITLink/X86/Inputs/MachO_global_absolute_def.s
new file mode 100644
index 0000000000000..3b5612cca2777
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/X86/Inputs/MachO_global_absolute_def.s
@@ -0,0 +1,16 @@
+# Supplies a global definition of an absolute symbol, plus a global symbol
+# containing the absolute symbol's value.
+
+        .section        __TEXT,__text,regular,pure_instructions
+        .build_version macos, 12, 0
+        .section        __DATA,__data
+
+        .globl _AbsoluteSymDef
+_AbsoluteSymDef = 0x01234567
+
+        .globl  _GlobalAbsoluteSymDefValue
+        .p2align        2
+_GlobalAbsoluteSymDefValue:
+        .long _AbsoluteSymDef
+
+.subsections_via_symbols

diff  --git a/llvm/test/ExecutionEngine/JITLink/X86/Inputs/MachO_local_absolute_def.s b/llvm/test/ExecutionEngine/JITLink/X86/Inputs/MachO_local_absolute_def.s
new file mode 100644
index 0000000000000..d2df11845c706
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/X86/Inputs/MachO_local_absolute_def.s
@@ -0,0 +1,15 @@
+# Supplies an internal definition of an absolute symbol, plus a global symbol
+# containing the absolute symbol's value.
+
+        .section        __TEXT,__text,regular,pure_instructions
+        .build_version macos, 12, 0
+        .section        __DATA,__data
+
+_AbsoluteSymDef = 0x89ABCDEF
+
+        .globl  _LocalAbsoluteSymDefValue
+        .p2align        2
+_LocalAbsoluteSymDefValue:
+        .long _AbsoluteSymDef
+
+.subsections_via_symbols

diff  --git a/llvm/test/ExecutionEngine/JITLink/X86/MachO_absolute_symbols.s b/llvm/test/ExecutionEngine/JITLink/X86/MachO_absolute_symbols.s
new file mode 100644
index 0000000000000..edeb790ffe977
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/X86/MachO_absolute_symbols.s
@@ -0,0 +1,33 @@
+# RUN: rm -rf %t && mkdir -p %t
+# RUN: llvm-mc -triple x86_64-apple-macosx10.9 -filetype=obj \
+# RUN:   -o %t/MachO_global_absolute_def.o %S/Inputs/MachO_global_absolute_def.s
+# RUN: llvm-mc -triple x86_64-apple-macosx10.9 -filetype=obj \
+# RUN:   -o %t/MachO_local_absolute_def.o %S/Inputs/MachO_local_absolute_def.s
+# RUN: llvm-mc -triple x86_64-apple-macosx10.9 -filetype=obj \
+# RUN:   -o %t/MachO_absolute_symbols.o %s
+# RUN: llvm-jitlink -noexec -check=%s %t/MachO_absolute_symbols.o \
+# RUN:   %t/MachO_global_absolute_def.o %t/MachO_local_absolute_def.o
+#
+# Check that both global and local absolute defs work as expected (global
+# absolutes visible, local ones not).
+#
+# jitlink-check: *{4}_GlobalAbsoluteSymDefValue = 0x01234567
+# jitlink-check: *{4}_LocalAbsoluteSymDefValue = 0x89ABCDEF
+
+	.section	__TEXT,__text,regular,pure_instructions
+	.build_version macos, 10, 14	sdk_version 10, 14
+	.globl	_main
+	.p2align	4, 0x90
+_main:
+	retq
+
+	.section	__DATA,__data
+# Take the address of GlobalAbsoluteSymDefValue and LocalAbsoluteSymDefValue
+# to force linking of the extra input files.
+	.globl	extra_files_anchor
+	.p2align	3
+extra_files_anchor:
+        .quad   _GlobalAbsoluteSymDefValue
+	.quad	_LocalAbsoluteSymDefValue
+
+.subsections_via_symbols


        


More information about the llvm-commits mailing list