]> Git Repo - binutils.git/blobdiff - gdb/valops.c
* c-typeprint.c (c_type_print_cv_qualifier): Don't print `const'
[binutils.git] / gdb / valops.c
index 918398493bcc7ad95388ddd7fc700e243bae6979..0ab0ae6e916a97c4c82eb361a3e22813a54b6058 100644 (file)
@@ -1,6 +1,6 @@
 /* Perform non-arithmetic operations on values, for GDB.
-   Copyright 1986, 87, 89, 91, 92, 93, 94, 95, 96, 97, 1998
-   Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -30,6 +30,7 @@
 #include "demangle.h"
 #include "language.h"
 #include "gdbcmd.h"
+#include "regcache.h"
 
 #include <errno.h>
 #include "gdb_string.h"
@@ -70,8 +71,6 @@ static struct fn_field *find_method_list (value_ptr * argp, char *method,
 
 void _initialize_valops (void);
 
-#define VALUE_SUBSTRING_START(VAL) VALUE_FRAME(VAL)
-
 /* Flag for whether we want to abandon failed expression evals by default.  */
 
 #if 0
@@ -289,12 +288,23 @@ value_cast (struct type *type, register value_ptr arg2)
                                      code2 == TYPE_CODE_ENUM ||
                                      code2 == TYPE_CODE_RANGE))
     {
-      int ptr_bit = HOST_CHAR_BIT * TYPE_LENGTH (type);
+      /* TYPE_LENGTH (type) is the length of a pointer, but we really
+        want the length of an address! -- we are really dealing with
+        addresses (i.e., gdb representations) not pointers (i.e.,
+        target representations) here.
+
+        This allows things like "print *(int *)0x01000234" to work
+        without printing a misleading message -- which would
+        otherwise occur when dealing with a target having two byte
+        pointers and four byte addresses.  */
+
+      int addr_bit = TARGET_ADDR_BIT;
+
       LONGEST longest = value_as_long (arg2);
-      if (ptr_bit < sizeof (LONGEST) * HOST_CHAR_BIT)
+      if (addr_bit < sizeof (LONGEST) * HOST_CHAR_BIT)
        {
-         if (longest >= ((LONGEST) 1 << ptr_bit)
-             || longest <= -((LONGEST) 1 << ptr_bit))
+         if (longest >= ((LONGEST) 1 << addr_bit)
+             || longest <= -((LONGEST) 1 << addr_bit))
            warning ("value truncated");
        }
       return value_from_longest (type, longest);
@@ -561,7 +571,7 @@ value_assign (register value_ptr toval, register value_ptr fromval)
 {
   register struct type *type;
   register value_ptr val;
-  char raw_buffer[MAX_REGISTER_RAW_SIZE];
+  char *raw_buffer = (char*) alloca (MAX_REGISTER_RAW_SIZE);
   int use_buffer = 0;
 
   if (!toval->modifiable)
@@ -1018,7 +1028,7 @@ CORE_ADDR
 push_word (CORE_ADDR sp, ULONGEST word)
 {
   register int len = REGISTER_SIZE;
-  char buffer[MAX_REGISTER_RAW_SIZE];
+  char *buffer = alloca (MAX_REGISTER_RAW_SIZE);
 
   store_unsigned_integer (buffer, len, word);
   if (INNER_THAN (1, 2))
@@ -1520,26 +1530,19 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
                {
                  /* stack grows downward */
                  sp -= aligned_len;
+                 /* ... so the address of the thing we push is the
+                    stack pointer after we push it.  */
+                 addr = sp;
                }
              else
                {
                  /* The stack grows up, so the address of the thing
                     we push is the stack pointer before we push it.  */
                  addr = sp;
-               }
-             /* Push the structure.  */
-             write_memory (sp, VALUE_CONTENTS_ALL (args[i]), len);
-             if (INNER_THAN (1, 2))
-               {
-                 /* The stack grows down, so the address of the thing
-                    we push is the stack pointer after we push it.  */
-                 addr = sp;
-               }
-             else
-               {
-                 /* stack grows upward */
                  sp += aligned_len;
                }
+             /* Push the structure.  */
+             write_memory (addr, VALUE_CONTENTS_ALL (args[i]), len);
              /* The value we're going to pass is the address of the
                 thing we just pushed.  */
              /*args[i] = value_from_longest (lookup_pointer_type (value_type),
@@ -1656,7 +1659,7 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
     SAVE_DUMMY_FRAME_TOS (sp);
 
   {
-    char retbuf[REGISTER_BYTES];
+    char *retbuf = (char*) alloca (REGISTER_BYTES);
     char *name;
     struct symbol *symbol;
 
@@ -2788,7 +2791,7 @@ find_overload_match (struct type **arg_types, int nargs, char *name, int method,
          default:
            break;
          }
-      free (parm_types);
+      xfree (parm_types);
       if (overload_debug)
        {
          if (method)
@@ -2860,7 +2863,7 @@ find_overload_match (struct type **arg_types, int nargs, char *name, int method,
   else
     {
       *symp = oload_syms[oload_champ];
-      free (func_name);
+      xfree (func_name);
     }
 
   return oload_incompatible ? 100 : (oload_non_standard ? 10 : 0);
This page took 0.030526 seconds and 4 git commands to generate.