[PATCH v13 0/1] Implement Structured Exception Handling (SEH) on AArch64

Evgeny Karpov <[email protected]>
Newsgroups gmane.comp.gnu.binutils
Message-ID <[email protected]>
Hello,

Thank you for reviewing v12!
v13 removes redundant logic and structures.

Changes in v13:
- Remove code_words checks.
- Remove redundant structures.
- Remove single epilogue.

Changes in v12 2026-07-16:
- Remove prologue_size.
- Fix a typo.
- Add gas_assert for seh_function_size.
- Move is_fragmented_function slightly below.
- Fix endianness issue.
- Remove redundant logic. 
https://sourceware.org/pipermail/binutils/2026-July/150254.html


Changes in v11 2026-07-06:
- Apply different renaming.
- Fix typos.
- Support big endian host.
- Fix phantom prologue encoding.
- Inline some conditions.
- Add seh_aarch64_context::has_exception_data.
- Remove seh_aarch64_xdata_header.
- Update tests.
https://sourceware.org/pipermail/binutils/2026-July/150023.html


Changes in v10 2026-06-26:
- Fix the indentations.
- Extend the description with limitations for the current implementation.
- Reorder aarch64_unwind_info.
- Use reg_pair to validate the correct register range.
- Rename offset_shift/reg_shift to offset_multiplier/reg_multiplier.
- Move some code to seh_aarch64_emit_xdata_record.
- Fix a typo for .seh_set_fp in the test's comment.
- Update the error message for offset.
https://sourceware.org/pipermail/binutils/2026-June/149827.html

Changes in v9 2026-06-17:
- Align backslashes only with tabs.
- Replace links with text that can help find proper resources.
- Replace binary literals with hex.
- Correct whitespace.
https://sourceware.org/pipermail/binutils/2026-June/149662.html

Changes in v8 2026-06-15:
- Refactor and simplify some conditions.
- Move .xdata record writing to a separate
  function (seh_aarch64_emit_xdata_record).
- Add documentation link to obj-coff-seh-aarch64.h.
- Add a minor change to the patch description.
- Use only prologue/epilogue.
- Add SEH tests.
- Use unsigned char instead of unsigned for aarch64_unwind_info.
- Rename offset/reg_offset to offset_addend/reg_addend.
- Remove shift direction from the names.
- Correct typos and comments locations.
- Add more comments and extend some of them.
- Reorder aarch64_unwind_code_data declarations.
- Remove AARCH64_UNOP_* and use code inside the declaration.
- Remove members that are NULL or 0.
- Rename unwind_code_pack_info to info.
- Rename aarch64_element to element and move 4 lines to the end of the function.
- Add validations for offset and reg.
- Drop the condition for code_bits.
- Inline some constants to the conditions.
- Check the register name for SEH directives.
- Modify style by changing line wrapping.
- Optimize some calculations.
- Remove some comments to avoid confusion.
- Add clarification for missing implementation.
- Move seh_aarch64_write_data under OBJ_COFF scope.
- Support .seh_code to simplify porting from x86_64.
https://sourceware.org/pipermail/binutils/2026-June/149639.html

Changes in v7 2026-03-19:
- Rename sort_x64_pdata to sort_pdata.
- Move obj_coff_seh_do_final implementation to a separate function.
- Merge patch 3/4 with 4/4.
https://sourceware.org/pipermail/binutils/2026-March/148657.html

Changes in v6 2026-03-11:
- Revert changes in frag_offset_ignore_align_p.
- Relax the code segment to be able to calculate the function sizes.
- Add seh_function_size that implements the calculation of the function size
  and replace frag_offset_ignore_align_p call with this implementation.
https://sourceware.org/pipermail/binutils/2026-March/148488.html

Changes in v5 2026-02-24:
- In many places int, uint32_t and int32_t have been replaced to unsigned.
- Refactor and move SEH aarch64 implementation to separate files.
- Replace uintptr_t with bfd_vma.
- Update comments.
- Add dedicated initializers.
- Move some variables inside loops.
- Fix the definition for packing some unwinding codes.
- Add description to seh commands.
- Rename prolog_instruction_count to prolog_insn_count.
- Relocate variable initilization closer to place of use.
- Add unwind_ prefix to unwind type enumerator.
https://sourceware.org/pipermail/binutils/2026-February/148332.html

Changes in v3(v4) 2025-08-14:
- Make the AArch64 implementation fully static.
- Fix ARM64_MAX_UNWIND_CODES and introduce AARCH64_MAX_UNWIND_CODES_SIZE.
- Add validation for the epilogue_scope array.
- Add an upper bound for the register number.
- Exclude changes in md_do_align.
- Refactor the AArch64 SEH implementation to emit .pdata/.xdata records at
  the end of assembly.
- Declare md_finish for AArch64 to trigger obj_coff_generate_pdata.
- Support different fragment ordering in frag_offset_ignore_align_p
- Change signed to unsigned.
- Replace Arm64 / arm64 with AArch64 / aarch64.
- Add references to the official documentation to clarify
  implementation.
- Add static and aarch64_ prefix.
- Rebase onto the current master.
- Fix comments.
- Correct code style and naming.
https://sourceware.org/pipermail/binutils/2025-August/143401.html

Changes in v2 2025-05-09:
- Add guards for different architectures
- Fix code style issues and typos
- Move Arm64-specific code to pdata/xdata functions
- Prefer unsigned int over uint32_t in some places
- Revert memory release to the original implementation
- Refactor long function fragmentation
- Fix the function size calculation issue related to code alignment
https://sourceware.org/pipermail/binutils/2025-May/140961.html

v1 2025-04-09:
This patch series supports the GCC patch series that implements SEH
support for the aarch64-w64-mingw32 target.
https://gcc.gnu.org/pipermail/gcc-patches/2024-November/669003.html
The patch series has been tested by applying internal tests and passing
all Boost library tests that involve exception handling.
https://sourceware.org/pipermail/binutils/2025-April/140495.html

Regards,
Evgeny

Evgeny Karpov (1):
  aarch64: Implement Structured Exception Handling (SEH) on AArch64

 gas/config/obj-coff-seh-aarch64.c             | 868 ++++++++++++++++++
 gas/config/obj-coff-seh-aarch64.h             | 214 +++++
 gas/config/obj-coff-seh-shared.c              |   8 +-
 gas/config/obj-coff.c                         |   4 +
 gas/config/tc-aarch64.c                       |  10 +
 gas/config/tc-aarch64.h                       |   6 +
 gas/testsuite/gas/pe/pe.exp                   |   3 +
 gas/testsuite/gas/pe/seh-aarch64-error.l      | 110 +++
 gas/testsuite/gas/pe/seh-aarch64-error.s      | 128 +++
 gas/testsuite/gas/pe/seh-aarch64-large-func.d |  53 ++
 gas/testsuite/gas/pe/seh-aarch64-large-func.s |  13 +
 gas/testsuite/gas/pe/seh-aarch64.d            |  69 ++
 gas/testsuite/gas/pe/seh-aarch64.s            |  49 +
 gas/write.c                                   |   2 +-
 gas/write.h                                   |   1 +
 15 files changed, 1536 insertions(+), 2 deletions(-)
 create mode 100644 gas/config/obj-coff-seh-aarch64.c
 create mode 100644 gas/config/obj-coff-seh-aarch64.h
 create mode 100644 gas/testsuite/gas/pe/seh-aarch64-error.l
 create mode 100644 gas/testsuite/gas/pe/seh-aarch64-error.s
 create mode 100644 gas/testsuite/gas/pe/seh-aarch64-large-func.d
 create mode 100644 gas/testsuite/gas/pe/seh-aarch64-large-func.s
 create mode 100644 gas/testsuite/gas/pe/seh-aarch64.d
 create mode 100644 gas/testsuite/gas/pe/seh-aarch64.s
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.