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

Wu Zhou
2005-11-03T10:16:34Z

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