old-cross-binutils/gdb/values.c

1503 lines
43 KiB
C
Raw Normal View History

/* Low level packing and unpacking of values for GDB, the GNU Debugger.
Copyright 1986, 1987, 1989, 1991 Free Software Foundation, Inc.
1991-03-28 16:28:29 +00:00
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
1991-03-28 16:28:29 +00:00
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
1991-03-28 16:28:29 +00:00
This program is distributed in the hope that it will be useful,
1991-03-28 16:28:29 +00:00
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
1991-03-28 16:28:29 +00:00
#include "defs.h"
#include <string.h>
1991-03-28 16:28:29 +00:00
#include "symtab.h"
#include "gdbtypes.h"
1991-03-28 16:28:29 +00:00
#include "value.h"
#include "gdbcore.h"
#include "frame.h"
#include "command.h"
1991-04-19 01:32:08 +00:00
#include "gdbcmd.h"
#include "target.h"
#include "demangle.h"
1991-03-28 16:28:29 +00:00
/* Local function prototypes. */
static value
value_headof PARAMS ((value, struct type *, struct type *));
static void
show_values PARAMS ((char *, int));
static void
show_convenience PARAMS ((char *, int));
1991-03-28 16:28:29 +00:00
/* The value-history records all the values printed
by print commands during this session. Each chunk
records 60 consecutive values. The first chunk on
the chain records the most recent values.
The total number of values is in value_history_count. */
#define VALUE_HISTORY_CHUNK 60
struct value_history_chunk
{
struct value_history_chunk *next;
value values[VALUE_HISTORY_CHUNK];
};
/* Chain of chunks now in use. */
static struct value_history_chunk *value_history_chain;
static int value_history_count; /* Abs number of last entry stored */
/* List of all value objects currently allocated
(except for those released by calls to release_value)
This is so they can be freed after each command. */
static value all_values;
/* Allocate a value that has the correct length for type TYPE. */
value
allocate_value (type)
struct type *type;
{
register value val;
check_stub_type (type);
val = (value) xmalloc (sizeof (struct value) + TYPE_LENGTH (type));
VALUE_NEXT (val) = all_values;
all_values = val;
VALUE_TYPE (val) = type;
VALUE_LVAL (val) = not_lval;
VALUE_ADDRESS (val) = 0;
VALUE_FRAME (val) = 0;
VALUE_OFFSET (val) = 0;
VALUE_BITPOS (val) = 0;
VALUE_BITSIZE (val) = 0;
VALUE_REPEATED (val) = 0;
VALUE_REPETITIONS (val) = 0;
VALUE_REGNO (val) = -1;
VALUE_LAZY (val) = 0;
VALUE_OPTIMIZED_OUT (val) = 0;
return val;
}
/* Allocate a value that has the correct length
for COUNT repetitions type TYPE. */
value
allocate_repeat_value (type, count)
struct type *type;
int count;
{
register value val;
val = (value) xmalloc (sizeof (struct value) + TYPE_LENGTH (type) * count);
VALUE_NEXT (val) = all_values;
all_values = val;
VALUE_TYPE (val) = type;
VALUE_LVAL (val) = not_lval;
VALUE_ADDRESS (val) = 0;
VALUE_FRAME (val) = 0;
VALUE_OFFSET (val) = 0;
VALUE_BITPOS (val) = 0;
VALUE_BITSIZE (val) = 0;
VALUE_REPEATED (val) = 1;
VALUE_REPETITIONS (val) = count;
VALUE_REGNO (val) = -1;
VALUE_LAZY (val) = 0;
VALUE_OPTIMIZED_OUT (val) = 0;
return val;
}
/* Return a mark in the value chain. All values allocated after the
mark is obtained (except for those released) are subject to being freed
if a subsequent value_free_to_mark is passed the mark. */
value
value_mark ()
{
return all_values;
}
/* Free all values allocated since MARK was obtained by value_mark
(except for those released). */
void
value_free_to_mark (mark)
value mark;
{
value val, next;
for (val = all_values; val && val != mark; val = next)
{
next = VALUE_NEXT (val);
value_free (val);
}
all_values = val;
}
1991-03-28 16:28:29 +00:00
/* Free all the values that have been allocated (except for those released).
Called after each command, successful or not. */
void
free_all_values ()
{
register value val, next;
for (val = all_values; val; val = next)
{
next = VALUE_NEXT (val);
value_free (val);
}
all_values = 0;
}
/* Remove VAL from the chain all_values
so it will not be freed automatically. */
void
release_value (val)
register value val;
{
register value v;
if (all_values == val)
{
all_values = val->next;
return;
}
for (v = all_values; v; v = v->next)
{
if (v->next == val)
{
v->next = val->next;
break;
}
}
}
/* Return a copy of the value ARG.
It contains the same contents, for same memory address,
but it's a different block of storage. */
value
1991-03-28 16:28:29 +00:00
value_copy (arg)
value arg;
{
register value val;
register struct type *type = VALUE_TYPE (arg);
if (VALUE_REPEATED (arg))
val = allocate_repeat_value (type, VALUE_REPETITIONS (arg));
else
val = allocate_value (type);
VALUE_LVAL (val) = VALUE_LVAL (arg);
VALUE_ADDRESS (val) = VALUE_ADDRESS (arg);
VALUE_OFFSET (val) = VALUE_OFFSET (arg);
VALUE_BITPOS (val) = VALUE_BITPOS (arg);
VALUE_BITSIZE (val) = VALUE_BITSIZE (arg);
VALUE_REGNO (val) = VALUE_REGNO (arg);
VALUE_LAZY (val) = VALUE_LAZY (arg);
if (!VALUE_LAZY (val))
{
memcpy (VALUE_CONTENTS_RAW (val), VALUE_CONTENTS_RAW (arg),
TYPE_LENGTH (VALUE_TYPE (arg))
* (VALUE_REPEATED (arg) ? VALUE_REPETITIONS (arg) : 1));
1991-03-28 16:28:29 +00:00
}
return val;
}
/* Access to the value history. */
/* Record a new value in the value history.
Returns the absolute history index of the entry.
Result of -1 indicates the value was not saved; otherwise it is the
value history index of this new item. */
int
record_latest_value (val)
value val;
{
int i;
/* Check error now if about to store an invalid float. We return -1
to the caller, but allow them to continue, e.g. to print it as "Nan". */
if (TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_FLT)
{
unpack_double (VALUE_TYPE (val), VALUE_CONTENTS (val), &i);
if (i) return -1; /* Indicate value not saved in history */
}
1991-03-28 16:28:29 +00:00
/* Here we treat value_history_count as origin-zero
and applying to the value being stored now. */
i = value_history_count % VALUE_HISTORY_CHUNK;
if (i == 0)
{
register struct value_history_chunk *new
= (struct value_history_chunk *)
xmalloc (sizeof (struct value_history_chunk));
memset (new->values, 0, sizeof new->values);
1991-03-28 16:28:29 +00:00
new->next = value_history_chain;
value_history_chain = new;
}
value_history_chain->values[i] = val;
/* We don't want this value to have anything to do with the inferior anymore.
In particular, "set $1 = 50" should not affect the variable from which
the value was taken, and fast watchpoints should be able to assume that
a value on the value history never changes. */
if (VALUE_LAZY (val))
value_fetch_lazy (val);
VALUE_LVAL (val) = not_lval;
1991-03-28 16:28:29 +00:00
release_value (val);
/* Now we regard value_history_count as origin-one
and applying to the value just stored. */
return ++value_history_count;
}
/* Return a copy of the value in the history with sequence number NUM. */
value
access_value_history (num)
int num;
{
register struct value_history_chunk *chunk;
register int i;
register int absnum = num;
if (absnum <= 0)
absnum += value_history_count;
if (absnum <= 0)
{
if (num == 0)
error ("The history is empty.");
else if (num == 1)
error ("There is only one value in the history.");
else
error ("History does not go back to $$%d.", -num);
}
if (absnum > value_history_count)
error ("History has not yet reached $%d.", absnum);
absnum--;
/* Now absnum is always absolute and origin zero. */
chunk = value_history_chain;
for (i = (value_history_count - 1) / VALUE_HISTORY_CHUNK - absnum / VALUE_HISTORY_CHUNK;
i > 0; i--)
chunk = chunk->next;
return value_copy (chunk->values[absnum % VALUE_HISTORY_CHUNK]);
}
/* Clear the value history entirely.
Must be done when new symbol tables are loaded,
because the type pointers become invalid. */
void
clear_value_history ()
{
register struct value_history_chunk *next;
register int i;
register value val;
while (value_history_chain)
{
for (i = 0; i < VALUE_HISTORY_CHUNK; i++)
* Makefile.in (VERSION): Bump to 4.7.4. * Makefile.in (SFILES_MAINDIR): Add typeprint.c, c-typeprint.c, m2-typeprint.c, c-valprint.c cp-valprint.c m2-valprint.c. * Makefile.in (HFILES): Add valprint.h. * Makefile.in (OBS): Add typeprint.o, c-typeprint.o, m2-typeprint.o, c-valprint.o, cp-valprint.o m2-valprint.o. * typeprint.c, typeprint.h: New files for language independent type printing functions. * c-typeprint.c, m2-typeprint.c: New files for language dependent type printing functions and definitions. * valprint.h: New include file for language independent value printing definitions. * c-valprint.c, cp-valprint.c, m2-valprint.c: New files for language dependent value printing functions. * c-exp.y (production ptype): Add range_type variable and use new create_range_type function. * c-exp.y (tokentab2, tokentab3), c-lang.c (c_op_print_tab), infcmd.c (path_var_name), language.c (unk_op_print_tab), m2-lang.c (m2_op_print_tab): Change from ANSI-obsolescent "const static" to ANSI-conformant "static const". * c-exp.y (c_create_fundamental_type): Remove unused nbytes. * c-exp.y (c_language_defn, cplus_language_defn): Add c_print_type, and c_val_print. * c-lang.h (c_print_type, c_val_print): Add prototypes. * coffread.c (decode_type): Add range_type variable and call to new create_range_type function. * complaints.c (complain): Remove unused val variable. * complaints.c (_initialize_complaints): Make it void. * convex-tdep.c (value_of_trapped_internalvar): Add range_type variable and call new create_range_type function. * defs.h (enum val_prettyprint): Move enum from value.h to here so we can avoid having to include value.h just for prototypes that need the enum (thanks ANSI). * dwarfread.c (struct_type): Local anonymous_size variable is only used if !BITS_BIG_ENDIAN. * dwarfread.c (decode_subscript_data_item): Add rangetype variable and call new create_range_type function. * elfread.c (elf_symfile_read): Remove unused dbx and text_sect variables. * eval.c (evaluate_subexp): Remove unused local variable name and the statement with no side effects that initializes it. * expprint.c (print_subexp): Change local_printstr to LA_PRINT_STRING. * gdbtypes.c (create_range_type): New function that creates a range type using code fragments from object file readers as an example of what has to be initialized. * gdbtypes.c (create_array_type): Removed index_type, low_bound, and high_bound parameters, replaced with a single range_type parameter. Change function body to use passed in range_type rather than handcrafting one. * gdbtypes.h (create_range_type): Add prototype. * gdbtypes.h (create_array_type): Change prototype parameters. * infrun.c (normal_stop): Remove unused local variables tem and c. * infrun.c (hook_stop_stub): Return 0 rather than random value. * language.c (unk_lang_print_type, unk_lang_val_print): Add stub functions that call error if called. * language.c (unknown_language_defn, auto_language_defn, local_language_defn): Add initializers unk_lang_print_type and unk_lang_val_print. * language.h (struct language_defn): Reformat for larger comments, add la_print_type and la_val_print members. Add LA_PRINT_TYPE and LA_VAL_PRINT macros. Change local_printchar to LA_PRINT_CHAR and local_printstr to LA_PRINT_STRING. * m2-lang.c (m2_create_fundamental_type): Remove unused local variable nbytes. * m2-lang.c (m2_language_defn): Add initializers m2_print_type and m2_val_print. * m2-lang.h (m2_print_type, m2_val_print): Add prototypes. * main.c (execute_command): Remove unused local variable cmdlines. * main.c (echo_command), stabsread.c (read_type), printcmd.c (clear_displays), symmisc.c (block_depth), values.c (clear_value_history): Make testing of truth value of assignment result explicit. * mipsread.c (upgrade_type): Update FIXME to include future use of create_range_type. * printcmd.c (ptype_command, ptype_eval, whatis_command, whatis_exp, maintenance_print_type): Move prototypes and functions to new typeprint.c. * printcmd.c (_initialize_printcmd): Move add_com calls for ptype_command and whatis_command to new typeprint.c. * ser-bsd.c (serial_open): Remove unused variable sgttyb. * source.c (find_source_lines): Local variable c only used when LSEEK_NOT_LINEAR is defined. * stabsread.c (read_array_type): Use new create_range_type function. * stabsread.c (read_range_type): Add new index_type variable and call new create_range_type function rather than handcrafting range types. * symmisc.c (type_print_1): Change usages to LA_PRINT_TYPE. * symtab.c (typedef_print usages): Use c_typedef_print, renamed. * symtab.c (type_print_base usages): Use c_type_print_base. * symtab.c (type_print_varspec_prefix usages): Use c_type_print_varspec_prefix. * symtab.c (type_print_method_args usages): Use cp_type_print_method_args. * valprint.c: Completely ripped apart and the fragments used to create c-valprint.c, cp-valprint.c, m2-valprint.c, and valprint.h. Remaining stuff is language independent. * value.h (struct fn_field): Forward declare for prototypes. * value.h (type_print_1): Remove prototype. * value.h (enum val_prettyprint): Moved to defs.h. * value.h (typedef_print): Prototype renamed to c_typedef_print. * value.h (baseclass_offset): Add prototype. **** start-sanitize-chill **** * Makefile.in (SFILES_MAINDIR): Add ch-typeprint.c, ch-valprint.c. * Makefile.in (OBS): Add ch-typeprint.o, ch-valprint.o. * ch-typeprint.c: New file for language dependent type printing. * ch-valprint.c: New file for language dependent value printing. * ch-exp.y (parse_number): Remove prototype and stub function. * ch-exp.y (decode_integer_literal): Removed unused digits and temp variables. * ch-exp.y (convert_float): Completely ifdef out for now. * ch-exp.y (tokentab2, tokentab3, tokentab4, tokentab5), ch-lang.c (chill_op_print_tab): Change from ANSI-obsolescent "const static" to ANSI-conformant "static const". * ch-exp.y (yylex): Add unhandled storage class enumeration literals to switch statement for completeness. * ch-lang.c (chill_create_fundamental_types): Remove unused nbytes variable. Change dummy type to 2 bytes to match int. Handle FT_VOID types gratuituously added to chill DWARF by compiler. Change FT_CHAR case to generate an TYPE_CODE_CHAR type rather than a one byte TYPE_CODE_INT type. * ch-lang.c (chill_language_defn): Add chill_print_type and chill_val_print. * ch-lang.h (chill_print_type, chill_val_print): Add prototypes. **** end-sanitize-chill ****
1992-12-18 20:21:32 +00:00
if ((val = value_history_chain->values[i]) != NULL)
1992-03-29 23:26:47 +00:00
free ((PTR)val);
1991-03-28 16:28:29 +00:00
next = value_history_chain->next;
1992-03-29 23:26:47 +00:00
free ((PTR)value_history_chain);
1991-03-28 16:28:29 +00:00
value_history_chain = next;
}
value_history_count = 0;
}
static void
1991-04-19 01:32:08 +00:00
show_values (num_exp, from_tty)
1991-03-28 16:28:29 +00:00
char *num_exp;
int from_tty;
{
register int i;
register value val;
static int num = 1;
if (num_exp)
{
1993-09-08 20:15:34 +00:00
/* "info history +" should print from the stored position.
"info history <exp>" should print around value number <exp>. */
if (num_exp[0] != '+' || num_exp[1] != '\0')
1991-03-28 16:28:29 +00:00
num = parse_and_eval_address (num_exp) - 5;
}
else
{
/* "info history" means print the last 10 values. */
num = value_history_count - 9;
}
if (num <= 0)
num = 1;
for (i = num; i < num + 10 && i <= value_history_count; i++)
{
val = access_value_history (i);
printf_filtered ("$%d = ", i);
value_print (val, stdout, 0, Val_pretty_default);
printf_filtered ("\n");
}
/* The next "info history +" should start after what we just printed. */
num += 10;
/* Hitting just return after this command should do the same thing as
"info history +". If num_exp is null, this is unnecessary, since
"info history +" is not useful after "info history". */
if (from_tty && num_exp)
{
num_exp[0] = '+';
num_exp[1] = '\0';
}
}
/* Internal variables. These are variables within the debugger
that hold values assigned by debugger commands.
The user refers to them with a '$' prefix
that does not appear in the variable names stored internally. */
static struct internalvar *internalvars;
/* Look up an internal variable with name NAME. NAME should not
normally include a dollar sign.
If the specified internal variable does not exist,
one is created, with a void value. */
struct internalvar *
lookup_internalvar (name)
char *name;
{
register struct internalvar *var;
for (var = internalvars; var; var = var->next)
* defs.h (STRCMP, STREQ, STREQN): New macros. * defs.h (demangle_and_match): Remove prototype. * dwarfread.c (STREQ, STREQN): Remove macros, replaced with STREQ and STREQN defined in defs.h. * dwarfread.c (set_cu_language): For completely unknown languages, try to deduce the language from the filename. Retain behavior that for known languages we don't know how to handle, we use language_unknown. * dwarfread.c (enum_type, symthesize_typedef): Initialize language and demangled name fields in symbol. * dwarfread.c, mipsread.c, partial-stab.h: For all usages of ADD_PSYMBOL_TO_LIST, add language and objfile parameters. * dwarfread.c (new_symbol): Attempt to demangle C++ symbol names and cache the results in SYMBOL_DEMANGLED_NAME for the symbol. * elfread.c (STREQ): Remove macro, use STREQ defined in defs.h. Replace usages throughout. * elfread.c (demangle.h): Include. * elfread.c (record_minimal_symbol): Remove prototype and function. * gdbtypes.h, symtab.h (B_SET, B_CLR, B_TST, B_TYPE, B_BYTES, B_CLRALL): Moved from symtab.h to gdbtypes.h. * infcmd.c (jump_command): Remove code to demangle name and add it to a cleanup list. Now just use SYMBOL_DEMANGLED_NAME. * minsyms.c (demangle.h): Include. * minsyms.c (lookup_minimal_symbol): Indent comment to match code. * minsyms.c (install_minimal_symbols): Attempt to demangle symbol names as C++ names, and cache them in SYMBOL_DEMANGLED_NAME. * mipsread.c (psymtab_language): Add static variable. * stabsread.c (demangle.h): Include. * stabsread.c (define_symbol): Attempt to demangle C++ symbol names and cache them in the SYMBOL_DEMANGLED_NAME field. * stack.c (return_command): Remove explicit demangling of name and use of cleanups. Just use SYMBOL_DEMANGLED_NAME. * symfile.c (demangle.h): Include. * symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): Fix to match macros in symfile.h and allow them to be compiled if INLINE_ADD_PSYMBOL is not true. * symfile.h (INLINE_ADD_PSYMBOL): Default to true if not set. * symfile.h (ADD_PSYMBOL_*): Add language and objfile parameters. Add code to demangle and cache C++ symbol names. Use macro form if INLINE_ADD_PSYMBOL is true, otherwise use C function form. * symmisc.c (add_psymbol_to_list, add_psymbol_addr_to_list): Remove, also defined in symfile.c, which we already fixed. * symtab.c (expensive_mangler): Remove prototype and function. * symtab.c (find_methods): Remove physnames parameter and fix prototype to match. * symtab.c (completion_list_add_symbol): Name changed to completion_list_add_name. * symtab.c (COMPLETION_LIST_ADD_SYMBOL): New macro, adds both the normal symbol name and the cached C++ demangled name. * symtab.c (lookup_demangled_partial_symbol, lookup_demangled_block_symbol): Remove prototypes and functions. * symtab.c (lookup_symbol): Remove use of expensive_mangler, use lookup_block_symbol instead of lookup_demangled_block_symbol. Remove code to try demangling names and matching them. * symtab.c (lookup_partial_symbol, lookup_block_symbol): Fix to try matching the cached demangled name if no match is found using the regular symbol name. * symtab.c (find_methods): Remove unused physnames array. * symtab.c (name_match, NAME_MATCH): Remove function and macro, replaced with SYMBOL_MATCHES_REGEXP from symtab.h. * symtab.c (completion_list_add_symbol): Rewrite to use cached C++ demangled symbol names. * symtab.h: Much reformatting of structures and such to add whitespace to make them more readable, and make them more consistent with other gdb structure definitions. * symtab.h (general_symbol_info): New struct containing fields common to all symbols. * symtab.h (SYMBOL_LANGUAGE, SYMBOL_DEMANGLED_NAME, SYMBOL_SOURCE_NAME, SYMBOL_LINKAGE_NAME, SYMBOL_MATCHES_NAME, SYMBOL_MATCHES_REGEXP, MSYMBOL_INFO, MSYMBOL_TYPE): New macros. * symtab. (struct minimal_symbol, struct partial_symbol, struct symbol): Use general_symbol_info struct. * utils.c (demangle_and_match): Remove, no longer used. * valops.c (demangle.h): Include. * xcoffexec.c (eq): Remove macro, replace usages with STREQ. * blockframe.c, breakpoint.c, c-exp.y, c-valprint.c, dbxread.c, infcmd.c, m2-exp.y, minsyms.c, objfiles.h, solib.c, stack.c, symmisc.c, symtab.c, valops.c: Replace references to minimal symbol fields with appropriate macros. * breakpoint.c, buildsym.c, c-exp.y, c-typeprint.c, c-valprint.c, coffread.c, command.c, convex-tdep.c, cp-valprint.c, dbxread.c, demangle.c, elfread.c, energize.c, environ.c, exec.c, gdbtypes.c, i960-tdep.c, infrun.c, infrun-hacked.c, language.c, main.c, minsyms.c, mipsread.c, partial-stab.h, remote-es1800.c, remote-nindy.c, remote-udi.c, rs6000-tdep.c, solib.c, source.c, sparc-pinsn.c, stabsread.c, standalone.c, state.c, stuff.c, symfile.c, symmisc.c, symtab.c, symtab.h, tm-sysv4.h, tm-ultra3.h, values.c, xcoffexec.c, xcoffread.c: Replace strcmp and strncmp usages with STREQ, STREQN, or STRCMP as appropriate. * breakpoint.c, buildsym.c, c-typeprint.c, expprint.c, findvar.c, mipsread.c, printcmd.c, source.c, stabsread.c, stack.c, symmisc.c, tm-29k.h, valops.c, values.c: Replace SYMBOL_NAME references with SYMBOL_SOURCE_NAME or SYMBOL_LINKAGE_NAME as appropriate. * buildsym.c (start_subfile, patch_subfile_names): Default the source language to what can be deduced from the filename. * buildsym.c (end_symtab): Update the source language in the allocated symtab to match what we have been using. * buildsym.h (struct subfile): Add a language field. * c-typeprint.c (c_print_type): Remove code to do explicit demangling. * dbxread.c (psymtab_language): Add static variable. * dbxread.c (start_psymtab): Initialize psymtab_language using deduce_language_from_filename.
1992-12-23 06:34:57 +00:00
if (STREQ (var->name, name))
1991-03-28 16:28:29 +00:00
return var;
var = (struct internalvar *) xmalloc (sizeof (struct internalvar));
var->name = concat (name, NULL);
1991-03-28 16:28:29 +00:00
var->value = allocate_value (builtin_type_void);
release_value (var->value);
var->next = internalvars;
internalvars = var;
return var;
}
value
value_of_internalvar (var)
struct internalvar *var;
{
register value val;
#ifdef IS_TRAPPED_INTERNALVAR
if (IS_TRAPPED_INTERNALVAR (var->name))
return VALUE_OF_TRAPPED_INTERNALVAR (var);
#endif
val = value_copy (var->value);
if (VALUE_LAZY (val))
value_fetch_lazy (val);
VALUE_LVAL (val) = lval_internalvar;
VALUE_INTERNALVAR (val) = var;
return val;
}
void
set_internalvar_component (var, offset, bitpos, bitsize, newval)
struct internalvar *var;
int offset, bitpos, bitsize;
value newval;
{
register char *addr = VALUE_CONTENTS (var->value) + offset;
#ifdef IS_TRAPPED_INTERNALVAR
if (IS_TRAPPED_INTERNALVAR (var->name))
SET_TRAPPED_INTERNALVAR (var, newval, bitpos, bitsize, offset);
#endif
if (bitsize)
modify_field (addr, value_as_long (newval),
1991-03-28 16:28:29 +00:00
bitpos, bitsize);
else
memcpy (addr, VALUE_CONTENTS (newval), TYPE_LENGTH (VALUE_TYPE (newval)));
1991-03-28 16:28:29 +00:00
}
void
set_internalvar (var, val)
struct internalvar *var;
value val;
{
#ifdef IS_TRAPPED_INTERNALVAR
if (IS_TRAPPED_INTERNALVAR (var->name))
SET_TRAPPED_INTERNALVAR (var, val, 0, 0, 0);
#endif
1992-03-29 23:26:47 +00:00
free ((PTR)var->value);
1991-03-28 16:28:29 +00:00
var->value = value_copy (val);
/* Force the value to be fetched from the target now, to avoid problems
later when this internalvar is referenced and the target is gone or
has changed. */
if (VALUE_LAZY (var->value))
value_fetch_lazy (var->value);
1991-03-28 16:28:29 +00:00
release_value (var->value);
}
char *
internalvar_name (var)
struct internalvar *var;
{
return var->name;
}
/* Free all internalvars. Done when new symtabs are loaded,
because that makes the values invalid. */
void
clear_internalvars ()
{
register struct internalvar *var;
while (internalvars)
{
var = internalvars;
internalvars = var->next;
1992-03-29 23:26:47 +00:00
free ((PTR)var->name);
free ((PTR)var->value);
free ((PTR)var);
1991-03-28 16:28:29 +00:00
}
}
static void
show_convenience (ignore, from_tty)
char *ignore;
int from_tty;
1991-03-28 16:28:29 +00:00
{
register struct internalvar *var;
int varseen = 0;
for (var = internalvars; var; var = var->next)
{
#ifdef IS_TRAPPED_INTERNALVAR
if (IS_TRAPPED_INTERNALVAR (var->name))
continue;
#endif
if (!varseen)
{
varseen = 1;
}
printf_filtered ("$%s = ", var->name);
1991-03-28 16:28:29 +00:00
value_print (var->value, stdout, 0, Val_pretty_default);
printf_filtered ("\n");
1991-03-28 16:28:29 +00:00
}
if (!varseen)
printf ("No debugger convenience variables now defined.\n\
Convenience variables have names starting with \"$\";\n\
use \"set\" as in \"set $foo = 5\" to define them.\n");
}
/* Extract a value as a C number (either long or double).
Knows how to convert fixed values to double, or
floating values to long.
Does not deallocate the value. */
LONGEST
value_as_long (val)
register value val;
{
/* This coerces arrays and functions, which is necessary (e.g.
in disassemble_command). It also dereferences references, which
I suspect is the most logical thing to do. */
if (TYPE_CODE (VALUE_TYPE (val)) != TYPE_CODE_ENUM)
COERCE_ARRAY (val);
return unpack_long (VALUE_TYPE (val), VALUE_CONTENTS (val));
}
double
value_as_double (val)
register value val;
{
double foo;
int inv;
foo = unpack_double (VALUE_TYPE (val), VALUE_CONTENTS (val), &inv);
if (inv)
error ("Invalid floating value found in program.");
return foo;
}
/* Extract a value as a C pointer.
Does not deallocate the value. */
CORE_ADDR
value_as_pointer (val)
value val;
{
1991-05-03 00:50:18 +00:00
/* Assume a CORE_ADDR can fit in a LONGEST (for now). Not sure
whether we want this to be true eventually. */
#if 0
/* ADDR_BITS_REMOVE is wrong if we are being called for a
non-address (e.g. argument to "signal", "info break", etc.), or
for pointers to char, in which the low bits *are* significant. */
return ADDR_BITS_REMOVE(value_as_long (val));
#else
return value_as_long (val);
#endif
}
1991-03-28 16:28:29 +00:00
/* Unpack raw data (copied from debugee, target byte order) at VALADDR
as a long, or as a double, assuming the raw data is described
by type TYPE. Knows how to convert different sizes of values
and can convert between fixed and floating point. We don't assume
any alignment for the raw data. Return value is in host byte order.
If you want functions and arrays to be coerced to pointers, and
references to be dereferenced, call value_as_long() instead.
C++: It is assumed that the front-end has taken care of
all matters concerning pointers to members. A pointer
to member which reaches here is considered to be equivalent
to an INT (or some size). After all, it is only an offset. */
/* FIXME: This should be rewritten as a switch statement for speed and
ease of comprehension. */
1991-03-28 16:28:29 +00:00
LONGEST
unpack_long (type, valaddr)
struct type *type;
char *valaddr;
{
register enum type_code code = TYPE_CODE (type);
register int len = TYPE_LENGTH (type);
register int nosign = TYPE_UNSIGNED (type);
if (code == TYPE_CODE_ENUM || code == TYPE_CODE_BOOL)
1991-03-28 16:28:29 +00:00
code = TYPE_CODE_INT;
if (code == TYPE_CODE_FLT)
{
if (len == sizeof (float))
{
float retval;
memcpy (&retval, valaddr, sizeof (retval));
1991-03-28 16:28:29 +00:00
SWAP_TARGET_AND_HOST (&retval, sizeof (retval));
return retval;
}
if (len == sizeof (double))
{
double retval;
memcpy (&retval, valaddr, sizeof (retval));
1991-03-28 16:28:29 +00:00
SWAP_TARGET_AND_HOST (&retval, sizeof (retval));
return retval;
}
else
{
error ("Unexpected type of floating point number.");
}
}
else if ((code == TYPE_CODE_INT || code == TYPE_CODE_CHAR) && nosign)
1991-03-28 16:28:29 +00:00
{
return extract_unsigned_integer (valaddr, len);
1991-03-28 16:28:29 +00:00
}
else if (code == TYPE_CODE_INT || code == TYPE_CODE_CHAR)
1991-03-28 16:28:29 +00:00
{
return extract_signed_integer (valaddr, len);
1991-03-28 16:28:29 +00:00
}
1991-05-03 00:50:18 +00:00
/* Assume a CORE_ADDR can fit in a LONGEST (for now). Not sure
whether we want this to be true eventually. */
* c-exp.y (exp:STRING): Convert C strings into array-of-char constants with an explicit null byte terminator. OP_STRING is now used for real string types. * c-lang.c (builtin_type_*): Move declarations to lang.c since they are used by all languages. * c-lang.c (_initialize_c_language): Move initializations of builtin_type_* to lang.c. * c-typeprint.c (c_type_print_varspec_prefix, c_type_print_varspec_suffix): TYPE_CODE_PASCAL_ARRAY renamed to TYPE_CODE_STRING. * c-valprint.c (c_val_print): Change the way character arrays are printed as strings to be consistent with the way strings are printed when pointer-to-char types are dereferenced. Remove test of print_max before calling val_print_string, which now does it's own test. * eval.c (evaluate_subexp): Add case for OP_ARRAY. * expprint.c (print_subexp, dump_expression): Add case for OP_ARRAY. * expression.h (enum exp_opcode): Add OP_ARRAY and document. * gdbtypes.c (builtin_type_*): Add declarations moved from c-lang.c. * gdbtypes.c (create_string_type): New function to create real string types. * gdbtypes.c (recursive_dump_type): TYPE_CODE_PASCAL_ARRAY renamed to TYPE_CODE_STRING. * gdbtypes.c (_initialize_gdbtypes): Add initializations of builtin_type_* types moved from c-lang.c. * gdbtypes.h (enum type_code): TYPE_CODE_PASCAL_ARRAY renamed to TYPE_CODE_STRING. * gdbtypes.h (builtin_type_string): Add extern declaration. * gdbtypes.h (create_string_type): Add prototype. * m2-lang.c (m2_create_fundamental_type): TYPE_CODE_PASCAL_ARRAY renamed to TYPE_CODE_STRING. * m88k-tdep.c (pushed_size): TYPE_CODE_PASCAL_ARRAY renamed to TYPE_CODE_STRING. * mipsread.c (_initialize_mipsread): TYPE_CODE_PASCAL_ARRAY renamed to TYPE_CODE_STRING. * parse.c (length_of_subexp, prefixify_subexp): Add case for OP_ARRAY. * printcmd.c (print_formatted): Recognize TYPE_CODE_STRING. * typeprint.c (print_type_scalar): TYPE_CODE_PASCAL_ARRAY renamed to TYPE_CODE_STRING. * valops.c (allocate_space_in_inferior): New function and prototype, using code ripped out of value_string. * valops.c (value_string): Rewritten to use new function allocate_space_in_inferior, but temporarily disabled until some other support is in place. * valops.c (value_array): New function to create array constants. * valprint.c (val_print_string): Add comment to document use, complete rewrite to fix several small buglets. * value.h (value_array): Add prototype. * value.h (val_print_string): Change prototype to match rewrite. **** start-sanitize-chill **** * ch-valprint.c (chill_val_print): Add case for TYPE_CODE_STRING. * ch-exp.y (match_character_literal): Disable recognition of control sequence form of character literals and document why. **** end-sanitize-chill ****
1993-01-16 05:15:58 +00:00
else if (code == TYPE_CODE_PTR || code == TYPE_CODE_REF)
1991-03-28 16:28:29 +00:00
{
return extract_address (valaddr, len);
1991-03-28 16:28:29 +00:00
}
else if (code == TYPE_CODE_MEMBER)
error ("not implemented: member types in unpack_long");
error ("Value not integer or pointer.");
return 0; /* For lint -- never reached */
}
/* Return a double value from the specified type and address.
INVP points to an int which is set to 0 for valid value,
1 for invalid value (bad float format). In either case,
the returned double is OK to use. Argument is in target
format, result is in host format. */
double
unpack_double (type, valaddr, invp)
struct type *type;
char *valaddr;
int *invp;
{
register enum type_code code = TYPE_CODE (type);
register int len = TYPE_LENGTH (type);
register int nosign = TYPE_UNSIGNED (type);
*invp = 0; /* Assume valid. */
if (code == TYPE_CODE_FLT)
{
if (INVALID_FLOAT (valaddr, len))
{
*invp = 1;
return 1.234567891011121314;
}
if (len == sizeof (float))
{
float retval;
memcpy (&retval, valaddr, sizeof (retval));
1991-03-28 16:28:29 +00:00
SWAP_TARGET_AND_HOST (&retval, sizeof (retval));
return retval;
}
if (len == sizeof (double))
{
double retval;
memcpy (&retval, valaddr, sizeof (retval));
1991-03-28 16:28:29 +00:00
SWAP_TARGET_AND_HOST (&retval, sizeof (retval));
return retval;
}
else
{
error ("Unexpected type of floating point number.");
return 0; /* Placate lint. */
1991-03-28 16:28:29 +00:00
}
}
else if (nosign) {
/* Unsigned -- be sure we compensate for signed LONGEST. */
* defs.h (CC_HAS_LONG_LONG): Set up to define CC_HAS_LONG_LONG when compiling with gcc, but disable it for now. See comment. * defs.h (LONGEST): Define as either "long" or "long long" based on CC_HAS_LONG_LONG. * defs.h (longest_to_int): Use CC_HAS_LONG_LONG to control how longest_to_int is defined. * c-valprint.c (c_val_print): Call print_longest. * expprint.c (dump_expression): Use PRINTF_HAS_LONG_LONG instead of LONG_LONG. * {printcmd.c, gdbtypes.h} (LONG_LONG): Replace usages with CC_HAS_LONG_LONG. * printcmd.c (print_scalar_formatted): Call print_longest and let it figure out what to do for PRINTF_HAS_LONG_LONG. * typeprint.c (print_type_scalar): Call print_longest and let it figure out what to do for PRINTF_HAS_LONG_LONG. * valprint.c (val_print_type_code_int): Call print_longest and let it figure out what to do for PRINTF_HAS_LONG_LONG. * stabsread.c (LONG_LONG): Replace usages with CC_HAS_LONG_LONG. * value.h (struct value): Replace usage of LONG_LONG with CC_HAS_LONG_LONG. * value.h (print_longest): Add prototype. * values.c (LONG_LONG): Replace usages with CC_HAS_LONG_LONG. * values.c (unpack_double): Collapse code that was unnecessarily dependent on CC_HAS_LONG_LONG. Use LONGEST instead of direct types. * values.c (value_from_longest): Remove dependency on CC_HAS_LONG_LONG and just use LONGEST. * solib.c (solib_map_sections): Use bfd_get_filename to access filename field. * solib.c (clear_solib): Save filename and free it later, after bfd_close, since bfd_close may reference it. Use bfd_get_filename to access the field. * config/convex/xm-convex.h (LONG_LONG): Replace with CC_HAS_LONG_LONG. Add define for PRINTF_HAS_LONG_LONG. * doc/gdbint.texinfo (LONG_LONG): Replace with CC_HAS_LONG_LONG. Add PRINTF_HAS_LONG_LONG references.
1993-04-29 07:07:39 +00:00
return (unsigned LONGEST) unpack_long (type, valaddr);
1991-03-28 16:28:29 +00:00
} else {
/* Signed -- we are OK with unpack_long. */
return unpack_long (type, valaddr);
}
}
/* Unpack raw data (copied from debugee, target byte order) at VALADDR
as a CORE_ADDR, assuming the raw data is described by type TYPE.
We don't assume any alignment for the raw data. Return value is in
host byte order.
If you want functions and arrays to be coerced to pointers, and
references to be dereferenced, call value_as_pointer() instead.
C++: It is assumed that the front-end has taken care of
all matters concerning pointers to members. A pointer
to member which reaches here is considered to be equivalent
to an INT (or some size). After all, it is only an offset. */
CORE_ADDR
unpack_pointer (type, valaddr)
struct type *type;
char *valaddr;
{
1991-05-03 00:50:18 +00:00
/* Assume a CORE_ADDR can fit in a LONGEST (for now). Not sure
whether we want this to be true eventually. */
return unpack_long (type, valaddr);
}
1991-03-28 16:28:29 +00:00
/* Given a value ARG1 (offset by OFFSET bytes)
of a struct or union type ARG_TYPE,
extract and return the value of one of its fields.
FIELDNO says which field.
For C++, must also be able to return values from static fields */
value
value_primitive_field (arg1, offset, fieldno, arg_type)
register value arg1;
int offset;
register int fieldno;
register struct type *arg_type;
{
register value v;
register struct type *type;
check_stub_type (arg_type);
type = TYPE_FIELD_TYPE (arg_type, fieldno);
/* Handle packed fields */
offset += TYPE_FIELD_BITPOS (arg_type, fieldno) / 8;
if (TYPE_FIELD_BITSIZE (arg_type, fieldno))
{
v = value_from_longest (type,
1991-03-28 16:28:29 +00:00
unpack_field_as_long (arg_type,
VALUE_CONTENTS (arg1),
fieldno));
VALUE_BITPOS (v) = TYPE_FIELD_BITPOS (arg_type, fieldno) % 8;
VALUE_BITSIZE (v) = TYPE_FIELD_BITSIZE (arg_type, fieldno);
}
else
{
v = allocate_value (type);
if (VALUE_LAZY (arg1))
VALUE_LAZY (v) = 1;
else
memcpy (VALUE_CONTENTS_RAW (v), VALUE_CONTENTS_RAW (arg1) + offset,
TYPE_LENGTH (type));
1991-03-28 16:28:29 +00:00
}
VALUE_LVAL (v) = VALUE_LVAL (arg1);
if (VALUE_LVAL (arg1) == lval_internalvar)
VALUE_LVAL (v) = lval_internalvar_component;
VALUE_ADDRESS (v) = VALUE_ADDRESS (arg1);
VALUE_OFFSET (v) = offset + VALUE_OFFSET (arg1);
return v;
}
/* Given a value ARG1 of a struct or union type,
extract and return the value of one of its fields.
FIELDNO says which field.
For C++, must also be able to return values from static fields */
value
value_field (arg1, fieldno)
register value arg1;
register int fieldno;
{
return value_primitive_field (arg1, 0, fieldno, VALUE_TYPE (arg1));
}
/* Return a non-virtual function as a value.
F is the list of member functions which contains the desired method.
J is an index into F which provides the desired method. */
1991-03-28 16:28:29 +00:00
value
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
value_fn_field (arg1p, f, j, type, offset)
value *arg1p;
struct fn_field *f;
int j;
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
struct type *type;
int offset;
1991-03-28 16:28:29 +00:00
{
register value v;
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
register struct type *ftype = TYPE_FN_FIELD_TYPE (f, j);
1991-03-28 16:28:29 +00:00
struct symbol *sym;
sym = lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, j),
1991-03-28 16:28:29 +00:00
0, VAR_NAMESPACE, 0, NULL);
if (! sym) error ("Internal error: could not find physical method named %s",
TYPE_FN_FIELD_PHYSNAME (f, j));
1991-03-28 16:28:29 +00:00
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
v = allocate_value (ftype);
1991-03-28 16:28:29 +00:00
VALUE_ADDRESS (v) = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
VALUE_TYPE (v) = ftype;
if (arg1p)
{
if (type != VALUE_TYPE (*arg1p))
*arg1p = value_ind (value_cast (lookup_pointer_type (type),
value_addr (*arg1p)));
/* Move the `this' pointer according to the offset.
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
VALUE_OFFSET (*arg1p) += offset;
*/
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
}
1991-03-28 16:28:29 +00:00
return v;
}
/* Return a virtual function as a value.
ARG1 is the object which provides the virtual function
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
table pointer. *ARG1P is side-effected in calling this function.
1991-03-28 16:28:29 +00:00
F is the list of member functions which contains the desired virtual
function.
J is an index into F which provides the desired virtual function.
TYPE is the type in which F is located. */
1991-03-28 16:28:29 +00:00
value
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
value_virtual_fn_field (arg1p, f, j, type, offset)
value *arg1p;
1991-03-28 16:28:29 +00:00
struct fn_field *f;
int j;
struct type *type;
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
int offset;
1991-03-28 16:28:29 +00:00
{
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
value arg1 = *arg1p;
1991-03-28 16:28:29 +00:00
/* First, get the virtual function table pointer. That comes
with a strange type, so cast it to type `pointer to long' (which
should serve just fine as a function type). Then, index into
the table, and convert final value to appropriate function type. */
value entry, vfn, vtbl;
value vi = value_from_longest (builtin_type_int,
1991-03-28 16:28:29 +00:00
(LONGEST) TYPE_FN_FIELD_VOFFSET (f, j));
struct type *fcontext = TYPE_FN_FIELD_FCONTEXT (f, j);
struct type *context;
if (fcontext == NULL)
/* We don't have an fcontext (e.g. the program was compiled with
g++ version 1). Try to get the vtbl from the TYPE_VPTR_BASETYPE.
This won't work right for multiple inheritance, but at least we
should do as well as GDB 3.x did. */
fcontext = TYPE_VPTR_BASETYPE (type);
context = lookup_pointer_type (fcontext);
/* Now context is a pointer to the basetype containing the vtbl. */
1991-03-28 16:28:29 +00:00
if (TYPE_TARGET_TYPE (context) != VALUE_TYPE (arg1))
arg1 = value_ind (value_cast (context, value_addr (arg1)));
context = VALUE_TYPE (arg1);
/* Now context is the basetype containing the vtbl. */
1991-03-28 16:28:29 +00:00
/* This type may have been defined before its virtual function table
was. If so, fill in the virtual function table entry for the
type now. */
if (TYPE_VPTR_FIELDNO (context) < 0)
fill_in_vptr_fieldno (context);
1991-03-28 16:28:29 +00:00
/* The virtual function table is now an array of structures
which have the form { int16 offset, delta; void *pfn; }. */
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
vtbl = value_ind (value_primitive_field (arg1, 0,
TYPE_VPTR_FIELDNO (context),
TYPE_VPTR_BASETYPE (context)));
1991-03-28 16:28:29 +00:00
/* Index into the virtual function table. This is hard-coded because
looking up a field is not cheap, and it may be important to save
time, e.g. if the user has set a conditional breakpoint calling
a virtual function. */
entry = value_subscript (vtbl, vi);
/* Move the `this' pointer according to the virtual function table. */
VALUE_OFFSET (arg1) += value_as_long (value_field (entry, 0))/* + offset*/;
1991-03-28 16:28:29 +00:00
if (! VALUE_LAZY (arg1))
{
VALUE_LAZY (arg1) = 1;
value_fetch_lazy (arg1);
}
vfn = value_field (entry, 2);
/* Reinstantiate the function pointer with the correct type. */
VALUE_TYPE (vfn) = lookup_pointer_type (TYPE_FN_FIELD_TYPE (f, j));
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
*arg1p = arg1;
1991-03-28 16:28:29 +00:00
return vfn;
}
/* ARG is a pointer to an object we know to be at least
a DTYPE. BTYPE is the most derived basetype that has
already been searched (and need not be searched again).
After looking at the vtables between BTYPE and DTYPE,
return the most derived type we find. The caller must
be satisfied when the return value == DTYPE.
FIXME-tiemann: should work with dossier entries as well. */
static value
value_headof (in_arg, btype, dtype)
value in_arg;
struct type *btype, *dtype;
{
/* First collect the vtables we must look at for this object. */
/* FIXME-tiemann: right now, just look at top-most vtable. */
value arg, vtbl, entry, best_entry = 0;
int i, nelems;
int offset, best_offset = 0;
struct symbol *sym;
CORE_ADDR pc_for_sym;
char *demangled_name;
struct minimal_symbol *msymbol;
btype = TYPE_VPTR_BASETYPE (dtype);
check_stub_type (btype);
arg = in_arg;
if (btype != dtype)
arg = value_cast (lookup_pointer_type (btype), arg);
vtbl = value_ind (value_field (value_ind (arg), TYPE_VPTR_FIELDNO (btype)));
/* Check that VTBL looks like it points to a virtual function table. */
msymbol = lookup_minimal_symbol_by_pc (VALUE_ADDRESS (vtbl));
if (msymbol == NULL
* defs.h (STRCMP, STREQ, STREQN): New macros. * defs.h (demangle_and_match): Remove prototype. * dwarfread.c (STREQ, STREQN): Remove macros, replaced with STREQ and STREQN defined in defs.h. * dwarfread.c (set_cu_language): For completely unknown languages, try to deduce the language from the filename. Retain behavior that for known languages we don't know how to handle, we use language_unknown. * dwarfread.c (enum_type, symthesize_typedef): Initialize language and demangled name fields in symbol. * dwarfread.c, mipsread.c, partial-stab.h: For all usages of ADD_PSYMBOL_TO_LIST, add language and objfile parameters. * dwarfread.c (new_symbol): Attempt to demangle C++ symbol names and cache the results in SYMBOL_DEMANGLED_NAME for the symbol. * elfread.c (STREQ): Remove macro, use STREQ defined in defs.h. Replace usages throughout. * elfread.c (demangle.h): Include. * elfread.c (record_minimal_symbol): Remove prototype and function. * gdbtypes.h, symtab.h (B_SET, B_CLR, B_TST, B_TYPE, B_BYTES, B_CLRALL): Moved from symtab.h to gdbtypes.h. * infcmd.c (jump_command): Remove code to demangle name and add it to a cleanup list. Now just use SYMBOL_DEMANGLED_NAME. * minsyms.c (demangle.h): Include. * minsyms.c (lookup_minimal_symbol): Indent comment to match code. * minsyms.c (install_minimal_symbols): Attempt to demangle symbol names as C++ names, and cache them in SYMBOL_DEMANGLED_NAME. * mipsread.c (psymtab_language): Add static variable. * stabsread.c (demangle.h): Include. * stabsread.c (define_symbol): Attempt to demangle C++ symbol names and cache them in the SYMBOL_DEMANGLED_NAME field. * stack.c (return_command): Remove explicit demangling of name and use of cleanups. Just use SYMBOL_DEMANGLED_NAME. * symfile.c (demangle.h): Include. * symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): Fix to match macros in symfile.h and allow them to be compiled if INLINE_ADD_PSYMBOL is not true. * symfile.h (INLINE_ADD_PSYMBOL): Default to true if not set. * symfile.h (ADD_PSYMBOL_*): Add language and objfile parameters. Add code to demangle and cache C++ symbol names. Use macro form if INLINE_ADD_PSYMBOL is true, otherwise use C function form. * symmisc.c (add_psymbol_to_list, add_psymbol_addr_to_list): Remove, also defined in symfile.c, which we already fixed. * symtab.c (expensive_mangler): Remove prototype and function. * symtab.c (find_methods): Remove physnames parameter and fix prototype to match. * symtab.c (completion_list_add_symbol): Name changed to completion_list_add_name. * symtab.c (COMPLETION_LIST_ADD_SYMBOL): New macro, adds both the normal symbol name and the cached C++ demangled name. * symtab.c (lookup_demangled_partial_symbol, lookup_demangled_block_symbol): Remove prototypes and functions. * symtab.c (lookup_symbol): Remove use of expensive_mangler, use lookup_block_symbol instead of lookup_demangled_block_symbol. Remove code to try demangling names and matching them. * symtab.c (lookup_partial_symbol, lookup_block_symbol): Fix to try matching the cached demangled name if no match is found using the regular symbol name. * symtab.c (find_methods): Remove unused physnames array. * symtab.c (name_match, NAME_MATCH): Remove function and macro, replaced with SYMBOL_MATCHES_REGEXP from symtab.h. * symtab.c (completion_list_add_symbol): Rewrite to use cached C++ demangled symbol names. * symtab.h: Much reformatting of structures and such to add whitespace to make them more readable, and make them more consistent with other gdb structure definitions. * symtab.h (general_symbol_info): New struct containing fields common to all symbols. * symtab.h (SYMBOL_LANGUAGE, SYMBOL_DEMANGLED_NAME, SYMBOL_SOURCE_NAME, SYMBOL_LINKAGE_NAME, SYMBOL_MATCHES_NAME, SYMBOL_MATCHES_REGEXP, MSYMBOL_INFO, MSYMBOL_TYPE): New macros. * symtab. (struct minimal_symbol, struct partial_symbol, struct symbol): Use general_symbol_info struct. * utils.c (demangle_and_match): Remove, no longer used. * valops.c (demangle.h): Include. * xcoffexec.c (eq): Remove macro, replace usages with STREQ. * blockframe.c, breakpoint.c, c-exp.y, c-valprint.c, dbxread.c, infcmd.c, m2-exp.y, minsyms.c, objfiles.h, solib.c, stack.c, symmisc.c, symtab.c, valops.c: Replace references to minimal symbol fields with appropriate macros. * breakpoint.c, buildsym.c, c-exp.y, c-typeprint.c, c-valprint.c, coffread.c, command.c, convex-tdep.c, cp-valprint.c, dbxread.c, demangle.c, elfread.c, energize.c, environ.c, exec.c, gdbtypes.c, i960-tdep.c, infrun.c, infrun-hacked.c, language.c, main.c, minsyms.c, mipsread.c, partial-stab.h, remote-es1800.c, remote-nindy.c, remote-udi.c, rs6000-tdep.c, solib.c, source.c, sparc-pinsn.c, stabsread.c, standalone.c, state.c, stuff.c, symfile.c, symmisc.c, symtab.c, symtab.h, tm-sysv4.h, tm-ultra3.h, values.c, xcoffexec.c, xcoffread.c: Replace strcmp and strncmp usages with STREQ, STREQN, or STRCMP as appropriate. * breakpoint.c, buildsym.c, c-typeprint.c, expprint.c, findvar.c, mipsread.c, printcmd.c, source.c, stabsread.c, stack.c, symmisc.c, tm-29k.h, valops.c, values.c: Replace SYMBOL_NAME references with SYMBOL_SOURCE_NAME or SYMBOL_LINKAGE_NAME as appropriate. * buildsym.c (start_subfile, patch_subfile_names): Default the source language to what can be deduced from the filename. * buildsym.c (end_symtab): Update the source language in the allocated symtab to match what we have been using. * buildsym.h (struct subfile): Add a language field. * c-typeprint.c (c_print_type): Remove code to do explicit demangling. * dbxread.c (psymtab_language): Add static variable. * dbxread.c (start_psymtab): Initialize psymtab_language using deduce_language_from_filename.
1992-12-23 06:34:57 +00:00
|| !VTBL_PREFIX_P (demangled_name = SYMBOL_NAME (msymbol)))
{
/* If we expected to find a vtable, but did not, let the user
know that we aren't happy, but don't throw an error.
FIXME: there has to be a better way to do this. */
struct type *error_type = (struct type *)xmalloc (sizeof (struct type));
memcpy (error_type, VALUE_TYPE (in_arg), sizeof (struct type));
TYPE_NAME (error_type) = savestring ("suspicious *", sizeof ("suspicious *"));
VALUE_TYPE (in_arg) = error_type;
return in_arg;
}
/* Now search through the virtual function table. */
entry = value_ind (vtbl);
nelems = longest_to_int (value_as_long (value_field (entry, 2)));
for (i = 1; i <= nelems; i++)
{
entry = value_subscript (vtbl, value_from_longest (builtin_type_int,
(LONGEST) i));
offset = longest_to_int (value_as_long (value_field (entry, 0)));
/* If we use '<=' we can handle single inheritance
* where all offsets are zero - just use the first entry found. */
if (offset <= best_offset)
{
best_offset = offset;
best_entry = entry;
}
}
/* Move the pointer according to BEST_ENTRY's offset, and figure
out what type we should return as the new pointer. */
if (best_entry == 0)
{
/* An alternative method (which should no longer be necessary).
* But we leave it in for future use, when we will hopefully
* have optimizes the vtable to use thunks instead of offsets. */
/* Use the name of vtable itself to extract a base type. */
demangled_name += 4; /* Skip vt$ prefix. */
}
else
{
pc_for_sym = value_as_pointer (value_field (best_entry, 2));
sym = find_pc_function (pc_for_sym);
demangled_name = cplus_demangle (SYMBOL_NAME (sym), DMGL_ANSI);
*(strchr (demangled_name, ':')) = '\0';
}
sym = lookup_symbol (demangled_name, 0, VAR_NAMESPACE, 0, 0);
* defs.h (STRCMP, STREQ, STREQN): New macros. * defs.h (demangle_and_match): Remove prototype. * dwarfread.c (STREQ, STREQN): Remove macros, replaced with STREQ and STREQN defined in defs.h. * dwarfread.c (set_cu_language): For completely unknown languages, try to deduce the language from the filename. Retain behavior that for known languages we don't know how to handle, we use language_unknown. * dwarfread.c (enum_type, symthesize_typedef): Initialize language and demangled name fields in symbol. * dwarfread.c, mipsread.c, partial-stab.h: For all usages of ADD_PSYMBOL_TO_LIST, add language and objfile parameters. * dwarfread.c (new_symbol): Attempt to demangle C++ symbol names and cache the results in SYMBOL_DEMANGLED_NAME for the symbol. * elfread.c (STREQ): Remove macro, use STREQ defined in defs.h. Replace usages throughout. * elfread.c (demangle.h): Include. * elfread.c (record_minimal_symbol): Remove prototype and function. * gdbtypes.h, symtab.h (B_SET, B_CLR, B_TST, B_TYPE, B_BYTES, B_CLRALL): Moved from symtab.h to gdbtypes.h. * infcmd.c (jump_command): Remove code to demangle name and add it to a cleanup list. Now just use SYMBOL_DEMANGLED_NAME. * minsyms.c (demangle.h): Include. * minsyms.c (lookup_minimal_symbol): Indent comment to match code. * minsyms.c (install_minimal_symbols): Attempt to demangle symbol names as C++ names, and cache them in SYMBOL_DEMANGLED_NAME. * mipsread.c (psymtab_language): Add static variable. * stabsread.c (demangle.h): Include. * stabsread.c (define_symbol): Attempt to demangle C++ symbol names and cache them in the SYMBOL_DEMANGLED_NAME field. * stack.c (return_command): Remove explicit demangling of name and use of cleanups. Just use SYMBOL_DEMANGLED_NAME. * symfile.c (demangle.h): Include. * symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): Fix to match macros in symfile.h and allow them to be compiled if INLINE_ADD_PSYMBOL is not true. * symfile.h (INLINE_ADD_PSYMBOL): Default to true if not set. * symfile.h (ADD_PSYMBOL_*): Add language and objfile parameters. Add code to demangle and cache C++ symbol names. Use macro form if INLINE_ADD_PSYMBOL is true, otherwise use C function form. * symmisc.c (add_psymbol_to_list, add_psymbol_addr_to_list): Remove, also defined in symfile.c, which we already fixed. * symtab.c (expensive_mangler): Remove prototype and function. * symtab.c (find_methods): Remove physnames parameter and fix prototype to match. * symtab.c (completion_list_add_symbol): Name changed to completion_list_add_name. * symtab.c (COMPLETION_LIST_ADD_SYMBOL): New macro, adds both the normal symbol name and the cached C++ demangled name. * symtab.c (lookup_demangled_partial_symbol, lookup_demangled_block_symbol): Remove prototypes and functions. * symtab.c (lookup_symbol): Remove use of expensive_mangler, use lookup_block_symbol instead of lookup_demangled_block_symbol. Remove code to try demangling names and matching them. * symtab.c (lookup_partial_symbol, lookup_block_symbol): Fix to try matching the cached demangled name if no match is found using the regular symbol name. * symtab.c (find_methods): Remove unused physnames array. * symtab.c (name_match, NAME_MATCH): Remove function and macro, replaced with SYMBOL_MATCHES_REGEXP from symtab.h. * symtab.c (completion_list_add_symbol): Rewrite to use cached C++ demangled symbol names. * symtab.h: Much reformatting of structures and such to add whitespace to make them more readable, and make them more consistent with other gdb structure definitions. * symtab.h (general_symbol_info): New struct containing fields common to all symbols. * symtab.h (SYMBOL_LANGUAGE, SYMBOL_DEMANGLED_NAME, SYMBOL_SOURCE_NAME, SYMBOL_LINKAGE_NAME, SYMBOL_MATCHES_NAME, SYMBOL_MATCHES_REGEXP, MSYMBOL_INFO, MSYMBOL_TYPE): New macros. * symtab. (struct minimal_symbol, struct partial_symbol, struct symbol): Use general_symbol_info struct. * utils.c (demangle_and_match): Remove, no longer used. * valops.c (demangle.h): Include. * xcoffexec.c (eq): Remove macro, replace usages with STREQ. * blockframe.c, breakpoint.c, c-exp.y, c-valprint.c, dbxread.c, infcmd.c, m2-exp.y, minsyms.c, objfiles.h, solib.c, stack.c, symmisc.c, symtab.c, valops.c: Replace references to minimal symbol fields with appropriate macros. * breakpoint.c, buildsym.c, c-exp.y, c-typeprint.c, c-valprint.c, coffread.c, command.c, convex-tdep.c, cp-valprint.c, dbxread.c, demangle.c, elfread.c, energize.c, environ.c, exec.c, gdbtypes.c, i960-tdep.c, infrun.c, infrun-hacked.c, language.c, main.c, minsyms.c, mipsread.c, partial-stab.h, remote-es1800.c, remote-nindy.c, remote-udi.c, rs6000-tdep.c, solib.c, source.c, sparc-pinsn.c, stabsread.c, standalone.c, state.c, stuff.c, symfile.c, symmisc.c, symtab.c, symtab.h, tm-sysv4.h, tm-ultra3.h, values.c, xcoffexec.c, xcoffread.c: Replace strcmp and strncmp usages with STREQ, STREQN, or STRCMP as appropriate. * breakpoint.c, buildsym.c, c-typeprint.c, expprint.c, findvar.c, mipsread.c, printcmd.c, source.c, stabsread.c, stack.c, symmisc.c, tm-29k.h, valops.c, values.c: Replace SYMBOL_NAME references with SYMBOL_SOURCE_NAME or SYMBOL_LINKAGE_NAME as appropriate. * buildsym.c (start_subfile, patch_subfile_names): Default the source language to what can be deduced from the filename. * buildsym.c (end_symtab): Update the source language in the allocated symtab to match what we have been using. * buildsym.h (struct subfile): Add a language field. * c-typeprint.c (c_print_type): Remove code to do explicit demangling. * dbxread.c (psymtab_language): Add static variable. * dbxread.c (start_psymtab): Initialize psymtab_language using deduce_language_from_filename.
1992-12-23 06:34:57 +00:00
if (sym == NULL)
error ("could not find type declaration for `%s'", demangled_name);
if (best_entry)
{
free (demangled_name);
arg = value_add (value_cast (builtin_type_int, arg),
value_field (best_entry, 0));
}
else arg = in_arg;
VALUE_TYPE (arg) = lookup_pointer_type (SYMBOL_TYPE (sym));
return arg;
}
/* ARG is a pointer object of type TYPE. If TYPE has virtual
function tables, probe ARG's tables (including the vtables
of its baseclasses) to figure out the most derived type that ARG
could actually be a pointer to. */
value
value_from_vtable_info (arg, type)
value arg;
struct type *type;
{
/* Take care of preliminaries. */
if (TYPE_VPTR_FIELDNO (type) < 0)
fill_in_vptr_fieldno (type);
if (TYPE_VPTR_FIELDNO (type) < 0 || VALUE_REPEATED (arg))
return 0;
return value_headof (arg, 0, type);
}
/* Return true if the INDEXth field of TYPE is a virtual baseclass
pointer which is for the base class whose type is BASECLASS. */
static int
vb_match (type, index, basetype)
struct type *type;
int index;
struct type *basetype;
{
struct type *fieldtype;
char *name = TYPE_FIELD_NAME (type, index);
char *field_class_name = NULL;
if (*name != '_')
return 0;
/* gcc 2.4 uses vb$. */
if (name[1] == 'v' && name[2] == 'b' && name[3] == CPLUS_MARKER)
field_class_name = name + 4;
/* gcc 2.5 will use _vb_. */
if (name[1] == '_' && name[2] == 'v' && name[3] == 'b' && name[4] == '_')
field_class_name = name + 5;
if (field_class_name == NULL)
/* This field is not a virtual base class pointer. */
return 0;
/* It's a virtual baseclass pointer, now we just need to find out whether
it is for this baseclass. */
fieldtype = TYPE_FIELD_TYPE (type, index);
if (fieldtype == NULL
|| TYPE_CODE (fieldtype) != TYPE_CODE_PTR)
/* "Can't happen". */
return 0;
/* What we check for is that either the types are equal (needed for
nameless types) or have the same name. This is ugly, and a more
elegant solution should be devised (which would probably just push
the ugliness into symbol reading unless we change the stabs format). */
if (TYPE_TARGET_TYPE (fieldtype) == basetype)
return 1;
if (TYPE_NAME (basetype) != NULL
&& TYPE_NAME (TYPE_TARGET_TYPE (fieldtype)) != NULL
&& STREQ (TYPE_NAME (basetype),
TYPE_NAME (TYPE_TARGET_TYPE (fieldtype))))
return 1;
return 0;
}
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
/* Compute the offset of the baseclass which is
the INDEXth baseclass of class TYPE, for a value ARG,
wih extra offset of OFFSET.
The result is the offste of the baseclass value relative
to (the address of)(ARG) + OFFSET.
-1 is returned on error. */
int
baseclass_offset (type, index, arg, offset)
struct type *type;
int index;
value arg;
int offset;
{
struct type *basetype = TYPE_BASECLASS (type, index);
if (BASETYPE_VIA_VIRTUAL (type, index))
{
/* Must hunt for the pointer to this virtual baseclass. */
register int i, len = TYPE_NFIELDS (type);
register int n_baseclasses = TYPE_N_BASECLASSES (type);
/* First look for the virtual baseclass pointer
in the fields. */
for (i = n_baseclasses; i < len; i++)
{
if (vb_match (type, i, basetype))
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
{
CORE_ADDR addr
= unpack_pointer (TYPE_FIELD_TYPE (type, i),
VALUE_CONTENTS (arg) + VALUE_OFFSET (arg)
+ offset
+ (TYPE_FIELD_BITPOS (type, i) / 8));
if (VALUE_LVAL (arg) != lval_memory)
return -1;
return addr -
(LONGEST) (VALUE_ADDRESS (arg) + VALUE_OFFSET (arg) + offset);
}
}
/* Not in the fields, so try looking through the baseclasses. */
for (i = index+1; i < n_baseclasses; i++)
{
int boffset =
baseclass_offset (type, i, arg, offset);
if (boffset)
return boffset;
}
/* Not found. */
return -1;
}
/* Baseclass is easily computed. */
return TYPE_BASECLASS_BITPOS (type, index) / 8;
}
1991-03-28 16:28:29 +00:00
/* Compute the address of the baseclass which is
1991-11-27 09:43:59 +00:00
the INDEXth baseclass of class TYPE. The TYPE base
of the object is at VALADDR.
If ERRP is non-NULL, set *ERRP to be the errno code of any error,
or 0 if no error. In that case the return value is not the address
of the baseclasss, but the address which could not be read
successfully. */
1991-03-28 16:28:29 +00:00
A bunch of changes mostly to improve debugging of C++ programs. Specifically, the calling of inferiors methods is improved. * value.h: New macros METHOD_PTR_IS_VIRTUAL, METHOD_PTR_FROM_VOFFSET, METHOD_PTR_TO_VOFFSET to partially hide the implementation details of pointer-to-method objects. How to tell if the pointer points to a virtual method is still very dependent on the particular compiler, but this should make it easier to find the places to change. * eval.c (evaluate_subexp [case OP_FUNCALL]), valprint.c (val_print [case TYPE_CODE_PTR]): Use the new METHOD_PTR_* macros, instead of a hard-wired-in code that incorrectly assumed a no-longerused representation of pointer-to-method values. And otherwise fix the relevant bit-rotted code. * valprint.c (type_print_base [case TYPE_CODE_STRUCT]): If there are both fields and methods, put a space between. * stabsread.c (read_struct_type): Fix bug in handling of GNU C++ anonymous type (indicated by CPLUS_MARKER followed by '_'). (It used to prematurely exit the loop reading in the fields, so it would think it should start reading methods while still in the fields. This could crash gdb given a gcc that can emit nested type information.) * valops.c (search_struct_method): Pass 'this' value by reference instead of by value. This provides a more consistent interface through a recursive search where the "bottom" functions may need to adjust offsets (due to multiple inheritance). * valops.c, value.h, values.c: Pass extra parameters to value_fn_field and value_virtual_fn_field so we can correctly adjust offset for multiple inheritance. * eval.c (evaluate_subexp [case OP_FUNCALL]): Simplify virtual function calls by using value_virtual_fn_field(). * values.c: New function baseclass_offset, derived from baseclass_addr (which perhaps can be made obsolete?). It returns an offset rather than an address. This is a cleaner interface since it doesn't mess around allocating new values. * valops.c (search_struct_method): Use baseclass_offset rather than baseclass_addr.
1992-10-06 09:22:43 +00:00
/* FIXME Fix remaining uses of baseclass_addr to use baseclass_offset */
1991-03-28 16:28:29 +00:00
char *
baseclass_addr (type, index, valaddr, valuep, errp)
1991-03-28 16:28:29 +00:00
struct type *type;
int index;
char *valaddr;
value *valuep;
int *errp;
1991-03-28 16:28:29 +00:00
{
struct type *basetype = TYPE_BASECLASS (type, index);
if (errp)
*errp = 0;
1991-03-28 16:28:29 +00:00
if (BASETYPE_VIA_VIRTUAL (type, index))
{
/* Must hunt for the pointer to this virtual baseclass. */
register int i, len = TYPE_NFIELDS (type);
register int n_baseclasses = TYPE_N_BASECLASSES (type);
/* First look for the virtual baseclass pointer
in the fields. */
for (i = n_baseclasses; i < len; i++)
{
if (vb_match (type, i, basetype))
1991-03-28 16:28:29 +00:00
{
value val = allocate_value (basetype);
CORE_ADDR addr;
int status;
addr
= unpack_pointer (TYPE_FIELD_TYPE (type, i),
valaddr + (TYPE_FIELD_BITPOS (type, i) / 8));
status = target_read_memory (addr,
VALUE_CONTENTS_RAW (val),
TYPE_LENGTH (basetype));
VALUE_LVAL (val) = lval_memory;
VALUE_ADDRESS (val) = addr;
if (status != 0)
{
if (valuep)
*valuep = NULL;
release_value (val);
value_free (val);
if (errp)
*errp = status;
return (char *)addr;
}
else
{
if (valuep)
*valuep = val;
return (char *) VALUE_CONTENTS (val);
}
1991-03-28 16:28:29 +00:00
}
}
/* Not in the fields, so try looking through the baseclasses. */
for (i = index+1; i < n_baseclasses; i++)
{
char *baddr;
baddr = baseclass_addr (type, i, valaddr, valuep, errp);
1991-03-28 16:28:29 +00:00
if (baddr)
return baddr;
}
/* Not found. */
if (valuep)
*valuep = 0;
return 0;
}
/* Baseclass is easily computed. */
if (valuep)
*valuep = 0;
return valaddr + TYPE_BASECLASS_BITPOS (type, index) / 8;
}
/* Unpack a field FIELDNO of the specified TYPE, from the anonymous object at
VALADDR.
Extracting bits depends on endianness of the machine. Compute the
number of least significant bits to discard. For big endian machines,
we compute the total number of bits in the anonymous object, subtract
off the bit count from the MSB of the object to the MSB of the
bitfield, then the size of the bitfield, which leaves the LSB discard
count. For little endian machines, the discard count is simply the
number of bits from the LSB of the anonymous object to the LSB of the
bitfield.
If the field is signed, we also do sign extension. */
LONGEST
1991-03-28 16:28:29 +00:00
unpack_field_as_long (type, valaddr, fieldno)
struct type *type;
char *valaddr;
int fieldno;
{
unsigned LONGEST val;
unsigned LONGEST valmask;
1991-03-28 16:28:29 +00:00
int bitpos = TYPE_FIELD_BITPOS (type, fieldno);
int bitsize = TYPE_FIELD_BITSIZE (type, fieldno);
int lsbcount;
1991-03-28 16:28:29 +00:00
val = extract_unsigned_integer (valaddr + bitpos / 8, sizeof (val));
/* Extract bits. See comment above. */
1991-03-28 16:28:29 +00:00
#if BITS_BIG_ENDIAN
lsbcount = (sizeof val * 8 - bitpos % 8 - bitsize);
1991-03-28 16:28:29 +00:00
#else
lsbcount = (bitpos % 8);
1991-03-28 16:28:29 +00:00
#endif
val >>= lsbcount;
1991-03-28 16:28:29 +00:00
/* If the field does not entirely fill a LONGEST, then zero the sign bits.
If the field is signed, and is negative, then sign extend. */
if ((bitsize > 0) && (bitsize < 8 * sizeof (val)))
{
valmask = (((unsigned LONGEST) 1) << bitsize) - 1;
val &= valmask;
if (!TYPE_UNSIGNED (TYPE_FIELD_TYPE (type, fieldno)))
{
if (val & (valmask ^ (valmask >> 1)))
{
val |= ~valmask;
}
}
}
return (val);
1991-03-28 16:28:29 +00:00
}
1991-04-05 09:02:10 +00:00
/* Modify the value of a bitfield. ADDR points to a block of memory in
target byte order; the bitfield starts in the byte pointed to. FIELDVAL
is the desired value of the field, in host byte order. BITPOS and BITSIZE
indicate which bits (in target bit order) comprise the bitfield. */
1991-03-28 16:28:29 +00:00
void
modify_field (addr, fieldval, bitpos, bitsize)
char *addr;
LONGEST fieldval;
1991-03-28 16:28:29 +00:00
int bitpos, bitsize;
{
LONGEST oword;
1991-03-28 16:28:29 +00:00
/* Reject values too big to fit in the field in question,
otherwise adjoining fields may be corrupted. */
1991-08-22 22:50:50 +00:00
if (bitsize < (8 * sizeof (fieldval))
&& 0 != (fieldval & ~((1<<bitsize)-1)))
{
/* FIXME: would like to include fieldval in the message, but
we don't have a sprintf_longest. */
error ("Value does not fit in %d bits.", bitsize);
}
oword = extract_signed_integer (addr, sizeof oword);
1991-03-28 16:28:29 +00:00
1991-04-05 09:02:10 +00:00
/* Shifting for bit field depends on endianness of the target machine. */
#if BITS_BIG_ENDIAN
1991-03-28 16:28:29 +00:00
bitpos = sizeof (oword) * 8 - bitpos - bitsize;
#endif
/* Mask out old value, while avoiding shifts >= size of oword */
if (bitsize < 8 * sizeof (oword))
oword &= ~(((((unsigned LONGEST)1) << bitsize) - 1) << bitpos);
else
oword &= ~((~(unsigned LONGEST)0) << bitpos);
1991-03-28 16:28:29 +00:00
oword |= fieldval << bitpos;
1991-04-05 09:02:10 +00:00
store_signed_integer (addr, sizeof oword, oword);
1991-03-28 16:28:29 +00:00
}
/* Convert C numbers into newly allocated values */
value
value_from_longest (type, num)
1991-03-28 16:28:29 +00:00
struct type *type;
register LONGEST num;
{
register value val = allocate_value (type);
register enum type_code code = TYPE_CODE (type);
register int len = TYPE_LENGTH (type);
switch (code)
1991-03-28 16:28:29 +00:00
{
case TYPE_CODE_INT:
case TYPE_CODE_CHAR:
case TYPE_CODE_ENUM:
case TYPE_CODE_BOOL:
store_signed_integer (VALUE_CONTENTS_RAW (val), len, num);
break;
case TYPE_CODE_REF:
case TYPE_CODE_PTR:
/* This assumes that all pointers of a given length
have the same form. */
store_address (VALUE_CONTENTS_RAW (val), len, (CORE_ADDR) num);
break;
default:
error ("Unexpected type encountered for integer constant.");
1991-03-28 16:28:29 +00:00
}
return val;
}
value
value_from_double (type, num)
struct type *type;
double num;
{
register value val = allocate_value (type);
register enum type_code code = TYPE_CODE (type);
register int len = TYPE_LENGTH (type);
if (code == TYPE_CODE_FLT)
{
if (len == sizeof (float))
* (float *) VALUE_CONTENTS_RAW (val) = num;
else if (len == sizeof (double))
* (double *) VALUE_CONTENTS_RAW (val) = num;
else
error ("Floating type encountered with unexpected data length.");
}
else
error ("Unexpected type encountered for floating constant.");
/* num was in host byte order. So now put the value's contents
into target byte order. */
SWAP_TARGET_AND_HOST (VALUE_CONTENTS_RAW (val), len);
return val;
}
/* Deal with the value that is "about to be returned". */
/* Return the value that a function returning now
would be returning to its caller, assuming its type is VALTYPE.
RETBUF is where we look for what ought to be the contents
of the registers (in raw form). This is because it is often
desirable to restore old values to those registers
after saving the contents of interest, and then call
this function using the saved values.
struct_return is non-zero when the function in question is
using the structure return conventions on the machine in question;
0 when it is using the value returning conventions (this often
means returning pointer to where structure is vs. returning value). */
value
value_being_returned (valtype, retbuf, struct_return)
register struct type *valtype;
char retbuf[REGISTER_BYTES];
int struct_return;
/*ARGSUSED*/
{
register value val;
CORE_ADDR addr;
#if defined (EXTRACT_STRUCT_VALUE_ADDRESS)
/* If this is not defined, just use EXTRACT_RETURN_VALUE instead. */
if (struct_return) {
addr = EXTRACT_STRUCT_VALUE_ADDRESS (retbuf);
if (!addr)
error ("Function return value unknown");
return value_at (valtype, addr);
}
#endif
val = allocate_value (valtype);
EXTRACT_RETURN_VALUE (valtype, retbuf, VALUE_CONTENTS_RAW (val));
return val;
}
/* Should we use EXTRACT_STRUCT_VALUE_ADDRESS instead of
EXTRACT_RETURN_VALUE? GCC_P is true if compiled with gcc
and TYPE is the type (which is known to be struct, union or array).
On most machines, the struct convention is used unless we are
using gcc and the type is of a special size. */
/* As of about 31 Mar 93, GCC was changed to be compatible with the
native compiler. GCC 2.3.3 was the last release that did it the
old way. Since gcc2_compiled was not changed, we have no
way to correctly win in all cases, so we just do the right thing
for gcc1 and for gcc2 after this change. Thus it loses for gcc
2.0-2.3.3. This is somewhat unfortunate, but changing gcc2_compiled
would cause more chaos than dealing with some struct returns being
handled wrong. */
1991-03-28 16:28:29 +00:00
#if !defined (USE_STRUCT_CONVENTION)
#define USE_STRUCT_CONVENTION(gcc_p, type)\
(!((gcc_p == 1) && (TYPE_LENGTH (value_type) == 1 \
|| TYPE_LENGTH (value_type) == 2 \
|| TYPE_LENGTH (value_type) == 4 \
|| TYPE_LENGTH (value_type) == 8 \
) \
1991-03-28 16:28:29 +00:00
))
#endif
/* Return true if the function specified is using the structure returning
convention on this machine to return arguments, or 0 if it is using
the value returning convention. FUNCTION is the value representing
the function, FUNCADDR is the address of the function, and VALUE_TYPE
is the type returned by the function. GCC_P is nonzero if compiled
with GCC. */
int
using_struct_return (function, funcaddr, value_type, gcc_p)
value function;
CORE_ADDR funcaddr;
struct type *value_type;
int gcc_p;
/*ARGSUSED*/
{
register enum type_code code = TYPE_CODE (value_type);
if (code == TYPE_CODE_ERROR)
error ("Function return type unknown.");
if (code == TYPE_CODE_STRUCT ||
code == TYPE_CODE_UNION ||
code == TYPE_CODE_ARRAY)
return USE_STRUCT_CONVENTION (gcc_p, value_type);
return 0;
}
/* Store VAL so it will be returned if a function returns now.
Does not verify that VAL's type matches what the current
function wants to return. */
void
set_return_value (val)
value val;
{
register enum type_code code = TYPE_CODE (VALUE_TYPE (val));
double dbuf;
LONGEST lbuf;
if (code == TYPE_CODE_ERROR)
error ("Function return type unknown.");
1991-11-27 09:43:59 +00:00
if ( code == TYPE_CODE_STRUCT
|| code == TYPE_CODE_UNION) /* FIXME, implement struct return. */
error ("GDB does not support specifying a struct or union return value.");
1991-03-28 16:28:29 +00:00
/* FIXME, this is bogus. We don't know what the return conventions
are, or how values should be promoted.... */
if (code == TYPE_CODE_FLT)
{
dbuf = value_as_double (val);
STORE_RETURN_VALUE (VALUE_TYPE (val), (char *)&dbuf);
}
else
{
lbuf = value_as_long (val);
STORE_RETURN_VALUE (VALUE_TYPE (val), (char *)&lbuf);
}
}
void
_initialize_values ()
{
1991-04-19 01:32:08 +00:00
add_cmd ("convenience", no_class, show_convenience,
1991-03-28 16:28:29 +00:00
"Debugger convenience (\"$foo\") variables.\n\
These variables are created when you assign them values;\n\
thus, \"print $foo=1\" gives \"$foo\" the value 1. Values may be any type.\n\n\
A few convenience variables are given values automatically:\n\
\"$_\"holds the last address examined with \"x\" or \"info lines\",\n\
1991-04-19 01:32:08 +00:00
\"$__\" holds the contents of the last address examined with \"x\".",
&showlist);
1991-03-28 16:28:29 +00:00
1991-04-19 01:32:08 +00:00
add_cmd ("values", no_class, show_values,
"Elements of value history around item number IDX (or last ten).",
&showlist);
1991-03-28 16:28:29 +00:00
}