[llvm] 02095f2 - [ORC] Pad section start to account for alignment offset in MachO GDB JIT plugin.
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 6 19:28:38 PST 2021
Author: Lang Hames
Date: 2021-12-07T14:28:31+11:00
New Revision: 02095f2dd7d96768432af8a53e2d743e881e7447
URL: https://github.com/llvm/llvm-project/commit/02095f2dd7d96768432af8a53e2d743e881e7447
DIFF: https://github.com/llvm/llvm-project/commit/02095f2dd7d96768432af8a53e2d743e881e7447.diff
LOG: [ORC] Pad section start to account for alignment offset in MachO GDB JIT plugin.
In order to present a well-formed MachO debug object for debugger registration
the first block in each section must have a zero alignment offset (since there
is no way to represent a non-zero offset in a MachO section load command). This
patch updates the MachODebugObjectSynthesizer class to introduce a padding
padding block at the start of the section if necessary to guarantee a zero
alignment offset.
Added:
llvm/test/ExecutionEngine/JITLink/X86/Inputs/MachO_strong_def_extra.s
llvm/test/ExecutionEngine/JITLink/X86/MachO_gdb_jit_nonzero_alignment_offsets.s
Modified:
llvm/lib/ExecutionEngine/Orc/DebuggerSupportPlugin.cpp
Removed:
################################################################################
diff --git a/llvm/lib/ExecutionEngine/Orc/DebuggerSupportPlugin.cpp b/llvm/lib/ExecutionEngine/Orc/DebuggerSupportPlugin.cpp
index 8479495623b8..fe62138c790c 100644
--- a/llvm/lib/ExecutionEngine/Orc/DebuggerSupportPlugin.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/DebuggerSupportPlugin.cpp
@@ -154,8 +154,24 @@ class MachODebugObjectSynthesizer : public MachODebugObjectSynthesizerBase {
}
DebugSecInfos.push_back({&Sec, Sec.getName().substr(0, SepPos),
Sec.getName().substr(SepPos + 1), 0, 0});
- } else
+ } else {
NonDebugSections.push_back(&Sec);
+
+ // If the first block in the section has a non-zero alignment offset
+ // then we need to add a padding block, since the section command in
+ // the header doesn't allow for aligment offsets.
+ SectionRange R(Sec);
+ if (!R.empty()) {
+ auto &FB = *R.getFirstBlock();
+ if (FB.getAlignmentOffset() != 0) {
+ auto Padding = G.allocateBuffer(FB.getAlignmentOffset());
+ memset(Padding.data(), 0, Padding.size());
+ G.createContentBlock(Sec, Padding,
+ FB.getAddress() - FB.getAlignmentOffset(),
+ FB.getAlignment(), 0);
+ }
+ }
+ }
}
// Create container block.
diff --git a/llvm/test/ExecutionEngine/JITLink/X86/Inputs/MachO_strong_def_extra.s b/llvm/test/ExecutionEngine/JITLink/X86/Inputs/MachO_strong_def_extra.s
new file mode 100644
index 000000000000..15785ed0f69c
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/X86/Inputs/MachO_strong_def_extra.s
@@ -0,0 +1,11 @@
+# Supplies a strong definition of WeakDef.
+
+ .section __TEXT,__text,regular,pure_instructions
+ .build_version macos, 10, 14 sdk_version 10, 14
+ .section __DATA,__data
+ .globl WeakDef
+ .p2align 2
+WeakDef:
+ .long 3
+
+.subsections_via_symbols
diff --git a/llvm/test/ExecutionEngine/JITLink/X86/MachO_gdb_jit_nonzero_alignment_offsets.s b/llvm/test/ExecutionEngine/JITLink/X86/MachO_gdb_jit_nonzero_alignment_offsets.s
new file mode 100644
index 000000000000..e8618e0868bb
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/X86/MachO_gdb_jit_nonzero_alignment_offsets.s
@@ -0,0 +1,38 @@
+# REQUIRES: system-darwin && asserts
+# RUN: rm -rf %t && mkdir -p %t
+# RUN: llvm-mc -triple x86_64-apple-macosx10.9 -filetype=obj \
+# RUN: -o %t/MachO_strong_def_extra.o %S/Inputs/MachO_strong_def_extra.s
+# RUN: llvm-mc -triple x86_64-apple-macosx10.9 -filetype=obj \
+# RUN: -o %t/MachO_gdb_jit_nonzero_alignment_offsets.o %s
+# RUN: llvm-jitlink -noexec -debugger-support \
+# RUN: %t/MachO_gdb_jit_nonzero_alignment_offsets.o \
+# RUN: %t/MachO_strong_def_extra.o
+#
+# Check that blocks with non-zero alignment offsets don't break debugging
+# support.
+#
+# In this test case the WeakDef symbol below will be overridden by a strong def
+# in MachO_strong_defs_extra.s. This will leave main (with alignment 16,
+# alignment offset 4) as the only block in __TEXT,__text. The testcase ensures
+# that the debugging support plugin doesn't crash or throw an error in this
+# case.
+
+ .section __TEXT,__text,regular,pure_instructions
+ .p2align 4, 0x90
+
+ .globl WeakDef
+ .weak_definition WeakDef
+ .p2align 2
+WeakDef:
+ .long 42
+
+ .globl _main
+_main:
+ xorq %rax, %rax
+ retq
+
+ .section __DWARF,__debug_str,regular,debug
+Linfo_string:
+ .asciz "test dwarf string"
+
+.subsections_via_symbols
More information about the llvm-commits
mailing list