* gdb.texinfo (Command Files): Mention -x, use @enumerate for
[deliverable/binutils-gdb.git] / gdb / findvar.c
index 98322e014e4e8bac31bc8773988b958734f52261..5ee099ba9463d72806f3f4a714e1af4a08534ed1 100644 (file)
@@ -42,9 +42,12 @@ const struct floatformat floatformat_unknown;
 #define CANNOT_STORE_REGISTER(regno) 0
 #endif
 
-static void write_register_gen PARAMS ((int, char *));
+void write_register_gen PARAMS ((int, char *));
 
-static int read_relative_register_raw_bytes_for_frame PARAMS ((int regnum, char *myaddr, struct frame_info * frame));
+static int 
+read_relative_register_raw_bytes_for_frame PARAMS ((int regnum, 
+                                                   char *myaddr, 
+                                                   struct frame_info *frame));
 
 /* Basic byte-swapping routines.  GDB has needed these for a long time...
    All extract a target-format integer at ADDR which is LEN bytes long.  */
@@ -57,10 +60,8 @@ static int read_relative_register_raw_bytes_for_frame PARAMS ((int regnum, char
 you lose
 #endif
 
-  LONGEST
-extract_signed_integer (addr, len)
-     PTR addr;
-     int len;
+LONGEST
+extract_signed_integer (void *addr, int len)
 {
   LONGEST retval;
   unsigned char *p;
@@ -94,9 +95,7 @@ That operation is not available on integers of more than %d bytes.",
 }
 
 ULONGEST
-extract_unsigned_integer (addr, len)
-     PTR addr;
-     int len;
+extract_unsigned_integer (void *addr, int len)
 {
   ULONGEST retval;
   unsigned char *p;
@@ -130,10 +129,7 @@ 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 (addr, orig_len, pval)
-     PTR addr;
-     int orig_len;
-     LONGEST *pval;
+extract_long_unsigned_integer (void *addr, int orig_len, LONGEST *pval)
 {
   char *p, *first_addr;
   int len;
@@ -176,21 +172,45 @@ extract_long_unsigned_integer (addr, orig_len, pval)
   return 0;
 }
 
+
+/* Treat the LEN bytes at ADDR as a target-format address, and return
+   that address.  ADDR is a buffer in the GDB process, not in the
+   inferior.
+
+   This function should only be used by target-specific code.  It
+   assumes that a pointer has the same representation as that thing's
+   address represented as an integer.  Some machines use word
+   addresses, or similarly munged things, for certain types of
+   pointers, so that assumption doesn't hold everywhere.
+
+   Common code should use extract_typed_address instead, or something
+   else based on POINTER_TO_ADDRESS.  */
+
 CORE_ADDR
-extract_address (addr, len)
-     PTR addr;
-     int len;
+extract_address (void *addr, int len)
 {
   /* Assume a CORE_ADDR can fit in a LONGEST (for now).  Not sure
      whether we want this to be true eventually.  */
   return (CORE_ADDR) extract_unsigned_integer (addr, len);
 }
 
+
+/* Treat the bytes at BUF as a pointer of type TYPE, and return the
+   address it represents.  */
+CORE_ADDR
+extract_typed_address (void *buf, struct type *type)
+{
+  if (TYPE_CODE (type) != TYPE_CODE_PTR
+      && TYPE_CODE (type) != TYPE_CODE_REF)
+    internal_error ("findvar.c (extract_typed_address): "
+                   "type is not a pointer or reference");
+
+  return POINTER_TO_ADDRESS (type, buf);
+}
+
+
 void
-store_signed_integer (addr, len, val)
-     PTR addr;
-     int len;
-     LONGEST val;
+store_signed_integer (void *addr, int len, LONGEST val)
 {
   unsigned char *p;
   unsigned char *startaddr = (unsigned char *) addr;
@@ -217,10 +237,7 @@ store_signed_integer (addr, len, val)
 }
 
 void
-store_unsigned_integer (addr, len, val)
-     PTR addr;
-     int len;
-     ULONGEST val;
+store_unsigned_integer (void *addr, int len, ULONGEST val)
 {
   unsigned char *p;
   unsigned char *startaddr = (unsigned char *) addr;
@@ -246,17 +263,39 @@ store_unsigned_integer (addr, len, val)
     }
 }
 
-/* Store the literal address "val" into
-   gdb-local memory pointed to by "addr"
-   for "len" bytes. */
+/* Store the address VAL as a LEN-byte value in target byte order at
+   ADDR.  ADDR is a buffer in the GDB process, not in the inferior.
+
+   This function should only be used by target-specific code.  It
+   assumes that a pointer has the same representation as that thing's
+   address represented as an integer.  Some machines use word
+   addresses, or similarly munged things, for certain types of
+   pointers, so that assumption doesn't hold everywhere.
+
+   Common code should use store_typed_address instead, or something else
+   based on ADDRESS_TO_POINTER.  */
 void
-store_address (addr, len, val)
-     PTR addr;
-     int len;
-     LONGEST val;
+store_address (void *addr, int len, LONGEST val)
 {
   store_unsigned_integer (addr, len, 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)
+{
+  if (TYPE_CODE (type) != TYPE_CODE_PTR
+      && TYPE_CODE (type) != TYPE_CODE_REF)
+    internal_error ("findvar.c (store_typed_address): "
+                   "type is not a pointer or reference");
+
+  ADDRESS_TO_POINTER (type, buf, addr);
+}
+
+
+
 \f
 /* Extract a floating-point number from a target-order byte-stream at ADDR.
    Returns the value as type DOUBLEST.
@@ -307,10 +346,6 @@ extract_floating (void *addr, int len)
       else
        floatformat_to_doublest (TARGET_LONG_DOUBLE_FORMAT, addr, &dretval);
     }
-#ifdef TARGET_EXTRACT_FLOATING
-  else if (TARGET_EXTRACT_FLOATING (addr, len, &dretval))
-    return dretval;
-#endif
   else
     {
       error ("Can't deal with a floating point number of %d bytes.", len);
@@ -351,10 +386,6 @@ store_floating (void *addr, int len, DOUBLEST val)
       else
        floatformat_from_doublest (TARGET_LONG_DOUBLE_FORMAT, &val, addr);
     }
-#ifdef TARGET_STORE_FLOATING
-  else if (TARGET_STORE_FLOATING (addr, len, val))
-    return;
-#endif 
   else
     {
       error ("Can't deal with a floating point number of %d bytes.", len);
@@ -471,7 +502,8 @@ default_get_saved_register (raw_buffer, optimized, addrp, frame, regnum, lval)
          if (raw_buffer != NULL)
            {
              /* Put it back in target format.  */
-             store_address (raw_buffer, REGISTER_RAW_SIZE (regnum), (LONGEST) addr);
+             store_address (raw_buffer, REGISTER_RAW_SIZE (regnum),
+                            (LONGEST) addr);
            }
          if (addrp != NULL)
            *addrp = 0;
@@ -748,7 +780,7 @@ read_register_gen (regno, myaddr)
 /* Write register REGNO at MYADDR to the target.  MYADDR points at
    REGISTER_RAW_BYTES(REGNO), which must be in target byte-order.  */
 
-static void
+void
 write_register_gen (regno, myaddr)
      int regno;
      char *myaddr;
@@ -857,8 +889,9 @@ read_register (regno)
   if (!register_valid[regno])
     target_fetch_registers (regno);
 
-  return (CORE_ADDR) extract_address (&registers[REGISTER_BYTE (regno)],
-                                     REGISTER_RAW_SIZE (regno));
+  return ((CORE_ADDR)
+         extract_unsigned_integer (&registers[REGISTER_BYTE (regno)],
+                                   REGISTER_RAW_SIZE (regno)));
 }
 
 CORE_ADDR
@@ -1176,6 +1209,25 @@ write_fp (val)
 {
   TARGET_WRITE_FP (val);
 }
+
+
+/* Given a pointer of type TYPE in target form in BUF, return the
+   address it represents.  */
+CORE_ADDR
+generic_pointer_to_address (struct type *type, char *buf)
+{
+  return extract_address (buf, TYPE_LENGTH (type));
+}
+
+
+/* Given an address, store it as a pointer of type TYPE in target
+   format in BUF.  */
+void
+generic_address_to_pointer (struct type *type, char *buf, CORE_ADDR addr)
+{
+  store_address (buf, TYPE_LENGTH (type), addr);
+}
+
 \f
 /* Will calling read_var_value or locate_var_value on SYM end
    up caring what frame it is being evaluated relative to?  SYM must
@@ -1257,12 +1309,15 @@ read_var_value (var, frame)
     case LOC_LABEL:
       /* Put the constant back in target format.  */
       if (overlay_debugging)
-       store_address (VALUE_CONTENTS_RAW (v), len,
-            (LONGEST) symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (var),
-                                                SYMBOL_BFD_SECTION (var)));
+       {
+         CORE_ADDR addr
+           = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (var),
+                                       SYMBOL_BFD_SECTION (var));
+         store_typed_address (VALUE_CONTENTS_RAW (v), type, addr);
+       }
       else
-       store_address (VALUE_CONTENTS_RAW (v), len,
-                      (LONGEST) SYMBOL_VALUE_ADDRESS (var));
+       store_typed_address (VALUE_CONTENTS_RAW (v), type,
+                             SYMBOL_VALUE_ADDRESS (var));
       VALUE_LVAL (v) = not_lval;
       return v;
 
@@ -1704,7 +1759,7 @@ locate_var_value (var, frame)
       value_ptr val;
 
       addr = VALUE_ADDRESS (lazy_value);
-      val = value_from_longest (lookup_pointer_type (type), (LONGEST) addr);
+      val = value_from_pointer (lookup_pointer_type (type), addr);
       VALUE_BFD_SECTION (val) = VALUE_BFD_SECTION (lazy_value);
       return val;
     }
This page took 0.026517 seconds and 4 git commands to generate.