Give GCC more control flow information, so it can be sure that
authorJim Blandy <jimb@red-bean.com>
Wed, 18 Dec 1996 21:39:44 +0000 (21:39 +0000)
committerJim Blandy <jimb@red-bean.com>
Wed, 18 Dec 1996 21:39:44 +0000 (21:39 +0000)
variables aren't used uninitialized.
* error.h (scm_error, scm_syserror, scm_syserror_msg,
scm_sysmissing, scm_num_overflow, scm_out_of_range,
scm_wrong_num_args, scm_wrong_type_arg, scm_memory_error,
scm_misc_error): Tell GCC that these functions never return.
* struct.c (scm_struct_ref, scm_struct_set_x): If we can't figure
out the field type, call abort if SCM_ASSERT returns, to placate
the optimizer.
* stacks.c (scm_make_stack, scm_last_stack_frame): abort if
scm_wta ever returns.  We can't handle this case anyway, and this
gives the optimizer more information.
* unif.c (scm_uniform_vector_ref, scm_array_set_x): Abort if
scm_wta ever returns.

libguile/error.h
libguile/stacks.c

index 385497e..0ce1628 100644 (file)
@@ -50,21 +50,34 @@ extern int scm_ints_disabled;
 
 \f
 
+/* GCC can be told that a function doesn't return; this helps it do
+   better error checking (for uninitialized variable use, for
+   example), and some optimization.  */
+#ifdef __GNUC__
+#define SCM_NORETURN __attribute__ ((noreturn))
+#else
+#define SCM_NORETURN
+#endif
+
+
 extern SCM scm_errno SCM_P ((SCM arg));
 extern SCM scm_perror SCM_P ((SCM arg));
 extern void scm_error SCM_P ((SCM key, char *subr, char *message,
-                             SCM args, SCM rest));
+                             SCM args, SCM rest)) SCM_NORETURN;
 extern void (*scm_error_callback) SCM_P ((SCM key, char *subr,
                                          char *message, SCM args, SCM rest));
-extern void scm_syserror SCM_P ((char *subr));
-extern void scm_syserror_msg SCM_P ((char *subr, char *message, SCM args));
-extern void scm_sysmissing SCM_P ((char *subr));
-extern void scm_num_overflow SCM_P ((char *subr));
-extern void scm_out_of_range SCM_P ((char *subr, SCM bad_value));
-extern void scm_wrong_num_args SCM_P ((SCM proc));
-extern void scm_wrong_type_arg SCM_P ((char *subr, int pos, SCM bad_value));
-extern void scm_memory_error SCM_P ((char *subr));
-extern void scm_misc_error SCM_P ((char *subr, char *message, SCM args));
+extern void scm_syserror SCM_P ((char *subr)) SCM_NORETURN;
+extern void scm_syserror_msg SCM_P ((char *subr, char *message, SCM args))
+                                   SCM_NORETURN;
+extern void scm_sysmissing SCM_P ((char *subr)) SCM_NORETURN;
+extern void scm_num_overflow SCM_P ((char *subr)) SCM_NORETURN;
+extern void scm_out_of_range SCM_P ((char *subr, SCM bad_value)) SCM_NORETURN;
+extern void scm_wrong_num_args SCM_P ((SCM proc)) SCM_NORETURN;
+extern void scm_wrong_type_arg SCM_P ((char *subr, int pos, SCM bad_value))
+                                     SCM_NORETURN;
+extern void scm_memory_error SCM_P ((char *subr)) SCM_NORETURN;
+extern void scm_misc_error SCM_P ((char *subr, char *message, SCM args))
+                                SCM_NORETURN;
 extern SCM scm_wta SCM_P ((SCM arg, char *pos, char *s_subr));
 extern void scm_init_error SCM_P ((void));
 
index c1813f2..fc595a3 100644 (file)
@@ -357,7 +357,11 @@ scm_make_stack (args)
          dframe = (scm_debug_frame *) ((SCM_STACKITEM *) SCM_DFRAME (obj)
                                       + offset);
        }
-      else scm_wta (obj, (char *) SCM_ARG1, s_make_stack);
+      else
+       {
+         scm_wta (obj, (char *) SCM_ARG1, s_make_stack);
+         abort ();
+       }
     }
 
   /* Count number of frames.  Also get stack id tag and check whether
@@ -511,7 +515,11 @@ scm_last_stack_frame (obj)
 #endif
       dframe = (scm_debug_frame *) ((SCM_STACKITEM *) SCM_DFRAME (obj) + offset);
     }
-  else scm_wta (obj, (char *) SCM_ARG1, s_last_stack_frame);
+  else
+    {
+      scm_wta (obj, (char *) SCM_ARG1, s_last_stack_frame);
+      abort ();
+    }
   
   if (!dframe || SCM_VOIDFRAMEP (*dframe))
     return SCM_BOOL_F;