diff options
author | nobody <> | 2003-05-21 19:52:40 +0000 |
---|---|---|
committer | nobody <> | 2003-05-21 19:52:40 +0000 |
commit | 3b246c09d7eda95c2f3cdfa3edd4b633850bbdd1 (patch) | |
tree | 2e1d6a58fdef4e9da0c4aceb20543c1b401483d8 /gdb/value.h | |
parent | b41719d9f61907f1c810753438454c6f5656347b (diff) | |
download | binutils-gdb-3b246c09d7eda95c2f3cdfa3edd4b633850bbdd1.tar.gz |
This commit was manufactured by cvs2svn to create branchcagney_fileio-20030521-branchpoint
'cagney_fileio-20030521-branch'.
Sprout from jimb-ppc64-linux-20030509-branch 2003-05-09 16:41:43 UTC nobody 'This commit was manufactured by cvs2svn to create branch 'jimb-'
Cherrypick from master 2003-05-21 19:52:39 UTC Andrew Cagney <cagney@redhat.com> '2003-05-21 Andrew Cagney <cagney@redhat.com>':
ChangeLog
Makefile.in
Makefile.tpl
bfd/ChangeLog
bfd/archures.c
bfd/bfd-in.h
bfd/bfd-in2.h
bfd/bfd.c
bfd/config.bfd
bfd/configure
bfd/configure.host
bfd/configure.in
bfd/cpu-h8300.c
bfd/cpu-m68hc12.c
bfd/elf-bfd.h
bfd/elf.c
bfd/elf32-h8300.c
bfd/elf32-i386.c
bfd/elf32-i860.c
bfd/elf32-m68hc1x.c
bfd/elf32-m68k.c
bfd/elf32-mips.c
bfd/elf32-ppc.c
bfd/elf32-sh.c
bfd/elf32-xstormy16.c
bfd/elf64-ppc.c
bfd/elfcode.h
bfd/elflink.c
bfd/elflink.h
bfd/elfxx-target.h
bfd/version.h
config.guess
config.sub
config/ChangeLog
config/acinclude.m4
config/acx.m4
configure
configure.in
etc/ChangeLog
etc/configure.texi
gdb/ChangeLog
gdb/MAINTAINERS
gdb/Makefile.in
gdb/NEWS
gdb/TODO
gdb/ada-exp.y
gdb/ada-lang.c
gdb/ada-lang.h
gdb/ada-valprint.c
gdb/alpha-tdep.c
gdb/arch-utils.c
gdb/arch-utils.h
gdb/arm-linux-tdep.c
gdb/arm-tdep.c
gdb/avr-tdep.c
gdb/block.c
gdb/block.h
gdb/blockframe.c
gdb/c-exp.y
gdb/c-lang.c
gdb/c-valprint.c
gdb/coffread.c
gdb/config/djgpp/fnchange.lst
gdb/config/i386/tm-linux.h
gdb/config/ia64/tm-ia64.h
gdb/config/m68k/nm-sun3.h
gdb/config/m68k/tm-linux.h
gdb/config/m68k/tm-m68k.h
gdb/config/m68k/tm-sun3.h
gdb/config/mips/tm-irix5.h
gdb/config/mips/tm-irix6.h
gdb/config/mips/tm-mips.h
gdb/config/nm-gnu.h
gdb/config/pa/tm-hppa.h
gdb/config/pa/tm-hppa64.h
gdb/config/s390/tm-s390.h
gdb/config/sparc/nm-nbsd.h
gdb/config/sparc/nm-sun4os4.h
gdb/config/sparc/nm-sun4sol2.h
gdb/config/sparc/tm-sp64.h
gdb/config/sparc/tm-sparc.h
gdb/cp-namespace.c
gdb/cp-support.h
gdb/cp-valprint.c
gdb/cris-tdep.c
gdb/dbxread.c
gdb/defs.h
gdb/disasm.h
gdb/doc/ChangeLog
gdb/doc/Makefile.in
gdb/doc/gdbint.texinfo
gdb/dummy-frame.c
gdb/dummy-frame.h
gdb/dwarf2expr.c
gdb/dwarf2loc.c
gdb/dwarf2read.c
gdb/dwarfread.c
gdb/f-exp.y
gdb/f-lang.c
gdb/findvar.c
gdb/frame.c
gdb/frame.h
gdb/frv-tdep.c
gdb/gdbarch.c
gdb/gdbarch.h
gdb/gdbarch.sh
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/gnu-v3-abi.c
gdb/h8300-tdep.c
gdb/hppa-tdep.c
gdb/hpread.c
gdb/hpux-thread.c
gdb/i386-linux-tdep.c
gdb/i386-tdep.c
gdb/i386-tdep.h
gdb/ia64-tdep.c
gdb/irix4-nat.c
gdb/irix5-nat.c
gdb/jv-exp.y
gdb/jv-lang.c
gdb/jv-valprint.c
gdb/language.c
gdb/language.h
gdb/linespec.c
gdb/m2-exp.y
gdb/m2-lang.c
gdb/m3-nat.c
gdb/m68hc11-tdep.c
gdb/m68k-tdep.c
gdb/m68klinux-tdep.c
gdb/mcore-tdep.c
gdb/mdebugread.c
gdb/mem-break.c
gdb/mi/ChangeLog
gdb/mi/mi-cmd-stack.c
gdb/mi/mi-main.c
gdb/mi/mi-symbol-cmds.c
gdb/minsyms.c
gdb/mips-nat.c
gdb/mips-tdep.c
gdb/mn10300-tdep.c
gdb/monitor.c
gdb/nlmread.c
gdb/ns32k-tdep.c
gdb/nto-tdep.c
gdb/objc-exp.y
gdb/objc-lang.c
gdb/objfiles.c
gdb/p-exp.y
gdb/p-lang.c
gdb/p-valprint.c
gdb/parse.c
gdb/ppc-sysv-tdep.c
gdb/printcmd.c
gdb/proc-api.c
gdb/regcache.c
gdb/regcache.h
gdb/remote-array.c
gdb/remote-mips.c
gdb/remote-sds.c
gdb/remote-vx.c
gdb/remote.c
gdb/rs6000-tdep.c
gdb/s390-tdep.c
gdb/scm-lang.c
gdb/ser-pipe.c
gdb/ser-tcp.c
gdb/ser-unix.c
gdb/sh-tdep.c
gdb/source.c
gdb/sparc-tdep.c
gdb/stabsread.c
gdb/stack.c
gdb/symfile.c
gdb/symfile.h
gdb/symmisc.c
gdb/symtab.c
gdb/symtab.h
gdb/target.h
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.c++/namespace.cc
gdb/testsuite/gdb.c++/namespace.exp
gdb/testsuite/gdb.c++/namespace1.cc
gdb/testsuite/gdb.c++/rtti.exp
gdb/testsuite/gdb.c++/rtti.h
gdb/testsuite/gdb.c++/rtti1.cc
gdb/testsuite/gdb.c++/rtti2.cc
gdb/testsuite/gdb.threads/linux-dp.exp
gdb/v850-tdep.c
gdb/valops.c
gdb/value.h
gdb/values.c
gdb/vax-tdep.c
gdb/version.in
gdb/x86-64-tdep.c
gdb/xcoffread.c
gdb/xstormy16-tdep.c
include/ChangeLog
include/bfdlink.h
include/elf/ChangeLog
include/elf/common.h
include/elf/external.h
include/elf/h8.h
include/elf/internal.h
include/libiberty.h
include/opcode/ChangeLog
include/opcode/i860.h
include/opcode/m68hc11.h
libiberty/ChangeLog
libiberty/config.table
libiberty/functions.texi
libiberty/hex.c
opcodes/ChangeLog
opcodes/Makefile.am
opcodes/Makefile.in
opcodes/configure
opcodes/configure.in
opcodes/disassemble.c
opcodes/i860-dis.c
opcodes/po/ro.po
readline/ChangeLog.gdb
readline/support/config.guess
readline/support/config.sub
sim/mips/ChangeLog
sim/mips/Makefile.in
sim/ppc/ChangeLog
sim/ppc/Makefile.in
sim/testsuite/ChangeLog
sim/testsuite/sim/h8300/ChangeLog
sim/testsuite/sim/h8300/addb.s
sim/testsuite/sim/h8300/addl.s
sim/testsuite/sim/h8300/addw.s
sim/testsuite/sim/h8300/allinsn.exp
sim/testsuite/sim/h8300/andb.s
sim/testsuite/sim/h8300/andl.s
sim/testsuite/sim/h8300/andw.s
sim/testsuite/sim/h8300/bra.s
sim/testsuite/sim/h8300/cmpb.s
sim/testsuite/sim/h8300/cmpl.s
sim/testsuite/sim/h8300/cmpw.s
sim/testsuite/sim/h8300/extl.s
sim/testsuite/sim/h8300/extw.s
sim/testsuite/sim/h8300/ldc.s
sim/testsuite/sim/h8300/ldm.s
sim/testsuite/sim/h8300/mova.s
sim/testsuite/sim/h8300/movb.s
sim/testsuite/sim/h8300/movl.s
sim/testsuite/sim/h8300/movw.s
sim/testsuite/sim/h8300/neg.s
sim/testsuite/sim/h8300/not.s
sim/testsuite/sim/h8300/orb.s
sim/testsuite/sim/h8300/orl.s
sim/testsuite/sim/h8300/orw.s
sim/testsuite/sim/h8300/rotr.s
sim/testsuite/sim/h8300/rotxr.s
sim/testsuite/sim/h8300/shar.s
sim/testsuite/sim/h8300/shlr.s
sim/testsuite/sim/h8300/stc.s
sim/testsuite/sim/h8300/subb.s
sim/testsuite/sim/h8300/subl.s
sim/testsuite/sim/h8300/subw.s
sim/testsuite/sim/h8300/xorb.s
sim/testsuite/sim/h8300/xorl.s
sim/testsuite/sim/h8300/xorw.s
sim/v850/ChangeLog
sim/v850/Makefile.in
Delete:
gdb/mi/mi-cmd-symbol.c
sim/testsuite/sim/h8300/add.b.s
sim/testsuite/sim/h8300/add.l.s
sim/testsuite/sim/h8300/add.w.s
sim/testsuite/sim/h8300/and.b.s
sim/testsuite/sim/h8300/and.l.s
sim/testsuite/sim/h8300/and.w.s
sim/testsuite/sim/h8300/cmp.b.s
sim/testsuite/sim/h8300/cmp.l.s
sim/testsuite/sim/h8300/cmp.w.s
sim/testsuite/sim/h8300/ext.l.s
sim/testsuite/sim/h8300/ext.w.s
sim/testsuite/sim/h8300/mov.b.s
sim/testsuite/sim/h8300/mov.l.s
sim/testsuite/sim/h8300/mov.w.s
sim/testsuite/sim/h8300/or.b.s
sim/testsuite/sim/h8300/or.l.s
sim/testsuite/sim/h8300/or.w.s
sim/testsuite/sim/h8300/sub.b.s
sim/testsuite/sim/h8300/sub.l.s
sim/testsuite/sim/h8300/sub.w.s
sim/testsuite/sim/h8300/xor.b.s
sim/testsuite/sim/h8300/xor.l.s
sim/testsuite/sim/h8300/xor.w.s
Diffstat (limited to 'gdb/value.h')
-rw-r--r-- | gdb/value.h | 320 |
1 files changed, 163 insertions, 157 deletions
diff --git a/gdb/value.h b/gdb/value.h index 54854e5f563..254c82f1cb2 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -1,4 +1,5 @@ /* Definitions for values of C expressions, for GDB. + Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. @@ -23,105 +24,109 @@ #if !defined (VALUE_H) #define VALUE_H 1 -struct ui_file; +#include "doublest.h" + +struct block; struct expression; +struct regcache; struct symbol; struct type; -struct regcache; -struct block; - -#include "doublest.h" +struct ui_file; -/* - * The structure which defines the type of a value. It should never - * be possible for a program lval value to survive over a call to the inferior - * (ie to be put into the history list or an internal variable). - */ +/* The structure which defines the type of a value. It should never + be possible for a program lval value to survive over a call to the + inferior (i.e. to be put into the history list or an internal + variable). */ struct value +{ + /* Type of value; either not an lval, or one of the various + different possible kinds of lval. */ + enum lval_type lval; + + /* Is it modifiable? Only relevant if lval != not_lval. */ + int modifiable; + + /* Location of value (if lval). */ + union { - /* Type of value; either not an lval, or one of the various - different possible kinds of lval. */ - enum lval_type lval; - /* Is it modifiable? Only relevant if lval != not_lval. */ - int modifiable; - /* Location of value (if lval). */ - union - { - /* If lval == lval_memory, this is the address in the inferior. - If lval == lval_register, this is the byte offset into the - registers structure. */ - CORE_ADDR address; - /* Pointer to internal variable. */ - struct internalvar *internalvar; - /* Number of register. Only used with - lval_reg_frame_relative. */ - int regnum; - } - location; - /* Describes offset of a value within lval of a structure in bytes. - If lval == lval_memory, this is an offset to the address. - If lval == lval_register, this is a further offset from - location.address within the registers structure. - Note also the member embedded_offset below. */ - int offset; - /* Only used for bitfields; number of bits contained in them. */ - int bitsize; - /* Only used for bitfields; position of start of field. - For BITS_BIG_ENDIAN=0 targets, it is the position of the LSB. - For BITS_BIG_ENDIAN=1 targets, it is the position of the MSB. */ + /* If lval == lval_memory, this is the address in the inferior. + If lval == lval_register, this is the byte offset into the + registers structure. */ + CORE_ADDR address; + + /* Pointer to internal variable. */ + struct internalvar *internalvar; + + /* Number of register. Only used with lval_reg_frame_relative. */ + int regnum; + } location; + + /* Describes offset of a value within lval of a structure in bytes. + If lval == lval_memory, this is an offset to the address. + If lval == lval_register, this is a further offset from + location.address within the registers structure. + Note also the member embedded_offset below. */ + int offset; + + /* Only used for bitfields; number of bits contained in them. */ + int bitsize; + + /* Only used for bitfields; position of start of field. + For BITS_BIG_ENDIAN=0 targets, it is the position of the LSB. + For BITS_BIG_ENDIAN=1 targets, it is the position of the MSB. */ int bitpos; - /* Frame value is relative to. In practice, this address is only - used if the value is stored in several registers in other than - the current frame, and these registers have not all been saved - at the same place in memory. This will be described in the - lval enum above as "lval_reg_frame_relative". */ - CORE_ADDR frame_addr; - - /* Type of the value. */ - struct type *type; - - /* If a value represents a C++ object, then the `type' field gives - the object's compile-time type. If the object actually belongs - to some class derived from `type', perhaps with other base - classes and additional members, then `type' is just a subobject - of the real thing, and the full object is probably larger than - `type' would suggest. - - If `type' is a dynamic class (i.e. one with a vtable), then GDB - can actually determine the object's run-time type by looking at - the run-time type information in the vtable. When this - information is available, we may elect to read in the entire - object, for several reasons: - - - When printing the value, the user would probably rather see - the full object, not just the limited portion apparent from - the compile-time type. - - - If `type' has virtual base classes, then even printing - `type' alone may require reaching outside the `type' - portion of the object to wherever the virtual base class - has been stored. - - When we store the entire object, `enclosing_type' is the - run-time type --- the complete object --- and `embedded_offset' - is the offset of `type' within that larger type, in bytes. The - VALUE_CONTENTS macro takes `embedded_offset' into account, so - most GDB code continues to see the `type' portion of the value, - just as the inferior would. - - If `type' is a pointer to an object, then `enclosing_type' is a - pointer to the object's run-time type, and `pointed_to_offset' - is the offset in bytes from the full object to the pointed-to - object --- that is, the value `embedded_offset' would have if - we followed the pointer and fetched the complete object. (I - don't really see the point. Why not just determine the - run-time type when you indirect, and avoid the special case? - The contents don't matter until you indirect anyway.) - - If we're not doing anything fancy, `enclosing_type' is equal to - `type', and `embedded_offset' is zero, so everything works - normally. */ + + /* Frame value is relative to. In practice, this address is only + used if the value is stored in several registers in other than + the current frame, and these registers have not all been saved + at the same place in memory. This will be described in the + lval enum above as "lval_reg_frame_relative". */ + CORE_ADDR frame_addr; + + /* Type of the value. */ + struct type *type; + + /* If a value represents a C++ object, then the `type' field gives + the object's compile-time type. If the object actually belongs + to some class derived from `type', perhaps with other base + classes and additional members, then `type' is just a subobject + of the real thing, and the full object is probably larger than + `type' would suggest. + + If `type' is a dynamic class (i.e. one with a vtable), then GDB + can actually determine the object's run-time type by looking at + the run-time type information in the vtable. When this + information is available, we may elect to read in the entire + object, for several reasons: + + - When printing the value, the user would probably rather see the + full object, not just the limited portion apparent from the + compile-time type. + + - If `type' has virtual base classes, then even printing `type' + alone may require reaching outside the `type' portion of the + object to wherever the virtual base class has been stored. + + When we store the entire object, `enclosing_type' is the run-time + type -- the complete object -- and `embedded_offset' is the + offset of `type' within that larger type, in bytes. The + VALUE_CONTENTS macro takes `embedded_offset' into account, so + most GDB code continues to see the `type' portion of the value, + just as the inferior would. + + If `type' is a pointer to an object, then `enclosing_type' is a + pointer to the object's run-time type, and `pointed_to_offset' is + the offset in bytes from the full object to the pointed-to object + -- that is, the value `embedded_offset' would have if we + followed the pointer and fetched the complete object. (I don't + really see the point. Why not just determine the run-time type + when you indirect, and avoid the special case? The contents + don't matter until you indirect anyway.) + + If we're not doing anything fancy, `enclosing_type' is equal to + `type', and `embedded_offset' is zero, so everything works + normally. */ struct type *enclosing_type; int embedded_offset; int pointed_to_offset; @@ -134,10 +139,11 @@ struct value /* Register number if the value is from a register. */ short regno; - /* If zero, contents of this value are in the contents field. - If nonzero, contents are in inferior memory at address - in the location.address field plus the offset field - (and the lval field should be lval_memory). + + /* If zero, contents of this value are in the contents field. If + nonzero, contents are in inferior memory at address in the + location.address field plus the offset field (and the lval + field should be lval_memory). WARNING: This field is used by the code which handles watchpoints (see breakpoint.c) to decide whether a particular @@ -150,53 +156,59 @@ struct value lazy flag is set and reset, be sure to consider this use as well! */ char lazy; + /* If nonzero, this is the value of a variable which does not actually exist in the program. */ char optimized_out; + /* The BFD section associated with this value. */ asection *bfd_section; + /* Actual contents of the value. For use of this value; setting it uses the stuff above. Not valid if lazy is nonzero. Target byte-order. We force it to be aligned properly for any possible value. Note that a value therefore extends beyond what is declared here. */ union - { - long contents[1]; - DOUBLEST force_doublest_align; - LONGEST force_longest_align; - CORE_ADDR force_core_addr_align; - void *force_pointer_align; - } - aligner; - /* Do not add any new members here -- contents above will trash them */ - }; + { + long contents[1]; + DOUBLEST force_doublest_align; + LONGEST force_longest_align; + CORE_ADDR force_core_addr_align; + void *force_pointer_align; + } aligner; + /* Do not add any new members here -- contents above will trash them. */ +}; #define VALUE_TYPE(val) (val)->type #define VALUE_ENCLOSING_TYPE(val) (val)->enclosing_type #define VALUE_LAZY(val) (val)->lazy + /* VALUE_CONTENTS and VALUE_CONTENTS_RAW both return the address of - the gdb buffer used to hold a copy of the contents of the lval. - VALUE_CONTENTS is used when the contents of the buffer are needed -- - it uses value_fetch_lazy() to load the buffer from the process being - debugged if it hasn't already been loaded. VALUE_CONTENTS_RAW is - used when data is being stored into the buffer, or when it is - certain that the contents of the buffer are valid. + the gdb buffer used to hold a copy of the contents of the lval. + VALUE_CONTENTS is used when the contents of the buffer are needed + -- it uses value_fetch_lazy() to load the buffer from the process + being debugged if it hasn't already been loaded. + VALUE_CONTENTS_RAW is used when data is being stored into the + buffer, or when it is certain that the contents of the buffer are + valid. + Note: The contents pointer is adjusted by the offset required to get to the real subobject, if the value happens to represent - something embedded in a larger run-time object. */ + something embedded in a larger run-time object. */ -#define VALUE_CONTENTS_RAW(val) ((char *) (val)->aligner.contents + (val)->embedded_offset) -#define VALUE_CONTENTS(val) ((void)(VALUE_LAZY(val) && value_fetch_lazy(val)),\ - VALUE_CONTENTS_RAW(val)) +#define VALUE_CONTENTS_RAW(val) \ + ((char *) (val)->aligner.contents + (val)->embedded_offset) +#define VALUE_CONTENTS(val) \ + ((void)(VALUE_LAZY(val) && value_fetch_lazy(val)), VALUE_CONTENTS_RAW(val)) /* The ALL variants of the above two macros do not adjust the returned - pointer by the embedded_offset value. */ + pointer by the embedded_offset value. */ #define VALUE_CONTENTS_ALL_RAW(val) ((char *) (val)->aligner.contents) -#define VALUE_CONTENTS_ALL(val) ((void) (VALUE_LAZY(val) && value_fetch_lazy(val)),\ - VALUE_CONTENTS_ALL_RAW(val)) - +#define VALUE_CONTENTS_ALL(val) \ + ((void) (VALUE_LAZY(val) && value_fetch_lazy(val)), \ + VALUE_CONTENTS_ALL_RAW(val)) extern int value_fetch_lazy (struct value *val); @@ -215,16 +227,17 @@ extern int value_fetch_lazy (struct value *val); #define VALUE_POINTED_TO_OFFSET(val) ((val)->pointed_to_offset) #define VALUE_BFD_SECTION(val) ((val)->bfd_section) -/* Convert a REF to the object referenced. */ +/* Convert a REF to the object referenced. */ -#define COERCE_REF(arg) \ -do { struct type *value_type_arg_tmp = check_typedef (VALUE_TYPE (arg));\ - if (TYPE_CODE (value_type_arg_tmp) == TYPE_CODE_REF) \ - arg = value_at_lazy (TYPE_TARGET_TYPE (value_type_arg_tmp), \ - unpack_pointer (VALUE_TYPE (arg), \ - VALUE_CONTENTS (arg)), \ - VALUE_BFD_SECTION (arg)); \ - } while (0) +#define COERCE_REF(arg) \ + do { \ + struct type *value_type_arg_tmp = check_typedef (VALUE_TYPE (arg)); \ + if (TYPE_CODE (value_type_arg_tmp) == TYPE_CODE_REF) \ + arg = value_at_lazy (TYPE_TARGET_TYPE (value_type_arg_tmp), \ + unpack_pointer (VALUE_TYPE (arg), \ + VALUE_CONTENTS (arg)), \ + VALUE_BFD_SECTION (arg)); \ + } while (0) /* If ARG is an array, convert it to a pointer. If ARG is an enum, convert it to an integer. @@ -232,17 +245,18 @@ do { struct type *value_type_arg_tmp = check_typedef (VALUE_TYPE (arg));\ References are dereferenced. */ -#define COERCE_ARRAY(arg) \ -do { COERCE_REF(arg); \ - if (current_language->c_style_arrays \ - && TYPE_CODE (VALUE_TYPE (arg)) == TYPE_CODE_ARRAY) \ - arg = value_coerce_array (arg); \ - if (TYPE_CODE (VALUE_TYPE (arg)) == TYPE_CODE_FUNC) \ - arg = value_coerce_function (arg); \ -} while (0) +#define COERCE_ARRAY(arg) \ + do { \ + COERCE_REF(arg); \ + if (current_language->c_style_arrays \ + && TYPE_CODE (VALUE_TYPE (arg)) == TYPE_CODE_ARRAY) \ + arg = value_coerce_array (arg); \ + if (TYPE_CODE (VALUE_TYPE (arg)) == TYPE_CODE_FUNC) \ + arg = value_coerce_function (arg); \ + } while (0) -#define COERCE_NUMBER(arg) \ - do { COERCE_ARRAY(arg); COERCE_ENUM(arg); } while (0) +#define COERCE_NUMBER(arg) \ + do { COERCE_ARRAY(arg); COERCE_ENUM(arg); } while (0) /* NOTE: cagney/2002-12-17: This macro was handling a chill language problem but that language has gone away. */ @@ -250,22 +264,23 @@ do { COERCE_REF(arg); \ /* If ARG is an enum, convert it to an integer. */ -#define COERCE_ENUM(arg) { \ - if (TYPE_CODE (check_typedef (VALUE_TYPE (arg))) == TYPE_CODE_ENUM) \ - arg = value_cast (builtin_type_unsigned_int, arg); \ -} +#define COERCE_ENUM(arg) \ + do { \ + if (TYPE_CODE (check_typedef (VALUE_TYPE (arg))) == TYPE_CODE_ENUM) \ + arg = value_cast (builtin_type_unsigned_int, arg); \ + } while (0) /* Internal variables (variables for convenience of use of debugger) are recorded as a chain of these structures. */ struct internalvar - { - struct internalvar *next; - char *name; - struct value *value; - }; +{ + struct internalvar *next; + char *name; + struct value *value; +}; -/* Pointer to member function. Depends on compiler implementation. */ +/* Pointer to member function. Depends on compiler implementation. */ #define METHOD_PTR_IS_VIRTUAL(ADDR) ((ADDR) & 0x80000000) #define METHOD_PTR_FROM_VOFFSET(OFFSET) (0x80000000 + (OFFSET)) @@ -282,32 +297,23 @@ struct fn_field; extern void print_address_demangle (CORE_ADDR, struct ui_file *, int); extern LONGEST value_as_long (struct value *val); - extern DOUBLEST value_as_double (struct value *val); - extern CORE_ADDR value_as_address (struct value *val); extern LONGEST unpack_long (struct type *type, const char *valaddr); - extern DOUBLEST unpack_double (struct type *type, const char *valaddr, int *invp); - extern CORE_ADDR unpack_pointer (struct type *type, const char *valaddr); - extern LONGEST unpack_field_as_long (struct type *type, const char *valaddr, int fieldno); extern struct value *value_from_longest (struct type *type, LONGEST num); - extern struct value *value_from_pointer (struct type *type, CORE_ADDR addr); - extern struct value *value_from_double (struct type *type, DOUBLEST num); - extern struct value *value_from_string (char *string); extern struct value *value_at (struct type *type, CORE_ADDR addr, asection * sect); - extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr, asection * sect); |