2006-10-08 Paul Brook <paul@codesourcery.com>
[binutils-gdb.git] / gdb / findvar.c
index 56d46fe9f232d513316abfcf7ae1853ec7ed48aa..0cda35e75ad982fd8e3983c3c2d8ece5b519339c 100644 (file)
@@ -1,6 +1,6 @@
 /* Find a variable's value in memory, for GDB, the GNU debugger.
 
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
+   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.
 
@@ -18,8 +18,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "defs.h"
 #include "symtab.h"
@@ -49,7 +49,7 @@ you lose
 #endif
 
 LONGEST
-extract_signed_integer (const void *addr, int len)
+extract_signed_integer (const gdb_byte *addr, int len)
 {
   LONGEST retval;
   const unsigned char *p;
@@ -57,8 +57,8 @@ extract_signed_integer (const void *addr, int len)
   const unsigned char *endaddr = startaddr + len;
 
   if (len > (int) sizeof (LONGEST))
-    error ("\
-That operation is not available on integers of more than %d bytes.",
+    error (_("\
+That operation is not available on integers of more than %d bytes."),
           (int) sizeof (LONGEST));
 
   /* Start at the most significant end of the integer, and work towards
@@ -83,7 +83,7 @@ That operation is not available on integers of more than %d bytes.",
 }
 
 ULONGEST
-extract_unsigned_integer (const void *addr, int len)
+extract_unsigned_integer (const gdb_byte *addr, int len)
 {
   ULONGEST retval;
   const unsigned char *p;
@@ -91,8 +91,8 @@ extract_unsigned_integer (const void *addr, int len)
   const unsigned char *endaddr = startaddr + len;
 
   if (len > (int) sizeof (ULONGEST))
-    error ("\
-That operation is not available on integers of more than %d bytes.",
+    error (_("\
+That operation is not available on integers of more than %d bytes."),
           (int) sizeof (ULONGEST));
 
   /* Start at the most significant end of the integer, and work towards
@@ -117,16 +117,18 @@ That operation is not available on integers of more than %d bytes.",
    function returns 1 and sets *PVAL.  Otherwise it returns 0.  */
 
 int
-extract_long_unsigned_integer (const void *addr, int orig_len, LONGEST *pval)
+extract_long_unsigned_integer (const gdb_byte *addr, int orig_len,
+                              LONGEST *pval)
 {
-  char *p, *first_addr;
+  const gdb_byte *p;
+  const gdb_byte *first_addr;
   int len;
 
   len = orig_len;
   if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
     {
-      for (p = (char *) addr;
-          len > (int) sizeof (LONGEST) && p < (char *) addr + orig_len;
+      for (p = addr;
+          len > (int) sizeof (LONGEST) && p < addr + orig_len;
           p++)
        {
          if (*p == 0)
@@ -138,9 +140,9 @@ extract_long_unsigned_integer (const void *addr, int orig_len, LONGEST *pval)
     }
   else
     {
-      first_addr = (char *) addr;
-      for (p = (char *) addr + orig_len - 1;
-          len > (int) sizeof (LONGEST) && p >= (char *) addr;
+      first_addr = addr;
+      for (p = addr + orig_len - 1;
+          len > (int) sizeof (LONGEST) && p >= addr;
           p--)
        {
          if (*p == 0)
@@ -164,24 +166,24 @@ extract_long_unsigned_integer (const void *addr, int orig_len, LONGEST *pval)
 /* Treat the bytes at BUF as a pointer of type TYPE, and return the
    address it represents.  */
 CORE_ADDR
-extract_typed_address (const void *buf, struct type *type)
+extract_typed_address (const gdb_byte *buf, struct type *type)
 {
   if (TYPE_CODE (type) != TYPE_CODE_PTR
       && TYPE_CODE (type) != TYPE_CODE_REF)
     internal_error (__FILE__, __LINE__,
-                   "extract_typed_address: "
-                   "type is not a pointer or reference");
+                   _("extract_typed_address: "
+                   "type is not a pointer or reference"));
 
   return POINTER_TO_ADDRESS (type, buf);
 }
 
 
 void
-store_signed_integer (void *addr, int len, LONGEST val)
+store_signed_integer (gdb_byte *addr, int len, LONGEST val)
 {
-  unsigned char *p;
-  unsigned char *startaddr = (unsigned char *) addr;
-  unsigned char *endaddr = startaddr + len;
+  gdb_byte *p;
+  gdb_byte *startaddr = addr;
+  gdb_byte *endaddr = startaddr + len;
 
   /* Start at the least significant end of the integer, and work towards
      the most significant.  */
@@ -204,7 +206,7 @@ store_signed_integer (void *addr, int len, LONGEST val)
 }
 
 void
-store_unsigned_integer (void *addr, int len, ULONGEST val)
+store_unsigned_integer (gdb_byte *addr, int len, ULONGEST val)
 {
   unsigned char *p;
   unsigned char *startaddr = (unsigned char *) addr;
@@ -233,13 +235,13 @@ store_unsigned_integer (void *addr, int len, ULONGEST val)
 /* Store the address ADDR as a pointer of type TYPE at BUF, in target
    form.  */
 void
-store_typed_address (void *buf, struct type *type, CORE_ADDR addr)
+store_typed_address (gdb_byte *buf, struct type *type, CORE_ADDR addr)
 {
   if (TYPE_CODE (type) != TYPE_CODE_PTR
       && TYPE_CODE (type) != TYPE_CODE_REF)
     internal_error (__FILE__, __LINE__,
-                   "store_typed_address: "
-                   "type is not a pointer or reference");
+                   _("store_typed_address: "
+                   "type is not a pointer or reference"));
 
   ADDRESS_TO_POINTER (type, buf, addr);
 }
@@ -260,7 +262,7 @@ value_of_register (int regnum, struct frame_info *frame)
   int optim;
   struct value *reg_val;
   int realnum;
-  char raw_buffer[MAX_REGISTER_SIZE];
+  gdb_byte raw_buffer[MAX_REGISTER_SIZE];
   enum lval_type lval;
 
   /* User registers lie completely outside of the range of normal
@@ -295,13 +297,13 @@ value_of_register (int regnum, struct frame_info *frame)
 /* Given a pointer of type TYPE in target form in BUF, return the
    address it represents.  */
 CORE_ADDR
-unsigned_pointer_to_address (struct type *type, const void *buf)
+unsigned_pointer_to_address (struct type *type, const gdb_byte *buf)
 {
   return extract_unsigned_integer (buf, TYPE_LENGTH (type));
 }
 
 CORE_ADDR
-signed_pointer_to_address (struct type *type, const void *buf)
+signed_pointer_to_address (struct type *type, const gdb_byte *buf)
 {
   return extract_signed_integer (buf, TYPE_LENGTH (type));
 }
@@ -309,13 +311,14 @@ signed_pointer_to_address (struct type *type, const void *buf)
 /* Given an address, store it as a pointer of type TYPE in target
    format in BUF.  */
 void
-unsigned_address_to_pointer (struct type *type, void *buf, CORE_ADDR addr)
+unsigned_address_to_pointer (struct type *type, gdb_byte *buf,
+                            CORE_ADDR addr)
 {
   store_unsigned_integer (buf, TYPE_LENGTH (type), addr);
 }
 
 void
-address_to_signed_pointer (struct type *type, void *buf, CORE_ADDR addr)
+address_to_signed_pointer (struct type *type, gdb_byte *buf, CORE_ADDR addr)
 {
   store_signed_integer (buf, TYPE_LENGTH (type), addr);
 }
@@ -385,12 +388,20 @@ read_var_value (struct symbol *var, struct frame_info *frame)
   CORE_ADDR addr;
   int len;
 
-  v = allocate_value (type);
-  VALUE_LVAL (v) = lval_memory;        /* The most likely possibility.  */
+  if (SYMBOL_CLASS (var) == LOC_COMPUTED
+      || SYMBOL_CLASS (var) == LOC_COMPUTED_ARG
+      || SYMBOL_CLASS (var) == LOC_REGISTER
+      || SYMBOL_CLASS (var) == LOC_REGPARM)
+    /* These cases do not use V.  */
+    v = NULL;
+  else
+    {
+      v = allocate_value (type);
+      VALUE_LVAL (v) = lval_memory;    /* The most likely possibility.  */
+    }
 
   len = TYPE_LENGTH (type);
 
-
   /* FIXME drow/2003-09-06: this call to the selected frame should be
      pushed upwards to the callers.  */
   if (frame == NULL)
@@ -422,9 +433,7 @@ read_var_value (struct symbol *var, struct frame_info *frame)
 
     case LOC_CONST_BYTES:
       {
-       char *bytes_addr;
-       bytes_addr = SYMBOL_VALUE_BYTES (var);
-       memcpy (value_contents_raw (v), bytes_addr, len);
+       memcpy (value_contents_raw (v), SYMBOL_VALUE_BYTES (var), len);
        VALUE_LVAL (v) = not_lval;
        return v;
       }
@@ -445,13 +454,14 @@ read_var_value (struct symbol *var, struct frame_info *frame)
        CORE_ADDR locaddr;
        struct value *loc;
        if (!target_has_execution)
-         error ("\
+         error (_("\
 Attempt to access variable defined in different shared object or load module when\n\
-addresses have not been bound by the dynamic loader. Try again when executable is running.");
+addresses have not been bound by the dynamic loader. Try again when executable is running."));
 
        locaddr = SYMBOL_VALUE_ADDRESS (var);
        loc = value_at (lookup_pointer_type (type), locaddr);
        addr = value_as_address (loc);
+       break;
       }
 
     case LOC_ARG:
@@ -495,14 +505,14 @@ addresses have not been bound by the dynamic loader. Try again when executable i
        regval = value_from_register (lookup_pointer_type (type),
                                      SYMBOL_BASEREG (var), frame);
        if (regval == NULL)
-         error ("Value of base register not available.");
+         error (_("Value of base register not available."));
        addr = value_as_address (regval);
        addr += SYMBOL_VALUE (var);
        break;
       }
 
     case LOC_TYPEDEF:
-      error ("Cannot look up value of a typedef");
+      error (_("Cannot look up value of a typedef"));
       break;
 
     case LOC_BLOCK:
@@ -532,7 +542,7 @@ addresses have not been bound by the dynamic loader. Try again when executable i
                                          frame);
 
            if (regval == NULL)
-             error ("Value of register variable not available.");
+             error (_("Value of register variable not available."));
 
            addr = value_as_address (regval);
            VALUE_LVAL (v) = lval_memory;
@@ -542,7 +552,7 @@ addresses have not been bound by the dynamic loader. Try again when executable i
            regval = value_from_register (type, regno, frame);
 
            if (regval == NULL)
-             error ("Value of register variable not available.");
+             error (_("Value of register variable not available."));
            return regval;
          }
       }
@@ -580,7 +590,7 @@ addresses have not been bound by the dynamic loader. Try again when executable i
       return v;
 
     default:
-      error ("Cannot look up value of a botched symbol.");
+      error (_("Cannot look up value of a botched symbol."));
       break;
     }
 
@@ -650,7 +660,7 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame)
       int len = TYPE_LENGTH (type);
       int value_bytes_copied;
       int optimized = 0;
-      char *value_bytes = (char *) alloca (len + MAX_REGISTER_SIZE);
+      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;
@@ -710,9 +720,9 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame)
       if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
          && len < register_size (current_gdbarch, regnum))
        /* Big-endian, and we want less than full size.  */
-       v->offset = register_size (current_gdbarch, regnum) - len;
+       set_value_offset (v, register_size (current_gdbarch, regnum) - len);
       else
-       v->offset = 0;
+       set_value_offset (v, 0);
       memcpy (value_contents_raw (v), value_bytes + value_offset (v), len);
     }
   return v;
@@ -736,7 +746,7 @@ locate_var_value (struct symbol *var, struct frame_info *frame)
 
   lazy_value = read_var_value (var, frame);
   if (lazy_value == 0)
-    error ("Address of \"%s\" is unknown.", SYMBOL_PRINT_NAME (var));
+    error (_("Address of \"%s\" is unknown."), SYMBOL_PRINT_NAME (var));
 
   if (value_lazy (lazy_value)
       || TYPE_CODE (type) == TYPE_CODE_FUNC)
@@ -754,14 +764,14 @@ locate_var_value (struct symbol *var, struct frame_info *frame)
     case lval_register:
       gdb_assert (REGISTER_NAME (VALUE_REGNUM (lazy_value)) != NULL
                  && *REGISTER_NAME (VALUE_REGNUM (lazy_value)) != '\0');
-      error("Address requested for identifier "
-           "\"%s\" which is in register $%s",
+      error (_("Address requested for identifier "
+              "\"%s\" which is in register $%s"),
             SYMBOL_PRINT_NAME (var), 
            REGISTER_NAME (VALUE_REGNUM (lazy_value)));
       break;
 
     default:
-      error ("Can't take address of \"%s\" which isn't an lvalue.",
+      error (_("Can't take address of \"%s\" which isn't an lvalue."),
             SYMBOL_PRINT_NAME (var));
       break;
     }