This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH V2] Improve user experience in printing Fortran derived types.
- From: Walfred Tedeschi <walfred dot tedeschi at intel dot com>
- To: Yao Qi <qiyaoltc at gmail dot com>
- Cc: Pedro Alves <palves at redhat dot com>, gdb-patches <gdb-patches at sourceware dot org>
- Date: Mon, 2 May 2016 14:35:02 +0200
- Subject: Re: [PATCH V2] Improve user experience in printing Fortran derived types.
- Authentication-results: sourceware.org; auth=none
- References: <1458296757-6795-1-git-send-email-walfred dot tedeschi at intel dot com> <86a8l8nuqk dot fsf at gmail dot com> <5703ACCF dot 4060903 at intel dot com> <8660vwnsb3 dot fsf at gmail dot com>
Am 4/5/2016 um 2:39 PM schrieb Yao Qi:
Walfred Tedeschi <walfred.tedeschi@intel.com> writes:
Here member functions, or methods of the derived type, are discarded.
OK, so can we have a test case shown that methods of the derived type
are discarded in printing?
Yao,
Given a sample like:
module class_Square
implicit none
private
type, public :: Square
real :: height
contains
procedure :: area => square_area
procedure :: print_area => print_area
end type Square
contains
function square_area(this) result(area)
class(Square), intent(in) :: this
real :: area
area = this%height**2
end function square_area
subroutine print_area(this)
class(Square), intent(in) :: this
real :: area
area = this%area()
print *, ' area = ', area
end subroutine print_area
end module class_Square
program square_Test
use class_Square
implicit none
type(Square) :: aSquare
aSquare = Square(2.1)
call aSquare%print_area
end program square_test
The readelf for the binary is:
<1><2e>: Abbrev Number: 2 (DW_TAG_module)
<2f> DW_AT_decl_line : 1
<30> DW_AT_decl_file : 1
<31> DW_AT_name : (indirect string, offset: 0xd9):
class_square
<2><35>: Abbrev Number: 3 (DW_TAG_subprogram)
<36> DW_AT_decl_line : 11
<37> DW_AT_decl_file : 1
<38> DW_AT_name : (indirect string, offset: 0xe6):
CLASS_SQUARE
<3c> DW_AT_low_pc : 0x402640
<44> DW_AT_high_pc : 0x402646
<4c> DW_AT_external : 1
<2><4d>: Abbrev Number: 4 (DW_TAG_subprogram)
<4e> DW_AT_decl_line : 12
<4f> DW_AT_decl_file : 1
<50> DW_AT_type : <0x126>
<54> DW_AT_name : (indirect string, offset: 0xfb): square_area
<58> DW_AT_low_pc : 0x402646
<60> DW_AT_high_pc : 0x402688
<68> DW_AT_external : 1
<3><69>: Abbrev Number: 5 (DW_TAG_formal_parameter)
<6a> DW_AT_decl_line : 12
<6b> DW_AT_decl_file : 1
<6c> DW_AT_type : <0x12d>
<70> DW_AT_name : (indirect string, offset: 0x124): this
<74> DW_AT_location : 3 byte block: 76 68 6 (DW_OP_breg6
(rbp): -24; DW_OP_deref)
<3><78>: Abbrev Number: 6 (DW_TAG_structure_type)
<79> DW_AT_decl_line : 5
<7a> DW_AT_decl_file : 1
<7b> DW_AT_byte_size : 4
<7c> DW_AT_name : (indirect string, offset: 0xdf): square
<4><80>: Abbrev Number: 7 (DW_TAG_member)
<81> DW_AT_decl_line : 5
<82> DW_AT_decl_file : 1
<83> DW_AT_data_member_location: 2 byte block: 23 0
(DW_OP_plus_uconst: 0)
<86> DW_AT_name : (indirect string, offset: 0x107): height
<8a> DW_AT_type : <0x126>
<4><8e>: Abbrev Number: 7 (DW_TAG_member)
<8f> DW_AT_decl_line : 5
<90> DW_AT_decl_file : 1
<91> DW_AT_data_member_location: 2 byte block: 23 0
(DW_OP_plus_uconst: 0)
<94> DW_AT_name : (indirect string, offset: 0x102): area
<98> DW_AT_type : <0x138>
<4><9c>: Abbrev Number: 7 (DW_TAG_member)
<9d> DW_AT_decl_line : 5
<9e> DW_AT_decl_file : 1
<9f> DW_AT_data_member_location: 2 byte block: 23 0
(DW_OP_plus_uconst: 0)
<a2> DW_AT_name : (indirect string, offset: 0x119): print_area
<a6> DW_AT_type : <0x143>
<4><aa>: Abbrev Number: 0
<3><ab>: Abbrev Number: 8 (DW_TAG_variable)
<ac> DW_AT_decl_line : 12
<ad> DW_AT_decl_file : 1
<ae> DW_AT_name : (indirect string, offset: 0x102): area
<b2> DW_AT_type : <0x126>
<b6> DW_AT_location : 2 byte block: 76 64 (DW_OP_breg6 (rbp):
-28)
<3><b9>: Abbrev Number: 0
<2><ba>: Abbrev Number: 9 (DW_TAG_subprogram)
<bb> DW_AT_decl_line : 18
<bc> DW_AT_decl_file : 1
<bd> DW_AT_name : (indirect string, offset: 0x119): print_area
<c1> DW_AT_low_pc : 0x402688
<c9> DW_AT_high_pc : 0x40274a
<d1> DW_AT_external : 1
<3><d2>: Abbrev Number: 5 (DW_TAG_formal_parameter)
<d3> DW_AT_decl_line : 18
<d4> DW_AT_decl_file : 1
<d5> DW_AT_type : <0x14a>
<d9> DW_AT_name : (indirect string, offset: 0x124): this
<dd> DW_AT_location : 4 byte block: 76 88 7f 6 (DW_OP_breg6
(rbp): -120; DW_OP_deref)
<3><e2>: Abbrev Number: 6 (DW_TAG_structure_type)
<e3> DW_AT_decl_line : 5
<e4> DW_AT_decl_file : 1
<e5> DW_AT_byte_size : 4
<e6> DW_AT_name : (indirect string, offset: 0xdf): square
<4><ea>: Abbrev Number: 7 (DW_TAG_member)
<eb> DW_AT_decl_line : 5
<ec> DW_AT_decl_file : 1
<ed> DW_AT_data_member_location: 2 byte block: 23 0
(DW_OP_plus_uconst: 0)
<f0> DW_AT_name : (indirect string, offset: 0x107): height
<f4> DW_AT_type : <0x126>
<4><f8>: Abbrev Number: 7 (DW_TAG_member)
<f9> DW_AT_decl_line : 5
<fa> DW_AT_decl_file : 1
<fb> DW_AT_data_member_location: 2 byte block: 23 0
(DW_OP_plus_uconst: 0)
<fe> DW_AT_name : (indirect string, offset: 0x102): area
<102> DW_AT_type : <0x155>
<4><106>: Abbrev Number: 7 (DW_TAG_member)
<107> DW_AT_decl_line : 5
<108> DW_AT_decl_file : 1
<109> DW_AT_data_member_location: 2 byte block: 23 0
(DW_OP_plus_uconst: 0)
<10c> DW_AT_name : (indirect string, offset: 0x119):
print_area
<110> DW_AT_type : <0x160>
<4><114>: Abbrev Number: 0
<3><115>: Abbrev Number: 8 (DW_TAG_variable)
<116> DW_AT_decl_line : 20
<117> DW_AT_decl_file : 1
<118> DW_AT_name : (indirect string, offset: 0x102): area
<11c> DW_AT_type : <0x126>
<120> DW_AT_location : 3 byte block: 76 84 7f (DW_OP_breg6
(rbp): -124)
<3><124>: Abbrev Number: 0
<2><125>: Abbrev Number: 0
<1><126>: Abbrev Number: 10 (DW_TAG_base_type)
<127> DW_AT_byte_size : 4
<128> DW_AT_encoding : 4 (float)
<129> DW_AT_name : (indirect string, offset: 0xf3): REAL(4)
<1><12d>: Abbrev Number: 11 (DW_TAG_pointer_type)
<12e> DW_AT_type : <0x78>
<132> DW_AT_associated : 5 byte block: 97 6 10 0 2e
(DW_OP_push_object_address; DW_OP_deref; DW_OP_constu: 0; DW_OP_ne)
<1><138>: Abbrev Number: 12 (DW_TAG_subroutine_type)
<139> DW_AT_decl_line : 8
<13a> DW_AT_decl_file : 1
<13b> DW_AT_name : (indirect string, offset: 0x114): AREA
<13f> DW_AT_type : <0x126>
<1><143>: Abbrev Number: 13 (DW_TAG_subroutine_type)
<144> DW_AT_decl_line : 9
<145> DW_AT_decl_file : 1
<146> DW_AT_name : (indirect string, offset: 0x10e):
PRINT_AREA
<1><14a>: Abbrev Number: 11 (DW_TAG_pointer_type)
<14b> DW_AT_type : <0xe2>
<14f> DW_AT_associated : 5 byte block: 97 6 10 0 2e
(DW_OP_push_object_address; DW_OP_deref; DW_OP_constu: 0; DW_OP_ne)
<1><155>: Abbrev Number: 12 (DW_TAG_subroutine_type)
<156> DW_AT_decl_line : 8
<157> DW_AT_decl_file : 1
<158> DW_AT_name : (indirect string, offset: 0x114): AREA
<15c> DW_AT_type : <0x126>
<1><160>: Abbrev Number: 13 (DW_TAG_subroutine_type)
<161> DW_AT_decl_line : 9
<162> DW_AT_decl_file : 1
<163> DW_AT_name : (indirect string, offset: 0x10e):
PRINT_AREA
<1><167>: Abbrev Number: 14 (DW_TAG_subprogram)
<168> DW_AT_decl_line : 27
<169> DW_AT_decl_file : 1
<16a> DW_AT_name : (indirect string, offset: 0x129):
square_test
<16e> DW_AT_calling_convention: 2 (program)
<16f> DW_AT_low_pc : 0x40274a
<177> DW_AT_high_pc : 0x402842
<17f> DW_AT_external : 1
<2><180>: Abbrev Number: 8 (DW_TAG_variable)
<181> DW_AT_decl_line : 31
<182> DW_AT_decl_file : 1
<183> DW_AT_name : (indirect string, offset: 0x135): asquare
<187> DW_AT_type : <0x195>
<18b> DW_AT_location : 9 byte block: 3 b0 33 6b 0 0 0 0 0
(DW_OP_addr: 6b33b0)
<2><195>: Abbrev Number: 6 (DW_TAG_structure_type)
<196> DW_AT_decl_line : 0
<197> DW_AT_decl_file : 1
<198> DW_AT_byte_size : 4
<199> DW_AT_name : (indirect string, offset: 0xdf): square
<3><19d>: Abbrev Number: 7 (DW_TAG_member)
<19e> DW_AT_decl_line : 0
<19f> DW_AT_decl_file : 1
<1a0> DW_AT_data_member_location: 2 byte block: 23 0
(DW_OP_plus_uconst: 0)
<1a3> DW_AT_name : (indirect string, offset: 0x107): height
<1a7> DW_AT_type : <0x126>
<3><1ab>: Abbrev Number: 7 (DW_TAG_member)
<1ac> DW_AT_decl_line : 0
<1ad> DW_AT_decl_file : 1
<1ae> DW_AT_data_member_location: 2 byte block: 23 0
(DW_OP_plus_uconst: 0)
<1b1> DW_AT_name : (indirect string, offset: 0x102): area
<1b5> DW_AT_type : <0x1c9>
<3><1b9>: Abbrev Number: 7 (DW_TAG_member)
<1ba> DW_AT_decl_line : 0
<1bb> DW_AT_decl_file : 1
<1bc> DW_AT_data_member_location: 2 byte block: 23 0
(DW_OP_plus_uconst: 0)
<1bf> DW_AT_name : (indirect string, offset: 0x119):
print_area
<1c3> DW_AT_type : <0x1d4>
<3><1c7>: Abbrev Number: 0
<2><1c8>: Abbrev Number: 0
<1><1c9>: Abbrev Number: 12 (DW_TAG_subroutine_type)
<1ca> DW_AT_decl_line : 27
<1cb> DW_AT_decl_file : 1
<1cc> DW_AT_name : (indirect string, offset: 0x114): AREA
<1d0> DW_AT_type : <0x126>
<1><1d4>: Abbrev Number: 13 (DW_TAG_subroutine_type)
<1d5> DW_AT_decl_line : 27
<1d6> DW_AT_decl_file : 1
<1d7> DW_AT_name : (indirect string, offset: 0x10e):
PRINT_AREA
<1><1db>: Abbrev Number: 0
You can see that in the declaration in the module and in the declaration
in the program itself there is also the functions as members.
Thus the result of the print of asquare is today:
(gdb) print asquare
$1 = ( 0, {REAL(4) ()} 0x6716253 <square_test_$ASQUARE>, {void ()}
0x6716253 <square_test_$ASQUARE> )
In this sense I suppose you would like to see that as a test added to
the fortran testsuite, right?
With that would it be ok to commit, of course after review of the test? :)
Thanks and regards,
-Fred
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928