* value.h (value_as_address): Rename value_as_pointer.
[deliverable/binutils-gdb.git] / gdb / valops.c
index 7ead578be1977f7eb41eec521c02ae786e704c57..22c6948b0e526197e035f4025a66b86cfc79e5e2 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,8 @@
 #include "demangle.h"
 #include "language.h"
 #include "gdbcmd.h"
+#include "regcache.h"
+#include "cp-abi.h"
 
 #include <errno.h>
 #include "gdb_string.h"
    value operations with HP aCC code/runtime. */
 extern int hp_som_som_object_present;
 
-
+extern int overload_debug;
 /* Local functions.  */
 
-static int typecmp PARAMS ((int staticp, struct type * t1[], value_ptr t2[]));
-
-static CORE_ADDR find_function_addr PARAMS ((value_ptr, struct type **));
-static value_ptr value_arg_coerce PARAMS ((value_ptr, struct type *, int));
+static int typecmp (int staticp, struct type *t1[], value_ptr t2[]);
 
+static CORE_ADDR find_function_addr (value_ptr, struct type **);
+static value_ptr value_arg_coerce (value_ptr, struct type *, int);
 
-static CORE_ADDR value_push PARAMS ((CORE_ADDR, value_ptr));
 
-static value_ptr search_struct_field PARAMS ((char *, value_ptr, int,
-                                             struct type *, int));
+static CORE_ADDR value_push (CORE_ADDR, value_ptr);
 
-static value_ptr search_struct_method PARAMS ((char *, value_ptr *,
-                                              value_ptr *,
-                                              int, int *, struct type *));
+static value_ptr search_struct_field (char *, value_ptr, int,
+                                     struct type *, int);
 
-static int check_field_in PARAMS ((struct type *, const char *));
+static value_ptr search_struct_method (char *, value_ptr *,
+                                      value_ptr *,
+                                      int, int *, struct type *);
 
-static CORE_ADDR allocate_space_in_inferior PARAMS ((int));
+static int check_field_in (struct type *, const char *);
 
-static value_ptr cast_into_complex PARAMS ((struct type *, value_ptr));
+static CORE_ADDR allocate_space_in_inferior (int);
 
-static struct fn_field *find_method_list PARAMS ((value_ptr * argp, char *method, int offset, int *static_memfuncp, struct type * type, int *num_fns, struct type ** basetype, int *boffset));
+static value_ptr cast_into_complex (struct type *, value_ptr);
 
-void _initialize_valops PARAMS ((void));
+static struct fn_field *find_method_list (value_ptr * argp, char *method,
+                                         int offset, int *static_memfuncp,
+                                         struct type *type, int *num_fns,
+                                         struct type **basetype,
+                                         int *boffset);
 
-#define VALUE_SUBSTRING_START(VAL) VALUE_FRAME(VAL)
+void _initialize_valops (void);
 
 /* Flag for whether we want to abandon failed expression evals by default.  */
 
@@ -88,8 +92,7 @@ int unwind_on_signal_p = 0;
 /* Find the address of function name NAME in the inferior.  */
 
 value_ptr
-find_function_in_inferior (name)
-     char *name;
+find_function_in_inferior (char *name)
 {
   register struct symbol *sym;
   sym = lookup_symbol (name, 0, VAR_NAMESPACE, 0, NULL);
@@ -108,12 +111,12 @@ find_function_in_inferior (name)
       if (msymbol != NULL)
        {
          struct type *type;
-         LONGEST maddr;
+         CORE_ADDR maddr;
          type = lookup_pointer_type (builtin_type_char);
          type = lookup_function_type (type);
          type = lookup_pointer_type (type);
-         maddr = (LONGEST) SYMBOL_VALUE_ADDRESS (msymbol);
-         return value_from_longest (type, maddr);
+         maddr = SYMBOL_VALUE_ADDRESS (msymbol);
+         return value_from_pointer (type, maddr);
        }
       else
        {
@@ -129,8 +132,7 @@ find_function_in_inferior (name)
    and return a value that is a pointer to the allocated space. */
 
 value_ptr
-value_allocate_space_in_inferior (len)
-     int len;
+value_allocate_space_in_inferior (int len)
 {
   value_ptr blocklen;
   register value_ptr val = find_function_in_inferior ("malloc");
@@ -148,8 +150,7 @@ value_allocate_space_in_inferior (len)
 }
 
 static CORE_ADDR
-allocate_space_in_inferior (len)
-     int len;
+allocate_space_in_inferior (int len)
 {
   return value_as_long (value_allocate_space_in_inferior (len));
 }
@@ -160,9 +161,7 @@ allocate_space_in_inferior (len)
 /* In C++, casts may change pointer or object representations.  */
 
 value_ptr
-value_cast (type, arg2)
-     struct type *type;
-     register value_ptr arg2;
+value_cast (struct type *type, register value_ptr arg2)
 {
   register enum type_code code1;
   register enum type_code code2;
@@ -269,7 +268,8 @@ value_cast (type, arg2)
              /* With HP aCC, pointers to data members have a bias */
            case TYPE_CODE_MEMBER:
              retvalp = value_from_longest (type, value_as_long (arg2));
-             ptr = (unsigned int *) VALUE_CONTENTS (retvalp);  /* force evaluation */
+             /* force evaluation */
+             ptr = (unsigned int *) VALUE_CONTENTS (retvalp);
              *ptr &= ~0x20000000;      /* zap 29th bit to remove bias */
              return retvalp;
 
@@ -281,8 +281,45 @@ value_cast (type, arg2)
              break;            /* fall out and go to normal handling */
            }
        }
-      longest = value_as_long (arg2);
-      return value_from_longest (type, convert_to_boolean ? (LONGEST) (longest ? 1 : 0) : longest);
+
+      /* When we cast pointers to integers, we mustn't use
+         POINTER_TO_ADDRESS to find the address the pointer
+         represents, as value_as_long would.  GDB should evaluate
+         expressions just as the compiler would --- and the compiler
+         sees a cast as a simple reinterpretation of the pointer's
+         bits.  */
+      if (code2 == TYPE_CODE_PTR)
+        longest = extract_unsigned_integer (VALUE_CONTENTS (arg2),
+                                            TYPE_LENGTH (type2));
+      else
+        longest = value_as_long (arg2);
+      return value_from_longest (type, convert_to_boolean ?
+                                (LONGEST) (longest ? 1 : 0) : longest);
+    }
+  else if (code1 == TYPE_CODE_PTR && (code2 == TYPE_CODE_INT  ||
+                                     code2 == TYPE_CODE_ENUM ||
+                                     code2 == TYPE_CODE_RANGE))
+    {
+      /* 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 (addr_bit < sizeof (LONGEST) * HOST_CHAR_BIT)
+       {
+         if (longest >= ((LONGEST) 1 << addr_bit)
+             || longest <= -((LONGEST) 1 << addr_bit))
+           warning ("value truncated");
+       }
+      return value_from_longest (type, longest);
     }
   else if (TYPE_LENGTH (type) == TYPE_LENGTH (type2))
     {
@@ -324,6 +361,12 @@ value_cast (type, arg2)
                      value_ptr v2 = value_ind (arg2);
                      VALUE_ADDRESS (v2) -= VALUE_ADDRESS (v)
                        + VALUE_OFFSET (v);
+
+                      /* JYG: adjust the new pointer value and
+                        embedded offset. */
+                      v2->aligner.contents[0] -=  VALUE_EMBEDDED_OFFSET (v);
+                      VALUE_EMBEDDED_OFFSET (v2) = 0;
+
                      v2 = value_addr (v2);
                      VALUE_TYPE (v2) = type;
                      return v2;
@@ -333,7 +376,7 @@ value_cast (type, arg2)
          /* No superclass found, just fall through to change ptr type.  */
        }
       VALUE_TYPE (arg2) = type;
-      VALUE_ENCLOSING_TYPE (arg2) = type;      /* pai: chk_val */
+      arg2 = value_change_enclosing_type (arg2, type);
       VALUE_POINTED_TO_OFFSET (arg2) = 0;      /* pai: chk_val */
       return arg2;
     }
@@ -399,9 +442,7 @@ value_cast (type, arg2)
 /* Create a value of type TYPE that is zero, and return it.  */
 
 value_ptr
-value_zero (type, lv)
-     struct type *type;
-     enum lval_type lv;
+value_zero (struct type *type, enum lval_type lv)
 {
   register value_ptr val = allocate_value (type);
 
@@ -411,23 +452,20 @@ value_zero (type, lv)
   return val;
 }
 
-/* Return a value with type TYPE located at ADDR.  
+/* Return a value with type TYPE located at ADDR.
 
    Call value_at only if the data needs to be fetched immediately;
    if we can be 'lazy' and defer the fetch, perhaps indefinately, call
    value_at_lazy instead.  value_at_lazy simply records the address of
-   the data and sets the lazy-evaluation-required flag.  The lazy flag 
-   is tested in the VALUE_CONTENTS macro, which is used if and when 
-   the contents are actually required. 
+   the data and sets the lazy-evaluation-required flag.  The lazy flag
+   is tested in the VALUE_CONTENTS macro, which is used if and when
+   the contents are actually required.
 
    Note: value_at does *NOT* handle embedded offsets; perform such
    adjustments before or after calling it. */
 
 value_ptr
-value_at (type, addr, sect)
-     struct type *type;
-     CORE_ADDR addr;
-     asection *sect;
+value_at (struct type *type, CORE_ADDR addr, asection *sect)
 {
   register value_ptr val;
 
@@ -436,30 +474,7 @@ value_at (type, addr, sect)
 
   val = allocate_value (type);
 
-  if (GDB_TARGET_IS_D10V
-      && TYPE_CODE (type) == TYPE_CODE_PTR
-      && TYPE_TARGET_TYPE (type)
-      && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC))
-    {
-      /* pointer to function */
-      unsigned long num;
-      unsigned short snum;
-      snum = read_memory_unsigned_integer (addr, 2);
-      num = D10V_MAKE_IADDR (snum);
-      store_address (VALUE_CONTENTS_RAW (val), 4, num);
-    }
-  else if (GDB_TARGET_IS_D10V
-          && TYPE_CODE (type) == TYPE_CODE_PTR)
-    {
-      /* pointer to data */
-      unsigned long num;
-      unsigned short snum;
-      snum = read_memory_unsigned_integer (addr, 2);
-      num = D10V_MAKE_DADDR (snum);
-      store_address (VALUE_CONTENTS_RAW (val), 4, num);
-    }
-  else
-    read_memory_section (addr, VALUE_CONTENTS_ALL_RAW (val), TYPE_LENGTH (type), sect);
+  read_memory (addr, VALUE_CONTENTS_ALL_RAW (val), TYPE_LENGTH (type));
 
   VALUE_LVAL (val) = lval_memory;
   VALUE_ADDRESS (val) = addr;
@@ -471,10 +486,7 @@ value_at (type, addr, sect)
 /* Return a lazy value with type TYPE located at ADDR (cf. value_at).  */
 
 value_ptr
-value_at_lazy (type, addr, sect)
-     struct type *type;
-     CORE_ADDR addr;
-     asection *sect;
+value_at_lazy (struct type *type, CORE_ADDR addr, asection *sect)
 {
   register value_ptr val;
 
@@ -491,9 +503,9 @@ value_at_lazy (type, addr, sect)
   return val;
 }
 
-/* Called only from the VALUE_CONTENTS and VALUE_CONTENTS_ALL macros, 
-   if the current data for a variable needs to be loaded into 
-   VALUE_CONTENTS(VAL).  Fetches the data from the user's process, and 
+/* Called only from the VALUE_CONTENTS and VALUE_CONTENTS_ALL macros,
+   if the current data for a variable needs to be loaded into
+   VALUE_CONTENTS(VAL).  Fetches the data from the user's process, and
    clears the lazy flag to indicate that the data in the buffer is valid.
 
    If the value is zero-length, we avoid calling read_memory, which would
@@ -504,38 +516,15 @@ value_at_lazy (type, addr, sect)
    value is ignored.  */
 
 int
-value_fetch_lazy (val)
-     register value_ptr val;
+value_fetch_lazy (register value_ptr val)
 {
   CORE_ADDR addr = VALUE_ADDRESS (val) + VALUE_OFFSET (val);
   int length = TYPE_LENGTH (VALUE_ENCLOSING_TYPE (val));
 
   struct type *type = VALUE_TYPE (val);
-  if (GDB_TARGET_IS_D10V
-      && TYPE_CODE (type) == TYPE_CODE_PTR
-      && TYPE_TARGET_TYPE (type)
-      && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC))
-    {
-      /* pointer to function */
-      unsigned long num;
-      unsigned short snum;
-      snum = read_memory_unsigned_integer (addr, 2);
-      num = D10V_MAKE_IADDR (snum);
-      store_address (VALUE_CONTENTS_RAW (val), 4, num);
-    }
-  else if (GDB_TARGET_IS_D10V
-          && TYPE_CODE (type) == TYPE_CODE_PTR)
-    {
-      /* pointer to data */
-      unsigned long num;
-      unsigned short snum;
-      snum = read_memory_unsigned_integer (addr, 2);
-      num = D10V_MAKE_DADDR (snum);
-      store_address (VALUE_CONTENTS_RAW (val), 4, num);
-    }
-  else if (length)
-    read_memory_section (addr, VALUE_CONTENTS_ALL_RAW (val), length,
-                        VALUE_BFD_SECTION (val));
+  if (length)
+    read_memory (addr, VALUE_CONTENTS_ALL_RAW (val), length);
+
   VALUE_LAZY (val) = 0;
   return 0;
 }
@@ -545,12 +534,11 @@ value_fetch_lazy (val)
    Return a new value with the location of TOVAL and contents of FROMVAL.  */
 
 value_ptr
-value_assign (toval, fromval)
-     register value_ptr toval, fromval;
+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)
@@ -587,7 +575,7 @@ value_assign (toval, fromval)
     case lval_internalvar:
       set_internalvar (VALUE_INTERNALVAR (toval), fromval);
       val = value_copy (VALUE_INTERNALVAR (toval)->value);
-      VALUE_ENCLOSING_TYPE (val) = VALUE_ENCLOSING_TYPE (fromval);
+      val = value_change_enclosing_type (val, VALUE_ENCLOSING_TYPE (fromval));
       VALUE_EMBEDDED_OFFSET (val) = VALUE_EMBEDDED_OFFSET (fromval);
       VALUE_POINTED_TO_OFFSET (val) = VALUE_POINTED_TO_OFFSET (fromval);
       return val;
@@ -650,7 +638,8 @@ value_assign (toval, fromval)
       if (VALUE_BITSIZE (toval))
        {
          char buffer[sizeof (LONGEST)];
-         int len = REGISTER_RAW_SIZE (VALUE_REGNO (toval));
+         int len =
+               REGISTER_RAW_SIZE (VALUE_REGNO (toval)) - VALUE_OFFSET (toval);
 
          if (len > (int) sizeof (LONGEST))
            error ("Can't handle bitfields in registers larger than %d bits.",
@@ -800,7 +789,7 @@ value_assign (toval, fromval)
   memcpy (VALUE_CONTENTS_RAW (val), VALUE_CONTENTS (fromval),
          TYPE_LENGTH (type));
   VALUE_TYPE (val) = type;
-  VALUE_ENCLOSING_TYPE (val) = VALUE_ENCLOSING_TYPE (fromval);
+  val = value_change_enclosing_type (val, VALUE_ENCLOSING_TYPE (fromval));
   VALUE_EMBEDDED_OFFSET (val) = VALUE_EMBEDDED_OFFSET (fromval);
   VALUE_POINTED_TO_OFFSET (val) = VALUE_POINTED_TO_OFFSET (fromval);
 
@@ -810,9 +799,7 @@ value_assign (toval, fromval)
 /* Extend a value VAL to COUNT repetitions of its type.  */
 
 value_ptr
-value_repeat (arg1, count)
-     value_ptr arg1;
-     int count;
+value_repeat (value_ptr arg1, int count)
 {
   register value_ptr val;
 
@@ -833,9 +820,7 @@ value_repeat (arg1, count)
 }
 
 value_ptr
-value_of_variable (var, b)
-     struct symbol *var;
-     struct block *b;
+value_of_variable (struct symbol *var, struct block *b)
 {
   value_ptr val;
   struct frame_info *frame = NULL;
@@ -887,32 +872,30 @@ value_of_variable (var, b)
  */
 
 value_ptr
-value_coerce_array (arg1)
-     value_ptr arg1;
+value_coerce_array (value_ptr arg1)
 {
   register struct type *type = check_typedef (VALUE_TYPE (arg1));
 
   if (VALUE_LVAL (arg1) != lval_memory)
     error ("Attempt to take address of value not located in memory.");
 
-  return value_from_longest (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
-                   (LONGEST) (VALUE_ADDRESS (arg1) + VALUE_OFFSET (arg1)));
+  return value_from_pointer (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
+                            (VALUE_ADDRESS (arg1) + VALUE_OFFSET (arg1)));
 }
 
 /* Given a value which is a function, return a value which is a pointer
    to it.  */
 
 value_ptr
-value_coerce_function (arg1)
-     value_ptr arg1;
+value_coerce_function (value_ptr arg1)
 {
   value_ptr retval;
 
   if (VALUE_LVAL (arg1) != lval_memory)
     error ("Attempt to take address of value not located in memory.");
 
-  retval = value_from_longest (lookup_pointer_type (VALUE_TYPE (arg1)),
-                   (LONGEST) (VALUE_ADDRESS (arg1) + VALUE_OFFSET (arg1)));
+  retval = value_from_pointer (lookup_pointer_type (VALUE_TYPE (arg1)),
+                              (VALUE_ADDRESS (arg1) + VALUE_OFFSET (arg1)));
   VALUE_BFD_SECTION (retval) = VALUE_BFD_SECTION (arg1);
   return retval;
 }
@@ -920,8 +903,7 @@ value_coerce_function (arg1)
 /* Return a pointer value for the object for which ARG1 is the contents.  */
 
 value_ptr
-value_addr (arg1)
-     value_ptr arg1;
+value_addr (value_ptr arg1)
 {
   value_ptr arg2;
 
@@ -942,14 +924,14 @@ value_addr (arg1)
     error ("Attempt to take address of value not located in memory.");
 
   /* Get target memory address */
-  arg2 = value_from_longest (lookup_pointer_type (VALUE_TYPE (arg1)),
-                            (LONGEST) (VALUE_ADDRESS (arg1)
-                                       + VALUE_OFFSET (arg1)
-                                       + VALUE_EMBEDDED_OFFSET (arg1)));
+  arg2 = value_from_pointer (lookup_pointer_type (VALUE_TYPE (arg1)),
+                            (VALUE_ADDRESS (arg1)
+                             + VALUE_OFFSET (arg1)
+                             + VALUE_EMBEDDED_OFFSET (arg1)));
 
   /* This may be a pointer to a base subobject; so remember the
      full derived object's type ... */
-  VALUE_ENCLOSING_TYPE (arg2) = lookup_pointer_type (VALUE_ENCLOSING_TYPE (arg1));
+  arg2 = value_change_enclosing_type (arg2, lookup_pointer_type (VALUE_ENCLOSING_TYPE (arg1)));
   /* ... and also the relative position of the subobject in the full object */
   VALUE_POINTED_TO_OFFSET (arg2) = VALUE_EMBEDDED_OFFSET (arg1);
   VALUE_BFD_SECTION (arg2) = VALUE_BFD_SECTION (arg1);
@@ -959,8 +941,7 @@ value_addr (arg1)
 /* Given a value of a pointer type, apply the C unary * operator to it.  */
 
 value_ptr
-value_ind (arg1)
-     value_ptr arg1;
+value_ind (value_ptr arg1)
 {
   struct type *base_type;
   value_ptr arg2;
@@ -989,12 +970,12 @@ value_ind (arg1)
       enc_type = TYPE_TARGET_TYPE (enc_type);
       /* Retrieve the enclosing object pointed to */
       arg2 = value_at_lazy (enc_type,
-                  value_as_pointer (arg1) - VALUE_POINTED_TO_OFFSET (arg1),
+                  value_as_address (arg1) - VALUE_POINTED_TO_OFFSET (arg1),
                            VALUE_BFD_SECTION (arg1));
       /* Re-adjust type */
       VALUE_TYPE (arg2) = TYPE_TARGET_TYPE (base_type);
       /* Add embedding info */
-      VALUE_ENCLOSING_TYPE (arg2) = enc_type;
+      arg2 = value_change_enclosing_type (arg2, enc_type);
       VALUE_EMBEDDED_OFFSET (arg2) = VALUE_POINTED_TO_OFFSET (arg1);
 
       /* We may be pointing to an object of some derived type */
@@ -1011,12 +992,10 @@ value_ind (arg1)
 /* Push one word (the size of object that a register holds).  */
 
 CORE_ADDR
-push_word (sp, word)
-     CORE_ADDR sp;
-     ULONGEST word;
+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))
@@ -1038,10 +1017,7 @@ push_word (sp, word)
 /* Push LEN bytes with data at BUFFER.  */
 
 CORE_ADDR
-push_bytes (sp, buffer, len)
-     CORE_ADDR sp;
-     char *buffer;
-     int len;
+push_bytes (CORE_ADDR sp, char *buffer, int len)
 {
   if (INNER_THAN (1, 2))
     {
@@ -1067,9 +1043,7 @@ push_bytes (sp, buffer, len)
    it to be an argument to a function.  */
 
 static CORE_ADDR
-value_push (sp, arg)
-     register CORE_ADDR sp;
-     value_ptr arg;
+value_push (register CORE_ADDR sp, value_ptr arg)
 {
   register int len = TYPE_LENGTH (VALUE_ENCLOSING_TYPE (arg));
   register int container_len = len;
@@ -1107,12 +1081,8 @@ value_push (sp, arg)
 #endif
 
 CORE_ADDR
-default_push_arguments (nargs, args, sp, struct_return, struct_addr)
-     int nargs;
-     value_ptr *args;
-     CORE_ADDR sp;
-     int struct_return;
-     CORE_ADDR struct_addr;
+default_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
+                       int struct_return, CORE_ADDR struct_addr)
 {
   /* ASSERT ( !struct_return); */
   int i;
@@ -1122,18 +1092,6 @@ default_push_arguments (nargs, args, sp, struct_return, struct_addr)
 }
 
 
-/* If we're calling a function declared without a prototype, should we
-   promote floats to doubles?  FORMAL and ACTUAL are the types of the
-   arguments; FORMAL may be NULL.
-
-   If we have no definition for this macro, either from the target or
-   from gdbarch, provide a default.  */
-#ifndef COERCE_FLOAT_TO_DOUBLE
-#define COERCE_FLOAT_TO_DOUBLE(formal, actual) \
-  (default_coerce_float_to_double ((formal), (actual)))
-#endif   
-
-
 /* A default function for COERCE_FLOAT_TO_DOUBLE: do the coercion only
    when we don't have any type for the argument at hand.  This occurs
    when we have no debug info, or when passing varargs.
@@ -1169,10 +1127,7 @@ standard_coerce_float_to_double (struct type *formal, struct type *actual)
    IS_PROTOTYPED is non-zero if the function declaration is prototyped.  */
 
 static value_ptr
-value_arg_coerce (arg, param_type, is_prototyped)
-     value_ptr arg;
-     struct type *param_type;
-     int is_prototyped;
+value_arg_coerce (value_ptr arg, struct type *param_type, int is_prototyped)
 {
   register struct type *arg_type = check_typedef (VALUE_TYPE (arg));
   register struct type *type
@@ -1244,13 +1199,11 @@ value_arg_coerce (arg, param_type, is_prototyped)
   return value_cast (type, arg);
 }
 
-/* Determine a function's address and its return type from its value. 
+/* Determine a function's address and its return type from its value.
    Calls error() if the function is not valid for calling.  */
 
 static CORE_ADDR
-find_function_addr (function, retval_type)
-     value_ptr function;
-     struct type **retval_type;
+find_function_addr (value_ptr function, struct type **retval_type)
 {
   register struct type *ftype = check_typedef (VALUE_TYPE (function));
   register enum type_code code = TYPE_CODE (ftype);
@@ -1268,17 +1221,12 @@ find_function_addr (function, retval_type)
     }
   else if (code == TYPE_CODE_PTR)
     {
-      funaddr = value_as_pointer (function);
+      funaddr = value_as_address (function);
       ftype = check_typedef (TYPE_TARGET_TYPE (ftype));
       if (TYPE_CODE (ftype) == TYPE_CODE_FUNC
          || TYPE_CODE (ftype) == TYPE_CODE_METHOD)
        {
-#ifdef CONVERT_FROM_FUNC_PTR_ADDR
-         /* FIXME: This is a workaround for the unusual function
-            pointer representation on the RS/6000, see comment
-            in config/rs6000/tm-rs6000.h  */
          funaddr = CONVERT_FROM_FUNC_PTR_ADDR (funaddr);
-#endif
          value_type = TYPE_TARGET_TYPE (ftype);
        }
       else
@@ -1289,7 +1237,7 @@ find_function_addr (function, retval_type)
       /* Handle the case of functions lacking debugging info.
          Their values are characters since their addresses are char */
       if (TYPE_LENGTH (ftype) == 1)
-       funaddr = value_as_pointer (value_addr (function));
+       funaddr = value_as_address (value_addr (function));
       else
        /* Handle integer used as address of a function.  */
        funaddr = (CORE_ADDR) value_as_long (function);
@@ -1321,12 +1269,10 @@ find_function_addr (function, retval_type)
 
    ARGS is modified to contain coerced values. */
 
-static value_ptr hand_function_call PARAMS ((value_ptr function, int nargs, value_ptr * args));
+static value_ptr hand_function_call (value_ptr function, int nargs,
+                                    value_ptr * args);
 static value_ptr
-hand_function_call (function, nargs, args)
-     value_ptr function;
-     int nargs;
-     value_ptr *args;
+hand_function_call (value_ptr function, int nargs, value_ptr *args)
 {
   register CORE_ADDR sp;
   register int i;
@@ -1335,7 +1281,7 @@ hand_function_call (function, nargs, args)
   /* CALL_DUMMY is an array of words (REGISTER_SIZE), but each word
      is in host byte order.  Before calling FIX_CALL_DUMMY, we byteswap it
      and remove any extra bytes which might exist because ULONGEST is
-     bigger than REGISTER_SIZE.  
+     bigger than REGISTER_SIZE.
 
      NOTE: This is pretty wierd, as the call dummy is actually a
      sequence of instructions.  But CISC machines will have
@@ -1370,8 +1316,7 @@ hand_function_call (function, nargs, args)
     noprocess ();
 
   inf_status = save_inferior_status (1);
-  old_chain = make_cleanup ((make_cleanup_func) restore_inferior_status,
-                           inf_status);
+  old_chain = make_cleanup_restore_inferior_status (inf_status);
 
   /* PUSH_DUMMY_FRAME is responsible for saving the inferior registers
      (and POP_FRAME for restoring them).  (At least on most machines)
@@ -1484,13 +1429,13 @@ hand_function_call (function, nargs, args)
          args[i] = value_arg_coerce (args[i], param_type, is_prototyped);
        }
 
-      /*elz: this code is to handle the case in which the function to be called 
-         has a pointer to function as parameter and the corresponding actual argument 
+      /*elz: this code is to handle the case in which the function to be called
+         has a pointer to function as parameter and the corresponding actual argument
          is the address of a function and not a pointer to function variable.
          In aCC compiled code, the calls through pointers to functions (in the body
          of the function called by hand) are made via $$dyncall_external which
-         requires some registers setting, this is taken care of if we call 
-         via a function pointer variable, but not via a function address. 
+         requires some registers setting, this is taken care of if we call
+         via a function pointer variable, but not via a function address.
          In cc this is not a problem. */
 
       if (using_gcc == 0)
@@ -1498,10 +1443,10 @@ hand_function_call (function, nargs, args)
          /* if this parameter is a pointer to function */
          if (TYPE_CODE (param_type) == TYPE_CODE_PTR)
            if (TYPE_CODE (param_type->target_type) == TYPE_CODE_FUNC)
-             /* elz: FIXME here should go the test about the compiler used 
+             /* elz: FIXME here should go the test about the compiler used
                 to compile the target. We want to issue the error
-                message only if the compiler used was HP's aCC. 
-                If we used HP's cc, then there is no problem and no need 
+                message only if the compiler used was HP's aCC.
+                If we used HP's cc, then there is no problem and no need
                 to return at this point */
              if (using_gcc == 0)       /* && compiler == aCC */
                /* go see if the actual parameter is a variable of type
@@ -1516,72 +1461,65 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
                  }
     }
 
-#if defined (REG_STRUCT_HAS_ADDR)
-  {
-    /* This is a machine like the sparc, where we may need to pass a pointer
-       to the structure, not the structure itself.  */
-    for (i = nargs - 1; i >= 0; i--)
-      {
-       struct type *arg_type = check_typedef (VALUE_TYPE (args[i]));
-       if ((TYPE_CODE (arg_type) == TYPE_CODE_STRUCT
-            || TYPE_CODE (arg_type) == TYPE_CODE_UNION
-            || TYPE_CODE (arg_type) == TYPE_CODE_ARRAY
-            || TYPE_CODE (arg_type) == TYPE_CODE_STRING
-            || TYPE_CODE (arg_type) == TYPE_CODE_BITSTRING
-            || TYPE_CODE (arg_type) == TYPE_CODE_SET
-            || (TYPE_CODE (arg_type) == TYPE_CODE_FLT
-                && TYPE_LENGTH (arg_type) > 8)
-           )
-           && REG_STRUCT_HAS_ADDR (using_gcc, arg_type))
-         {
-           CORE_ADDR addr;
-           int len;            /*  = TYPE_LENGTH (arg_type); */
-           int aligned_len;
-           arg_type = check_typedef (VALUE_ENCLOSING_TYPE (args[i]));
-           len = TYPE_LENGTH (arg_type);
-
-#ifdef STACK_ALIGN
-           /* MVS 11/22/96: I think at least some of this stack_align code is
-              really broken.  Better to let PUSH_ARGUMENTS adjust the stack in
-              a target-defined manner.  */
-           aligned_len = STACK_ALIGN (len);
-#else
-           aligned_len = len;
-#endif
-           if (INNER_THAN (1, 2))
-             {
-               /* stack grows downward */
-               sp -= aligned_len;
-             }
-           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;
-             }
-           /* 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),
-              (LONGEST) addr); */
-           args[i] = value_from_longest (lookup_pointer_type (arg_type),
-                                         (LONGEST) addr);
-         }
-      }
-  }
-#endif /* REG_STRUCT_HAS_ADDR.  */
+  if (REG_STRUCT_HAS_ADDR_P ())
+    {
+      /* This is a machine like the sparc, where we may need to pass a
+        pointer to the structure, not the structure itself.  */
+      for (i = nargs - 1; i >= 0; i--)
+       {
+         struct type *arg_type = check_typedef (VALUE_TYPE (args[i]));
+         if ((TYPE_CODE (arg_type) == TYPE_CODE_STRUCT
+              || TYPE_CODE (arg_type) == TYPE_CODE_UNION
+              || TYPE_CODE (arg_type) == TYPE_CODE_ARRAY
+              || TYPE_CODE (arg_type) == TYPE_CODE_STRING
+              || TYPE_CODE (arg_type) == TYPE_CODE_BITSTRING
+              || TYPE_CODE (arg_type) == TYPE_CODE_SET
+              || (TYPE_CODE (arg_type) == TYPE_CODE_FLT
+                  && TYPE_LENGTH (arg_type) > 8)
+              )
+             && REG_STRUCT_HAS_ADDR (using_gcc, arg_type))
+           {
+             CORE_ADDR addr;
+             int len;          /*  = TYPE_LENGTH (arg_type); */
+             int aligned_len;
+             arg_type = check_typedef (VALUE_ENCLOSING_TYPE (args[i]));
+             len = TYPE_LENGTH (arg_type);
+
+             if (STACK_ALIGN_P ())
+               /* MVS 11/22/96: I think at least some of this
+                  stack_align code is really broken.  Better to let
+                  PUSH_ARGUMENTS adjust the stack in a target-defined
+                  manner.  */
+               aligned_len = STACK_ALIGN (len);
+             else
+               aligned_len = len;
+             if (INNER_THAN (1, 2))
+               {
+                 /* 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;
+                 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),
+               (LONGEST) addr); */
+             args[i] = value_from_pointer (lookup_pointer_type (arg_type),
+                                           addr);
+           }
+       }
+    }
+
 
   /* Reserve space for the return structure to be written on the
      stack, if necessary */
@@ -1589,12 +1527,11 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
   if (struct_return)
     {
       int len = TYPE_LENGTH (value_type);
-#ifdef STACK_ALIGN
-      /* MVS 11/22/96: I think at least some of this stack_align code is
-         really broken.  Better to let PUSH_ARGUMENTS adjust the stack in
-         a target-defined manner.  */
-      len = STACK_ALIGN (len);
-#endif
+      if (STACK_ALIGN_P ())
+       /* MVS 11/22/96: I think at least some of this stack_align
+          code is really broken.  Better to let PUSH_ARGUMENTS adjust
+          the stack in a target-defined manner.  */
+       len = STACK_ALIGN (len);
       if (INNER_THAN (1, 2))
        {
          /* stack grows downward */
@@ -1609,29 +1546,27 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
        }
     }
 
-/* elz: on HPPA no need for this extra alignment, maybe it is needed
-   on other architectures. This is because all the alignment is taken care
-   of in the above code (ifdef REG_STRUCT_HAS_ADDR) and in 
-   hppa_push_arguments */
-#ifndef NO_EXTRA_ALIGNMENT_NEEDED
-
-#if defined(STACK_ALIGN)
-  /* MVS 11/22/96: I think at least some of this stack_align code is
-     really broken.  Better to let PUSH_ARGUMENTS adjust the stack in
-     a target-defined manner.  */
-  if (INNER_THAN (1, 2))
+  /* elz: on HPPA no need for this extra alignment, maybe it is needed
+     on other architectures. This is because all the alignment is
+     taken care of in the above code (ifdef REG_STRUCT_HAS_ADDR) and
+     in hppa_push_arguments */
+  if (EXTRA_STACK_ALIGNMENT_NEEDED)
     {
-      /* If stack grows down, we must leave a hole at the top. */
-      int len = 0;
-
-      for (i = nargs - 1; i >= 0; i--)
-       len += TYPE_LENGTH (VALUE_ENCLOSING_TYPE (args[i]));
-      if (CALL_DUMMY_STACK_ADJUST_P)
-       len += CALL_DUMMY_STACK_ADJUST;
-      sp -= STACK_ALIGN (len) - len;
+      /* MVS 11/22/96: I think at least some of this stack_align code
+        is really broken.  Better to let PUSH_ARGUMENTS adjust the
+        stack in a target-defined manner.  */
+      if (STACK_ALIGN_P () && INNER_THAN (1, 2))
+       {
+         /* If stack grows down, we must leave a hole at the top. */
+         int len = 0;
+
+         for (i = nargs - 1; i >= 0; i--)
+           len += TYPE_LENGTH (VALUE_ENCLOSING_TYPE (args[i]));
+         if (CALL_DUMMY_STACK_ADJUST_P)
+           len += CALL_DUMMY_STACK_ADJUST;
+         sp -= STACK_ALIGN (len) - len;
+       }
     }
-#endif /* STACK_ALIGN */
-#endif /* NO_EXTRA_ALIGNMENT_NEEDED */
 
   sp = PUSH_ARGUMENTS (nargs, args, sp, struct_return, struct_addr);
 
@@ -1642,14 +1577,13 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
      function.  Since this doesn't actually involve executing a JSR/BSR
      instruction, the return address must be set up by hand, either by
      pushing onto the stack or copying into a return-address register
-     as appropriate.  Formerly this has been done in PUSH_ARGUMENTS, 
+     as appropriate.  Formerly this has been done in PUSH_ARGUMENTS,
      but that's overloading its functionality a bit, so I'm making it
      explicit to do it here.  */
   sp = PUSH_RETURN_ADDRESS (real_pc, sp);
 #endif /* PUSH_RETURN_ADDRESS */
 
-#if defined(STACK_ALIGN)
-  if (!INNER_THAN (1, 2))
+  if (STACK_ALIGN_P () && !INNER_THAN (1, 2))
     {
       /* If stack grows up, we must leave a hole at the bottom, note
          that sp already has been advanced for the arguments!  */
@@ -1657,7 +1591,6 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
        sp += CALL_DUMMY_STACK_ADJUST;
       sp = STACK_ALIGN (sp);
     }
-#endif /* STACK_ALIGN */
 
 /* XXX This seems wrong.  For stacks that grow down we shouldn't do
    anything here!  */
@@ -1677,7 +1610,7 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
      it doesn't cost us anything but space and if the function is pcc
      it will ignore this value, we will make that assumption.
 
-     Also note that on some machines (like the sparc) pcc uses a 
+     Also note that on some machines (like the sparc) pcc uses a
      convention like gcc's.  */
 
   if (struct_return)
@@ -1689,12 +1622,11 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
      wouldn't happen.  (See store_inferior_registers in sparc-nat.c.)  */
   write_sp (sp);
 
-#ifdef SAVE_DUMMY_FRAME_TOS
-  SAVE_DUMMY_FRAME_TOS (sp);
-#endif
+  if (SAVE_DUMMY_FRAME_TOS_P ())
+    SAVE_DUMMY_FRAME_TOS (sp);
 
   {
-    char retbuf[REGISTER_BYTES];
+    char *retbuf = (char*) alloca (REGISTER_BYTES);
     char *name;
     struct symbol *symbol;
 
@@ -1820,10 +1752,7 @@ the function call).", name);
 }
 
 value_ptr
-call_function_by_hand (function, nargs, args)
-     value_ptr function;
-     int nargs;
-     value_ptr *args;
+call_function_by_hand (value_ptr function, int nargs, value_ptr *args)
 {
   if (CALL_DUMMY_P)
     {
@@ -1848,10 +1777,7 @@ call_function_by_hand (function, nargs, args)
    don't currently enforce any restriction on their types). */
 
 value_ptr
-value_array (lowbound, highbound, elemvec)
-     int lowbound;
-     int highbound;
-     value_ptr *elemvec;
+value_array (int lowbound, int highbound, value_ptr *elemvec)
 {
   int nelem;
   int idx;
@@ -1923,9 +1849,7 @@ value_array (lowbound, highbound, elemvec)
    embedded null bytes. */
 
 value_ptr
-value_string (ptr, len)
-     char *ptr;
-     int len;
+value_string (char *ptr, int len)
 {
   value_ptr val;
   int lowbound = current_language->string_lower_bound;
@@ -1955,9 +1879,7 @@ value_string (ptr, len)
 }
 
 value_ptr
-value_bitstring (ptr, len)
-     char *ptr;
-     int len;
+value_bitstring (char *ptr, int len)
 {
   value_ptr val;
   struct type *domain_type = create_range_type (NULL, builtin_type_int,
@@ -1985,10 +1907,7 @@ value_bitstring (ptr, len)
    requested operation is type secure, shouldn't we?  FIXME.  */
 
 static int
-typecmp (staticp, t1, t2)
-     int staticp;
-     struct type *t1[];
-     value_ptr t2[];
+typecmp (int staticp, struct type *t1[], value_ptr t2[])
 {
   int i;
 
@@ -2020,12 +1939,22 @@ typecmp (staticp, t1, t2)
          continue;
        }
 
-      while (TYPE_CODE (tt1) == TYPE_CODE_PTR
-            && (TYPE_CODE (tt2) == TYPE_CODE_ARRAY
-                || TYPE_CODE (tt2) == TYPE_CODE_PTR))
+      /* djb - 20000715 - Until the new type structure is in the
+        place, and we can attempt things like implicit conversions,
+        we need to do this so you can take something like a map<const
+        char *>, and properly access map["hello"], because the
+        argument to [] will be a reference to a pointer to a char,
+        and the argument will be a pointer to a char. */
+      while ( TYPE_CODE(tt1) == TYPE_CODE_REF ||
+             TYPE_CODE (tt1) == TYPE_CODE_PTR)
+       {
+         tt1 = check_typedef( TYPE_TARGET_TYPE(tt1) );
+       }
+      while ( TYPE_CODE(tt2) == TYPE_CODE_ARRAY ||
+             TYPE_CODE(tt2) == TYPE_CODE_PTR ||
+             TYPE_CODE(tt2) == TYPE_CODE_REF)
        {
-         tt1 = check_typedef (TYPE_TARGET_TYPE (tt1));
-         tt2 = check_typedef (TYPE_TARGET_TYPE (tt2));
+         tt2 = check_typedef( TYPE_TARGET_TYPE(tt2) );
        }
       if (TYPE_CODE (tt1) == TYPE_CODE (tt2))
        continue;
@@ -2051,12 +1980,8 @@ typecmp (staticp, t1, t2)
    look for a baseclass named NAME.  */
 
 static value_ptr
-search_struct_field (name, arg1, offset, type, looking_for_baseclass)
-     char *name;
-     register value_ptr arg1;
-     int offset;
-     register struct type *type;
-     int looking_for_baseclass;
+search_struct_field (char *name, register value_ptr arg1, int offset,
+                    register struct type *type, int looking_for_baseclass)
 {
   int i;
   int nbases = TYPE_N_BASECLASSES (type);
@@ -2208,13 +2133,8 @@ search_struct_field (name, arg1, offset, type, looking_for_baseclass)
  * conventions.  */
 
 void
-find_rt_vbase_offset (type, basetype, valaddr, offset, boffset_p, skip_p)
-     struct type *type;
-     struct type *basetype;
-     char *valaddr;
-     int offset;
-     int *boffset_p;
-     int *skip_p;
+find_rt_vbase_offset (struct type *type, struct type *basetype, char *valaddr,
+                     int offset, int *boffset_p, int *skip_p)
 {
   int boffset;                 /* offset of virtual base */
   int index;                   /* displacement to use in virtual table */
@@ -2270,7 +2190,7 @@ find_rt_vbase_offset (type, basetype, valaddr, offset, boffset_p, skip_p)
    * virtual base entries.  Offset is negative -- virtual base entries
    * appear _before_ the address point of the virtual table. */
 
-  /* pai: FIXME -- 32x64 problem, if word = 8 bytes, change multiplier 
+  /* pai: FIXME -- 32x64 problem, if word = 8 bytes, change multiplier
      & use long type */
 
   /* epstein : FIXME -- added param for overlay section. May not be correct */
@@ -2289,11 +2209,9 @@ find_rt_vbase_offset (type, basetype, valaddr, offset, boffset_p, skip_p)
    else return NULL. */
 
 static value_ptr
-search_struct_method (name, arg1p, args, offset, static_memfuncp, type)
-     char *name;
-     register value_ptr *arg1p, *args;
-     int offset, *static_memfuncp;
-     register struct type *type;
+search_struct_method (char *name, register value_ptr *arg1p,
+                     register value_ptr *args, int offset,
+                     int *static_memfuncp, register struct type *type)
 {
   int i;
   value_ptr v;
@@ -2335,7 +2253,7 @@ search_struct_method (name, arg1p, args, offset, static_memfuncp, type)
                    *static_memfuncp = 1;
                  v = value_fn_field (arg1p, f, j, type, offset);
                  if (v != NULL)
-                   return v;
+                   return v;       
                }
              j--;
            }
@@ -2427,11 +2345,8 @@ search_struct_method (name, arg1p, args, offset, static_memfuncp, type)
    ERR is an error message to be printed in case the field is not found.  */
 
 value_ptr
-value_struct_elt (argp, args, name, static_memfuncp, err)
-     register value_ptr *argp, *args;
-     char *name;
-     int *static_memfuncp;
-     char *err;
+value_struct_elt (register value_ptr *argp, register value_ptr *args,
+                 char *name, int *static_memfuncp, char *err)
 {
   register struct type *t;
   value_ptr v;
@@ -2517,10 +2432,10 @@ value_struct_elt (argp, args, name, static_memfuncp, err)
     }
   else
     v = search_struct_method (name, argp, args, 0, static_memfuncp, t);
-
+  
   if (v == (value_ptr) - 1)
     {
-      error ("Argument list of %s mismatch with component in the structure.", name);
+      error ("One of the arguments you tried to pass to %s could not be converted to what the function wants.", name);
     }
   else if (v == 0)
     {
@@ -2549,15 +2464,9 @@ value_struct_elt (argp, args, name, static_memfuncp, err)
  * BOFFSET is the offset of the base subobject where the method is found */
 
 static struct fn_field *
-find_method_list (argp, method, offset, static_memfuncp, type, num_fns, basetype, boffset)
-     value_ptr *argp;
-     char *method;
-     int offset;
-     int *static_memfuncp;
-     struct type *type;
-     int *num_fns;
-     struct type **basetype;
-     int *boffset;
+find_method_list (value_ptr *argp, char *method, int offset,
+                 int *static_memfuncp, struct type *type, int *num_fns,
+                 struct type **basetype, int *boffset)
 {
   int i;
   struct fn_field *f;
@@ -2632,14 +2541,9 @@ find_method_list (argp, method, offset, static_memfuncp, type, num_fns, basetype
  * BOFFSET is the offset of the base subobject which defines the method */
 
 struct fn_field *
-value_find_oload_method_list (argp, method, offset, static_memfuncp, num_fns, basetype, boffset)
-     value_ptr *argp;
-     char *method;
-     int offset;
-     int *static_memfuncp;
-     int *num_fns;
-     struct type **basetype;
-     int *boffset;
+value_find_oload_method_list (value_ptr *argp, char *method, int offset,
+                             int *static_memfuncp, int *num_fns,
+                             struct type **basetype, int *boffset)
 {
   struct type *t;
 
@@ -2699,17 +2603,9 @@ value_find_oload_method_list (argp, method, offset, static_memfuncp, num_fns, ba
  */
 
 int
-find_overload_match (arg_types, nargs, name, method, lax, obj, fsym, valp, symp, staticp)
-     struct type **arg_types;
-     int nargs;
-     char *name;
-     int method;
-     int lax;
-     value_ptr obj;
-     struct symbol *fsym;
-     value_ptr *valp;
-     struct symbol **symp;
-     int *staticp;
+find_overload_match (struct type **arg_types, int nargs, char *name, int method,
+                    int lax, value_ptr obj, struct symbol *fsym,
+                    value_ptr *valp, struct symbol **symp, int *staticp)
 {
   int nparms;
   struct type **parm_types;
@@ -2775,7 +2671,7 @@ find_overload_match (arg_types, nargs, name, method, lax, obj, fsym, valp, symp,
 
          for (j = 0; j < len2; j++)
            {
-             if (TYPE_FN_FIELD_STUB (f, j))
+             if (TYPE_FN_FIELD_STUB (f, j) && (!strcmp_iw (TYPE_FN_FIELDLIST_NAME (domain,i),name)))
                check_stub_method (domain, i, j);
            }
        }
@@ -2862,20 +2758,18 @@ find_overload_match (arg_types, nargs, name, method, lax, obj, fsym, valp, symp,
          default:
            break;
          }
-      free (parm_types);
-#ifdef DEBUG_OLOAD
-      /* FIXME: cagney/2000-03-12: Send the output to gdb_stderr.  See
-         comments above about adding a ``set debug'' command. */
-      if (method)
-       printf ("Overloaded method instance %s, # of parms %d\n", fns_ptr[ix].physname, nparms);
-      else
-       printf ("Overloaded function instance %s # of parms %d\n", SYMBOL_DEMANGLED_NAME (oload_syms[ix]), nparms);
-      for (jj = 0; jj < nargs; jj++)
-       printf ("...Badness @ %d : %d\n", jj, bv->rank[jj]);
-      printf ("Overload resolution champion is %d, ambiguous? %d\n", oload_champ, oload_ambiguous);
-#endif
+      xfree (parm_types);
+      if (overload_debug)
+       {
+         if (method)
+           fprintf_filtered (gdb_stderr,"Overloaded method instance %s, # of parms %d\n", fns_ptr[ix].physname, nparms);
+         else
+           fprintf_filtered (gdb_stderr,"Overloaded function instance %s # of parms %d\n", SYMBOL_DEMANGLED_NAME (oload_syms[ix]), nparms);
+         for (jj = 0; jj < nargs; jj++)
+           fprintf_filtered (gdb_stderr,"...Badness @ %d : %d\n", jj, bv->rank[jj]);
+         fprintf_filtered (gdb_stderr,"Overload resolution champion is %d, ambiguous? %d\n", oload_champ, oload_ambiguous);
+       }
     }                          /* end loop over all candidates */
-
   /* NOTE: dan/2000-03-10: Seems to be a better idea to just pick one
      if they have the exact same goodness. This is because there is no
      way to differentiate based on return type, which we need to in
@@ -2897,15 +2791,11 @@ find_overload_match (arg_types, nargs, name, method, lax, obj, fsym, valp, symp,
   /* Check how bad the best match is */
   for (ix = 1; ix <= nargs; ix++)
     {
-      switch (oload_champ_bv->rank[ix])
-       {
-       case 10:
-         oload_non_standard = 1;       /* non-standard type conversions needed */
-         break;
-       case 100:
-         oload_incompatible = 1;       /* truly mismatched types */
-         break;
-       }
+      if (oload_champ_bv->rank[ix] >= 100)
+       oload_incompatible = 1; /* truly mismatched types */
+
+      else if (oload_champ_bv->rank[ix] >= 10)
+       oload_non_standard = 1; /* non-standard type conversions needed */
     }
   if (oload_incompatible)
     {
@@ -2940,7 +2830,7 @@ find_overload_match (arg_types, nargs, name, method, lax, obj, fsym, valp, symp,
   else
     {
       *symp = oload_syms[oload_champ];
-      free (func_name);
+      xfree (func_name);
     }
 
   return oload_incompatible ? 100 : (oload_non_standard ? 10 : 0);
@@ -2950,9 +2840,7 @@ find_overload_match (arg_types, nargs, name, method, lax, obj, fsym, valp, symp,
    of type TYPE.  If TYPE does not have a destructor, or
    if NAME is inappropriate for TYPE, an error is signaled.  */
 int
-destructor_name_p (name, type)
-     const char *name;
-     const struct type *type;
+destructor_name_p (const char *name, const struct type *type)
 {
   /* destructors are a special case.  */
 
@@ -2980,9 +2868,7 @@ destructor_name_p (name, type)
    target structure/union is defined, otherwise, return 0. */
 
 static int
-check_field_in (type, name)
-     register struct type *type;
-     const char *name;
+check_field_in (register struct type *type, const char *name)
 {
   register int i;
 
@@ -3023,9 +2909,7 @@ check_field_in (type, name)
    target structure/union is defined, otherwise, return 0.  */
 
 int
-check_field (arg1, name)
-     register value_ptr arg1;
-     const char *name;
+check_field (register value_ptr arg1, const char *name)
 {
   register struct type *t;
 
@@ -3061,10 +2945,9 @@ check_field (arg1, name)
    to resolve user expressions of the form "DOMAIN::NAME".  */
 
 value_ptr
-value_struct_elt_for_reference (domain, offset, curtype, name, intype)
-     struct type *domain, *curtype, *intype;
-     int offset;
-     char *name;
+value_struct_elt_for_reference (struct type *domain, int offset,
+                               struct type *curtype, char *name,
+                               struct type *intype)
 {
   register struct type *t = curtype;
   register int i;
@@ -3195,147 +3078,13 @@ value_struct_elt_for_reference (domain, offset, curtype, name, intype)
 }
 
 
-/* Find the real run-time type of a value using RTTI.
- * V is a pointer to the value.
- * A pointer to the struct type entry of the run-time type
- * is returneed.
- * FULL is a flag that is set only if the value V includes
- * the entire contents of an object of the RTTI type.
- * TOP is the offset to the top of the enclosing object of
- * the real run-time type.  This offset may be for the embedded
- * object, or for the enclosing object of V.
- * USING_ENC is the flag that distinguishes the two cases.
- * If it is 1, then the offset is for the enclosing object,
- * otherwise for the embedded object.
- * 
- * This currently works only for RTTI information generated
- * by the HP ANSI C++ compiler (aCC).  g++ today (1997-06-10)
- * does not appear to support RTTI. This function returns a
- * NULL value for objects in the g++ runtime model. */
-
-struct type *
-value_rtti_type (v, full, top, using_enc)
-     value_ptr v;
-     int *full;
-     int *top;
-     int *using_enc;
-{
-  struct type *known_type;
-  struct type *rtti_type;
-  CORE_ADDR coreptr;
-  value_ptr vp;
-  int using_enclosing = 0;
-  long top_offset = 0;
-  char rtti_type_name[256];
-
-  if (full)
-    *full = 0;
-  if (top)
-    *top = -1;
-  if (using_enc)
-    *using_enc = 0;
-
-  /* Get declared type */
-  known_type = VALUE_TYPE (v);
-  CHECK_TYPEDEF (known_type);
-  /* RTTI works only or class objects */
-  if (TYPE_CODE (known_type) != TYPE_CODE_CLASS)
-    return NULL;
-
-  /* If neither the declared type nor the enclosing type of the
-   * value structure has a HP ANSI C++ style virtual table,
-   * we can't do anything. */
-  if (!TYPE_HAS_VTABLE (known_type))
-    {
-      known_type = VALUE_ENCLOSING_TYPE (v);
-      CHECK_TYPEDEF (known_type);
-      if ((TYPE_CODE (known_type) != TYPE_CODE_CLASS) ||
-         !TYPE_HAS_VTABLE (known_type))
-       return NULL;            /* No RTTI, or not HP-compiled types */
-      CHECK_TYPEDEF (known_type);
-      using_enclosing = 1;
-    }
-
-  if (using_enclosing && using_enc)
-    *using_enc = 1;
-
-  /* First get the virtual table address */
-  coreptr = *(CORE_ADDR *) ((VALUE_CONTENTS_ALL (v))
-                           + VALUE_OFFSET (v)
-                      + (using_enclosing ? 0 : VALUE_EMBEDDED_OFFSET (v)));
-  if (coreptr == 0)
-    return NULL;               /* return silently -- maybe called on gdb-generated value */
-
-  /* Fetch the top offset of the object */
-  /* FIXME possible 32x64 problem with pointer size & arithmetic */
-  vp = value_at (builtin_type_int,
-                coreptr + 4 * HP_ACC_TOP_OFFSET_OFFSET,
-                VALUE_BFD_SECTION (v));
-  top_offset = value_as_long (vp);
-  if (top)
-    *top = top_offset;
-
-  /* Fetch the typeinfo pointer */
-  /* FIXME possible 32x64 problem with pointer size & arithmetic */
-  vp = value_at (builtin_type_int, coreptr + 4 * HP_ACC_TYPEINFO_OFFSET, VALUE_BFD_SECTION (v));
-  /* Indirect through the typeinfo pointer and retrieve the pointer
-   * to the string name */
-  coreptr = *(CORE_ADDR *) (VALUE_CONTENTS (vp));
-  if (!coreptr)
-    error ("Retrieved null typeinfo pointer in trying to determine run-time type");
-  vp = value_at (builtin_type_int, coreptr + 4, VALUE_BFD_SECTION (v));                /* 4 -> offset of name field */
-  /* FIXME possible 32x64 problem */
-
-  coreptr = *(CORE_ADDR *) (VALUE_CONTENTS (vp));
-
-  read_memory_string (coreptr, rtti_type_name, 256);
-
-  if (strlen (rtti_type_name) == 0)
-    error ("Retrieved null type name from typeinfo");
-
-  /* search for type */
-  rtti_type = lookup_typename (rtti_type_name, (struct block *) 0, 1);
-
-  if (!rtti_type)
-    error ("Could not find run-time type: invalid type name %s in typeinfo??", rtti_type_name);
-  CHECK_TYPEDEF (rtti_type);
-
-#if 0                          /* debugging */
-  printf ("RTTI type name %s, tag %s, full? %d\n", TYPE_NAME (rtti_type), TYPE_TAG_NAME (rtti_type), full ? *full : -1);
-#endif
-
-  /* Check whether we have the entire object */
-  if (full                     /* Non-null pointer passed */
-
-      &&
-  /* Either we checked on the whole object in hand and found the
-     top offset to be zero */
-      (((top_offset == 0) &&
-       using_enclosing &&
-       TYPE_LENGTH (known_type) == TYPE_LENGTH (rtti_type))
-       ||
-  /* Or we checked on the embedded object and top offset was the
-     same as the embedded offset */
-       ((top_offset == VALUE_EMBEDDED_OFFSET (v)) &&
-       !using_enclosing &&
-       TYPE_LENGTH (VALUE_ENCLOSING_TYPE (v)) == TYPE_LENGTH (rtti_type))))
-
-    *full = 1;
-
-  return rtti_type;
-}
-
 /* Given a pointer value V, find the real (RTTI) type
    of the object it points to.
    Other parameters FULL, TOP, USING_ENC as with value_rtti_type()
    and refer to the values computed for the object pointed to. */
 
 struct type *
-value_rtti_target_type (v, full, top, using_enc)
-     value_ptr v;
-     int *full;
-     int *top;
-     int *using_enc;
+value_rtti_target_type (value_ptr v, int *full, int *top, int *using_enc)
 {
   value_ptr target;
 
@@ -3355,13 +3104,8 @@ value_rtti_target_type (v, full, top, using_enc)
    (Pass RTYPE == NULL if they're not available */
 
 value_ptr
-value_full_object (argp, rtype, xfull, xtop, xusing_enc)
-     value_ptr argp;
-     struct type *rtype;
-     int xfull;
-     int xtop;
-     int xusing_enc;
-
+value_full_object (value_ptr argp, struct type *rtype, int xfull, int xtop,
+                  int xusing_enc)
 {
   struct type *real_type;
   int full = 0;
@@ -3387,7 +3131,7 @@ value_full_object (argp, rtype, xfull, xtop, xusing_enc)
      type is wrong, set it *//* pai: FIXME -- sounds iffy */
   if (full)
     {
-      VALUE_ENCLOSING_TYPE (argp) = real_type;
+      argp = value_change_enclosing_type (argp, real_type);
       return argp;
     }
 
@@ -3419,8 +3163,7 @@ value_full_object (argp, rtype, xfull, xtop, xusing_enc)
    inappropriate context.  */
 
 value_ptr
-value_of_this (complain)
-     int complain;
+value_of_this (int complain)
 {
   struct symbol *func, *sym;
   struct block *b;
@@ -3477,9 +3220,7 @@ value_of_this (complain)
    the original ARRAY.  */
 
 value_ptr
-value_slice (array, lowbound, length)
-     value_ptr array;
-     int lowbound, length;
+value_slice (value_ptr array, int lowbound, int length)
 {
   struct type *slice_range_type, *slice_type, *range_type;
   LONGEST lowerbound, upperbound, offset;
@@ -3558,8 +3299,7 @@ value_slice (array, lowbound, length)
    value as a fixed-length array. */
 
 value_ptr
-varying_to_slice (varray)
-     value_ptr varray;
+varying_to_slice (value_ptr varray)
 {
   struct type *vtype = check_typedef (VALUE_TYPE (varray));
   LONGEST length = unpack_long (TYPE_FIELD_TYPE (vtype, 0),
@@ -3568,17 +3308,14 @@ varying_to_slice (varray)
   return value_slice (value_primitive_field (varray, 0, 1, vtype), 0, length);
 }
 
-/* Create a value for a FORTRAN complex number.  Currently most of 
-   the time values are coerced to COMPLEX*16 (i.e. a complex number 
-   composed of 2 doubles.  This really should be a smarter routine 
-   that figures out precision inteligently as opposed to assuming 
+/* Create a value for a FORTRAN complex number.  Currently most of
+   the time values are coerced to COMPLEX*16 (i.e. a complex number
+   composed of 2 doubles.  This really should be a smarter routine
+   that figures out precision inteligently as opposed to assuming
    doubles. FIXME: fmb */
 
 value_ptr
-value_literal_complex (arg1, arg2, type)
-     value_ptr arg1;
-     value_ptr arg2;
-     struct type *type;
+value_literal_complex (value_ptr arg1, value_ptr arg2, struct type *type)
 {
   register value_ptr val;
   struct type *real_type = TYPE_TARGET_TYPE (type);
@@ -3597,9 +3334,7 @@ value_literal_complex (arg1, arg2, type)
 /* Cast a value into the appropriate complex data type. */
 
 static value_ptr
-cast_into_complex (type, val)
-     struct type *type;
-     register value_ptr val;
+cast_into_complex (struct type *type, register value_ptr val)
 {
   struct type *real_type = TYPE_TARGET_TYPE (type);
   if (TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_COMPLEX)
@@ -3624,7 +3359,7 @@ cast_into_complex (type, val)
 }
 
 void
-_initialize_valops ()
+_initialize_valops (void)
 {
 #if 0
   add_show_from_set
This page took 0.04491 seconds and 4 git commands to generate.