Re: [PATCH dwarves v4 03/11] dwarf_loader: Handle signatures with dead arguments
Yonghong Song <[email protected]> Sat, 23 May 2026 09:28:38 -0700
| Newsgroups | org.kernel.vger.dwarves,org.kernel.vger.bpf |
|---|---|
| Message-ID | <[email protected]> |
On 3/30/26 3:13 AM, Alan Maguire wrote:
> On 26/03/2026 01:31, Yonghong Song wrote:
>> For llvm dwarf, the dead argument may be in the middle of
>> DW_TAG_subprogram. So we introduce skip_idx in order to
>> match expected registers properly.
>>
>> For example:
>> 0x00042897: DW_TAG_subprogram
>> DW_AT_name ("create_dev")
>> DW_AT_calling_convention (DW_CC_nocall)
>> DW_AT_type (0x0002429a "int")
>> ...
>>
>> 0x000428ab: DW_TAG_formal_parameter
>> DW_AT_name ("name")
>> DW_AT_type (0x000242ed "char *")
>> ...
>>
>> 0x000428b5: DW_TAG_formal_parameter
>> DW_AT_location (indexed (0x3f) loclist = 0x000027f8:
>> [0xffffffff87681370, 0xffffffff8768137a): DW_OP_reg5 RDI
>> [0xffffffff8768137a, 0xffffffff87681392): DW_OP_reg3 RBX
>> [0xffffffff87681392, 0xffffffff876813ae): DW_OP_entry_value(DW_OP_reg5 RDI), DW_OP_stack_value)
>> DW_AT_name ("dev")
>> DW_AT_type (0x00026859 "dev_t")
>> ...
>>
>> With skip_idx, we can identify that the second original argument
>> 'dev' becomes the first one after optimization.
>>
> Is there a way we could unify this a bit better with the existing approach
> where each struct parameter has an idx value associated with it? For gcc
> we compare concrete and abstract indices and if they mismatch we know a
> parameter is skipped and set reordered_parm at the function tag level.
> We could set the idx to -1 or similar for skipped parameters to cover
> the below cases maybe?
>
> Not sure how the skip_idx approach would generalize to multiple optimized
> out parameters; is there a way to handle that?
For this particular case (proper parameter indexes), gcc is better than
clang. For gcc, parameter are reordered to have dead arguments after
non-dead arguments. Compiler did the work here.
But for clang, parameters are still original parameter sequence.
For each parameter, we do not know that any particular parameter
is dead or not, unless we go through the whole parameter__reg().
>
>> The previous patch has the following:
>> 0x0533fd03: DW_TAG_subprogram
>> DW_AT_name ("acpi_irq_penalty_update")
>> DW_AT_calling_convention (DW_CC_nocall)
>> DW_AT_type (0x05334dc7 "int")
>> ...
>>
>> 0x0533fd15: DW_TAG_formal_parameter
>> DW_AT_name ("str")
>> DW_AT_type (0x05335918 "char *")
>> ...
>>
>> 0x0533fd1f: DW_TAG_formal_parameter
>> DW_AT_location (indexed (0x3b) loclist = 0x00eb9d83:
>> [0xffff80008419f2e0, 0xffff80008419f324): DW_OP_reg1 W1
>> [0xffff80008419f324, 0xffff80008419f47c): DW_OP_reg19 W19
>> [0xffff80008419f47c, 0xffff80008419f494): DW_OP_entry_value(DW_OP_reg1 W1), DW_OP_stack_value
>> [0xffff80008419f494, 0xffff80008419f498): DW_OP_reg19 W19)
>> DW_AT_name ("used")
>> DW_AT_type (0x05334dc7 "int")
>> ...
>>
>> It is also handled properly with parameter 'str' will have W0 register.
>>
>> With this patch, I checked x86_64 that the number of invalid true signatures is reduced
>> from 532 to 96. This suggests that majority of optimized functions are caused by
>> dead arguments.
[...]