[PATCH] xtensa: add R_XTENSA_PDIFF_ULEB128 for DWARF uleb128 diffs
Max Filippov
jcmvbkbc@gmail.com
Mon Aug 10 11:19:18 GMT 2026
Hi Alexey,
this patch does not apply to the current matser, what version
of binutils is it against?
It's also not in a plain text format...
On Mon, Aug 3, 2026 at 4:38 AM Alexey Lapshin
<alexey.lapshin@espressif.com> wrote:
>
> DWARF 5 location and range lists encode many same-section symbol
> differences as uleb128. Today the assembler must mark all covered code
> no_transform so linker relaxation cannot change those differences, which
> effectively disables relaxation for nearly every function that has DWARF 5
> debug info.
>
> Emit R_XTENSA_PDIFF_ULEB128 instead: like R_XTENSA_PDIFF32 the difference
> stays in the section contents and the reloc records the subtracted symbol,
> but the assembler pads the uleb128 to a fixed width (minimal encoding plus
> one spare byte) and the linker rewrites the value in place after
> relaxation.
>
> sleb128 and cross-section differences still fall back to no_transform.
> Growth that needs more than the reserved spare byte is reported as a
> relocation overflow.
>
> bfd/
> * bfd-in2.h: Regenerated.
> * elf32-xtensa.c (elf_howto_table): New entry for
> R_XTENSA_PDIFF_ULEB128.
> (elf_xtensa_reloc_type_lookup, elf_xtensa_do_reloc): Handle it.
> (relax_section): Rewrite padded uleb128 differences in place.
> * libbfd.h (bfd_reloc_code_real_names): Add
> BFD_RELOC_XTENSA_PDIFF_ULEB128.
> * reloc.c: Document BFD_RELOC_XTENSA_PDIFF_ULEB128.
>
> binutils/
> * readelf.c (is_none_reloc): Recognize R_XTENSA_PDIFF_ULEB128.
>
> gas/
> * write.c (cvt_frag_to_fill): Pad leb128 frags to the reserved
> size when md_leb128_frag_size grew them.
> (relax_segment): Call md_leb128_frag_size if defined.
> * config/tc-xtensa.h (xtensa_symfield_type): Add
> has_leb128_diff_reloc.
> (md_leb128_frag_size): Define.
> * config/tc-xtensa.c (xtensa_md_finish): Insert uleb128 fixes.
> (xtensa_insert_uleb128_fixes, xtensa_leb128_frag_size): New.
> (xtensa_mark_difference_of_two_symbols): Skip relocated diffs.
> (md_apply_fix): Ignore BFD_RELOC_XTENSA_PDIFF_ULEB128.
> * testsuite/gas/xtensa/pdiff-uleb128.s: New test.
> * testsuite/gas/xtensa/pdiff-uleb128.d: New test.
> * testsuite/gas/xtensa/pdiff-uleb128-norelax.d: New test.
>
> include/
> * elf/xtensa.h (elf_xtensa_reloc_type): Add
> R_XTENSA_PDIFF_ULEB128.
>
> ld/
> * testsuite/ld-xtensa/relax-uleb128.s: New test.
> * testsuite/ld-xtensa/relax-uleb128.d: New test.
> * testsuite/ld-xtensa/relax-uleb128-2.s: New test.
> * testsuite/ld-xtensa/relax-uleb128-2.d: New test.
> * testsuite/ld-xtensa/xtensa.exp: Run them.
> ---
> bfd/bfd-in2.h | 10 +++
> bfd/elf32-xtensa.c | 80 +++++++++++++++++
> bfd/libbfd.h | 1 +
> bfd/reloc.c | 12 +++
> binutils/readelf.c | 3 +-
> gas/config/tc-xtensa.c | 86 ++++++++++++++++++-
> gas/config/tc-xtensa.h | 5 ++
> .../gas/xtensa/pdiff-uleb128-norelax.d | 20 +++++
> gas/testsuite/gas/xtensa/pdiff-uleb128.d | 12 +++
> gas/testsuite/gas/xtensa/pdiff-uleb128.s | 7 ++
> gas/write.c | 20 +++++
> include/elf/xtensa.h | 3 +
> ld/testsuite/ld-xtensa/relax-uleb128-2.d | 12 +++
> ld/testsuite/ld-xtensa/relax-uleb128-2.s | 18 ++++
> ld/testsuite/ld-xtensa/relax-uleb128.d | 11 +++
> ld/testsuite/ld-xtensa/relax-uleb128.s | 16 ++++
> ld/testsuite/ld-xtensa/xtensa.exp | 2 +
> 17 files changed, 314 insertions(+), 4 deletions(-)
> create mode 100644 gas/testsuite/gas/xtensa/pdiff-uleb128-norelax.d
> create mode 100644 gas/testsuite/gas/xtensa/pdiff-uleb128.d
> create mode 100644 gas/testsuite/gas/xtensa/pdiff-uleb128.s
> create mode 100644 ld/testsuite/ld-xtensa/relax-uleb128-2.d
> create mode 100644 ld/testsuite/ld-xtensa/relax-uleb128-2.s
> create mode 100644 ld/testsuite/ld-xtensa/relax-uleb128.d
> create mode 100644 ld/testsuite/ld-xtensa/relax-uleb128.s
--
Thanks.
-- Max
More information about the Binutils
mailing list