2003-10-06 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / gdb / infcall.c
index 98e7da5fc3d6067c18bf0d5ee545543a32b13dba..f9cb87e89d45a22c0cbe8b073fc85776b9ddf852 100644 (file)
@@ -84,8 +84,8 @@ static struct value *
 value_arg_coerce (struct value *arg, struct type *param_type,
                  int is_prototyped)
 {
-  register struct type *arg_type = check_typedef (VALUE_TYPE (arg));
-  register struct type *type
+  struct type *arg_type = check_typedef (VALUE_TYPE (arg));
+  struct type *type
     = param_type ? check_typedef (param_type) : arg_type;
 
   switch (TYPE_CODE (type))
@@ -161,8 +161,8 @@ value_arg_coerce (struct value *arg, struct type *param_type,
 CORE_ADDR
 find_function_addr (struct value *function, struct type **retval_type)
 {
-  register struct type *ftype = check_typedef (VALUE_TYPE (function));
-  register enum type_code code = TYPE_CODE (ftype);
+  struct type *ftype = check_typedef (VALUE_TYPE (function));
+  enum type_code code = TYPE_CODE (ftype);
   struct type *value_type;
   CORE_ADDR funaddr;
 
@@ -375,7 +375,7 @@ push_dummy_code (struct gdbarch *gdbarch,
 struct value *
 call_function_by_hand (struct value *function, int nargs, struct value **args)
 {
-  register CORE_ADDR sp;
+  CORE_ADDR sp;
   CORE_ADDR dummy_addr;
   struct type *value_type;
   unsigned char struct_return;
@@ -512,8 +512,7 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
   /* Are we returning a value using a structure return or a normal
      value return? */
 
-  struct_return = using_struct_return (function, funaddr, value_type,
-                                      using_gcc);
+  struct_return = using_struct_return (value_type, using_gcc);
 
   /* Determine the location of the breakpoint (and possibly other
      stuff) that the called function will return to.  The SPARC, for a
@@ -557,7 +556,13 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
                                     value_type, using_gcc);
        }
       real_pc = funaddr;
-      dummy_addr = CALL_DUMMY_ADDRESS ();
+      dummy_addr = entry_point_address ();
+      if (DEPRECATED_CALL_DUMMY_ADDRESS_P ())
+       /* Override it.  */
+       dummy_addr = DEPRECATED_CALL_DUMMY_ADDRESS ();
+      /* Make certain that the address points at real code, and not a
+         function descriptor.  */
+      dummy_addr = CONVERT_FROM_FUNC_PTR_ADDR (dummy_addr);
       /* A call dummy always consists of just a single breakpoint, so
          it's address is the same as the address of the dummy.  */
       bp_addr = dummy_addr;
@@ -576,6 +581,11 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
          dummy_addr = SYMBOL_VALUE_ADDRESS (sym);
        else
          dummy_addr = entry_point_address ();
+       /* Make certain that the address points at real code, and not
+          a function descriptor.  */
+       dummy_addr = CONVERT_FROM_FUNC_PTR_ADDR (dummy_addr);
+       /* A call dummy always consists of just a single breakpoint,
+          so it's address is the same as the address of the dummy.  */
        bp_addr = dummy_addr;
        break;
       }
@@ -653,7 +663,7 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
       }
   }
 
-  if (REG_STRUCT_HAS_ADDR_P ())
+  if (DEPRECATED_REG_STRUCT_HAS_ADDR_P ())
     {
       int i;
       /* This is a machine like the sparc, where we may need to pass a
@@ -670,7 +680,7 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
               || (TYPE_CODE (arg_type) == TYPE_CODE_FLT
                   && TYPE_LENGTH (arg_type) > 8)
               )
-             && REG_STRUCT_HAS_ADDR (using_gcc, arg_type))
+             && DEPRECATED_REG_STRUCT_HAS_ADDR (using_gcc, arg_type))
            {
              CORE_ADDR addr;
              int len;          /*  = TYPE_LENGTH (arg_type); */
@@ -678,12 +688,12 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
              arg_type = check_typedef (VALUE_ENCLOSING_TYPE (args[i]));
              len = TYPE_LENGTH (arg_type);
 
-             if (STACK_ALIGN_P ())
+             if (DEPRECATED_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);
+               aligned_len = DEPRECATED_STACK_ALIGN (len);
              else
                aligned_len = len;
              if (INNER_THAN (1, 2))
@@ -721,10 +731,10 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
   if (struct_return)
     {
       int len = TYPE_LENGTH (value_type);
-      if (STACK_ALIGN_P ())
+      if (DEPRECATED_STACK_ALIGN_P ())
        /* NOTE: cagney/2003-03-22: Should rely on frame align, rather
            than stack align to force the alignment of the stack.  */
-       len = STACK_ALIGN (len);
+       len = DEPRECATED_STACK_ALIGN (len);
       if (INNER_THAN (1, 2))
        {
          /* Stack grows downward.  Align STRUCT_ADDR and SP after
@@ -749,8 +759,8 @@ 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 */
+     taken care of in the above code (ifdef DEPRECATED_REG_STRUCT_HAS_ADDR)
+     and in hppa_push_arguments */
   /* NOTE: cagney/2003-03-24: The below code is very broken.  Given an
      odd sized parameter the below will mis-align the stack.  As was
      suggested back in '96, better to let PUSH_ARGUMENTS handle it.  */
@@ -759,7 +769,7 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
       /* MVS 11/22/96: I think at least some of this stack_align code
         is really broken.  Better to let push_dummy_call() adjust the
         stack in a target-defined manner.  */
-      if (STACK_ALIGN_P () && INNER_THAN (1, 2))
+      if (DEPRECATED_STACK_ALIGN_P () && INNER_THAN (1, 2))
        {
          /* If stack grows down, we must leave a hole at the top. */
          int len = 0;
@@ -768,7 +778,7 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
            len += TYPE_LENGTH (VALUE_ENCLOSING_TYPE (args[i]));
          if (DEPRECATED_CALL_DUMMY_STACK_ADJUST_P ())
            len += DEPRECATED_CALL_DUMMY_STACK_ADJUST;
-         sp -= STACK_ALIGN (len) - len;
+         sp -= DEPRECATED_STACK_ALIGN (len) - len;
        }
     }
 
@@ -813,13 +823,13 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
      handled any alignment issues, the code below is entirely
      redundant.  */
   if (!gdbarch_push_dummy_call_p (current_gdbarch)
-      && STACK_ALIGN_P () && !INNER_THAN (1, 2))
+      && DEPRECATED_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!  */
       if (DEPRECATED_CALL_DUMMY_STACK_ADJUST_P ())
        sp += DEPRECATED_CALL_DUMMY_STACK_ADJUST;
-      sp = STACK_ALIGN (sp);
+      sp = DEPRECATED_STACK_ALIGN (sp);
     }
 
 /* XXX This seems wrong.  For stacks that grow down we shouldn't do
@@ -1066,30 +1076,34 @@ the function call).", name);
      address of the returned structure. Usually this will be
      overwritten by the callee.  I don't know about other
      architectures, so I defined this macro */
-#ifdef VALUE_RETURNED_FROM_STACK
+  /* FIXME: cagney/2003-09-27: This is no longer needed.  The problem
+     is now handled directly be by the code below.  */
+#ifdef DEPRECATED_VALUE_RETURNED_FROM_STACK
   if (struct_return)
     {
       do_cleanups (retbuf_cleanup);
-      return VALUE_RETURNED_FROM_STACK (value_type, struct_addr);
+      return DEPRECATED_VALUE_RETURNED_FROM_STACK (value_type, struct_addr);
     }
 #endif
-  /* NOTE: cagney/2002-09-10: Only when the stack has been correctly
-     aligned (using frame_align()) do we can trust STRUCT_ADDR and
-     fetch the return value direct from the stack.  This lack of trust
-     comes about because legacy targets have a nasty habit of
-     silently, and local to PUSH_ARGUMENTS(), moving STRUCT_ADDR.  For
-     such targets, just hope that value_being_returned() can find the
-     adjusted value.  */
-  if (struct_return && gdbarch_frame_align_p (current_gdbarch))
+  if (struct_return)
     {
+      /* NOTE: cagney/2003-09-27: This assumes that PUSH_DUMMY_CALL
+        has correctly stored STRUCT_ADDR in the target.  In the past
+        that hasn't been the case, the old MIPS PUSH_ARGUMENTS
+        (PUSH_DUMMY_CALL precursor) would silently move the location
+        of the struct return value making STRUCT_ADDR bogus.  If
+        you're seeing problems with values being returned using the
+        "struct return convention", check that PUSH_DUMMY_CALL isn't
+        playing tricks.  */
       struct value *retval = value_at (value_type, struct_addr, NULL);
       do_cleanups (retbuf_cleanup);
       return retval;
     }
   else
     {
-      struct value *retval = value_being_returned (value_type, retbuf,
-                                                  struct_return);
+      /* The non-register case was handled above.  */
+      struct value *retval = register_value_being_returned (value_type,
+                                                           retbuf);
       do_cleanups (retbuf_cleanup);
       return retval;
     }
This page took 0.026606 seconds and 4 git commands to generate.