Ensure to skip optimized parameter so btf can generate proper true signatures. In the first patch of the patch set, with DW_CC_nocall filtering, 875 functions have signature changed. With a series of improvement, eventually only 17 functions remain and unfortunately these functions cannot be converted to true signatures due to locations. For example, 0x0242f1f7: DW_TAG_subprogram DW_AT_name ("memblock_find_in_range") DW_AT_calling_convention (DW_CC_nocall) DW_AT_type (0x0242decc "phys_addr_t") ... 0x0242f22e: DW_TAG_formal_parameter DW_AT_location (indexed (0x14a) loclist = 0x005595bc: [0xffffffff87a000f9, 0xffffffff87a00178): DW_OP_reg5 RDI [0xffffffff87a00178, 0xffffffff87a001be): DW_OP_reg14 R14 [0xffffffff87a001be, 0xffffffff87a001c7): DW_OP_entry_value(DW_OP_reg5 RDI), DW_OP_stack_value [0xffffffff87a001c7, 0xffffffff87a00214): DW_OP_reg14 R14) DW_AT_name ("start") DW_AT_type (0x0242decc "phys_addr_t") ... 0x0242f239: DW_TAG_formal_parameter DW_AT_location (indexed (0x14b) loclist = 0x005595e6: [0xffffffff87a000f9, 0xffffffff87a00175): DW_OP_reg4 RSI [0xffffffff87a00175, 0xffffffff87a001b8): DW_OP_reg3 RBX [0xffffffff87a001b8, 0xffffffff87a001c7): DW_OP_entry_value(DW_OP_reg4 RSI), DW_OP_stack_value [0xffffffff87a001c7, 0xffffffff87a00214): DW_OP_reg3 RBX) DW_AT_name ("end") DW_AT_type (0x0242decc "phys_addr_t") ... 0x0242f245: DW_TAG_formal_parameter DW_AT_location (indexed (0x14c) loclist = 0x00559610: [0xffffffff87a001e3, 0xffffffff87a001ef): DW_OP_breg4 RSI+0) DW_AT_name ("size") DW_AT_type (0x0242decc "phys_addr_t") ... 0x0242f250: DW_TAG_formal_parameter DW_AT_const_value (4096) DW_AT_name ("align") DW_AT_type (0x0242decc "phys_addr_t") ... The third parameter 'size' is not from RDX. Hence, true signature is not possible for this function. I also did some experiments on arm64. The number of signature-changed funcitons is 863 and finally there are 79 functions cannot be converted to true signatures. Through dwarf comparison of x86_64 vs. arm64, llvm arm64 backend looks like having more relaxation to compute parameter values for those signature-changed functions. Signed-off-by: Yonghong Song --- btf_encoder.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/btf_encoder.c b/btf_encoder.c index aa7cd1c..0cd4124 100644 --- a/btf_encoder.c +++ b/btf_encoder.c @@ -1257,15 +1257,21 @@ static int32_t btf_encoder__save_func(struct btf_encoder *encoder, struct functi struct btf *btf = encoder->btf; struct llvm_annotation *annot; struct parameter *param; - uint8_t param_idx = 0; + uint8_t param_idx = 0, skip_idx = 0; int str_off, err = 0; if (!state) return -ENOMEM; + if (encoder->cu->producer_clang) { + ftype__for_each_parameter(ftype, param) { + if (param->optimized) skip_idx++; + } + } + state->addr = function__addr(fn); state->elf = func; - state->nr_parms = ftype->nr_parms + (ftype->unspec_parms ? 1 : 0); + state->nr_parms = ftype->nr_parms - skip_idx + (ftype->unspec_parms ? 1 : 0); state->ret_type_id = ftype->tag.type == 0 ? 0 : encoder->type_id_off + ftype->tag.type; if (state->nr_parms > 0) { state->parms = zalloc(state->nr_parms * sizeof(*state->parms)); @@ -1303,6 +1309,9 @@ static int32_t btf_encoder__save_func(struct btf_encoder *encoder, struct functi state->nr_parms--; continue; } + if (encoder->cu->producer_clang && param->optimized) + continue; + name = parameter__name(param) ?: ""; str_off = btf__add_str(btf, name); if (str_off < 0) { -- 2.47.3