This is the mail archive of the gdb@sourceware.org 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]

Re: The root cause for SEGV in evaluating fortran function call,any solution or suggestion?


On Wed, 2 Nov 2005, Jim Blandy wrote:

> 
> Mark Kettenis <mark.kettenis@xs4all.nl> writes:
> > One could argue that the debug information generated by g77 is wrong,
> > because it doesn't reflect the actual implementation of FUNC_NAME.  Or
> > perhaps GDB symbol reading code causes problems.  Can you post a
> > concrete example of a function call that goes wrong, and add a bit of
> > explanation about the types involved for those of us who are not very
> > familiar with Fortran?
> 
> The types in the debug information should not reflect the extra level
> of indirection; the fact that they're passed by reference is just part
> of the meaning of a Fortran function call.  But the location
> expression should encode the extra level of indirection.
> 
> Probably value_arg_coerce should be a language method.  The C
> promotion rules aren't appropriate for Fortran anyway, and the Fortran
> version could take care of applying value_addr (or something like
> that), and turning the array of actuals into an array of pointers to
> the actuals.

Jim, it seems that you just said out what I am thinking of.  Function 
value_arg_coerce is said to perform the standard coercion that are 
specified for arguments to be passed to C functions (you can see that in 
the comment).  But it is also used for Fortran functions (maybe all 
other function GDB supports). 

What is more, I find that when I pass "res_(b)" to gfortran code in gdb 
command line, it will get the correct result.  All the difference is that 
gfortran handle the parameters as reference to the actuals.  So 
value_arg_coerce will call value_addr to convert args into the address of 
them, so we can get the correct result.

However with gfortran, "print res_(2)" still doesn't get the correct 
result.  But it fail more gracefully, it reports the following error 
message:  
  Attempt to take address of value not located in memory.

Which is well expected with reference to the code in value_arg_coerce.

So I am thinking of a somwhat different value_arg_coerce for Fortran code: 
when the parameter type is a reference (for gfortran) or pointer (for 
g77), we can call something like value_addr to changed the argument into 
its address.

I did some tests today, but no success so far.  Will take some more look 
into this.

Any suggestion, comments on this?  Thanks!

Regards
- Wu Zhou


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