This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[RFA] Function return type checking
- From: Klee Dienes <kdienes at apple dot com>
- To: gdb-patches at sources dot redhat dot com
- Date: Tue, 5 Feb 2002 01:36:41 -0800
- Subject: [RFA] Function return type checking
(This is basically the same patch I sent last week, just updated
to the latest source base.)
The following patch adds "expected return type" support to the target
function call interface. The "expected return type" is specified
using cast syntax; it is ignored if actual type information for the
function is available. If no type information is provided for a
function, the user is now required to provide an expected return type
using the cast syntax, or get an error.
Some examples:
(gdb) print fabs (3.0) (no type information present)
Unable to call function at 0x%lx: no return type information available.
To call this function anyway, you can cast the return type explicitly
(e.g. 'print (float) fabs (3.0)').
(gdb) print (float) fabs (-3.12) (no type information present)
$1 = 3.11999989
(gdb) print (int) fabs (-3.12) (no type information present)
$2 = 1074329026
(here, the return value of `fabs' has been interpreted as an int
... not cast to one)
(gdb) print (int) fabs (-3.12) (type information present)
$3 = -3
(since type information was available, the return value was
interpreted as a float, then cast to an int).
(gdb) print (struct stat) fabs (-3.12) (no type information present)
Cannot access memory at address 0xf5c28f6
(this causes an error, since the struct return convention is being
misused)
struct s { int i; int j; };
struct s f (void) { struct s ss = { 3, 1 }; return ss; }
(gdb) print f () (no type information present)
Unable to call function at 0x%lx: no return type information available.
To call this function anyway, you can cast the return type explicitly
(e.g. 'print (float) fabs (3.0)').
(gdb) print (struct s) f (3.0) (no type information present)
$4 = {i = 3, j = 1}
(gdb) print (float) f (3.0) (no type information present)
Program received signal SIGSEGV, Segmentation fault.
0x0804841d in f ()
(here we lied to GDB about the return type, causing it to generate
incorrect struct return code).
Compare this to the old behavior:
(gdb) print fabs (3.0) (no type information present)
$1 = 1074266112
(GDB has no type information available, so it assumes 'int').
(gdb) print (float) fabs (-3.12) (no type information present)
$2 = 1.07426611e+09
(GDB still assumes the function returns 'int', then casts the result
to a float).
struct s { int i; int j; };
struct s f (void) { struct s ss = { 3, 1 }; return ss; }
(gdb) print f ()
Program received signal SIGSEGV, Segmentation fault.
0x0804841d in f ()
(here there is no way out ... no matter what we pass in as the return
value to f(), GDB will generate the calling convention for a function
returning int)
The reason I suggest 2) might be controversial is that the old
behavior can be convenient in the general case. A lot of functions
*do* return int, and when debugging programs without symbols, it can
be annoying to have to declare the return type, just to make the rare
case when functions return floats/structs behave correctly. But I'd
argue that it's not *that* big a deal to cast a return value, and
correctness must always take priority.
2002-02-04 Klee Dienes <kdienes@apple.com>
* c-valprint.c (c_val_print): print type with typecode
TYPE_CODE_ERROR
as "<error type>" and not "<unknown type>".
* eval.c (evaluate_subexp_standard): when called with
EVAL_AVOID_SIDE_EFFECTS, return the passed-in `expect_type' if
the
type of the evaluated expression is unknown. Also update to use
the new `call_function_by_hand_expecting_type' interface.
* gcore.c (default_derive_heap_segment): update to pass type
argument
to find_function_in_inferior.
* gdbtypes.c, gdbtypes.h: add new type
builtin_type_voidptrfuncptr.
* parse.c, parse.h: export msym_{text,data,unknown}_symbol_type.
Make them of type TYPE_CODE_ERROR instead of TYPE_CODE_INT.
* parser-defs.h: export msym_{text,data,unknown}_symbol_type.
* scm-lang.c (scm_lookup_name): update to use new interface to
find_function_in_inferior.
* valops.c (find_function_in_inferior): add a default type as
second
argument. This type will be used for the returned value if no
type information is available for the function (previously, the
type was assumed to be (char *) (*).
(hand_function_call): add new `expect_type' parameter. This type
will be used as the return type for the function if no type
information is available.
(call_function_by_hand_expecting_type): like
call_function_by_hand, but uses the new `expect_type' interface
to
hand_function_call.
(call_function_by_hand): implement as a wrapper to
call_function_by_hand_expecting_type.
(value_allocate_space_in_inferior): use new cached_function
interface.
(find_function_addr): if asked the return type of a function with
type TYPE_CODE_ERROR, return TYPE_CODE_ERROR.
* value.h (call_function_by_hand_expecting_type): add.
(find_function_in_inferior) update to new signature.
Index: gdb/c-valprint.c
===================================================================
RCS file: /cvs/src/src/gdb/c-valprint.c,v
retrieving revision 1.12
diff -u -r1.12 c-valprint.c
--- c-valprint.c 2002/02/04 02:14:46 1.12
+++ c-valprint.c 2002/02/05 06:22:27
@@ -453,7 +453,7 @@
break;
case TYPE_CODE_ERROR:
- fprintf_filtered (stream, "<error type>");
+ fprintf_filtered (stream, "<unknown type>");
break;
case TYPE_CODE_UNDEF:
Index: gdb/eval.c
===================================================================
RCS file: /cvs/src/src/gdb/eval.c,v
retrieving revision 1.19
diff -u -r1.19 eval.c
--- eval.c 2002/01/04 17:51:38 1.19
+++ eval.c 2002/02/05 06:22:29
@@ -928,15 +928,20 @@
gdb isn't asked for it's opinion (ie. through "whatis"),
it won't offer it. */
- struct type *ftype =
- TYPE_TARGET_TYPE (VALUE_TYPE (argvec[0]));
-
- if (ftype)
- return allocate_value (TYPE_TARGET_TYPE (VALUE_TYPE
(argvec[0])));
- else
- error ("Expression of type other than \"Function
returning ...\" used as function");
+ struct type *type =
+ TYPE_TARGET_TYPE (VALUE_TYPE (argvec[0]));
+
+ if (type)
+ {
+ if ((TYPE_CODE (type) == TYPE_CODE_ERROR) && expect_type)
+ return allocate_value (expect_type);
+ else
+ return allocate_value (type);
+ }
+ else
+ error ("Expression of type other than \"Function
returning ...\" used as function");
}
- return call_function_by_hand (argvec[0], nargs, argvec + 1);
+ return call_function_by_hand_expecting_type (argvec[0],
expect_type, nargs, argvec + 1);
/* pai: FIXME save value from call_function_by_hand, then adjust
pc by adjust_fn_pc if +ve */
case OP_F77_UNDETERMINED_ARGLIST:
Index: gdb/gcore.c
===================================================================
RCS file: /cvs/src/src/gdb/gcore.c,v
retrieving revision 1.3
diff -u -r1.3 gcore.c
--- gcore.c 2002/01/14 20:00:48 1.3
+++ gcore.c 2002/02/05 06:22:30
@@ -274,7 +274,7 @@
}
}
/* Now get the top-of-heap by calling sbrk in the inferior. */
- if ((sbrk = find_function_in_inferior ("sbrk")) == NULL)
+ if ((sbrk = find_function_in_inferior ("sbrk",
builtin_type_voidptrfuncptr)) == NULL)
return 0;
if ((zero = value_from_longest (builtin_type_int, (LONGEST) 0)) ==
NULL)
return 0;
Index: gdb/gdbtypes.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtypes.c,v
retrieving revision 1.40
diff -u -r1.40 gdbtypes.c
--- gdbtypes.c 2002/02/03 23:18:11 1.40
+++ gdbtypes.c 2002/02/05 06:22:33
@@ -99,6 +99,7 @@
struct type *builtin_type_void_func_ptr;
struct type *builtin_type_CORE_ADDR;
struct type *builtin_type_bfd_vma;
+struct type *builtin_type_voidptrfuncptr;
int opaque_type_resolution = 1;
int overload_debug = 0;
@@ -3290,6 +3291,8 @@
init_type (TYPE_CODE_INT, TARGET_BFD_VMA_BIT / 8,
TYPE_FLAG_UNSIGNED,
"__bfd_vma", (struct objfile *) NULL);
+ builtin_type_voidptrfuncptr =
+ lookup_pointer_type (lookup_function_type (lookup_pointer_type
(builtin_type_void)));
}
Index: gdb/gdbtypes.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbtypes.h,v
retrieving revision 1.26
diff -u -r1.26 gdbtypes.h
--- gdbtypes.h 2002/02/03 22:57:56 1.26
+++ gdbtypes.h 2002/02/05 06:22:35
@@ -934,6 +934,7 @@
bit address type even though the TARGET has a 64 bit pointer type
(cf MIPS). */
extern struct type *builtin_type_bfd_vma;
+extern struct type *builtin_type_voidptrfuncptr;
/* Explicit sizes - see C9X <intypes.h> for naming scheme */
extern struct type *builtin_type_int8;
Index: gdb/parse.c
===================================================================
RCS file: /cvs/src/src/gdb/parse.c,v
retrieving revision 1.19
diff -u -r1.19 parse.c
--- parse.c 2002/01/31 02:13:56 1.19
+++ parse.c 2002/02/05 06:22:37
@@ -382,9 +382,9 @@
based on the language, but they no longer have names like "int", so
the initial rationale is gone. */
-static struct type *msym_text_symbol_type;
-static struct type *msym_data_symbol_type;
-static struct type *msym_unknown_symbol_type;
+struct type *msym_text_symbol_type;
+struct type *msym_data_symbol_type;
+struct type *msym_unknown_symbol_type;
void
write_exp_msymbol (struct minimal_symbol *msymbol,
@@ -1341,16 +1341,15 @@
{
int i;
- msym_text_symbol_type =
- init_type (TYPE_CODE_FUNC, 1, 0, "<text variable, no debug info>",
NULL);
- TYPE_TARGET_TYPE (msym_text_symbol_type) = builtin_type_int;
- msym_data_symbol_type =
- init_type (TYPE_CODE_INT, TARGET_INT_BIT / HOST_CHAR_BIT, 0,
- "<data variable, no debug info>", NULL);
- msym_unknown_symbol_type =
- init_type (TYPE_CODE_INT, 1, 0,
- "<variable (not text or data), no debug info>",
- NULL);
+ msym_text_symbol_type =
+ init_type (TYPE_CODE_FUNC, 0, 0, "<text variable, no debug info>",
NULL);
+ TYPE_TARGET_TYPE (msym_text_symbol_type) = builtin_type_error;
+ msym_data_symbol_type =
+ init_type (TYPE_CODE_ERROR, 0, 0,
+ "<data variable, no debug info>", NULL);
+ msym_unknown_symbol_type =
+ init_type (TYPE_CODE_ERROR, 0, 0,
+ "<variable (not text or data), no debug info>", NULL);
/* create the std_regs table */
Index: gdb/parser-defs.h
===================================================================
RCS file: /cvs/src/src/gdb/parser-defs.h,v
retrieving revision 1.6
diff -u -r1.6 parser-defs.h
--- parser-defs.h 2001/11/15 01:55:59 1.6
+++ parser-defs.h 2002/02/05 06:22:37
@@ -39,6 +39,10 @@
extern int expout_size;
extern int expout_ptr;
+extern struct type *msym_text_symbol_type;
+extern struct type *msym_data_symbol_type;
+extern struct type *msym_unknown_symbol_type;
+
/* If this is nonzero, this block is used as the lexical context
for symbol names. */
Index: gdb/scm-lang.c
===================================================================
RCS file: /cvs/src/src/gdb/scm-lang.c,v
retrieving revision 1.7
diff -u -r1.7 scm-lang.c
--- scm-lang.c 2002/01/04 05:20:08 1.7
+++ scm-lang.c 2002/02/05 06:22:37
@@ -169,7 +169,7 @@
/* FIXME in this case, we should try lookup_symbol first */
args[2] = value_from_longest (builtin_type_scm, SCM_EOL);
- func = find_function_in_inferior ("scm_lookup_cstr");
+ func = find_function_in_inferior ("scm_lookup_cstr",
builtin_type_voidptrfuncptr);
val = call_function_by_hand (func, 3, args);
if (!value_logical_not (val))
return value_ind (val);
@@ -192,7 +192,7 @@
write_memory (iaddr, str, len);
/* FIXME - should find and pass env */
write_memory (iaddr + len, "", 1);
- func = find_function_in_inferior ("scm_evstr");
+ func = find_function_in_inferior ("scm_evstr",
builtin_type_voidptrfuncptr);
return call_function_by_hand (func, 1, &addr);
}
Index: gdb/valops.c
===================================================================
RCS file: /cvs/src/src/gdb/valops.c,v
retrieving revision 1.50
diff -u -r1.50 valops.c
--- valops.c 2002/02/04 02:14:46 1.50
+++ valops.c 2002/02/05 06:22:41
@@ -32,6 +32,7 @@
#include "language.h"
#include "gdbcmd.h"
#include "regcache.h"
+#include "parser-defs.h"
#include "cp-abi.h"
#include <errno.h>
@@ -46,7 +47,7 @@
static int typecmp (int staticp, struct type *t1[], struct value *t2[]);
-static CORE_ADDR find_function_addr (struct value *, struct type **);
+CORE_ADDR find_function_addr (struct value *, struct type **);
static struct value *value_arg_coerce (struct value *, struct type *,
int);
@@ -89,11 +90,13 @@
int unwind_on_signal_p = 0;
-
-/* Find the address of function name NAME in the inferior. */
-
-struct value *
-find_function_in_inferior (char *name)
+/* Find the address of function name NAME in the inferior. If no type
+ information is available for NAME, use `type' as the type for the
+ resulting value.
+*/
+
+struct value *
+find_function_in_inferior (char *name, struct type *type)
{
register struct symbol *sym;
sym = lookup_symbol (name, 0, VAR_NAMESPACE, 0, NULL);
@@ -111,20 +114,18 @@
struct minimal_symbol *msymbol = lookup_minimal_symbol (name,
NULL, NULL);
if (msymbol != NULL)
{
- struct type *type;
- CORE_ADDR maddr;
- type = lookup_pointer_type (builtin_type_char);
- type = lookup_function_type (type);
- type = lookup_pointer_type (type);
- maddr = SYMBOL_VALUE_ADDRESS (msymbol);
- return value_from_pointer (type, maddr);
+ if (type != NULL)
+ return value_from_longest (type, (LONGEST)
SYMBOL_VALUE_ADDRESS (msymbol));
+ else
+ return value_from_longest (lookup_pointer_type
(msym_text_symbol_type),
+ (LONGEST) SYMBOL_VALUE_ADDRESS
(msymbol));
}
else
{
if (!target_has_execution)
error ("evaluation of this expression requires the target
program to be active");
else
- error ("evaluation of this expression requires the program
to have a function \"%s\".", name);
+ error ("evaluation of this expression requires the program
to have a function named \"%s\".", name);
}
}
}
@@ -136,10 +137,10 @@
value_allocate_space_in_inferior (int len)
{
struct value *blocklen;
- struct value *val = find_function_in_inferior ("malloc");
+ struct value *val = find_function_in_inferior ("malloc",
builtin_type_voidptrfuncptr);
blocklen = value_from_longest (builtin_type_int, (LONGEST) len);
- val = call_function_by_hand (val, 1, &blocklen);
+ val = call_function_by_hand (val, 1, &blocklen);
if (value_logical_not (val))
{
if (!target_has_execution)
@@ -1261,6 +1262,11 @@
value_type = builtin_type_int;
}
+ else if (code == TYPE_CODE_ERROR)
+ {
+ value_type = builtin_type_error;
+ funaddr = (CORE_ADDR) -1;
+ }
else
error ("Invalid data type for function to be called.");
@@ -1287,7 +1293,8 @@
ARGS is modified to contain coerced values. */
static struct value *
-hand_function_call (struct value *function, int nargs, struct value
**args)
+hand_function_call (struct value *function,
+ struct type *expect_type, int nargs, struct value
**args)
{
register CORE_ADDR sp;
register int i;
@@ -1334,6 +1341,33 @@
inf_status = save_inferior_status (1);
old_chain = make_cleanup_restore_inferior_status (inf_status);
+ funaddr = find_function_addr (function, &value_type);
+ CHECK_TYPEDEF (value_type);
+
+ if ((value_type == NULL) || (value_type->code == TYPE_CODE_ERROR))
+ value_type = expect_type;
+
+ if ((value_type == NULL) || (value_type->code == TYPE_CODE_ERROR))
+ error ("Unable to call function at 0x%lx: no return type
information available.\n"
+ "To call this function anyway, you can cast the return type
explicitly\n"
+ "(e.g. 'print (float) fabs (3.0)')",
+ (unsigned long) funaddr);
+
+ CHECK_TYPEDEF (value_type);
+
+ {
+ struct block *b = block_for_pc (funaddr);
+ /* If compiled without -g, assume GCC 2. */
+ using_gcc = (b == NULL ? 2 : BLOCK_GCC_COMPILED (b));
+ }
+
+ /* Are we returning a value using a structure return or a normal
+ value return? */
+
+ struct_return = using_struct_return (function, funaddr, value_type,
+ using_gcc);
+
+
/* PUSH_DUMMY_FRAME is responsible for saving the inferior registers
(and POP_FRAME for restoring them). (At least on most machines)
they are saved on the stack in the inferior. */
@@ -1354,21 +1388,6 @@
sp += sizeof_dummy1;
}
- funaddr = find_function_addr (function, &value_type);
- CHECK_TYPEDEF (value_type);
-
- {
- struct block *b = block_for_pc (funaddr);
- /* If compiled without -g, assume GCC 2. */
- using_gcc = (b == NULL ? 2 : BLOCK_GCC_COMPILED (b));
- }
-
- /* Are we returning a value using a structure return or a normal
- value return? */
-
- struct_return = using_struct_return (function, funaddr, value_type,
- using_gcc);
-
/* Create a call sequence customized for this function
and the number of arguments for it. */
for (i = 0; i < (int) (SIZEOF_CALL_DUMMY_WORDS / sizeof (dummy[0]));
i++)
@@ -1786,16 +1805,24 @@
}
struct value *
-call_function_by_hand (struct value *function, int nargs, struct value
**args)
+call_function_by_hand_expecting_type (struct value *function,
+ struct type *expect_type,
+ int nargs, struct value **args)
{
if (CALL_DUMMY_P)
{
- return hand_function_call (function, nargs, args);
+ return hand_function_call (function, expect_type, nargs, args);
}
else
{
error ("Cannot invoke functions on this machine.");
}
+}
+
+struct value *
+call_function_by_hand (struct value *function, int nargs, struct value
**args)
+{
+ return call_function_by_hand_expecting_type (function, NULL, nargs,
args);
}
Index: gdb/value.h
===================================================================
RCS file: /cvs/src/src/gdb/value.h,v
retrieving revision 1.26
diff -u -r1.26 value.h
--- value.h 2002/01/04 23:21:38 1.26
+++ value.h 2002/02/05 06:22:42
@@ -551,6 +551,11 @@
extern struct value *value_slice (struct value *, int, int);
+extern struct value *
+call_function_by_hand_expecting_type (struct value *,
+ struct type *, int,
+ struct value **);
+
extern struct value *call_function_by_hand (struct value *, int,
struct value **);
@@ -564,7 +569,9 @@
extern void find_rt_vbase_offset (struct type *, struct type *, char *,
int,
int *, int *);
-extern struct value *find_function_in_inferior (char *);
+extern CORE_ADDR find_function_addr (struct value *, struct type **);
+
+extern struct value *find_function_in_inferior (char *, struct type *);
extern struct value *value_allocate_space_in_inferior (int);
Index: gdb/testsuite/gdb.asm/asm-source.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.asm/asm-source.exp,v
retrieving revision 1.17
diff -u -r1.17 asm-source.exp
--- asm-source.exp 2002/01/18 00:13:00 1.17
+++ asm-source.exp 2002/02/05 06:22:44
@@ -220,10 +220,12 @@
"Make selected stack frame return now\?.*" "y"
# See if we can look at a global variable
-gdb_test "print globalvar" ".* = 11" "look at global variable"
+gdb_test "print globalvar" ".* = (11|<unknown type>)" "look at global
variable"
+gdb_test "print (int) globalvar" ".* = 11" "look at global variable"
# See if we can look at a static variable
-gdb_test "print staticvar" ".* = 5" "look at static variable"
+gdb_test "print staticvar" ".* = (5|<unknown type>)" "look at static
variable"
+gdb_test "print (int) staticvar" ".* = 5" "look at static variable"
# See if we can look at a static function
gdb_test "disassem foostatic" ".*<foostatic>:.*End of assembler dump." \
Index: gdb/testsuite/gdb.base/nodebug.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/nodebug.exp,v
retrieving revision 1.2
diff -u -r1.2 nodebug.exp
--- nodebug.exp 2001/03/06 08:21:50 1.2
+++ nodebug.exp 2002/02/05 06:22:47
@@ -77,23 +77,24 @@
gdb_test "whatis top" \
"(<(text variable|function), no debug info>|short
\\(int\\)|short \\(\\))"
if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" }
- gdb_test "ptype top" "(short|int) \\((|void|int|<non-float
parameter>|<non-float parameter>, <non-float parameter>)\\)"
+ gdb_test "ptype top" "(short|int|<unknown type>)
\\((|void|int|<non-float parameter>|<non-float parameter>, <non-float
parameter>)\\)"
if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix5*" }
setup_xfail "mips-sgi-irix6*"
gdb_test "p middle" \
- "\{(<(text variable|function), no debug info>|short
\\(int\\)|short \\(\\))\} \[0-9a-fx]* <middle(\\(int\\)|)>"
+ "\{(<(text variable|function), no debug info>|short|<unknown
type> \\(int\\)|short \\(\\))\} \[0-9a-fx]* <middle(\\(int\\)|)>"
if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix5*" }
setup_xfail "mips-sgi-irix6*"
gdb_test "whatis middle" \
- "(<(text variable|function), no debug info>|short
\\(int\\)|short \\(\\))"
+ "(<(text variable|function), no debug info>|short|<unknown type>
\\(int\\)|short \\(\\))"
setup_xfail "mips-sgi-irix6*"
- gdb_test "ptype middle" "(short|int) \\((|void|int|<non-float
parameter>|<non-float parameter>, <non-float parameter>)\\)"
+ gdb_test "ptype middle" "(short|int|<unknown type>)
\\((|void|int|<non-float parameter>|<non-float parameter>, <non-float
parameter>)\\)"
- gdb_test "p dataglobal" "= 3"
+ gdb_test "p dataglobal" "(= 3|<unknown type>)"
+ gdb_test "p (int) dataglobal" "= 3"
gdb_test "whatis dataglobal" \
- "<(data variable|variable), no debug info>|int"
- gdb_test "ptype dataglobal" "<(data variable|variable), no debug
info>|int"
+ "<(data variable|variable), no debug info>|int|<unknown type>"
+ gdb_test "ptype dataglobal" "<(data variable|variable), no debug
info>|int|<unknown type>"
# The only symbol xcoff puts out for statics is for the TOC entry.
# Possible, but hairy, for gdb to deal. Right now it doesn't, it
@@ -102,37 +103,40 @@
setup_xfail "powerpc*-*-aix*"
if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" }
if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" }
- gdb_test "p datalocal" "= 4"
+ gdb_test "p datalocal" "(= 4|<unknown type>)"
+ gdb_test "p (int) datalocal" "4"
setup_xfail "rs6000*-*-aix*"
setup_xfail "powerpc*-*-aix*"
if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" }
if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" }
- gdb_test "whatis datalocal" "<(data variable|variable), no debug
info>"
+ gdb_test "whatis datalocal" "<(data variable|variable), no debug
info>|<unknown type>"
setup_xfail "rs6000*-*-aix*"
setup_xfail "powerpc*-*-aix*"
if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" }
if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" }
- gdb_test "ptype datalocal" "<(data variable|variable), no debug
info>"
+ gdb_test "ptype datalocal" "<(data variable|variable), no debug
info>|<unknown type>"
- gdb_test "p bssglobal" "= 0"
- gdb_test "whatis bssglobal" "<(data variable|variable), no debug
info>|int"
- gdb_test "ptype bssglobal" "<(data variable|variable), no debug
info>|int"
+ gdb_test "p bssglobal" "(= 0|<unknown type>)"
+ gdb_test "p (int) bssglobal" "= 0"
+ gdb_test "whatis bssglobal" "<(data variable|variable), no debug
info>|<unknown type>|int"
+ gdb_test "ptype bssglobal" "<(data variable|variable), no debug
info>|<unknown type>|int"
setup_xfail "rs6000*-*-aix*"
setup_xfail "powerpc*-*-aix*"
if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" }
if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" }
- gdb_test "p bsslocal" "= 0"
+ gdb_test "p bsslocal" "(= 0|<unknown type>)"
+ gdb_test "p (int) bsslocal" "= 0"
setup_xfail "rs6000*-*-aix*"
setup_xfail "powerpc*-*-aix*"
if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" }
if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" }
- gdb_test "whatis bsslocal" "<(data variable|variable), no debug
info>"
+ gdb_test "whatis bsslocal" "<(data variable|variable), no debug
info>|<unknown type>"
setup_xfail "rs6000*-*-aix*"
setup_xfail "powerpc*-*-aix*"
if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" }
if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" }
- gdb_test "ptype bsslocal" "<(data variable|variable), no debug
info>"
+ gdb_test "ptype bsslocal" "<(data variable|variable), no debug
info>|<unknown type>"
if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" }
gdb_test "backtrace 10"
"#0.*inner.*#1.*middle.*#2.*top.*#3.*main.*" \
@@ -167,7 +171,9 @@
# We need to up this because this can be really slow on some
boards.
# (malloc() is called as part of the test).
set timeout 60;
- gdb_test {p/c array_index("abcdef",2)} " = 99 'c'"
+ gdb_test {p/c (int) array_index("abcdef",2)} " = 99 'c'"
+ gdb_test {p/c array_index("abcdef",2)} \
+ "Unable to call function .* no return type information
available.*"
}
}