g_journal_read has broken argument list in V10
Andreas Longwitz
longwitz at incore.de
Fri Aug 4 10:46:24 UTC 2017
Hello, thanks for answer.
>>
>> The function g_journal_read() is the only one in g_journal.c that shows
>> the described problem. I can not decide, if the object module
>> g_journal.o is broken or if ctfconvert does something wrong.
>
> It's possible that the compiler is reordering arguments. CTF is
> generated from DWARF info, so the way to determine if this is the case
> is to inspect the dwarf tags with dwarfdump or readelf -w and check the
> parameter order there. I don't know why the arguments would be getting
> reordered in this case, but I've seen it happen before, particularly in
> functions that take struct values as parameters. Specifically, on amd64
> such parameters are moved to the end of the list so other parameters may
> be passed in registers.
>
> FWIW, with clang 5.0 on ~CURRENT I get the expected parameter order:
>
> [23] FUNC (g_journal_read) returns: 1 args: (1090, 988, 332, 332)
Yes, dwarfdump shows the problem is in g_journal.o, the list of formal
parameters is reordered by the compiler:
< 1><0x0000cb4f> DW_TAG_subprogram
DW_AT_name g_journal_read
DW_AT_decl_file 0x00000001
/usr/src/sys/geom/journal/g_journal.c
DW_AT_decl_line 0x0000061f
DW_AT_prototyped yes(1)
DW_AT_low_pc 0x00008ad0
DW_AT_high_pc 0x0000915c
DW_AT_frame_base DW_OP_reg6
< 2><0x0000cb6a> DW_TAG_formal_parameter
DW_AT_name sc
DW_AT_decl_file 0x00000001
/usr/src/sys/geom/journal/g_journal.c
DW_AT_decl_line 0x0000061f
DW_AT_type <0x0000949a>
DW_AT_location <loclist at offset
0x00005c35 with 2 entries follows>
[ 0]< offset pair low-off : 0x00008ad0 addr
0x00008ad0 high-off 0x00008b35 addr 0x00008b35>DW_OP_reg5
[ 1]< offset pair low-off : 0x00008b35 addr
0x00008b35 high-off 0x00008b35 addr 0x00008b35>DW_OP_breg6-104
< 2><0x0000cb7a> DW_TAG_formal_parameter
DW_AT_name ostart
DW_AT_decl_file 0x00000001
/usr/src/sys/geom/journal/g_journal.c
DW_AT_decl_line 0x0000061f
DW_AT_type <0x00003b31>
DW_AT_location <loclist at offset
0x00005cb5 with 1 entries follows>
[ 0]< offset pair low-off : 0x00008ad0 addr
0x00008ad0 high-off 0x00008bb8 addr 0x00008bb8>DW_OP_reg14
< 2><0x0000cb8a> DW_TAG_formal_parameter
DW_AT_name oend
DW_AT_decl_file 0x00000001
/usr/src/sys/geom/journal/g_journal.c
DW_AT_decl_line 0x00000620
DW_AT_type <0x00003b31>
DW_AT_location <loclist at offset
0x00005c12 with 1 entries follows>
[ 0]< offset pair low-off : 0x00008ad0 addr
0x00008ad0 high-off 0x00008b35 addr 0x00008b35>DW_OP_reg2
< 2><0x0000cb9a> DW_TAG_formal_parameter
DW_AT_name pbp
DW_AT_decl_file 0x00000001
/usr/src/sys/geom/journal/g_journal.c
DW_AT_decl_line 0x0000061f
DW_AT_type <0x00005de4>
By the way, the following patch solves the problem with the wrong
argument counts in ctfdump:
--- dump.c.1st 2015-07-03 16:39:24.000000000 +0200
+++ dump.c 2017-08-04 10:56:21.563805000 +0200
@@ -364,7 +364,8 @@
(void) printf(" [%lu] FUNC ", id);
if (name != NULL)
(void) printf("(%s) ", name);
- (void) printf("returns: %u args: (", *fp++);
+ (void) printf("returns: %u args: (", n);
+ fp++;
if (n != 0) {
(void) printf("%u", *fp++);
--
Andreas Longwitz
More information about the freebsd-dtrace
mailing list