OSDN Git Service

* config/arm.c (output_func_epilogue): Check TARGET_ABORT_NORETURN
authorclm <clm@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 13 Jan 1999 14:32:39 +0000 (14:32 +0000)
committerclm <clm@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 13 Jan 1999 14:32:39 +0000 (14:32 +0000)
        before generating a call to abort for volatile functions.
        * config/arm.h (ARM_FLAG_ABORT_NORETURN):  Define.
        (TARGET_ABORT_NORETURN):  Define.
        (abort-on-noreturn):  New option.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@24653 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/config/arm/arm.h

index 8342b55..a11bfc0 100644 (file)
@@ -1,3 +1,11 @@
+Wed Jan 13 16:16:44 1999  Catherine Moore  <clm@cygnus.com>
+
+        * config/arm.c (output_func_epilogue):  Check TARGET_ABORT_NORETURN
+        before generating a call to abort for volatile functions.
+        * config/arm.h (ARM_FLAG_ABORT_NORETURN):  Define.
+        (TARGET_ABORT_NORETURN):  Define.
+        (abort-on-noreturn):  New option.
+
 Wed Jan 13 13:30:08 1999  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * cccp.c (xstrdup): Renamed from `savestring'.  All callers changed.
index 7d0f5ca..bcbf33c 100644 (file)
@@ -5006,7 +5006,7 @@ output_func_epilogue (f, frame_size)
     goto epilogue_done;
 
   /* A volatile function should never return.  Call abort.  */
-  if (volatile_func)
+  if (TARGET_ABORT_NORETURN && volatile_func)
     {
       rtx op = gen_rtx (SYMBOL_REF, Pmode, "abort");
       assemble_external_libcall (op);
index f47f653..3c29f1c 100644 (file)
@@ -312,6 +312,10 @@ extern char *target_fp_name;
    big-endian (for backwards compatibility with older versions of GCC).  */
 #define ARM_FLAG_LITTLE_WORDS  (0x2000)
 
+/* Nonzero if a call to abort should be generated if a noreturn 
+function tries to return. */
+#define ARM_FLAG_ABORT_NORETURN (0x8000)
+
 #define TARGET_APCS                    (target_flags & ARM_FLAG_APCS_FRAME)
 #define TARGET_POKE_FUNCTION_NAME      (target_flags & ARM_FLAG_POKE)
 #define TARGET_FPE                     (target_flags & ARM_FLAG_FPE)
@@ -327,6 +331,7 @@ extern char *target_fp_name;
 #define TARGET_BIG_END                 (target_flags & ARM_FLAG_BIG_END)
 #define TARGET_THUMB_INTERWORK         (target_flags & ARM_FLAG_THUMB)
 #define TARGET_LITTLE_WORDS            (target_flags & ARM_FLAG_LITTLE_WORDS)
+#define TARGET_ABORT_NORETURN           (target_flags & ARM_FLAG_ABORT_NORETURN)
 
 /* SUBTARGET_SWITCHES is used to add flags on a per-config basis.
    Bit 31 is reserved.  See riscix.h.  */
@@ -377,6 +382,10 @@ extern char *target_fp_name;
   {"thumb-interwork",          ARM_FLAG_THUMB,         \
      "Support calls between THUMB and ARM instructions sets" },        \
   {"no-thumb-interwork",       -ARM_FLAG_THUMB, "" },  \
+  {"abort-on-noreturn",         ARM_FLAG_ABORT_NORETURN,     \
+   "Generate a call to abort if a noreturn function returns"}, \
+  {"no-abort-on-noreturn",      -ARM_FLAG_ABORT_NORETURN, ""}, \
+
   SUBTARGET_SWITCHES                                   \
   {"",                         TARGET_DEFAULT }        \
 }