* valops.c (hand_function_call): Replace #ifdef STACK_ALIGN with
authorAndrew Cagney <cagney@redhat.com>
Fri, 21 Apr 2000 04:17:18 +0000 (04:17 +0000)
committerAndrew Cagney <cagney@redhat.com>
Fri, 21 Apr 2000 04:17:18 +0000 (04:17 +0000)
run-time test for STACK_ALIGN_P.
* gdbarch.sh: Add support for function and variable predicates.
(STACK_ALIGN): Add.  Implement with predicate - STACK_ALIGN_P.
* gdbarch.h, gdbarch.c: Re-generate.

gdb/ChangeLog
gdb/gdbarch.c
gdb/gdbarch.h
gdb/gdbarch.sh
gdb/valops.c

index dd196761105deac5d05c6bd2adde1b60c3d29519..798677fcfb63e2d29e2d1d6a0977709907096028 100644 (file)
@@ -1,3 +1,11 @@
+Thu Apr 20 14:35:46 2000  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * valops.c (hand_function_call): Replace #ifdef STACK_ALIGN with
+       run-time test for STACK_ALIGN_P.
+       * gdbarch.sh: Add support for function and variable predicates.
+       (STACK_ALIGN): Add.  Implement with predicate - STACK_ALIGN_P.
+       * gdbarch.h, gdbarch.c: Re-generate.
+
 Thu Apr 20 17:39:11 2000  Andrew Cagney  <cagney@b1.cygnus.com>
 
        * defs.h, utils.c (free_current_contents): Change parameter to
index 1db4ce900c1ee25677f7497427f284e3efc76c7f..06eccad729aeca3707c288f8c97a2214d08bec92 100644 (file)
@@ -213,6 +213,7 @@ struct gdbarch
   gdbarch_frame_locals_address_ftype *frame_locals_address;
   gdbarch_saved_pc_after_call_ftype *saved_pc_after_call;
   gdbarch_frame_num_args_ftype *frame_num_args;
+  gdbarch_stack_align_ftype *stack_align;
 };
 
 
@@ -317,6 +318,7 @@ struct gdbarch startup_gdbarch = {
   0,
   0,
   0,
+  0,
   /* startup_gdbarch() */
 };
 struct gdbarch *current_gdbarch = &startup_gdbarch;
@@ -620,6 +622,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
   if ((GDB_MULTI_ARCH >= 2)
       && (gdbarch->frame_num_args == 0))
     internal_error ("gdbarch: verify_gdbarch: frame_num_args invalid");
+  /* Skip verify of stack_align, has predicate */
 }
 
 
@@ -955,6 +958,10 @@ gdbarch_dump (void)
                       "gdbarch_update: FRAME_NUM_ARGS = 0x%08lx\n",
                       (long) current_gdbarch->frame_num_args
                       /*FRAME_NUM_ARGS ()*/);
+  fprintf_unfiltered (gdb_stdlog,
+                      "gdbarch_update: STACK_ALIGN = 0x%08lx\n",
+                      (long) current_gdbarch->stack_align
+                      /*STACK_ALIGN ()*/);
 }
 
 struct gdbarch_tdep *
@@ -2487,6 +2494,29 @@ set_gdbarch_frame_num_args (struct gdbarch *gdbarch,
   gdbarch->frame_num_args = frame_num_args;
 }
 
+int
+gdbarch_stack_align_p (struct gdbarch *gdbarch)
+{
+  return gdbarch->stack_align != 0;
+}
+
+CORE_ADDR
+gdbarch_stack_align (struct gdbarch *gdbarch, CORE_ADDR sp)
+{
+  if (gdbarch->stack_align == 0)
+    internal_error ("gdbarch: gdbarch_stack_align invalid");
+  if (gdbarch_debug >= 2)
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_stack_align called\n");
+  return gdbarch->stack_align (sp);
+}
+
+void
+set_gdbarch_stack_align (struct gdbarch *gdbarch,
+                         gdbarch_stack_align_ftype stack_align)
+{
+  gdbarch->stack_align = stack_align;
+}
+
 
 /* Keep a registrary of per-architecture data-pointers required by GDB
    modules. */
index cdf60a7062e018ae68735212073116ac25fb1551..06d74393128f3696cd02b9c927b3ccd0d1684ef2 100644 (file)
@@ -798,6 +798,23 @@ extern void set_gdbarch_frame_num_args (struct gdbarch *gdbarch, gdbarch_frame_n
 #endif
 #endif
 
+#if defined (STACK_ALIGN)
+/* Legacy for systems yet to multi-arch STACK_ALIGN */
+#define STACK_ALIGN_P() (1)
+#endif
+
+extern int gdbarch_stack_align_p (struct gdbarch *gdbarch);
+#if (GDB_MULTI_ARCH > 1) || !defined (STACK_ALIGN_P)
+#define STACK_ALIGN_P() (gdbarch_stack_align_p (current_gdbarch))
+#endif
+
+typedef CORE_ADDR (gdbarch_stack_align_ftype) (CORE_ADDR sp);
+extern CORE_ADDR gdbarch_stack_align (struct gdbarch *gdbarch, CORE_ADDR sp);
+extern void set_gdbarch_stack_align (struct gdbarch *gdbarch, gdbarch_stack_align_ftype *stack_align);
+#if (GDB_MULTI_ARCH > 1) || !defined (STACK_ALIGN)
+#define STACK_ALIGN(sp) (gdbarch_stack_align (current_gdbarch, sp))
+#endif
+
 extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
 
 
index ffa925e3b9cddc1e68f8f81fc0b4d0c71d7070f2..c2689d0f0d4195967a9cec2e801b2d198e7a8078 100755 (executable)
@@ -44,6 +44,27 @@ default_is_fallback_p ()
 # Format of the input table
 read="class level macro returntype function formal actual attrib startup default invalid_p fmt print print_p description"
 
+class_is_variable_p ()
+{
+    [ "${class}" = "v" -o "${class}" = "V" ]
+}
+
+class_is_function_p ()
+{
+    [ "${class}" = "f" -o "${class}" = "F" ]
+}
+
+class_is_predicate_p ()
+{
+    [ "${class}" = "F" -o "${class}" = "V" ]
+}
+
+class_is_info_p ()
+{
+    [ "${class}" = "i" ]
+}
+
+
 do_read ()
 {
     if eval read $read
@@ -51,7 +72,19 @@ do_read ()
        test "${startup}" || startup=0
        test "${fmt}" || fmt="%ld"
        test "${print}" || print="(long) ${macro}"
-       #test "${default}" || default=0
+       #FIXME:
+       #Should set DEFAULT to zero and force the user to provide
+       #an invalid_p=0
+       #test "${default}" || default=0 - NO
+       case "${invalid_p}" in
+           0 ) valid_p=1 ;;
+           "" ) test "${default}" && valid_p="gdbarch->${function} != ${default}"
+               #NOT_YET
+               #test "${default}" && invalid_p="gdbarch->${function} == ${default}"
+               ;;
+           * ) valid_p="!(${invalid_p})"
+       esac
+       #NOT YET:
        :
     else
        false
@@ -69,8 +102,12 @@ do
        # # -> line disable
        # f -> function
        #   hiding a function
+       # F -> function + predicate
+       #   hiding a function + predicate to test function validity
        # v -> variable
        #   hiding a variable
+       # V -> variable + predicate
+       #   hiding a variable + predicate to test variables validity
        # i -> set from info
        #   hiding something from the ``struct info'' object
 
@@ -136,7 +173,7 @@ do
        # returned if the code creating the new architecture failed to
        # initialize the MEMBER or initialized the member to something
        # invalid. By default, a check that the value is no longer
-       # equal to DEFAULT ips performed.  The equation ``0'' disables
+       # equal to DEFAULT is performed.  The equation ``0'' disables
        # the invalid_p check.
 
     fmt ) : ;;
@@ -284,6 +321,7 @@ f:2:FRAME_LOCALS_ADDRESS:CORE_ADDR:frame_locals_address:struct frame_info *fi:fi
 f:2:SAVED_PC_AFTER_CALL:CORE_ADDR:saved_pc_after_call:struct frame_info *frame:frame::0:0
 f:2:FRAME_NUM_ARGS:int:frame_num_args:struct frame_info *frame:frame::0:0
 #
+F:2:STACK_ALIGN:CORE_ADDR:stack_align:CORE_ADDR sp:sp::0:0
 EOF
   grep -v '^#'
 }
@@ -292,23 +330,29 @@ EOF
 # dump it out
 if true
 then
-  exec > new-gdbarch
-  function_list | while do_read # eval read $read
-  do
-    cat <<EOF
+    exec > new-gdbarch
+    function_list | while do_read # eval read $read
+    do
+       cat <<EOF
 ${class} ${macro}(${actual})
   ${returntype} ${function} ($formal)${attrib}
     level=${level}
     startup=${startup}
     default=${default}
     invalid_p=${invalid_p}
+    valid_p=${valid_p}
     fmt=${fmt}
     print=${print}
     print_p=${print_p}
     description=${description}
 EOF
-  done
-  exec 1>&2
+       if class_is_predicate_p && default_is_fallback_p
+       then
+           echo "Error: predicate function can not have a non- multi-arch default" 1>&2
+           exit 1
+       fi
+    done
+    exec 1>&2
 fi
 
 copyright ()
@@ -398,8 +442,8 @@ echo ""
 echo "/* The following are pre-initialized by GDBARCH. */"
 function_list | while do_read # eval read $read
 do
-  case "${class}" in
-    "i" )
+    if class_is_info_p
+    then
        echo ""
        echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);"
        echo "/* set_gdbarch_${function}() - not applicable - pre-initialized. */"
@@ -408,8 +452,7 @@ do
        echo "#define ${macro} (gdbarch_${function} (current_gdbarch))"
        echo "#endif"
        echo "#endif"
-       ;;
-  esac
+    fi
 done
 
 # function typedef's
@@ -418,24 +461,38 @@ echo ""
 echo "/* The following are initialized by the target dependant code. */"
 function_list | while do_read # eval read $read
 do
-  case "${class}" in
-    "v" )
+    if class_is_predicate_p
+    then
+       echo ""
+       echo "#if defined (${macro})"
+       echo "/* Legacy for systems yet to multi-arch ${macro} */"
+       echo "#define ${macro}_P() (1)"
+       echo "#endif"
+       echo ""
+       echo "extern int gdbarch_${function}_p (struct gdbarch *gdbarch);"
+       echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro}_P)"
+       echo "#define ${macro}_P() (gdbarch_${function}_p (current_gdbarch))"
+       echo "#endif"
+    fi
+    if class_is_variable_p
+    then
        echo ""
        echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);"
        echo "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, ${returntype} ${function});"
-       if ! default_is_fallback_p
+       if ! default_is_fallback_p && ! class_is_predicate_p
        then
            echo "#if GDB_MULTI_ARCH"
        fi
        echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
        echo "#define ${macro} (gdbarch_${function} (current_gdbarch))"
        echo "#endif"
-       if ! default_is_fallback_p
+       if ! default_is_fallback_p && ! class_is_predicate_p
        then
            echo "#endif"
        fi
-       ;;
-    "f" )
+    fi
+    if class_is_function_p
+    then
        echo ""
        echo "typedef ${returntype} (gdbarch_${function}_ftype) (${formal});"
        if [ "${formal}" = "void" ]
@@ -445,7 +502,7 @@ do
          echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch, ${formal});"
        fi
        echo "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, gdbarch_${function}_ftype *${function});"
-       if ! default_is_fallback_p
+       if ! default_is_fallback_p && ! class_is_predicate_p
        then
            echo "#if GDB_MULTI_ARCH"
        fi
@@ -460,12 +517,11 @@ do
          echo "#define ${macro}(${actual}) (gdbarch_${function} (current_gdbarch, ${actual}))"
        fi
        echo "#endif"
-       if ! default_is_fallback_p
+       if ! default_is_fallback_p && ! class_is_predicate_p
        then
            echo "#endif"
        fi
-       ;;
-  esac
+    fi
 done
 
 # close it off
@@ -834,9 +890,10 @@ echo "{"
 echo "  /* basic architectural information */"
 function_list | while do_read # eval read $read
 do
-  case "${class}" in
-    "i" ) echo "  ${returntype} ${function};" ;;
-  esac
+    if class_is_info_p
+    then
+       echo "  ${returntype} ${function};"
+    fi
 done
 echo ""
 echo "  /* target specific vector. */"
@@ -879,10 +936,13 @@ cat <<EOF
 EOF
 function_list | while do_read # eval read $read
 do
-  case "${class}" in
-    "v" ) echo "  ${returntype} ${function};" ;;
-    "f" ) echo "  gdbarch_${function}_ftype *${function}${attrib};" ;;
-  esac
+    if class_is_variable_p
+    then
+       echo "  ${returntype} ${function};"
+    elif class_is_function_p
+    then
+       echo "  gdbarch_${function}_ftype *${function}${attrib};"
+    fi
 done
 echo "};"
 
@@ -900,11 +960,10 @@ echo "struct gdbarch startup_gdbarch = {"
 echo "  /* basic architecture information */"
 function_list | while do_read # eval read $read
 do
-  case "${class}" in
-    "i" ) 
-      echo "  ${startup},"
-    ;;
-  esac
+    if class_is_info_p
+    then
+       echo "  ${startup},"
+    fi
 done
 cat <<EOF
   /* target specific vector */
@@ -915,11 +974,10 @@ cat <<EOF
 EOF
 function_list | while do_read # eval read $read
 do
-  case "${class}" in
-    "f" | "v" )
-      echo "  ${startup},"
-    ;;
-  esac
+    if class_is_function_p || class_is_variable_p
+    then
+       echo "  ${startup},"
+    fi
 done
 cat <<EOF
   /* startup_gdbarch() */
@@ -948,22 +1006,22 @@ EOF
 echo ""
 function_list | while do_read # eval read $read
 do
-  case "${class}" in
-    "i" ) echo "  gdbarch->${function} = info->${function};"
-  esac
+    if class_is_info_p
+    then
+       echo "  gdbarch->${function} = info->${function};"
+    fi
 done
 echo ""
 echo "  /* Force the explicit initialization of these. */"
 function_list | while do_read # eval read $read
 do
-  case "${class}" in
-    "f" | "v" )
+    if class_is_function_p || class_is_variable_p
+    then
        if [ "${default}" != "" -a "${default}" != "0" ]
        then
          echo "  gdbarch->${function} = ${default};"
        fi
-       ;;
-  esac
+    fi
 done
 cat <<EOF
   /* gdbarch_alloc() */
@@ -1010,11 +1068,14 @@ verify_gdbarch (struct gdbarch *gdbarch)
 EOF
 function_list | while do_read # eval read $read
 do
-  case "${class}" in
-    "f" | "v" )
+    if class_is_function_p || class_is_variable_p
+    then
        if [ "${invalid_p}" = "0" ]
        then
            echo "  /* Skip verify of ${function}, invalid_p == 0 */"
+       elif class_is_predicate_p
+       then
+           echo "  /* Skip verify of ${function}, has predicate */"
        elif [ "${invalid_p}" ]
        then
            echo "  if ((GDB_MULTI_ARCH >= ${level})"
@@ -1026,8 +1087,7 @@ do
            echo "      && (gdbarch->${function} == ${default}))"
            echo "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
        fi
-       ;;
-  esac
+    fi
 done
 cat <<EOF
 }
@@ -1045,14 +1105,13 @@ gdbarch_dump (void)
 EOF
 function_list | while do_read # eval read $read
 do
-  case "${class}" in
-    "f" )
+    if class_is_function_p
+    then
        echo "  fprintf_unfiltered (gdb_stdlog,"
        echo "                      \"gdbarch_update: ${macro} = 0x%08lx\\n\","
        echo "                      (long) current_gdbarch->${function}"
        echo "                      /*${macro} ()*/);"
-       ;;
-    * )
+    else
        if [ "${print_p}" = "#" ]
        then
          echo "#ifdef ${macro}"
@@ -1071,8 +1130,7 @@ do
          echo "                      \"gdbarch_update: ${macro} = ${fmt}\\n\","
          echo "                      ${print});"
        fi
-       ;;
-  esac
+    fi
 done
 echo "}"
 
@@ -1091,8 +1149,22 @@ EOF
 echo ""
 function_list | while do_read # eval read $read
 do
-  case "${class}" in
-    "f" )
+    if class_is_predicate_p
+    then
+       echo ""
+       echo "int"
+       echo "gdbarch_${function}_p (struct gdbarch *gdbarch)"
+       echo "{"
+       if [ "${valid_p}" ]
+       then
+           echo "  return ${valid_p};"
+       else
+           echo "#error \"gdbarch_${function}_p: not defined\""
+       fi
+       echo "}"
+    fi
+    if class_is_function_p
+    then
        echo ""
        echo "${returntype}"
        if [ "${formal}" = "void" ]
@@ -1134,8 +1206,8 @@ do
        echo "{"
        echo "  gdbarch->${function} = ${function};"
        echo "}"
-       ;;
-    "v" )
+    elif class_is_variable_p
+    then
        echo ""
        echo "${returntype}"
        echo "gdbarch_${function} (struct gdbarch *gdbarch)"
@@ -1168,8 +1240,8 @@ do
        echo "{"
        echo "  gdbarch->${function} = ${function};"
        echo "}"
-       ;;
-    "i" )
+    elif class_is_info_p
+    then
        echo ""
        echo "${returntype}"
        echo "gdbarch_${function} (struct gdbarch *gdbarch)"
@@ -1178,8 +1250,7 @@ do
        echo "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\n\");"
        echo "  return gdbarch->${function};"
        echo "}"
-       ;;
-  esac
+    fi
 done
 
 # All the trailing guff
index 3198741390d0a2553a5948860ba0dfe0bd626b99..36846c7ebdbcf8a59bb443886a9749af527ed317 100644 (file)
@@ -1534,14 +1534,14 @@ 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);
 
-#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 (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 */
@@ -1583,12 +1583,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,11 +1608,10 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
    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))
+  if (STACK_ALIGN_P () && INNER_THAN (1, 2))
     {
       /* If stack grows down, we must leave a hole at the top. */
       int len = 0;
@@ -1624,7 +1622,6 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
        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,8 +1639,7 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
   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!  */
@@ -1651,7 +1647,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!  */