aboutsummaryrefslogtreecommitdiff
path: root/gdb/findvar.c
diff options
context:
space:
mode:
authorStu Grossman <grossman@cygnus>1993-05-17 22:48:07 +0000
committerStu Grossman <grossman@cygnus>1993-05-17 22:48:07 +0000
commit35247ccd31f45cb344e047bcbd2842988836bfe2 (patch)
treecccd476844020208dc6edb521156103f8996f151 /gdb/findvar.c
parentd3dd198cf01879ef9ddab00bf1ad8a0108de61ff (diff)
downloadgdb-35247ccd31f45cb344e047bcbd2842988836bfe2.zip
gdb-35247ccd31f45cb344e047bcbd2842988836bfe2.tar.gz
gdb-35247ccd31f45cb344e047bcbd2842988836bfe2.tar.bz2
* findvar.c (write_register): Add sanity check for register size.
(read_register): Fixup sanity check for register size to be consistent with write_register().
Diffstat (limited to 'gdb/findvar.c')
-rw-r--r--gdb/findvar.c31
1 files changed, 14 insertions, 17 deletions
diff --git a/gdb/findvar.c b/gdb/findvar.c
index 33f5ad6..e0d5e53 100644
--- a/gdb/findvar.c
+++ b/gdb/findvar.c
@@ -322,8 +322,8 @@ read_register (regno)
SWAP_TARGET_AND_HOST (&lval, sizeof (lval));
return lval;
default:
- error ("Can't handle register size of %d for register %d\n",
- REGISTER_RAW_SIZE(regno), regno);
+ error ("GDB Internal Error in read_register() for register %d, size %d",
+ regno, RAW_REGISTER_SIZE(regno));
}
}
@@ -367,6 +367,9 @@ write_register (regno, val)
SWAP_TARGET_AND_HOST (&lval, sizeof (lval));
memcpy (&registers[REGISTER_BYTE (regno)], &lval, sizeof (lval));
break;
+ default:
+ error ("GDB Internal Error in write_register() for register %d, size %d",
+ regno, RAW_REGISTER_SIZE(regno));
}
target_store_registers (regno);
@@ -507,6 +510,7 @@ read_var_value (var, frame)
case LOC_REGISTER:
case LOC_REGPARM:
+ case LOC_REGPARM_ADDR:
{
struct block *b;
@@ -516,20 +520,7 @@ read_var_value (var, frame)
v = value_from_register (type, SYMBOL_VALUE (var), frame);
- /* Nonzero if a struct which is located in a register or a LOC_ARG
- really contains
- the address of the struct, not the struct itself. GCC_P is nonzero
- if the function was compiled with GCC. */
- /* A cleaner way to do this would be to add LOC_REGISTER_ADDR
- (register contains the address of the value) and LOC_REGPARM_ADDR,
- and have the symbol-reading code set them -kingdon. */
-#if !defined (REG_STRUCT_HAS_ADDR)
-#define REG_STRUCT_HAS_ADDR(gcc_p) 0
-#endif
-
- if (REG_STRUCT_HAS_ADDR (BLOCK_GCC_COMPILED (b))
- && ( (TYPE_CODE (type) == TYPE_CODE_STRUCT)
- || (TYPE_CODE (type) == TYPE_CODE_UNION)))
+ if (SYMBOL_CLASS (var) == LOC_REGPARM_ADDR)
{
addr = *(CORE_ADDR *)VALUE_CONTENTS (v);
VALUE_LVAL (v) = lval_memory;
@@ -539,6 +530,11 @@ read_var_value (var, frame)
}
break;
+ case LOC_OPTIMIZED_OUT:
+ VALUE_LVAL (v) = not_lval;
+ VALUE_OPTIMIZED_OUT (v) = 1;
+ return v;
+
default:
error ("Cannot look up value of a botched symbol.");
break;
@@ -601,7 +597,8 @@ value_from_register (type, regnum, frame)
numbers for the pointer & non-pointer form of the register. But, it
doesn't, so we're stuck with this. */
- if (TYPE_CODE (type) == TYPE_CODE_PTR)
+ if (TYPE_CODE (type) == TYPE_CODE_PTR
+ && len > 2)
{
int page_regnum;