Re: [PATCH dwarves v2] dwarf_loader: Handle DW_AT_location attrs containing DW_OP_plus_uconst

Alan Maguire
2026-01-06T13:55:43Z

On 17/12/2025 04:14, Yonghong Song wrote:
>
>
> On 12/13/25 12:27 AM, Yao Zi wrote:
>> LLVM has a GlobalMerge pass, which tries to group multiple global
>> variables together and address them with through a single register with
>> offsets coded in instructions, to reduce register pressure. Address of
>> symbols transformed by the pass may be represented by an DWARF
>> expression consisting of DW_OP_addrx and DW_OP_plus_uconst, which
>> naturally matches the way a merged variable is addressed.
>>
>> However, our dwarf_loader currently ignores anything but the first in
>> the location expression, including the DW_OP_plus_uconst atom, which
>> appears the second operation in this case. This could result in broken
>> BTF information produced by pahole, where several merged symbols are
>> given the same offset, even though in fact they don't overlap.
>>
>> LLVM has enabled MergeGlobal pass for PowerPC[1] and RISC-V[2] by
>> default since version 20, let's handle DW_OP_plus_uconst operations in
>> DW_AT_location attributes correctly to ensure correct BTF could be
>> produced for LLVM-built kernels.
>>
>> Fixes: a6ea527aab91 ("variable: Add ->addr member")
>> Reported-by: q66 <me@q66.moe>
>> Closes: https://github.com/ClangBuiltLinux/linux/issues/2089
>> Link: https://github.com/llvm/llvm-project/commit/aaa37d6755e6 # [1]
>> Link: https://github.com/llvm/llvm-project/commit/9d02264b03ea # [2]
>> Signed-off-by: Yao Zi <me@ziyao.cc>
>
> Acked-by: Yonghong Song <yonghong.song@linux.dev>
>

Tested using dwarves CI [1]; change looks good, applied. Thanks!

Alan

[1] https://github.com/alan-maguire/dwarves/actions/runs/20747914338