/* Find a variable's value in memory, for GDB, the GNU debugger.
- Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
- 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 Free
- Software Foundation, Inc.
+ Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+ 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2007
+ Free Software Foundation, Inc.
This file is part of GDB.
/* Return a `value' with the contents of (virtual or cooked) register
REGNUM as found in the specified FRAME. The register's type is
- determined by register_type().
-
- NOTE: returns NULL if register value is not available. Caller will
- check return value or die! */
+ determined by register_type(). */
struct value *
value_of_register (int regnum, struct frame_info *frame)
frame_register (frame, regnum, &optim, &lval, &addr, &realnum, raw_buffer);
- /* FIXME: cagney/2002-05-15: This test is just bogus.
-
- It indicates that the target failed to supply a value for a
- register because it was "not available" at this time. Problem
- is, the target still has the register and so get saved_register()
- may be returning a value saved on the stack. */
-
- if (register_cached (regnum) < 0)
- return NULL; /* register value not available */
-
reg_val = allocate_value (register_type (current_gdbarch, regnum));
memcpy (value_contents_raw (reg_val), raw_buffer,
and a stack frame id, read the value of the variable
and return a (pointer to a) struct value containing the value.
If the variable cannot be found, return a zero pointer.
- If FRAME is NULL, use the deprecated_selected_frame. */
+ If FRAME is NULL, use the selected frame. */
struct value *
read_var_value (struct symbol *var, struct frame_info *frame)
return v;
}
-/* Return a value of type TYPE, stored in register REGNUM, in frame
- FRAME.
+/* Install default attributes for register values. */
+
+struct value *
+default_value_from_register (struct type *type, int regnum,
+ struct frame_info *frame)
+{
+ struct gdbarch *gdbarch = get_frame_arch (frame);
+ int len = TYPE_LENGTH (type);
+ struct value *value = allocate_value (type);
+
+ VALUE_LVAL (value) = lval_register;
+ VALUE_FRAME_ID (value) = get_frame_id (frame);
+ VALUE_REGNUM (value) = regnum;
+
+ /* Any structure stored in more than one register will always be
+ an integral number of registers. Otherwise, you need to do
+ some fiddling with the last register copied here for little
+ endian machines. */
+ if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
+ && len < register_size (gdbarch, regnum))
+ /* Big-endian, and we want less than full size. */
+ set_value_offset (value, register_size (gdbarch, regnum) - len);
+ else
+ set_value_offset (value, 0);
+
+ return value;
+}
- NOTE: returns NULL if register value is not available.
- Caller will check return value or die! */
+/* Return a value of type TYPE, stored in register REGNUM, in frame FRAME. */
struct value *
value_from_register (struct type *type, int regnum, struct frame_info *frame)
{
struct gdbarch *gdbarch = get_frame_arch (frame);
- struct value *v = allocate_value (type);
- CHECK_TYPEDEF (type);
+ struct type *type1 = check_typedef (type);
+ struct value *v;
- if (TYPE_LENGTH (type) == 0)
- {
- /* It doesn't matter much what we return for this: since the
- length is zero, it could be anything. But if allowed to see
- a zero-length type, the register-finding loop below will set
- neither mem_stor nor reg_stor, and then report an internal
- error.
-
- Zero-length types can legitimately arise from declarations
- like 'struct {}' (a GCC extension, not valid ISO C). GDB may
- also create them when it finds bogus debugging information;
- for example, in GCC 2.95.4 and binutils 2.11.93.0.2, the
- STABS BINCL->EXCL compression process can create bad type
- numbers. GDB reads these as TYPE_CODE_UNDEF types, with zero
- length. (That bug is actually the only known way to get a
- zero-length value allocated to a register --- which is what
- it takes to make it here.)
-
- We'll just attribute the value to the original register. */
- VALUE_LVAL (v) = lval_register;
- VALUE_ADDRESS (v) = regnum;
- VALUE_REGNUM (v) = regnum;
- }
- else if (CONVERT_REGISTER_P (regnum, type))
+ if (CONVERT_REGISTER_P (regnum, type1))
{
/* The ISA/ABI need to something weird when obtaining the
specified value from this register. It might need to
the corresponding [integer] type (see Alpha). The assumption
is that REGISTER_TO_VALUE populates the entire value
including the location. */
- REGISTER_TO_VALUE (frame, regnum, type, value_contents_raw (v));
+ v = allocate_value (type);
VALUE_LVAL (v) = lval_register;
VALUE_FRAME_ID (v) = get_frame_id (frame);
VALUE_REGNUM (v) = regnum;
+ REGISTER_TO_VALUE (frame, regnum, type1, value_contents_raw (v));
}
else
{
- int local_regnum;
- int mem_stor = 0, reg_stor = 0;
- int mem_tracking = 1;
- CORE_ADDR last_addr = 0;
- CORE_ADDR first_addr = 0;
- int first_realnum = regnum;
int len = TYPE_LENGTH (type);
- int value_bytes_copied;
- int optimized = 0;
- gdb_byte *value_bytes = alloca (len + MAX_REGISTER_SIZE);
-
- /* Copy all of the data out, whereever it may be. */
- for (local_regnum = regnum, value_bytes_copied = 0;
- value_bytes_copied < len;
- (value_bytes_copied += register_size (current_gdbarch, local_regnum),
- ++local_regnum))
- {
- int realnum;
- int optim;
- enum lval_type lval;
- CORE_ADDR addr;
- frame_register (frame, local_regnum, &optim, &lval, &addr,
- &realnum, value_bytes + value_bytes_copied);
- optimized += optim;
- if (register_cached (local_regnum) == -1)
- return NULL; /* register value not available */
-
- if (regnum == local_regnum)
- {
- first_addr = addr;
- first_realnum = realnum;
- }
- if (lval == lval_register)
- reg_stor++;
- else
- {
- mem_stor++;
-
- /* FIXME: cagney/2004-11-12: I think this is trying to
- check that the stored registers are adjacent in
- memory. It isn't doing a good job? */
- mem_tracking = (mem_tracking
- && (regnum == local_regnum
- || addr == last_addr));
- }
- last_addr = addr;
- }
-
- if (mem_tracking && mem_stor && !reg_stor)
- {
- VALUE_LVAL (v) = lval_memory;
- VALUE_ADDRESS (v) = first_addr;
- }
- else
- {
- VALUE_LVAL (v) = lval_register;
- VALUE_FRAME_ID (v) = get_frame_id (frame);
- VALUE_REGNUM (v) = regnum;
- }
-
- set_value_optimized_out (v, optimized);
-
- /* Any structure stored in more than one register will always be
- an integral number of registers. Otherwise, you need to do
- some fiddling with the last register copied here for little
- endian machines. */
- if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
- && len < register_size (current_gdbarch, regnum))
- /* Big-endian, and we want less than full size. */
- set_value_offset (v, register_size (current_gdbarch, regnum) - len);
- else
- set_value_offset (v, 0);
- memcpy (value_contents_raw (v), value_bytes + value_offset (v), len);
+
+ /* Construct the value. */
+ v = gdbarch_value_from_register (gdbarch, type, regnum, frame);
+
+ /* Get the data. */
+ if (!get_frame_register_bytes (frame, regnum, value_offset (v), len,
+ value_contents_raw (v)))
+ set_value_optimized_out (v, 1);
}
return v;
}