gdb/fortran: Handle internal function calls

If an convenience function is defined in python (or guile), then
currently this will not work in Fortran, instead the user is given
this message:

  (gdb) set language fortran
  (gdb) p $myfunc (3)
  Cannot perform substring on this type

Compare this to C:

  (gdb) set language c
  (gdb) p $myfunc (3)
  $1 = 1

After this patch we see the same behaviour in both C and Fortran.
I've extended the test to check that all languages can call the
convenience functions - only Fortran was broken.

When calling convenience functions in Fortran we don't need to perform
the same value preparation (passing by pointer) that we would for
calling a native function - passing the real value is fine.

gdb/ChangeLog:

	* eval.c (evaluate_subexp_standard): Handle internal functions
	during Fortran function call handling.

gdb/testsuite/ChangeLog:

	* gdb.python/py-function.exp: Check calling helper function from
	all languages.
	* lib/gdb.exp (gdb_supported_languages): New proc.
This commit is contained in:
Andrew Burgess 2019-02-14 15:49:39 +00:00
parent 8bdc16587e
commit d7df654955
5 changed files with 34 additions and 5 deletions

View File

@ -1,3 +1,8 @@
2019-04-01 Andrew Burgess <andrew.burgess@embecosm.com>
* eval.c (evaluate_subexp_standard): Handle internal functions
during Fortran function call handling.
2019-04-01 Andrew Burgess <andrew.burgess@embecosm.com> 2019-04-01 Andrew Burgess <andrew.burgess@embecosm.com>
* NEWS: Mention new internal functions. * NEWS: Mention new internal functions.

View File

@ -1979,6 +1979,7 @@ evaluate_subexp_standard (struct type *expect_type,
case TYPE_CODE_PTR: case TYPE_CODE_PTR:
case TYPE_CODE_FUNC: case TYPE_CODE_FUNC:
case TYPE_CODE_INTERNAL_FUNCTION:
/* It's a function call. */ /* It's a function call. */
/* Allocate arg vector, including space for the function to be /* Allocate arg vector, including space for the function to be
called in argvec[0] and a terminating NULL. */ called in argvec[0] and a terminating NULL. */
@ -1996,11 +1997,14 @@ evaluate_subexp_standard (struct type *expect_type,
results in malloc being called with a pointer to an integer results in malloc being called with a pointer to an integer
followed by an attempt to malloc the arguments to malloc in followed by an attempt to malloc the arguments to malloc in
target memory. Infinite recursion ensues. */ target memory. Infinite recursion ensues. */
bool is_artificial = if (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC)
TYPE_FIELD_ARTIFICIAL (value_type (arg1), tem - 1); {
bool is_artificial
= TYPE_FIELD_ARTIFICIAL (value_type (arg1), tem - 1);
argvec[tem] = fortran_argument_convert (argvec[tem], argvec[tem] = fortran_argument_convert (argvec[tem],
is_artificial); is_artificial);
} }
}
argvec[tem] = 0; /* signal end of arglist */ argvec[tem] = 0; /* signal end of arglist */
if (noside == EVAL_SKIP) if (noside == EVAL_SKIP)
return eval_skip_value (exp); return eval_skip_value (exp);

View File

@ -1,3 +1,9 @@
2019-04-01 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb.python/py-function.exp: Check calling helper function from
all languages.
* lib/gdb.exp (gdb_supported_languages): New proc.
2019-04-01 Andrew Burgess <andrew.burgess@embecosm.com> 2019-04-01 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb.base/complex-parts.c: New file. * gdb.base/complex-parts.c: New file.

View File

@ -51,7 +51,13 @@ gdb_py_test_multiple "input value-returning convenience function" \
"Double ()" "" \ "Double ()" "" \
"end" "" "end" ""
gdb_test "print \$double (1)" "= 2" "call value-returning function" # Different languages can have different parsers, so lets check that
# internal functions are understood by every language. Place auto
# last in the list so we end up back in 'auto' language mode.
foreach lang [concat [gdb_supported_languages] auto] {
gdb_test_no_output "set language $lang"
gdb_test "print \$double (1)" "= 2" "call value-returning function, language = $lang"
}
gdb_py_test_multiple "input int-returning function" \ gdb_py_test_multiple "input int-returning function" \
"python" "" \ "python" "" \

View File

@ -6353,5 +6353,13 @@ proc cd { dir } {
builtin_cd $dir builtin_cd $dir
} }
# Return a list of all languages supported by GDB, suitable for use in
# 'set language NAME'. This doesn't include either the 'local' or
# 'auto' keywords.
proc gdb_supported_languages {} {
return [list c objective-c c++ d go fortran modula-2 asm pascal \
opencl rust minimal ada]
}
# Always load compatibility stuff. # Always load compatibility stuff.
load_lib future.exp load_lib future.exp