Thanks. Now let us say I will not try to add those "changed function
signatures" to dwarf
and actually rely on dwarf locations to somehow recover parameters. I understand
in some cases, it is not easy to recover if dwarf locations are too
complicated and we
might ignore those cases.
I actually want to ask how to identify whether the return type is
changed or not in dwarf.
The following is an example:
$ cat test.c
#include <stdio.h>
unsigned tar(int a);
__attribute__((noinline)) static int foo(int a, int b)
{
return tar(a) + tar(a + 1);
}
__attribute__((noinline)) int bar(int a)
{
foo(a, 1);
return 0;
}
In this particular case, the return value of foo() is actually not used
and the compiler will optimize it away with returning void in llvm.
$ clang -O2 -g -c test.c
$ llvm-dwarfdump test.o
...
0x0000004e: DW_TAG_subprogram
DW_AT_low_pc (0x0000000000000010)
DW_AT_high_pc (0x0000000000000022)
DW_AT_frame_base (DW_OP_reg7 RSP)
DW_AT_call_all_calls (true)
DW_AT_name ("foo")
DW_AT_decl_file ("/home/yhs/tests/sig-change/deadret/test.c")
DW_AT_decl_line (3)
DW_AT_prototyped (true)
DW_AT_calling_convention (DW_CC_nocall)
DW_AT_type (0x00000096 "int")
0x0000005e: DW_TAG_formal_parameter
DW_AT_location (indexed (0x1) loclist = 0x00000022:
[0x0000000000000010, 0x0000000000000018): DW_OP_reg5 RDI
[0x0000000000000018, 0x000000000000001a): DW_OP_reg3 RBX
[0x000000000000001a, 0x0000000000000022):
DW_OP_entry_value(DW_OP_reg5 RDI), DW_OP_stack_value)
DW_AT_name ("a")
DW_AT_decl_file
("/home/yhs/tests/sig-change/deadret/test.c")
DW_AT_decl_line (3)
DW_AT_type (0x00000096 "int")
0x00000067: DW_TAG_formal_parameter
DW_AT_name ("b")
DW_AT_decl_file
("/home/yhs/tests/sig-change/deadret/test.c")
DW_AT_decl_line (3)
DW_AT_type (0x00000096 "int")
...
Assembly code:
0000000000000000 <bar>:
0: 50 pushq %rax
1: e8 0a 00 00 00 callq 0x10 <foo>
6: 31 c0 xorl %eax, %eax
8: 59 popq %rcx
9: c3 retq
a: 66 0f 1f 44 00 00 nopw (%rax,%rax)
0000000000000010 <foo>:
10: 53 pushq %rbx
11: 89 fb movl %edi, %ebx
13: e8 00 00 00 00 callq 0x18 <foo+0x8>
18: ff c3 incl %ebx
1a: 89 df movl %ebx, %edi
1c: 5b popq %rbx
1d: e9 00 00 00 00 jmp 0x22 <foo+0x12>
The compiler knows whether the return type has changed or not.
Unfortunately the information is not available in dwarf.
Any suggestions to add some additional information in dwarf so we can
find whether the return type is changed or not?
--
Dwarf-discuss mailing list
[email protected]
https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss