summaryrefslogtreecommitdiff
path: root/llvm/lib/ExecutionEngine/JITLink/CompactUnwindSupport.cpp
AgeCommit message (Collapse)Author
2025-02-05Re-reapply "[ORC] Enable JIT support for the compact-unwind..." with fixes.Lang Hames
Re-enables compact-unwind support in JITLink, which was reverted in b04847b427d due to buildbot failures. The underlying cause for the failures on the buildbots was the lack of compact-unwind registration support on older Darwin OSes. Since the CompactUnwindManager pass now removes eh-frames by default we were left with unwind-info that could not be registered. On x86-64, where eh-frame info is produced by default the solution is to fall back to using eh-frames. On arm64 we simply can't support exceptions on older OSes. This patch updates the EHFrameRegistrationPlugin to remove the compact-unwind section (__LD,__compact_unwind) when installed, forcing use of eh-frames when the EHFrameRegistrationPlugin is used. In LLJIT, the EHFrameRegistrationPlugin continues to be used for all non-Darwin platform, and will be added on Darwin platforms when the a CompactUnwindRegistrationPlugin instance can't be created (e.g. due to missing support for compact-unwind info registration). The lit.cfg.py script is updated to check whether the host OSes default unwind info supports JIT registration, allowing tests to be disabled for older Darwin OSes on arm64.
2025-01-30Revert "Reapply "[ORC] Enable JIT support for the compact-unwind frame..." ↵Ben Langmuir
with fixes." (#125098) This reverts commit d6524c8dfa37634257050ca71d16e117b802181c. This reverts commit b1bd73700a1fb6f450e0f6f9c405a9c8bde2cae7. This was causing bot failures on Darwin https://green.lab.llvm.org/job/llvm.org/job/clang-stage1-cmake-RA-incremental/7315/ Clang.Interpreter.simple-exception.cpp Clang-Unit.Interpreter/ExceptionTests/_/ClangReplInterpreterExceptionTests/0.1 LLVM.ExecutionEngine/OrcLazy.minimal-throw-catch.ll https://green.lab.llvm.org/job/llvm.org/job/clang-stage1-RA/3415/ ORC-x86_64-darwin.TestCases/Darwin/Generic.exceptions.cpp ORC-x86_64-darwin.TestCases/Darwin/x86-64.lljit-ehframe.cpp
2025-01-30[ORC] Add missing files from d6524c8dfa3.Lang Hames
2025-01-24Revert "[ORC] Enable JIT support for the compact-unwind frame info format..."Lang Hames
This reverts 4f0325873faccfbe171bae4babceb65975ca892e and follow-up patches (see below) while I investigate some ongoing failures on the buildbots. --- Revert "[clang-repl] Try to XFAIL testcase on arm32 without affecting arm64 darwin." This reverts commit fd174f0ff3e793fe96a6663b1488ed159cfe042f. Revert "[clang-repl] The simple-exception test now passes on arm64-darwin." This reverts commit c9bc242e387f4a4a3dfcd86561f3ec0ca8a72d62. Revert "[ORC] Destroy defunct MaterializationUnits outside the session lock." This reverts commit a001cc0e6cdcfa672b8aff9ce6d14782bb96356a. Revert "[ORC] Add explicit narrowing casts to fix build errors." This reverts commit 26fc07d5d88760ad659599184fd10181287d2d9e. Revert "[ORC] Enable JIT support for the compact-unwind frame info format on Darwin." This reverts commit 4f0325873faccfbe171bae4babceb65975ca892e.
2025-01-23[ORC] Enable JIT support for the compact-unwind frame info format on Darwin.Lang Hames
For Darwin/arm64 (including Apple Silicon Macs) this will enable exception handling and stack unwinding in JIT'd code. Darwin supports two unwind-info formats: DWARF eh-frames and compact-unwind. On Darwin/x86-64 compilers usually produce both by default, and ORC supported exceptions and unwinding via eh-frames (same as on Linux), discarding the redundant compact-unwind info. On Darwin/arm64 compilers typically default to producing compact-unwind only, with DWARF eh-frames as a fallback for functions that can't be described in compact-unwind. Since ORC did not previously support the compact-unwind format and eh-frames were not present ORC was unable to handle exceptions or unwinding by default in Darwin/arm64 JIT'd code. This patch enables support for the compact-unwind-info format, and contains three major moving parts: (1) The JITLink CompactUnwindManager class is responsible for transforming the __compact_unwind records produced by the linker into the __unwind_info tables that libunwind parses during unwinding. To enable this the CompactUnwindManager class provides three JITLink passes: The prepareForPrune pass that splits the __compact_unwind section into single-record blocks, allowing unused records to be dead-stripped; the processAndReserveUnwindInfo pass that reserves space for the final __unwind_info section, and the writeUnwindInfo pass that writes the __unwind_info section. (2) The OrcTargetProcess UnwindInfoManager class maintains a table of registered JIT'd __unwind_info and __eh_frame sections, and handles requests from libunwind for unwind info sections (by registering a callback with libunwind's __unw_add_find_dynamic_unwind_sections function). (3) The Orc UnwindInfoRegistrationPlugin, which scans LinkGraphs for __unwind_info and __eh_frame sections to register with the UnwindInfoManager. This commit adds the CompactUnwindManager passes to the default JITLink pipelines for Darwin/arm64 and Darwin/x86-64, and UnwindInfoManager intances to the SelfExecutorProcessControl class (when built for apple platforms) and the llvm-jitlink-executor tool. The LLJIT class will now create an UnwindInfoRegistrationPlugin when targeting a process running on Darwin if it detects that an UnwindInfoManager is available to handle the registrations. The ORC runtime macho_platform class already supported libunwind callbacks, so out-of-process execution and unwinding support will work when loading the ORC runtime. The llvm-jitlink tool will only support compact-unwind when the orc-runtime is loaded, as the UnwindInfoRegistrationPlugin requires access to an IR compiler to load a helper module and llvm-jitlink does not provide an IR compiler.