Re: [PATCH V2] Improve user experience in printing Fortran derived types.

Walfred Tedeschi
2016-05-02T12:35:18Z

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
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