binutils-gdb/gdb/values.c

1421 lines
42 KiB
C
Raw Normal View History

/* Low level packing and unpacking of values for GDB, the GNU Debugger.
Copyright 1986, 1987, 1989, 1991, 1993, 1994, 1995, 1996
Free Software Foundation, Inc.
1991-03-28 17:28:29 +01:00
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
1991-03-28 17:28:29 +01: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 17:28:29 +01:00
This program is distributed in the hope that it will be useful,
1991-03-28 17:28:29 +01: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
1995-08-02 05:41:12 +02:00
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
1991-03-28 17:28:29 +01:00
#include "defs.h"
* configure.in: Check for working mmap, ansi headers, string.h, strings.h, and memory.h. * configure: Regenerated. * gdb_stat.h: New file, "portable" <sys/stat.h>. * gdb_string.h: New file, "portable" <string.h>. * altos-xdep.c, arm-tdep.c, arm-xdep.c, convex-tdep.c, convex-xdep.c, coredep.c, cxux-nat.c, dbxread.c, exec.c, gould-xdep.c, hppa-tdep.c, i386aix-nat.c, i386b-nat.c, i386mach-nat.c, i386v-nat.c, infptrace.c, m88k-nat.c, main.c, mdebugread.c, objfiles.c, os9kread.c, procfs.c, pyr-xdep.c, rs6000-nat.c, source.c, standalone.c, stuff.c, sun386-nat.c, symfile.c, symm-nat.c, symm-tdep.c, symtab.c, top.c, ultra3-nat.c, ultra3-xdep.c, umax-xdep.c, xcoffread.c: Include "gdb_stat.h" instead of <sys/stat.h>. * alpha-tdep.c, breakpoint.c, buildsym.c, c-typeprint.c, ch-typeprint.c, coffread.c, command.c, core-sol2.c, core-svr4.c, core.c, corelow.c, cp-valprint.c, dbxread.c, dcache.c, demangle.c, dpx2-nat.c, dstread.c, dwarfread.c, elfread.c, environ.c, eval.c, exec.c, f-lang.c, f-typeprint.c, f-valprint.c, findvar.c, fork-child.c, gdbtypes.c, hpread.c, i386-tdep.c, infcmd.c, inflow.c, infptrace.c, infrun.c, irix5-nat.c, language.c, m2-typeprint.c, main.c, mdebugread.c, minsyms.c, mipsread.c, monitor.c, nlmread.c, objfiles.c, os9kread.c, osfsolib.c, parse.c, printcmd.c, procfs.c, regex.c, remote-adapt.c, remote-arc.c, remote-array.c, remote-bug.c, remote-e7000.c, remote-eb.c, remote-es.c, remote-hms.c, remote-mm.c, remote-os9k.c, remote-pa.c, remote-sim.c, remote-st.c, remote-udi.c, remote-utils.c, remote-vx.c, remote-vx29k.c, remote-vx68.c, remote-vx960.c, remote-vxmips.c, remote-vxsparc.c, remote.c, solib.c, somread.c, source.c, stabsread.c, stack.c, symfile.c, symmisc.c, symtab.c, target.c, top.c, typeprint.c, utils.c, valarith.c, valops.c, valprint.c, values.c, xcoffread.c: Include "gdb_string.h" instead of <string.h>. * gdbtk.c: Likewise. * config/xm-sysv4.h, i386/xm-ptx.h, m68k/xm-sun3os4.h, sparc/xm-sun4os4.h (HAVE_MMAP): Removed. * config/xm-lynx.h, config/i386/xm-ptx.h, config/m68k/nm-apollo68b.h, config/m68k/xm-hp300hpux.h, config/mips/xm-irix3.h, config/mips/xm-mips.h, config/mips/xm-news-mips.h, config/mips/xm-riscos.h, config/pa/hppah.h, config/rs6000/xm-rs6000.h, config/sparc/xm-sun4os4.h, config/sparc/xm-sun4sol2.h, config/vax/xm-vaxbsd.h, config/vax/xm-vaxult.h, config/vax/xm-vaxult2.h (MEM_FNS_DECLARED): Removed. * config/mips/xm-irix3.h, config/mips/xm-mips.h, config/pa/xm-hppah.h (memcpy, memset): Removed declarations.
1995-08-01 22:14:27 +02:00
#include "gdb_string.h"
1991-03-28 17:28:29 +01:00
#include "symtab.h"
#include "gdbtypes.h"
1991-03-28 17:28:29 +01:00
#include "value.h"
#include "gdbcore.h"
#include "frame.h"
#include "command.h"
1991-04-19 03:32:08 +02:00
#include "gdbcmd.h"
#include "target.h"
#include "language.h"
* core-aout.c (fetch_core_registers): Cast core_reg_size to int before testing against reg_ptr. * eval.c (evaluate_subexp_standard): Cast type of TYPE_FN_FIELD_VOFFSET to int. * findvar.c (extract_signed_integer, extract_unsigned_integer, extract_long_unsigned_integer): Cast type of sizeof to int. * values.c (unpack_field_as_long, modify_field): Ditto. * valops.c (value_assign, call_function_by_hand): Ditto. * infcmd.c (do_registers_info): Ditto. * ser-tcp.c (tcp_open): Ditto * remote.c (putpkt): Ditto. * dcache.c (dcache_peek): Ditto. * dcache.c (dcache_poke): Ditto. * m2-exp.y (yylex): Ditto. * gnu-regex.c (re_match_2): Ditto. * f-lang.c (ADD_BF_SYMNUM, saved_bf_list_end, tmp_bf_ptr): Ifdef out unused macro definition and variables. * inftarg.c (proc_wait): Move from main.c to here, and make static. * valprint.c (val_print_string): Change bufsize from int to unsigned. * main.c (wait.h): Include * top.c (command_line_input): Remove unused variable "c". * f-typeprint.c (f_type_print_varspec_prefix): Add missing enum value TYPE_CODE_TYPEDEF to switch statement. (f_type_print_varspec_suffix): Add missing enum value TYPE_CODE_TYPEDEF to switch statement. * ch-exp.c (parse_primval): Add remaining enumeration values to switch statement, with no specific action. (ch_lex): Add LOC_UNRESOLVED in switch statement. (pushback_token): Ifdef out, since code using it is ifdef'd out. * stabsread.c (cleanup_undefined_types): Remove unused label "badtype". * objfiles.h (print_symbol_bcache_statistics): Add prototype. * maint.c (objfiles.h): Include. (maintenance_print_statistics): Remove unused variable "temp". * minsyms.c (lookup_minimal_symbol_solib_trampoline): Remove unused variable "found_file_symbol". * m2-exp.y (yylex): Add LOC_UNRESOLVED case to switch. * language.c (lang_bool_type): Use existing function local type variable rather than create block local variables. * solib.c (disable_break): Enclose in ifndef SVR4_SHARED_LIBS. * infptrace.c (wait.h, command.h): Include. * ser-tcp.c (gdb_string.h): Include * i386-tdep.c (codestream_seek): Change "place" to CORE_ADDR. (i386_get_frame_setup): Change "pc" from int to CORE_ADDR. * command.c (complete_on_enum): Make assignment used as truth value explictly check against NULL. (wait.h): Include. * infrun.c (wait_for_inferior): Ifdef out prologue_pc since code that uses it is ifdef'd out. * parser-defs.h: Add prototype for write_dollar_variable. * infrun.c: Add prototype for write_pc_pid. * breakpoint.h: Add prototype for re_enable_breakpoints_in_shlibs. * symmisc.c (bcache.h): Include. * bcache.h: Add prototype for print_bcache_statistics. * symfile.c: Include <time.h>. * printcmd.c (print_scalar_formatted): Change len to unsigned int. * valarith.c (value_equal): Cast result of TYPE_LENGTH to int. * valarith.c (value_binop): Change result_len, promoted_len1, and promoted_len2 to unsigned int. * valarith.c (value_subscripted_rvalue): Change elt_offs and elt_size to unsigned int. * valops.c (value_array): Change typelength to unsigned int. (destructor_name_p): Change len to unsigned int. * scm-lang.h (scm_parse): Add prototype for scm_unpack. * symfile.c (decrement_reading_symtab): Change return type to void. * valarith.c (value_subscript): Remove unused variable "word". (value_subscript): Remove unused variable "tint". * valops.c (auto_abandon): Ifdef out, since code using it is also ifdef'd out. * eval.c (init_array_element): Remove unused variable "val". * Makefile.in (values.o): Depends on scm-lang.h. (command.o): Depends upon wait_h. (ser-tcp.o): Depends upon gdb_string.h. (infptrace.o): Depends upon wait_h and command_h. (maint.o): Depends on objfiles.h and symfile.h. * values.c (allocate_repeat_value): Remove unused variable "element_type". (scm-lang.h): Include. * breakpoint.c (create_longjmp_breakpoint): Enclose in GET_LONGJMP_TARGET define, unused otherwise. * config/i386/nm-linux.h: Add prototypes for i386_insert_watchpoint, i386_remove_watchpoint and i386_stopped_by_watchpoint.
1996-03-30 06:45:10 +01:00
#include "scm-lang.h"
#include "demangle.h"
1991-03-28 17:28:29 +01:00
/* Local function prototypes. */
static value_ptr value_headof PARAMS ((value_ptr, struct type *,
struct type *));
static void show_values PARAMS ((char *, int));
static void show_convenience PARAMS ((char *, int));
static int vb_match PARAMS ((struct type *, int, struct type *));
1991-03-28 17:28:29 +01: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_ptr values[VALUE_HISTORY_CHUNK];
1991-03-28 17:28:29 +01:00
};
/* 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_ptr all_values;
1991-03-28 17:28:29 +01:00
/* Allocate a value that has the correct length for type TYPE. */
value_ptr
1991-03-28 17:28:29 +01:00
allocate_value (type)
struct type *type;
{
register value_ptr val;
struct type *atype = check_typedef (type);
1991-03-28 17:28:29 +01:00
val = (struct value *) xmalloc (sizeof (struct value) + TYPE_LENGTH (atype));
1991-03-28 17:28:29 +01:00
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_REGNO (val) = -1;
VALUE_LAZY (val) = 0;
VALUE_OPTIMIZED_OUT (val) = 0;
val->modifiable = 1;
1991-03-28 17:28:29 +01:00
return val;
}
/* Allocate a value that has the correct length
for COUNT repetitions type TYPE. */
value_ptr
1991-03-28 17:28:29 +01:00
allocate_repeat_value (type, count)
struct type *type;
int count;
{
int low_bound = current_language->string_lower_bound; /* ??? */
/* FIXME-type-allocation: need a way to free this type when we are
done with it. */
struct type *range_type
= create_range_type ((struct type *) NULL, builtin_type_int,
low_bound, count + low_bound - 1);
/* FIXME-type-allocation: need a way to free this type when we are
done with it. */
return allocate_value (create_array_type ((struct type *) NULL,
type, range_type));
1991-03-28 17:28:29 +01:00
}
/* 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_ptr
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_ptr mark;
{
value_ptr val, next;
for (val = all_values; val && val != mark; val = next)
{
next = VALUE_NEXT (val);
value_free (val);
}
all_values = val;
}
1991-03-28 17:28:29 +01: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_ptr val, next;
1991-03-28 17:28:29 +01:00
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_ptr val;
1991-03-28 17:28:29 +01:00
{
register value_ptr v;
1991-03-28 17:28:29 +01:00
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;
}
}
}
* breakpoint.h (enum bptype): Add bp_hardware_watchpoint and bp_watchpoint_scope breakpoints. (struct breakpoint): Add val_chain and related_breakpoint fields for use by watchpoints. * breakpoint.c (within_scope): Delete. No longer used. (TARGET_CAN_USE_HARDWARE_WATCHPOINT): Provide default definition. (target_{remove,insert}_watchpoint): Likewise. (can_use_hardware_watchpoint): New function. (remove_breakpoint): New function to remove a single breakpoint or hardware watchpoint. (insert_breakpoints): Handle insertion of hardware watchpoints. Store a copy of the value chain derived from the watchpoint expression. (remove_breakpoints): Simplify by using remove_breakpoint. (delete_breakpoint): Likewise. (watchpoint_check): Delete the watchpoint and watchpoint scope breakpoints when the watchpoint goes out of scope. Save & restore the current frame after checking watchpoints. (breakpoint_init_inferior): Likewise (restarting the program makes all local watchpoints go out of scope). (bpstat_stop_status): Handle hardware watchpoints much like normal watchpoints. Delete the watchpoint and watchpoint scope breakpoint when the watchpoint goes out of scope. Remove and reinsert all breakpoints before returning if we stopped when a hardware watchpoint fired. (watch_command): Use a hardware watchpoint when possible. If watching a local expression, build a scope breakpoint too. (map_breakpoint_numbers): Also call given function for any related breakpoints. (disable_breakpoint): Never disable a scope breakpoint. (enable_breakpoint): Handle hardware breakpoints much like normal breakpoints, but recompute the watchpoint_scope breakpoint's frame and address (if we have an associated scope breakpoint). (read_memory_nobpt): Handle hardware watchpoints like normal watchpoints. When necessary handle watchpoint_scope breakpoints. (print_it_normal, bpstat_what, breakpoint_1, mention): Likewise. (clear_command, breakpoint_re_set_one, enable_command): Likewise. (disable_command): Likewise. * blockframe.c (find_frame_addr_in_frame_chain): New function. Extern prototype added to frame.h * infrun.c (wait_for_inferior): Set current_frame and select a frame before checking if we stopped due to a hardare watchpoint firing. Handle stepping over hardware watchpoints. (normal_stop): Remove unnecessary call to select_frame. * value.h (value_release_to_mark): Declare. * values.c (value_release_to_mark): New function. * procfs.c (procfs_wait): Add cases for hardware watchpoints. (procfs_set_watchpoint, procfs_stopped_by_watchpoint): New functions. * hppab-nat.c (hppa_set_watchpoint): New function. * config/pa/nm-hppab.h (STOPPED_BY_WATCHPOINT): Define. (HAVE_STEPPABLE_WATCHPOINT): Define. (TARGET_CAN_USE_HARDWARE_WATCHPOINT): Define. (target_{insert,delete}_watchpoint): Define.
1994-04-13 23:57:00 +02:00
/* Release all values up to mark */
value_ptr
value_release_to_mark (mark)
value_ptr mark;
{
value_ptr val, next;
for (val = next = all_values; next; next = VALUE_NEXT (next))
if (VALUE_NEXT (next) == mark)
{
all_values = VALUE_NEXT (next);
VALUE_NEXT (next) = 0;
return val;
}
all_values = 0;
return val;
}
1991-03-28 17:28:29 +01:00
/* 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_ptr
1991-03-28 17:28:29 +01:00
value_copy (arg)
value_ptr arg;
1991-03-28 17:28:29 +01:00
{
register struct type *type = VALUE_TYPE (arg);
register value_ptr val = allocate_value (type);
1991-03-28 17:28:29 +01:00
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_FRAME (val) = VALUE_FRAME (arg);
1991-03-28 17:28:29 +01:00
VALUE_REGNO (val) = VALUE_REGNO (arg);
VALUE_LAZY (val) = VALUE_LAZY (arg);
VALUE_OPTIMIZED_OUT (val) = VALUE_OPTIMIZED_OUT (arg);
val->modifiable = arg->modifiable;
1991-03-28 17:28:29 +01:00
if (!VALUE_LAZY (val))
{
memcpy (VALUE_CONTENTS_RAW (val), VALUE_CONTENTS_RAW (arg),
TYPE_LENGTH (VALUE_TYPE (arg)));
1991-03-28 17:28:29 +01: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_ptr val;
1991-03-28 17:28:29 +01:00
{
int i;
/* 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);
/* We preserve VALUE_LVAL so that the user can find out where it was fetched
from. This is a bit dubious, because then *&$1 does not just return $1
but the current contents of that location. c'est la vie... */
val->modifiable = 0;
release_value (val);
1991-03-28 17:28:29 +01: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 17:28:29 +01:00
new->next = value_history_chain;
value_history_chain = new;
}
value_history_chain->values[i] = val;
1991-03-28 17:28:29 +01:00
/* 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_ptr
1991-03-28 17:28:29 +01:00
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_ptr val;
1991-03-28 17:28:29 +01:00
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 21:21:32 +01:00
if ((val = value_history_chain->values[i]) != NULL)
1992-03-30 01:26:47 +02:00
free ((PTR)val);
1991-03-28 17:28:29 +01:00
next = value_history_chain->next;
1992-03-30 01:26:47 +02:00
free ((PTR)value_history_chain);
1991-03-28 17:28:29 +01:00
value_history_chain = next;
}
value_history_count = 0;
}
static void
1991-04-19 03:32:08 +02:00
show_values (num_exp, from_tty)
1991-03-28 17:28:29 +01:00
char *num_exp;
int from_tty;
{
register int i;
register value_ptr val;
1991-03-28 17:28:29 +01:00
static int num = 1;
if (num_exp)
{
1993-09-08 22:15:34 +02: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 17:28:29 +01: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, gdb_stdout, 0, Val_pretty_default);
1991-03-28 17:28:29 +01:00
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 07:34:57 +01:00
if (STREQ (var->name, name))
1991-03-28 17:28:29 +01:00
return var;
var = (struct internalvar *) xmalloc (sizeof (struct internalvar));
var->name = concat (name, NULL);
1991-03-28 17:28:29 +01:00
var->value = allocate_value (builtin_type_void);
release_value (var->value);
var->next = internalvars;
internalvars = var;
return var;
}
value_ptr
1991-03-28 17:28:29 +01:00
value_of_internalvar (var)
struct internalvar *var;
{
register value_ptr val;
1991-03-28 17:28:29 +01:00
#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_ptr newval;
1991-03-28 17:28:29 +01:00
{
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 17:28:29 +01:00
bitpos, bitsize);
else
memcpy (addr, VALUE_CONTENTS (newval), TYPE_LENGTH (VALUE_TYPE (newval)));
1991-03-28 17:28:29 +01:00
}
void
set_internalvar (var, val)
struct internalvar *var;
value_ptr val;
1991-03-28 17:28:29 +01:00
{
value_ptr newval;
1991-03-28 17:28:29 +01:00
#ifdef IS_TRAPPED_INTERNALVAR
if (IS_TRAPPED_INTERNALVAR (var->name))
SET_TRAPPED_INTERNALVAR (var, val, 0, 0, 0);
#endif
newval = value_copy (val);
newval->modifiable = 1;
/* 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 (newval))
value_fetch_lazy (newval);
/* Begin code which must not call error(). If var->value points to
something free'd, an error() obviously leaves a dangling pointer.
But we also get a danling pointer if var->value points to
something in the value chain (i.e., before release_value is
called), because after the error free_all_values will get called before
long. */
free ((PTR)var->value);
var->value = newval;
release_value (newval);
/* End code which must not call error(). */
1991-03-28 17:28:29 +01:00
}
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-30 01:26:47 +02:00
free ((PTR)var->name);
free ((PTR)var->value);
free ((PTR)var);
1991-03-28 17:28:29 +01:00
}
}
static void
show_convenience (ignore, from_tty)
char *ignore;
int from_tty;
1991-03-28 17:28:29 +01: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);
value_print (var->value, gdb_stdout, 0, Val_pretty_default);
printf_filtered ("\n");
1991-03-28 17:28:29 +01:00
}
if (!varseen)
printf_unfiltered ("No debugger convenience variables now defined.\n\
1991-03-28 17:28:29 +01:00
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_ptr val;
1991-03-28 17:28:29 +01:00
{
/* 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. */
COERCE_ARRAY (val);
1991-03-28 17:28:29 +01:00
return unpack_long (VALUE_TYPE (val), VALUE_CONTENTS (val));
}
* Add native support for long double data type. * c-exp.y (%union): Change dval to typed_val_float. Use DOUBLEST to store actual data. Change types of INT and FLOAT tokens to typed_val_int and typed_val_float respectively. Create new token DOUBLE_KEYWORD to specify the string `double'. Make production for FLOAT use type determined by parse_number. Add production for "long double" data type. * (parse_number): Use sscanf to parse numbers as float, double or long double depending upon the type of typed_val_float.dval. Also allow user to specify `f' or `l' suffix to explicitly specify float or long double constants. Change typed_val to typed_val_int. * (yylex): Change typed_val to typed_val_int. Also, scan for "double" keyword. * coffread.c (decode_base_type): Add support for T_LNGDBL basic type. * configure, configure.in: Add check for long double support in the host compiler. * defs.h: Define DOUBLEST appropriatly depending on whether HAVE_LONG_DOUBLE (from autoconf) is defined. Also, fix prototypes for functions that handle this type. * expression.h (union exp_element): doubleconst is now type DOUBLEST. * m2-exp.y f-exp.y (%union): dval becomes type DOUBLEST. * findvar.c (extract_floating): Make return value be DOUBLEST. Also, add support for numbers with size of long double. * (store_floating): Arg `val' is now type DOUBLEST. Handle all floating types. * parser-defs.h parse.c (write_exp_elt_dblcst): Arg expelt is now DOUBLEST. * valarith.c (value_binop): Change temp variables v1, v2 and v to type DOUBLEST. Coerce type of result to long double if either op was of that type. * valops.c (value_arg_coerce): If argument type is bigger than double, coerce to long double. * (call_function_by_hand): If REG_STRUCT_HAS_ADDR is defined, and arg type is float and > 8 bytes, then use pointer-to-object calling conventions. * valprint.c (print_floating): Arg doub is now type DOUBLEST. Use appropriate format and precision to print out floating point values. * value.h: Fixup prototypes for value_as_double, value_from_double, and unpack_double to use DOUBLEST. * values.c (record_latest_value): Remove check for invalid floats. Allow history to store them so that people may examine them in hex if they want. * (value_as_double unpack_double): Change return value to DOUBLEST. * (value_from_double): Arg `num' is now DOUBLEST. * (using_struct_return): Use RETURN_VALUE_ON_STACK macro (target specific) to expect certain types to always be returned on the stack.
1996-02-17 01:07:35 +01:00
DOUBLEST
1991-03-28 17:28:29 +01:00
value_as_double (val)
register value_ptr val;
1991-03-28 17:28:29 +01:00
{
* Add native support for long double data type. * c-exp.y (%union): Change dval to typed_val_float. Use DOUBLEST to store actual data. Change types of INT and FLOAT tokens to typed_val_int and typed_val_float respectively. Create new token DOUBLE_KEYWORD to specify the string `double'. Make production for FLOAT use type determined by parse_number. Add production for "long double" data type. * (parse_number): Use sscanf to parse numbers as float, double or long double depending upon the type of typed_val_float.dval. Also allow user to specify `f' or `l' suffix to explicitly specify float or long double constants. Change typed_val to typed_val_int. * (yylex): Change typed_val to typed_val_int. Also, scan for "double" keyword. * coffread.c (decode_base_type): Add support for T_LNGDBL basic type. * configure, configure.in: Add check for long double support in the host compiler. * defs.h: Define DOUBLEST appropriatly depending on whether HAVE_LONG_DOUBLE (from autoconf) is defined. Also, fix prototypes for functions that handle this type. * expression.h (union exp_element): doubleconst is now type DOUBLEST. * m2-exp.y f-exp.y (%union): dval becomes type DOUBLEST. * findvar.c (extract_floating): Make return value be DOUBLEST. Also, add support for numbers with size of long double. * (store_floating): Arg `val' is now type DOUBLEST. Handle all floating types. * parser-defs.h parse.c (write_exp_elt_dblcst): Arg expelt is now DOUBLEST. * valarith.c (value_binop): Change temp variables v1, v2 and v to type DOUBLEST. Coerce type of result to long double if either op was of that type. * valops.c (value_arg_coerce): If argument type is bigger than double, coerce to long double. * (call_function_by_hand): If REG_STRUCT_HAS_ADDR is defined, and arg type is float and > 8 bytes, then use pointer-to-object calling conventions. * valprint.c (print_floating): Arg doub is now type DOUBLEST. Use appropriate format and precision to print out floating point values. * value.h: Fixup prototypes for value_as_double, value_from_double, and unpack_double to use DOUBLEST. * values.c (record_latest_value): Remove check for invalid floats. Allow history to store them so that people may examine them in hex if they want. * (value_as_double unpack_double): Change return value to DOUBLEST. * (value_from_double): Arg `num' is now DOUBLEST. * (using_struct_return): Use RETURN_VALUE_ON_STACK macro (target specific) to expect certain types to always be returned on the stack.
1996-02-17 01:07:35 +01:00
DOUBLEST foo;
1991-03-28 17:28:29 +01:00
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_ptr val;
{
1991-05-03 02:50:18 +02: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 17:28:29 +01: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. */
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 (current_language->la_language == language_scm
&& is_scmvalue_type (type))
return scm_unpack (type, valaddr, TYPE_CODE_INT);
switch (code)
1991-03-28 17:28:29 +01:00
{
case TYPE_CODE_TYPEDEF:
return unpack_long (check_typedef (type), valaddr);
case TYPE_CODE_ENUM:
case TYPE_CODE_BOOL:
case TYPE_CODE_INT:
case TYPE_CODE_CHAR:
case TYPE_CODE_RANGE:
if (nosign)
return extract_unsigned_integer (valaddr, len);
1991-03-28 17:28:29 +01:00
else
return extract_signed_integer (valaddr, len);
case TYPE_CODE_FLT:
return extract_floating (valaddr, len);
case TYPE_CODE_PTR:
case TYPE_CODE_REF:
/* Assume a CORE_ADDR can fit in a LONGEST (for now). Not sure
whether we want this to be true eventually. */
return extract_address (valaddr, len);
1991-03-28 17:28:29 +01:00
case TYPE_CODE_MEMBER:
error ("not implemented: member types in unpack_long");
default:
error ("Value can't be converted to integer.");
}
return 0; /* Placate lint. */
1991-03-28 17:28:29 +01:00
}
/* 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. */
* Add native support for long double data type. * c-exp.y (%union): Change dval to typed_val_float. Use DOUBLEST to store actual data. Change types of INT and FLOAT tokens to typed_val_int and typed_val_float respectively. Create new token DOUBLE_KEYWORD to specify the string `double'. Make production for FLOAT use type determined by parse_number. Add production for "long double" data type. * (parse_number): Use sscanf to parse numbers as float, double or long double depending upon the type of typed_val_float.dval. Also allow user to specify `f' or `l' suffix to explicitly specify float or long double constants. Change typed_val to typed_val_int. * (yylex): Change typed_val to typed_val_int. Also, scan for "double" keyword. * coffread.c (decode_base_type): Add support for T_LNGDBL basic type. * configure, configure.in: Add check for long double support in the host compiler. * defs.h: Define DOUBLEST appropriatly depending on whether HAVE_LONG_DOUBLE (from autoconf) is defined. Also, fix prototypes for functions that handle this type. * expression.h (union exp_element): doubleconst is now type DOUBLEST. * m2-exp.y f-exp.y (%union): dval becomes type DOUBLEST. * findvar.c (extract_floating): Make return value be DOUBLEST. Also, add support for numbers with size of long double. * (store_floating): Arg `val' is now type DOUBLEST. Handle all floating types. * parser-defs.h parse.c (write_exp_elt_dblcst): Arg expelt is now DOUBLEST. * valarith.c (value_binop): Change temp variables v1, v2 and v to type DOUBLEST. Coerce type of result to long double if either op was of that type. * valops.c (value_arg_coerce): If argument type is bigger than double, coerce to long double. * (call_function_by_hand): If REG_STRUCT_HAS_ADDR is defined, and arg type is float and > 8 bytes, then use pointer-to-object calling conventions. * valprint.c (print_floating): Arg doub is now type DOUBLEST. Use appropriate format and precision to print out floating point values. * value.h: Fixup prototypes for value_as_double, value_from_double, and unpack_double to use DOUBLEST. * values.c (record_latest_value): Remove check for invalid floats. Allow history to store them so that people may examine them in hex if they want. * (value_as_double unpack_double): Change return value to DOUBLEST. * (value_from_double): Arg `num' is now DOUBLEST. * (using_struct_return): Use RETURN_VALUE_ON_STACK macro (target specific) to expect certain types to always be returned on the stack.
1996-02-17 01:07:35 +01:00
DOUBLEST
1991-03-28 17:28:29 +01:00
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. */
CHECK_TYPEDEF (type);
1991-03-28 17:28:29 +01:00
if (code == TYPE_CODE_FLT)
{
#ifdef INVALID_FLOAT
1991-03-28 17:28:29 +01:00
if (INVALID_FLOAT (valaddr, len))
{
*invp = 1;
return 1.234567891011121314;
}
#endif
return extract_floating (valaddr, len);
}
else if (nosign)
{
/* Unsigned -- be sure we compensate for signed LONGEST. */
return (unsigned LONGEST) unpack_long (type, valaddr);
}
else
{
/* Signed -- we are OK with unpack_long. */
return unpack_long (type, valaddr);
1991-03-28 17:28:29 +01:00
}
}
/* 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 02:50:18 +02: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 17:28:29 +01: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_ptr
1991-03-28 17:28:29 +01:00
value_primitive_field (arg1, offset, fieldno, arg_type)
register value_ptr arg1;
1991-03-28 17:28:29 +01:00
int offset;
register int fieldno;
register struct type *arg_type;
{
register value_ptr v;
1991-03-28 17:28:29 +01:00
register struct type *type;
CHECK_TYPEDEF (arg_type);
1991-03-28 17:28:29 +01:00
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 17:28:29 +01: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 17:28:29 +01: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_ptr
1991-03-28 17:28:29 +01:00
value_field (arg1, fieldno)
register value_ptr arg1;
1991-03-28 17:28:29 +01:00
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. */
value_ptr
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 10:22:43 +01:00
value_fn_field (arg1p, f, j, type, offset)
value_ptr *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 10:22:43 +01:00
struct type *type;
int offset;
1991-03-28 17:28:29 +01:00
{
register value_ptr 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 10:22:43 +01:00
register struct type *ftype = TYPE_FN_FIELD_TYPE (f, j);
1991-03-28 17:28:29 +01:00
struct symbol *sym;
sym = lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, j),
1991-03-28 17:28:29 +01:00
0, VAR_NAMESPACE, 0, NULL);
if (! sym)
return NULL;
/*
error ("Internal error: could not find physical method named %s",
TYPE_FN_FIELD_PHYSNAME (f, j));
*/
1991-03-28 17:28:29 +01: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 10:22:43 +01:00
v = allocate_value (ftype);
1991-03-28 17:28:29 +01: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 10:22:43 +01: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 10:22:43 +01: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 10:22:43 +01:00
}
1991-03-28 17:28:29 +01: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 10:22:43 +01:00
table pointer. *ARG1P is side-effected in calling this function.
1991-03-28 17:28:29 +01: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. */
value_ptr
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 10:22:43 +01:00
value_virtual_fn_field (arg1p, f, j, type, offset)
value_ptr *arg1p;
1991-03-28 17:28:29 +01: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 10:22:43 +01:00
int offset;
1991-03-28 17:28:29 +01:00
{
value_ptr arg1 = *arg1p;
struct type *type1 = check_typedef (VALUE_TYPE (arg1));
struct type *entry_type;
1991-03-28 17:28:29 +01: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_ptr entry, vfn, vtbl;
value_ptr vi = value_from_longest (builtin_type_int,
(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. */
if (TYPE_TARGET_TYPE (context) != type1)
{
arg1 = value_ind (value_cast (context, value_addr (arg1)));
type1 = check_typedef (VALUE_TYPE (arg1));
}
1991-03-28 17:28:29 +01:00
context = type1;
/* Now context is the basetype containing the vtbl. */
1991-03-28 17:28:29 +01: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 17:28:29 +01: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 10:22:43 +01:00
vtbl = value_ind (value_primitive_field (arg1, 0,
TYPE_VPTR_FIELDNO (context),
TYPE_VPTR_BASETYPE (context)));
1991-03-28 17:28:29 +01: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);
entry_type = check_typedef (VALUE_TYPE (entry));
1991-03-28 17:28:29 +01:00
if (TYPE_CODE (entry_type) == TYPE_CODE_STRUCT)
1991-03-28 17:28:29 +01:00
{
/* Move the `this' pointer according to the virtual function table. */
VALUE_OFFSET (arg1) += value_as_long (value_field (entry, 0));
if (! VALUE_LAZY (arg1))
{
VALUE_LAZY (arg1) = 1;
value_fetch_lazy (arg1);
}
1991-03-28 17:28:29 +01:00
vfn = value_field (entry, 2);
}
else if (TYPE_CODE (entry_type) == TYPE_CODE_PTR)
vfn = entry;
else
error ("I'm confused: virtual function table has bad type");
1991-03-28 17:28:29 +01:00
/* 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 10:22:43 +01:00
*arg1p = arg1;
1991-03-28 17:28:29 +01: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_ptr
value_headof (in_arg, btype, dtype)
value_ptr 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_ptr 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_TYPEDEF (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
|| (demangled_name = SYMBOL_NAME (msymbol)) == NULL
|| !VTBL_PREFIX_P (demangled_name))
{
/* 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));
/* This won't work if we're using thunks. */
if (TYPE_CODE (check_typedef (VALUE_TYPE (entry))) != TYPE_CODE_STRUCT)
break;
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 07:34:57 +01: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_ptr
value_from_vtable_info (arg, type)
value_ptr 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)
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' && is_cplus_marker (name[3]))
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 10:22:43 +01:00
/* Compute the offset of the baseclass which is
the INDEXth baseclass of class TYPE,
for value at VALADDR (in host) at ADDRESS (in target).
The result is the offset of the baseclass value relative
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 10:22:43 +01:00
to (the address of)(ARG) + OFFSET.
-1 is returned on error. */
int
baseclass_offset (type, index, valaddr, address)
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 10:22:43 +01:00
struct type *type;
int index;
char *valaddr;
CORE_ADDR address;
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 10:22:43 +01:00
{
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 10:22:43 +01:00
{
CORE_ADDR addr
= unpack_pointer (TYPE_FIELD_TYPE (type, i),
valaddr + (TYPE_FIELD_BITPOS (type, i) / 8));
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 10:22:43 +01:00
return addr - (LONGEST) address;
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 10:22:43 +01:00
}
}
/* Not in the fields, so try looking through the baseclasses. */
for (i = index+1; i < n_baseclasses; i++)
{
int boffset =
baseclass_offset (type, i, valaddr, address);
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 10:22:43 +01:00
if (boffset)
return boffset;
}
/* Not found. */
return -1;
}
/* Baseclass is easily computed. */
return TYPE_BASECLASS_BITPOS (type, index) / 8;
}
1991-03-28 17:28:29 +01:00
/* 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 17:28:29 +01:00
unpack_field_as_long (type, valaddr, fieldno)
struct type *type;
char *valaddr;
int fieldno;
{
unsigned LONGEST val;
unsigned LONGEST valmask;
1991-03-28 17:28:29 +01:00
int bitpos = TYPE_FIELD_BITPOS (type, fieldno);
int bitsize = TYPE_FIELD_BITSIZE (type, fieldno);
int lsbcount;
1991-03-28 17:28:29 +01:00
val = extract_unsigned_integer (valaddr + bitpos / 8, sizeof (val));
/* Extract bits. See comment above. */
1991-03-28 17:28:29 +01:00
if (BITS_BIG_ENDIAN)
lsbcount = (sizeof val * 8 - bitpos % 8 - bitsize);
else
lsbcount = (bitpos % 8);
val >>= lsbcount;
1991-03-28 17:28:29 +01: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. */
* core-aout.c (fetch_core_registers): Cast core_reg_size to int before testing against reg_ptr. * eval.c (evaluate_subexp_standard): Cast type of TYPE_FN_FIELD_VOFFSET to int. * findvar.c (extract_signed_integer, extract_unsigned_integer, extract_long_unsigned_integer): Cast type of sizeof to int. * values.c (unpack_field_as_long, modify_field): Ditto. * valops.c (value_assign, call_function_by_hand): Ditto. * infcmd.c (do_registers_info): Ditto. * ser-tcp.c (tcp_open): Ditto * remote.c (putpkt): Ditto. * dcache.c (dcache_peek): Ditto. * dcache.c (dcache_poke): Ditto. * m2-exp.y (yylex): Ditto. * gnu-regex.c (re_match_2): Ditto. * f-lang.c (ADD_BF_SYMNUM, saved_bf_list_end, tmp_bf_ptr): Ifdef out unused macro definition and variables. * inftarg.c (proc_wait): Move from main.c to here, and make static. * valprint.c (val_print_string): Change bufsize from int to unsigned. * main.c (wait.h): Include * top.c (command_line_input): Remove unused variable "c". * f-typeprint.c (f_type_print_varspec_prefix): Add missing enum value TYPE_CODE_TYPEDEF to switch statement. (f_type_print_varspec_suffix): Add missing enum value TYPE_CODE_TYPEDEF to switch statement. * ch-exp.c (parse_primval): Add remaining enumeration values to switch statement, with no specific action. (ch_lex): Add LOC_UNRESOLVED in switch statement. (pushback_token): Ifdef out, since code using it is ifdef'd out. * stabsread.c (cleanup_undefined_types): Remove unused label "badtype". * objfiles.h (print_symbol_bcache_statistics): Add prototype. * maint.c (objfiles.h): Include. (maintenance_print_statistics): Remove unused variable "temp". * minsyms.c (lookup_minimal_symbol_solib_trampoline): Remove unused variable "found_file_symbol". * m2-exp.y (yylex): Add LOC_UNRESOLVED case to switch. * language.c (lang_bool_type): Use existing function local type variable rather than create block local variables. * solib.c (disable_break): Enclose in ifndef SVR4_SHARED_LIBS. * infptrace.c (wait.h, command.h): Include. * ser-tcp.c (gdb_string.h): Include * i386-tdep.c (codestream_seek): Change "place" to CORE_ADDR. (i386_get_frame_setup): Change "pc" from int to CORE_ADDR. * command.c (complete_on_enum): Make assignment used as truth value explictly check against NULL. (wait.h): Include. * infrun.c (wait_for_inferior): Ifdef out prologue_pc since code that uses it is ifdef'd out. * parser-defs.h: Add prototype for write_dollar_variable. * infrun.c: Add prototype for write_pc_pid. * breakpoint.h: Add prototype for re_enable_breakpoints_in_shlibs. * symmisc.c (bcache.h): Include. * bcache.h: Add prototype for print_bcache_statistics. * symfile.c: Include <time.h>. * printcmd.c (print_scalar_formatted): Change len to unsigned int. * valarith.c (value_equal): Cast result of TYPE_LENGTH to int. * valarith.c (value_binop): Change result_len, promoted_len1, and promoted_len2 to unsigned int. * valarith.c (value_subscripted_rvalue): Change elt_offs and elt_size to unsigned int. * valops.c (value_array): Change typelength to unsigned int. (destructor_name_p): Change len to unsigned int. * scm-lang.h (scm_parse): Add prototype for scm_unpack. * symfile.c (decrement_reading_symtab): Change return type to void. * valarith.c (value_subscript): Remove unused variable "word". (value_subscript): Remove unused variable "tint". * valops.c (auto_abandon): Ifdef out, since code using it is also ifdef'd out. * eval.c (init_array_element): Remove unused variable "val". * Makefile.in (values.o): Depends on scm-lang.h. (command.o): Depends upon wait_h. (ser-tcp.o): Depends upon gdb_string.h. (infptrace.o): Depends upon wait_h and command_h. (maint.o): Depends on objfiles.h and symfile.h. * values.c (allocate_repeat_value): Remove unused variable "element_type". (scm-lang.h): Include. * breakpoint.c (create_longjmp_breakpoint): Enclose in GET_LONGJMP_TARGET define, unused otherwise. * config/i386/nm-linux.h: Add prototypes for i386_insert_watchpoint, i386_remove_watchpoint and i386_stopped_by_watchpoint.
1996-03-30 06:45:10 +01:00
if ((bitsize > 0) && (bitsize < 8 * (int) 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 17:28:29 +01:00
}
1991-04-05 11:02:10 +02: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 17:28:29 +01:00
void
modify_field (addr, fieldval, bitpos, bitsize)
char *addr;
LONGEST fieldval;
1991-03-28 17:28:29 +01:00
int bitpos, bitsize;
{
LONGEST oword;
1991-03-28 17:28:29 +01:00
/* If a negative fieldval fits in the field in question, chop
off the sign extension bits. */
* core-aout.c (fetch_core_registers): Cast core_reg_size to int before testing against reg_ptr. * eval.c (evaluate_subexp_standard): Cast type of TYPE_FN_FIELD_VOFFSET to int. * findvar.c (extract_signed_integer, extract_unsigned_integer, extract_long_unsigned_integer): Cast type of sizeof to int. * values.c (unpack_field_as_long, modify_field): Ditto. * valops.c (value_assign, call_function_by_hand): Ditto. * infcmd.c (do_registers_info): Ditto. * ser-tcp.c (tcp_open): Ditto * remote.c (putpkt): Ditto. * dcache.c (dcache_peek): Ditto. * dcache.c (dcache_poke): Ditto. * m2-exp.y (yylex): Ditto. * gnu-regex.c (re_match_2): Ditto. * f-lang.c (ADD_BF_SYMNUM, saved_bf_list_end, tmp_bf_ptr): Ifdef out unused macro definition and variables. * inftarg.c (proc_wait): Move from main.c to here, and make static. * valprint.c (val_print_string): Change bufsize from int to unsigned. * main.c (wait.h): Include * top.c (command_line_input): Remove unused variable "c". * f-typeprint.c (f_type_print_varspec_prefix): Add missing enum value TYPE_CODE_TYPEDEF to switch statement. (f_type_print_varspec_suffix): Add missing enum value TYPE_CODE_TYPEDEF to switch statement. * ch-exp.c (parse_primval): Add remaining enumeration values to switch statement, with no specific action. (ch_lex): Add LOC_UNRESOLVED in switch statement. (pushback_token): Ifdef out, since code using it is ifdef'd out. * stabsread.c (cleanup_undefined_types): Remove unused label "badtype". * objfiles.h (print_symbol_bcache_statistics): Add prototype. * maint.c (objfiles.h): Include. (maintenance_print_statistics): Remove unused variable "temp". * minsyms.c (lookup_minimal_symbol_solib_trampoline): Remove unused variable "found_file_symbol". * m2-exp.y (yylex): Add LOC_UNRESOLVED case to switch. * language.c (lang_bool_type): Use existing function local type variable rather than create block local variables. * solib.c (disable_break): Enclose in ifndef SVR4_SHARED_LIBS. * infptrace.c (wait.h, command.h): Include. * ser-tcp.c (gdb_string.h): Include * i386-tdep.c (codestream_seek): Change "place" to CORE_ADDR. (i386_get_frame_setup): Change "pc" from int to CORE_ADDR. * command.c (complete_on_enum): Make assignment used as truth value explictly check against NULL. (wait.h): Include. * infrun.c (wait_for_inferior): Ifdef out prologue_pc since code that uses it is ifdef'd out. * parser-defs.h: Add prototype for write_dollar_variable. * infrun.c: Add prototype for write_pc_pid. * breakpoint.h: Add prototype for re_enable_breakpoints_in_shlibs. * symmisc.c (bcache.h): Include. * bcache.h: Add prototype for print_bcache_statistics. * symfile.c: Include <time.h>. * printcmd.c (print_scalar_formatted): Change len to unsigned int. * valarith.c (value_equal): Cast result of TYPE_LENGTH to int. * valarith.c (value_binop): Change result_len, promoted_len1, and promoted_len2 to unsigned int. * valarith.c (value_subscripted_rvalue): Change elt_offs and elt_size to unsigned int. * valops.c (value_array): Change typelength to unsigned int. (destructor_name_p): Change len to unsigned int. * scm-lang.h (scm_parse): Add prototype for scm_unpack. * symfile.c (decrement_reading_symtab): Change return type to void. * valarith.c (value_subscript): Remove unused variable "word". (value_subscript): Remove unused variable "tint". * valops.c (auto_abandon): Ifdef out, since code using it is also ifdef'd out. * eval.c (init_array_element): Remove unused variable "val". * Makefile.in (values.o): Depends on scm-lang.h. (command.o): Depends upon wait_h. (ser-tcp.o): Depends upon gdb_string.h. (infptrace.o): Depends upon wait_h and command_h. (maint.o): Depends on objfiles.h and symfile.h. * values.c (allocate_repeat_value): Remove unused variable "element_type". (scm-lang.h): Include. * breakpoint.c (create_longjmp_breakpoint): Enclose in GET_LONGJMP_TARGET define, unused otherwise. * config/i386/nm-linux.h: Add prototypes for i386_insert_watchpoint, i386_remove_watchpoint and i386_stopped_by_watchpoint.
1996-03-30 06:45:10 +01:00
if (bitsize < (8 * (int) sizeof (fieldval))
&& (~fieldval & ~((1 << (bitsize - 1)) - 1)) == 0)
fieldval = fieldval & ((1 << bitsize) - 1);
/* Warn if value is too big to fit in the field in question. */
* core-aout.c (fetch_core_registers): Cast core_reg_size to int before testing against reg_ptr. * eval.c (evaluate_subexp_standard): Cast type of TYPE_FN_FIELD_VOFFSET to int. * findvar.c (extract_signed_integer, extract_unsigned_integer, extract_long_unsigned_integer): Cast type of sizeof to int. * values.c (unpack_field_as_long, modify_field): Ditto. * valops.c (value_assign, call_function_by_hand): Ditto. * infcmd.c (do_registers_info): Ditto. * ser-tcp.c (tcp_open): Ditto * remote.c (putpkt): Ditto. * dcache.c (dcache_peek): Ditto. * dcache.c (dcache_poke): Ditto. * m2-exp.y (yylex): Ditto. * gnu-regex.c (re_match_2): Ditto. * f-lang.c (ADD_BF_SYMNUM, saved_bf_list_end, tmp_bf_ptr): Ifdef out unused macro definition and variables. * inftarg.c (proc_wait): Move from main.c to here, and make static. * valprint.c (val_print_string): Change bufsize from int to unsigned. * main.c (wait.h): Include * top.c (command_line_input): Remove unused variable "c". * f-typeprint.c (f_type_print_varspec_prefix): Add missing enum value TYPE_CODE_TYPEDEF to switch statement. (f_type_print_varspec_suffix): Add missing enum value TYPE_CODE_TYPEDEF to switch statement. * ch-exp.c (parse_primval): Add remaining enumeration values to switch statement, with no specific action. (ch_lex): Add LOC_UNRESOLVED in switch statement. (pushback_token): Ifdef out, since code using it is ifdef'd out. * stabsread.c (cleanup_undefined_types): Remove unused label "badtype". * objfiles.h (print_symbol_bcache_statistics): Add prototype. * maint.c (objfiles.h): Include. (maintenance_print_statistics): Remove unused variable "temp". * minsyms.c (lookup_minimal_symbol_solib_trampoline): Remove unused variable "found_file_symbol". * m2-exp.y (yylex): Add LOC_UNRESOLVED case to switch. * language.c (lang_bool_type): Use existing function local type variable rather than create block local variables. * solib.c (disable_break): Enclose in ifndef SVR4_SHARED_LIBS. * infptrace.c (wait.h, command.h): Include. * ser-tcp.c (gdb_string.h): Include * i386-tdep.c (codestream_seek): Change "place" to CORE_ADDR. (i386_get_frame_setup): Change "pc" from int to CORE_ADDR. * command.c (complete_on_enum): Make assignment used as truth value explictly check against NULL. (wait.h): Include. * infrun.c (wait_for_inferior): Ifdef out prologue_pc since code that uses it is ifdef'd out. * parser-defs.h: Add prototype for write_dollar_variable. * infrun.c: Add prototype for write_pc_pid. * breakpoint.h: Add prototype for re_enable_breakpoints_in_shlibs. * symmisc.c (bcache.h): Include. * bcache.h: Add prototype for print_bcache_statistics. * symfile.c: Include <time.h>. * printcmd.c (print_scalar_formatted): Change len to unsigned int. * valarith.c (value_equal): Cast result of TYPE_LENGTH to int. * valarith.c (value_binop): Change result_len, promoted_len1, and promoted_len2 to unsigned int. * valarith.c (value_subscripted_rvalue): Change elt_offs and elt_size to unsigned int. * valops.c (value_array): Change typelength to unsigned int. (destructor_name_p): Change len to unsigned int. * scm-lang.h (scm_parse): Add prototype for scm_unpack. * symfile.c (decrement_reading_symtab): Change return type to void. * valarith.c (value_subscript): Remove unused variable "word". (value_subscript): Remove unused variable "tint". * valops.c (auto_abandon): Ifdef out, since code using it is also ifdef'd out. * eval.c (init_array_element): Remove unused variable "val". * Makefile.in (values.o): Depends on scm-lang.h. (command.o): Depends upon wait_h. (ser-tcp.o): Depends upon gdb_string.h. (infptrace.o): Depends upon wait_h and command_h. (maint.o): Depends on objfiles.h and symfile.h. * values.c (allocate_repeat_value): Remove unused variable "element_type". (scm-lang.h): Include. * breakpoint.c (create_longjmp_breakpoint): Enclose in GET_LONGJMP_TARGET define, unused otherwise. * config/i386/nm-linux.h: Add prototypes for i386_insert_watchpoint, i386_remove_watchpoint and i386_stopped_by_watchpoint.
1996-03-30 06:45:10 +01:00
if (bitsize < (8 * (int) sizeof (fieldval))
1991-08-23 00:50:50 +02:00
&& 0 != (fieldval & ~((1<<bitsize)-1)))
{
/* FIXME: would like to include fieldval in the message, but
we don't have a sprintf_longest. */
warning ("Value does not fit in %d bits.", bitsize);
/* Truncate it, otherwise adjoining fields may be corrupted. */
fieldval = fieldval & ((1 << bitsize) - 1);
}
oword = extract_signed_integer (addr, sizeof oword);
1991-03-28 17:28:29 +01:00
1991-04-05 11:02:10 +02:00
/* Shifting for bit field depends on endianness of the target machine. */
if (BITS_BIG_ENDIAN)
bitpos = sizeof (oword) * 8 - bitpos - bitsize;
1991-03-28 17:28:29 +01:00
/* Mask out old value, while avoiding shifts >= size of oword */
* core-aout.c (fetch_core_registers): Cast core_reg_size to int before testing against reg_ptr. * eval.c (evaluate_subexp_standard): Cast type of TYPE_FN_FIELD_VOFFSET to int. * findvar.c (extract_signed_integer, extract_unsigned_integer, extract_long_unsigned_integer): Cast type of sizeof to int. * values.c (unpack_field_as_long, modify_field): Ditto. * valops.c (value_assign, call_function_by_hand): Ditto. * infcmd.c (do_registers_info): Ditto. * ser-tcp.c (tcp_open): Ditto * remote.c (putpkt): Ditto. * dcache.c (dcache_peek): Ditto. * dcache.c (dcache_poke): Ditto. * m2-exp.y (yylex): Ditto. * gnu-regex.c (re_match_2): Ditto. * f-lang.c (ADD_BF_SYMNUM, saved_bf_list_end, tmp_bf_ptr): Ifdef out unused macro definition and variables. * inftarg.c (proc_wait): Move from main.c to here, and make static. * valprint.c (val_print_string): Change bufsize from int to unsigned. * main.c (wait.h): Include * top.c (command_line_input): Remove unused variable "c". * f-typeprint.c (f_type_print_varspec_prefix): Add missing enum value TYPE_CODE_TYPEDEF to switch statement. (f_type_print_varspec_suffix): Add missing enum value TYPE_CODE_TYPEDEF to switch statement. * ch-exp.c (parse_primval): Add remaining enumeration values to switch statement, with no specific action. (ch_lex): Add LOC_UNRESOLVED in switch statement. (pushback_token): Ifdef out, since code using it is ifdef'd out. * stabsread.c (cleanup_undefined_types): Remove unused label "badtype". * objfiles.h (print_symbol_bcache_statistics): Add prototype. * maint.c (objfiles.h): Include. (maintenance_print_statistics): Remove unused variable "temp". * minsyms.c (lookup_minimal_symbol_solib_trampoline): Remove unused variable "found_file_symbol". * m2-exp.y (yylex): Add LOC_UNRESOLVED case to switch. * language.c (lang_bool_type): Use existing function local type variable rather than create block local variables. * solib.c (disable_break): Enclose in ifndef SVR4_SHARED_LIBS. * infptrace.c (wait.h, command.h): Include. * ser-tcp.c (gdb_string.h): Include * i386-tdep.c (codestream_seek): Change "place" to CORE_ADDR. (i386_get_frame_setup): Change "pc" from int to CORE_ADDR. * command.c (complete_on_enum): Make assignment used as truth value explictly check against NULL. (wait.h): Include. * infrun.c (wait_for_inferior): Ifdef out prologue_pc since code that uses it is ifdef'd out. * parser-defs.h: Add prototype for write_dollar_variable. * infrun.c: Add prototype for write_pc_pid. * breakpoint.h: Add prototype for re_enable_breakpoints_in_shlibs. * symmisc.c (bcache.h): Include. * bcache.h: Add prototype for print_bcache_statistics. * symfile.c: Include <time.h>. * printcmd.c (print_scalar_formatted): Change len to unsigned int. * valarith.c (value_equal): Cast result of TYPE_LENGTH to int. * valarith.c (value_binop): Change result_len, promoted_len1, and promoted_len2 to unsigned int. * valarith.c (value_subscripted_rvalue): Change elt_offs and elt_size to unsigned int. * valops.c (value_array): Change typelength to unsigned int. (destructor_name_p): Change len to unsigned int. * scm-lang.h (scm_parse): Add prototype for scm_unpack. * symfile.c (decrement_reading_symtab): Change return type to void. * valarith.c (value_subscript): Remove unused variable "word". (value_subscript): Remove unused variable "tint". * valops.c (auto_abandon): Ifdef out, since code using it is also ifdef'd out. * eval.c (init_array_element): Remove unused variable "val". * Makefile.in (values.o): Depends on scm-lang.h. (command.o): Depends upon wait_h. (ser-tcp.o): Depends upon gdb_string.h. (infptrace.o): Depends upon wait_h and command_h. (maint.o): Depends on objfiles.h and symfile.h. * values.c (allocate_repeat_value): Remove unused variable "element_type". (scm-lang.h): Include. * breakpoint.c (create_longjmp_breakpoint): Enclose in GET_LONGJMP_TARGET define, unused otherwise. * config/i386/nm-linux.h: Add prototypes for i386_insert_watchpoint, i386_remove_watchpoint and i386_stopped_by_watchpoint.
1996-03-30 06:45:10 +01:00
if (bitsize < 8 * (int) sizeof (oword))
oword &= ~(((((unsigned LONGEST)1) << bitsize) - 1) << bitpos);
else
oword &= ~((~(unsigned LONGEST)0) << bitpos);
1991-03-28 17:28:29 +01:00
oword |= fieldval << bitpos;
1991-04-05 11:02:10 +02:00
store_signed_integer (addr, sizeof oword, oword);
1991-03-28 17:28:29 +01:00
}
/* Convert C numbers into newly allocated values */
value_ptr
value_from_longest (type, num)
1991-03-28 17:28:29 +01:00
struct type *type;
register LONGEST num;
{
register value_ptr val = allocate_value (type);
register enum type_code code;
register int len;
retry:
code = TYPE_CODE (type);
len = TYPE_LENGTH (type);
1991-03-28 17:28:29 +01:00
switch (code)
1991-03-28 17:28:29 +01:00
{
case TYPE_CODE_TYPEDEF:
type = check_typedef (type);
goto retry;
case TYPE_CODE_INT:
case TYPE_CODE_CHAR:
case TYPE_CODE_ENUM:
case TYPE_CODE_BOOL:
case TYPE_CODE_RANGE:
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 17:28:29 +01:00
}
return val;
}
value_ptr
1991-03-28 17:28:29 +01:00
value_from_double (type, num)
struct type *type;
* Add native support for long double data type. * c-exp.y (%union): Change dval to typed_val_float. Use DOUBLEST to store actual data. Change types of INT and FLOAT tokens to typed_val_int and typed_val_float respectively. Create new token DOUBLE_KEYWORD to specify the string `double'. Make production for FLOAT use type determined by parse_number. Add production for "long double" data type. * (parse_number): Use sscanf to parse numbers as float, double or long double depending upon the type of typed_val_float.dval. Also allow user to specify `f' or `l' suffix to explicitly specify float or long double constants. Change typed_val to typed_val_int. * (yylex): Change typed_val to typed_val_int. Also, scan for "double" keyword. * coffread.c (decode_base_type): Add support for T_LNGDBL basic type. * configure, configure.in: Add check for long double support in the host compiler. * defs.h: Define DOUBLEST appropriatly depending on whether HAVE_LONG_DOUBLE (from autoconf) is defined. Also, fix prototypes for functions that handle this type. * expression.h (union exp_element): doubleconst is now type DOUBLEST. * m2-exp.y f-exp.y (%union): dval becomes type DOUBLEST. * findvar.c (extract_floating): Make return value be DOUBLEST. Also, add support for numbers with size of long double. * (store_floating): Arg `val' is now type DOUBLEST. Handle all floating types. * parser-defs.h parse.c (write_exp_elt_dblcst): Arg expelt is now DOUBLEST. * valarith.c (value_binop): Change temp variables v1, v2 and v to type DOUBLEST. Coerce type of result to long double if either op was of that type. * valops.c (value_arg_coerce): If argument type is bigger than double, coerce to long double. * (call_function_by_hand): If REG_STRUCT_HAS_ADDR is defined, and arg type is float and > 8 bytes, then use pointer-to-object calling conventions. * valprint.c (print_floating): Arg doub is now type DOUBLEST. Use appropriate format and precision to print out floating point values. * value.h: Fixup prototypes for value_as_double, value_from_double, and unpack_double to use DOUBLEST. * values.c (record_latest_value): Remove check for invalid floats. Allow history to store them so that people may examine them in hex if they want. * (value_as_double unpack_double): Change return value to DOUBLEST. * (value_from_double): Arg `num' is now DOUBLEST. * (using_struct_return): Use RETURN_VALUE_ON_STACK macro (target specific) to expect certain types to always be returned on the stack.
1996-02-17 01:07:35 +01:00
DOUBLEST num;
1991-03-28 17:28:29 +01:00
{
register value_ptr val = allocate_value (type);
struct type *base_type = check_typedef (type);
register enum type_code code = TYPE_CODE (base_type);
register int len = TYPE_LENGTH (base_type);
1991-03-28 17:28:29 +01:00
if (code == TYPE_CODE_FLT)
{
store_floating (VALUE_CONTENTS_RAW (val), len, num);
1991-03-28 17:28:29 +01:00
}
else
error ("Unexpected type encountered for floating constant.");
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_ptr
1991-03-28 17:28:29 +01:00
value_being_returned (valtype, retbuf, struct_return)
register struct type *valtype;
char retbuf[REGISTER_BYTES];
int struct_return;
/*ARGSUSED*/
{
register value_ptr val;
1991-03-28 17:28:29 +01:00
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);
CHECK_TYPEDEF (valtype);
1991-03-28 17:28:29 +01:00
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 17:28:29 +01: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 17:28:29 +01:00
))
#endif
* Add native support for long double data type. * c-exp.y (%union): Change dval to typed_val_float. Use DOUBLEST to store actual data. Change types of INT and FLOAT tokens to typed_val_int and typed_val_float respectively. Create new token DOUBLE_KEYWORD to specify the string `double'. Make production for FLOAT use type determined by parse_number. Add production for "long double" data type. * (parse_number): Use sscanf to parse numbers as float, double or long double depending upon the type of typed_val_float.dval. Also allow user to specify `f' or `l' suffix to explicitly specify float or long double constants. Change typed_val to typed_val_int. * (yylex): Change typed_val to typed_val_int. Also, scan for "double" keyword. * coffread.c (decode_base_type): Add support for T_LNGDBL basic type. * configure, configure.in: Add check for long double support in the host compiler. * defs.h: Define DOUBLEST appropriatly depending on whether HAVE_LONG_DOUBLE (from autoconf) is defined. Also, fix prototypes for functions that handle this type. * expression.h (union exp_element): doubleconst is now type DOUBLEST. * m2-exp.y f-exp.y (%union): dval becomes type DOUBLEST. * findvar.c (extract_floating): Make return value be DOUBLEST. Also, add support for numbers with size of long double. * (store_floating): Arg `val' is now type DOUBLEST. Handle all floating types. * parser-defs.h parse.c (write_exp_elt_dblcst): Arg expelt is now DOUBLEST. * valarith.c (value_binop): Change temp variables v1, v2 and v to type DOUBLEST. Coerce type of result to long double if either op was of that type. * valops.c (value_arg_coerce): If argument type is bigger than double, coerce to long double. * (call_function_by_hand): If REG_STRUCT_HAS_ADDR is defined, and arg type is float and > 8 bytes, then use pointer-to-object calling conventions. * valprint.c (print_floating): Arg doub is now type DOUBLEST. Use appropriate format and precision to print out floating point values. * value.h: Fixup prototypes for value_as_double, value_from_double, and unpack_double to use DOUBLEST. * values.c (record_latest_value): Remove check for invalid floats. Allow history to store them so that people may examine them in hex if they want. * (value_as_double unpack_double): Change return value to DOUBLEST. * (value_from_double): Arg `num' is now DOUBLEST. * (using_struct_return): Use RETURN_VALUE_ON_STACK macro (target specific) to expect certain types to always be returned on the stack.
1996-02-17 01:07:35 +01:00
/* Some fundamental types (such as long double) are returned on the stack for
certain architectures. This macro should return true for any type besides
struct, union or array that gets returned on the stack. */
#ifndef RETURN_VALUE_ON_STACK
#define RETURN_VALUE_ON_STACK(TYPE) 0
#endif
1991-03-28 17:28:29 +01:00
/* 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_ptr function;
1991-03-28 17:28:29 +01:00
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.");
* Add native support for long double data type. * c-exp.y (%union): Change dval to typed_val_float. Use DOUBLEST to store actual data. Change types of INT and FLOAT tokens to typed_val_int and typed_val_float respectively. Create new token DOUBLE_KEYWORD to specify the string `double'. Make production for FLOAT use type determined by parse_number. Add production for "long double" data type. * (parse_number): Use sscanf to parse numbers as float, double or long double depending upon the type of typed_val_float.dval. Also allow user to specify `f' or `l' suffix to explicitly specify float or long double constants. Change typed_val to typed_val_int. * (yylex): Change typed_val to typed_val_int. Also, scan for "double" keyword. * coffread.c (decode_base_type): Add support for T_LNGDBL basic type. * configure, configure.in: Add check for long double support in the host compiler. * defs.h: Define DOUBLEST appropriatly depending on whether HAVE_LONG_DOUBLE (from autoconf) is defined. Also, fix prototypes for functions that handle this type. * expression.h (union exp_element): doubleconst is now type DOUBLEST. * m2-exp.y f-exp.y (%union): dval becomes type DOUBLEST. * findvar.c (extract_floating): Make return value be DOUBLEST. Also, add support for numbers with size of long double. * (store_floating): Arg `val' is now type DOUBLEST. Handle all floating types. * parser-defs.h parse.c (write_exp_elt_dblcst): Arg expelt is now DOUBLEST. * valarith.c (value_binop): Change temp variables v1, v2 and v to type DOUBLEST. Coerce type of result to long double if either op was of that type. * valops.c (value_arg_coerce): If argument type is bigger than double, coerce to long double. * (call_function_by_hand): If REG_STRUCT_HAS_ADDR is defined, and arg type is float and > 8 bytes, then use pointer-to-object calling conventions. * valprint.c (print_floating): Arg doub is now type DOUBLEST. Use appropriate format and precision to print out floating point values. * value.h: Fixup prototypes for value_as_double, value_from_double, and unpack_double to use DOUBLEST. * values.c (record_latest_value): Remove check for invalid floats. Allow history to store them so that people may examine them in hex if they want. * (value_as_double unpack_double): Change return value to DOUBLEST. * (value_from_double): Arg `num' is now DOUBLEST. * (using_struct_return): Use RETURN_VALUE_ON_STACK macro (target specific) to expect certain types to always be returned on the stack.
1996-02-17 01:07:35 +01:00
if (code == TYPE_CODE_STRUCT
|| code == TYPE_CODE_UNION
|| code == TYPE_CODE_ARRAY
|| RETURN_VALUE_ON_STACK (value_type))
1991-03-28 17:28:29 +01:00
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_ptr val;
1991-03-28 17:28:29 +01:00
{
struct type *type = check_typedef (VALUE_TYPE (val));
register enum type_code code = TYPE_CODE (type);
1991-03-28 17:28:29 +01:00
if (code == TYPE_CODE_ERROR)
error ("Function return type unknown.");
1991-11-27 10:43:59 +01: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 17:28:29 +01:00
STORE_RETURN_VALUE (type, VALUE_CONTENTS (val));
1991-03-28 17:28:29 +01:00
}
void
_initialize_values ()
{
1991-04-19 03:32:08 +02:00
add_cmd ("convenience", no_class, show_convenience,
1991-03-28 17:28:29 +01: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 03:32:08 +02:00
\"$__\" holds the contents of the last address examined with \"x\".",
&showlist);
1991-03-28 17:28:29 +01:00
1991-04-19 03:32:08 +02:00
add_cmd ("values", no_class, show_values,
"Elements of value history around item number IDX (or last ten).",
&showlist);
1991-03-28 17:28:29 +01:00
}