* vax-tdep.h (vax_regnum): Add VAX_R0_REGNUM and VAX_R1_REGNUM.
[deliverable/binutils-gdb.git] / gdb / infcall.c
index 8df1114e106f12b83b9d6fc7f331adcdddac07b9..b10f8071daf5262ceb0fdf00cbe408bfcef8d799 100644 (file)
@@ -1,8 +1,8 @@
 /* Perform an inferior function call, for GDB, the GNU debugger.
 
    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
-   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software
-   Foundation, Inc.
+   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -30,7 +30,7 @@
 #include "block.h"
 #include "gdbcore.h"
 #include "language.h"
-#include "symfile.h"
+#include "objfiles.h"
 #include "gdbcmd.h"
 #include "command.h"
 #include "gdb_string.h"
@@ -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;
 
@@ -182,7 +182,9 @@ find_function_addr (struct value *function, struct type **retval_type)
       if (TYPE_CODE (ftype) == TYPE_CODE_FUNC
          || TYPE_CODE (ftype) == TYPE_CODE_METHOD)
        {
-         funaddr = CONVERT_FROM_FUNC_PTR_ADDR (funaddr);
+         funaddr = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
+                                                       funaddr,
+                                                       &current_target);
          value_type = TYPE_TARGET_TYPE (ftype);
        }
       else
@@ -273,18 +275,16 @@ legacy_push_dummy_code (struct gdbarch *gdbarch,
      DUMMY_ADDR is pretty messed up.  It comes from constant tinkering
      with the values.  Instead a DEPRECATED_FIX_CALL_DUMMY replacement
      (PUSH_DUMMY_BREAKPOINT?) should just do everything.  */
-#ifdef GDB_TARGET_IS_HPPA
-  (*real_pc) = DEPRECATED_FIX_CALL_DUMMY (dummy1, start_sp, funaddr, nargs,
-                                         args, value_type, using_gcc);
-#else
-  if (DEPRECATED_FIX_CALL_DUMMY_P ())
+  if (!gdbarch_push_dummy_call_p (current_gdbarch))
     {
-      /* gdb_assert (CALL_DUMMY_LOCATION == ON_STACK) true?  */
-      DEPRECATED_FIX_CALL_DUMMY (dummy1, start_sp, funaddr, nargs, args,
-                                value_type, using_gcc);
+      if (DEPRECATED_FIX_CALL_DUMMY_P ())
+       {
+         /* gdb_assert (CALL_DUMMY_LOCATION == ON_STACK) true?  */
+         DEPRECATED_FIX_CALL_DUMMY (dummy1, start_sp, funaddr, nargs, args,
+                                    value_type, using_gcc);
+       }
+      (*real_pc) = start_sp;
     }
-  (*real_pc) = start_sp;
-#endif
   /* Yes, the offset is applied to the real_pc and not the dummy addr.
      Ulgh!  Blame the HP/UX target.  */
   (*bp_addr) = (*real_pc) + DEPRECATED_CALL_DUMMY_BREAKPOINT_OFFSET;
@@ -346,7 +346,8 @@ push_dummy_code (struct gdbarch *gdbarch,
   if (gdbarch_push_dummy_code_p (gdbarch))
     return gdbarch_push_dummy_code (gdbarch, sp, funaddr, using_gcc,
                                    args, nargs, value_type, real_pc, bp_addr);
-  else if (DEPRECATED_FIX_CALL_DUMMY_P ())
+  else if (DEPRECATED_FIX_CALL_DUMMY_P ()
+          && !gdbarch_push_dummy_call_p (gdbarch))
     return legacy_push_dummy_code (gdbarch, sp, funaddr, using_gcc,
                                   args, nargs, value_type, real_pc, bp_addr);
   else    
@@ -375,7 +376,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;
@@ -440,6 +441,18 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
     CORE_ADDR old_sp = read_sp ();
     if (gdbarch_frame_align_p (current_gdbarch))
       {
+       sp = gdbarch_frame_align (current_gdbarch, old_sp);
+       /* NOTE: cagney/2003-08-13: Skip the "red zone".  For some
+          ABIs, a function can use memory beyond the inner most stack
+          address.  AMD64 called that region the "red zone".  Skip at
+          least the "red zone" size before allocating any space on
+          the stack.  */
+       if (INNER_THAN (1, 2))
+         sp -= gdbarch_frame_red_zone_size (current_gdbarch);
+       else
+         sp += gdbarch_frame_red_zone_size (current_gdbarch);
+       /* Still aligned?  */
+       gdb_assert (sp == gdbarch_frame_align (current_gdbarch, sp));
        /* NOTE: cagney/2002-09-18:
           
           On a RISC architecture, a void parameterless generic dummy
@@ -460,7 +473,6 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
           stack.  That way, two dummy frames can never be identical.
           It does burn a few bytes of stack but that is a small price
           to pay :-).  */
-       sp = gdbarch_frame_align (current_gdbarch, old_sp);
        if (sp == old_sp)
          {
            if (INNER_THAN (1, 2))
@@ -476,12 +488,16 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
     else
       /* FIXME: cagney/2002-09-18: Hey, you loose!
 
-        Who knows how badly aligned the SP is!  Further, per comment
-        above, if the generic dummy frame ends up empty (because
-        nothing is pushed) GDB won't be able to correctly perform
-        back traces.  If a target is having trouble with backtraces,
-        first thing to do is add FRAME_ALIGN() to the architecture
-        vector. If that fails, try unwind_dummy_id().  */
+        Who knows how badly aligned the SP is!
+
+        If the generic dummy frame ends up empty (because nothing is
+        pushed) GDB won't be able to correctly perform back traces.
+        If a target is having trouble with backtraces, first thing to
+        do is add FRAME_ALIGN() to the architecture vector. If that
+        fails, try unwind_dummy_id().
+
+         If the ABI specifies a "Red Zone" (see the doco) the code
+         below will quietly trash it.  */
       sp = old_sp;
   }
 
@@ -497,8 +513,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
@@ -530,7 +545,8 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
        }
       break;
     case AT_ENTRY_POINT:
-      if (DEPRECATED_FIX_CALL_DUMMY_P ())
+      if (DEPRECATED_FIX_CALL_DUMMY_P ()
+         && !gdbarch_push_dummy_call_p (current_gdbarch))
        {
          /* Sigh.  Some targets use DEPRECATED_FIX_CALL_DUMMY to
              shove extra stuff onto the stack or into registers.  That
@@ -542,7 +558,12 @@ 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 ();
+      /* Make certain that the address points at real code, and not a
+         function descriptor.  */
+      dummy_addr = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
+                                                      dummy_addr,
+                                                      &current_target);
       /* 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;
@@ -561,6 +582,13 @@ 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 = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
+                                                        dummy_addr,
+                                                        &current_target);
+       /* 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;
       }
@@ -638,7 +666,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
@@ -655,7 +683,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); */
@@ -663,12 +691,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))
@@ -706,10 +734,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
@@ -732,31 +760,6 @@ 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 */
-  /* 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.  */
-  if (DEPRECATED_EXTRA_STACK_ALIGNMENT_NEEDED)
-    {
-      /* 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 stack grows down, we must leave a hole at the top. */
-         int len = 0;
-         int i;
-         for (i = nargs - 1; i >= 0; i--)
-           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;
-       }
-    }
-
   /* Create the dummy stack frame.  Pass in the call dummy address as,
      presumably, the ABI code knows where, in the call dummy, the
      return address should be pointed.  */
@@ -798,27 +801,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
-   anything here!  */
-  /* 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 (DEPRECATED_CALL_DUMMY_STACK_ADJUST_P ())
-    if (INNER_THAN (1, 2))
-      {
-       /* stack grows downward */
-       sp -= DEPRECATED_CALL_DUMMY_STACK_ADJUST;
-      }
-
   /* Store the address at which the structure is supposed to be
      written.  */
   /* NOTE: 2003-03-24: Since PUSH_ARGUMENTS can (and typically does)
@@ -878,7 +867,7 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
     else
       {
        /* The assumption here is that push_dummy_call() returned the
-          stack part of the frame ID.  Unfortunatly, many older
+          stack part of the frame ID.  Unfortunately, many older
           architectures were, via a convoluted mess, relying on the
           poorly defined and greatly overloaded
           DEPRECATED_TARGET_READ_FP or DEPRECATED_FP_REGNUM to supply
@@ -1044,37 +1033,25 @@ the function call).", name);
   do_cleanups (inf_status_cleanup);
 
   /* Figure out the value returned by the function.  */
-  /* elz: I defined this new macro for the hppa architecture only.
-     this gives us a way to get the value returned by the function
-     from the stack, at the same address we told the function to put
-     it.  We cannot assume on the pa that r28 still contains the
-     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
   if (struct_return)
     {
-      do_cleanups (retbuf_cleanup);
-      return 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))
-    {
+      /* 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.068787 seconds and 4 git commands to generate.