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:
parent
8bdc16587e
commit
d7df654955
@ -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.
|
||||||
|
@ -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);
|
||||||
|
@ -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.
|
||||||
|
@ -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" "" \
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user