Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 04 Aug 2017 12:46:18 +0200
From:      Andreas Longwitz <longwitz@incore.de>
To:        Mark Johnston <markj@FreeBSD.org>
Cc:        "freebsd-dtrace@freebsd.org" <freebsd-dtrace@freebsd.org>
Subject:   Re: g_journal_read has broken argument list in V10
Message-ID:  <5984507A.3090104@incore.de>
In-Reply-To: <20170803171011.GB4968@wkstn-mjohnston.west.isilon.com>
References:  <596F2CDA.1000705@incore.de> <598343D8.8060101@incore.de> <20170803171011.GB4968@wkstn-mjohnston.west.isilon.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5984507A.3090104>