This is the mail archive of the gdb-prs@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

breakpoints/937: Problem with optional function's parameters (Fortran)


>Number:         937
>Category:       breakpoints
>Synopsis:       Problem with optional function's parameters (Fortran)
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    unassigned
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Jan 16 03:28:01 PST 2003
>Closed-Date:
>Last-Modified:
>Originator:     sana@stl.sarov.ru
>Release:        unknown-1.0
>Organization:
>Environment:
32-bit && 64-bit Linux
>Description:
Fortran allows to use an optional parameters.

It is fragment of debug information dump, which is generated by Intel compiler for function all_optional1:

 <1><113>: Abbrev Number: 3 (DW_TAG_subprogram)
     DW_AT_decl_line   : 37     
     DW_AT_decl_column : 0      
     DW_AT_decl_file   : 1      
     DW_AT_sibling     : <1db>  
     DW_AT_accessibility: 1     (public)
     DW_AT_name        : all_optional1  
     DW_AT_type        : <6b>   
     DW_AT_prototyped  : 0      
     DW_AT_high_pc     : 0x80493ca 134517706    
     DW_AT_low_pc      : 0x8049316 134517526    
     DW_AT_external    : 1      
 <2><138>: Abbrev Number: 8 (DW_TAG_formal_parameter)
     DW_AT_decl_line   : 49     
     DW_AT_decl_column : 0      
     DW_AT_decl_file   : 1      
     DW_AT_type        : <f8>   
     DW_AT_is_optional : 1      
     DW_AT_variable_parameter: 1        
     DW_AT_name        : ipar   
     DW_AT_location    : 3 byte block: 75 8 6   (
                         DW_OP_breg5: 8
                         DW_OP_deref)
 <2><14b>: Abbrev Number: 8 (DW_TAG_formal_parameter)
     DW_AT_decl_line   : 49     
     DW_AT_decl_column : 0      
     DW_AT_decl_file   : 1      
     DW_AT_type        : <ed>   
     DW_AT_is_optional : 1      
     DW_AT_variable_parameter: 1        
     DW_AT_name        : rpar   
     DW_AT_location    : 3 byte block: 75 c 6   (
                         DW_OP_breg5: 12
                         DW_OP_deref)
 <2><15e>: Abbrev Number: 8 (DW_TAG_formal_parameter)
     DW_AT_decl_line   : 49     
     DW_AT_decl_column : 0      
     DW_AT_decl_file   : 1      
     DW_AT_type        : <df>   
     DW_AT_is_optional : 1      
     DW_AT_variable_parameter: 1        
     DW_AT_name        : lpar   
     DW_AT_location    : 3 byte block: 75 10 6  (
                         DW_OP_breg5: 16
                         DW_OP_deref)
 <2><171>: Abbrev Number: 8 (DW_TAG_formal_parameter)
     DW_AT_decl_line   : 49     
     DW_AT_decl_column : 0      
     DW_AT_decl_file   : 1      
     DW_AT_type        : <1db>  
     DW_AT_is_optional : 1      
     DW_AT_variable_parameter: 1        
     DW_AT_name        : arr_par        
     DW_AT_location    : 3 byte block: 75 44 6  (
                         DW_OP_breg5: -60
                         DW_OP_deref)

When parameters are passed really debugger shows them correct.
When some parameters are absent debugger's output is:

This GDB was configured as "i386-redhat-linux"...
(gdb) b all_optional1
Breakpoint 1 at 0x8049368: file attr_04.f, line 44.
(gdb) r
Starting program: /home1/sana/trackers/GDB/tr23206/attr_04.exe 

Breakpoint 1, all_optional1 (ipar=1, rpar=2, lpar=.FALSE., arr_par=())
    at attr_04.f:44
44              l_ipar = present(ipar)
Current language:  auto; currently fortran
(gdb) c
Continuing.

Breakpoint 1, all_optional1 (ipar=Cannot access memory at address 0xffffffff
) at attr_04.f:44
44              l_ipar = present(ipar)
(gdb) c
Continuing.

Breakpoint 1, all_optional1 (ipar=1, rpar=Cannot access memory at address 0xffffffff
) at attr_04.f:44
44              l_ipar = present(ipar)
(gdb) c
Continuing.

Breakpoint 1, all_optional1 (ipar=1, rpar=Cannot access memory at address 0xffffffff
) at attr_04.f:44
44              l_ipar = present(ipar)
(gdb)  

It does not look like nice and correct.
>How-To-Repeat:
Regression test is:

      program attribute_optional
        implicit logical (l)
        integer arr(1,3)
        data arr/3*5/
        interface
           subroutine all_optional1 (ipar, rpar, lpar, arr_par)
           integer,optional::ipar
           real,optional::rpar
           logical,optional::lpar
           integer,optional::arr_par(1,3)
           end subroutine

           subroutine all_optional2 (ipar, rpar, lpar, arr_par)
           integer,optional::ipar
           real,optional::rpar
           logical,optional::lpar
           integer,optional::arr_par(1,3)
           end subroutine
        end interface
        
        i = 1
        r = 2.0
        l = .false.
        call all_optional1(i,r,l,arr)
        call all_optional1()
        call all_optional1(i, arr_par=arr)
        call all_optional1(lpar=l, ipar=i)

        call all_optional2(i,r,l,arr)
        call all_optional2()
        call all_optional2(i, arr_par=arr)
        call all_optional2(lpar=l, ipar=i)

        end

        subroutine all_optional1 (ipar, rpar, lpar, arr_par)
        implicit logical (l)
        integer,optional::ipar
        real,optional::rpar
        logical,optional::lpar
        integer,optional::arr_par(1,3)
        
        l_ipar = present(ipar)
        l_rpar = present(rpar)
        l_lpar = present(lpar)
       l_ipar = present(ipar)
        l_rpar = present(rpar)
        l_lpar = present(lpar)
        l_arr_par = present(arr_par)

        end

        subroutine all_optional2 (ipar, rpar, lpar, arr_par)
        implicit logical (l)
        integer ipar
        real rpar
        logical lpar
        integer arr_par(1,3)
        optional::ipar,rpar,arr_par
        optional::lpar

        l_ipar = present(ipar)
        l_rpar = present(rpar)
        l_lpar = present(lpar)
        l_arr_par = present(arr_par)
        
        end
       
Intel compiler should be used fo rreproducing of situation.
G77 does not support this feature at all.

Command line is 'ifc -g attr_04.f'
>Fix:

>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: text/plain; name="attr_04.f"
Content-Disposition: inline; filename="attr_04.f"

	program attribute_optional
        implicit logical (l)
        integer arr(1,3)
	data arr/3*5/
        interface
	   subroutine all_optional1 (ipar, rpar, lpar, arr_par)
           integer,optional::ipar
           real,optional::rpar
           logical,optional::lpar
           integer,optional::arr_par(1,3)
	   end subroutine

	   subroutine all_optional2 (ipar, rpar, lpar, arr_par)
           integer,optional::ipar
           real,optional::rpar
           logical,optional::lpar
           integer,optional::arr_par(1,3)
	   end subroutine
	end interface
	
	i = 1
	r = 2.0
	l = .false.

        call all_optional1(i,r,l,arr)
        call all_optional1()
        call all_optional1(i, arr_par=arr)
        call all_optional1(lpar=l, ipar=i)

        call all_optional2(i,r,l,arr)
        call all_optional2()
        call all_optional2(i, arr_par=arr)
        call all_optional2(lpar=l, ipar=i)

	end

	subroutine all_optional1 (ipar, rpar, lpar, arr_par)
        implicit logical (l)
        integer,optional::ipar
        real,optional::rpar
        logical,optional::lpar
        integer,optional::arr_par(1,3)
	
	l_ipar = present(ipar)
	l_rpar = present(rpar)
	l_lpar = present(lpar)
	l_arr_par = present(arr_par)

	end

	subroutine all_optional2 (ipar, rpar, lpar, arr_par)
        implicit logical (l)
        integer ipar
        real rpar
        logical lpar
        integer arr_par(1,3)
        optional::ipar,rpar,arr_par
	optional::lpar

	l_ipar = present(ipar)
	l_rpar = present(rpar)
	l_lpar = present(lpar)
	l_arr_par = present(arr_par)
	
	end
	


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]