Mark parlib 2LS functions as noreturn
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 18 Feb 2016 22:45:59 +0000 (17:45 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 2 May 2016 21:11:15 +0000 (17:11 -0400)
There are a bunch of functions in the 2LS that do not return.
run_.*uthread(), vcore_entry(), etc.  Marking them as noreturn will allow
us use the compiler to enforce that functions in specific 2LSs are noreturn
as well.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/include/parlib/uthread.h
user/parlib/include/parlib/vcore.h
user/parlib/uthread.c

index b108110..fff5312 100644 (file)
@@ -98,8 +98,8 @@ void uth_enable_notifs(void);
 
 /* Helpers, which sched_entry() can call */
 void highjack_current_uthread(struct uthread *uthread);
-void run_current_uthread(void);
-void run_uthread(struct uthread *uthread);
+void __attribute__((noreturn)) run_current_uthread(void);
+void __attribute__((noreturn)) run_uthread(struct uthread *uthread);
 
 /* Asking for trouble with this API, when we just want stacktop (or whatever
  * the SP will be). */
index 7c86936..01df275 100644 (file)
@@ -25,7 +25,7 @@ extern void exit (int __status) __THROW __attribute__ ((__noreturn__));
 #define TRANSITION_STACK_SIZE (TRANSITION_STACK_PAGES*PGSIZE)
 
 /* Defined in vcore.c */
-extern void vcore_entry();
+void __attribute__((noreturn)) vcore_entry(void);
 extern __thread bool __vcore_context;
 extern __thread int __vcoreid;
 extern __thread struct syscall __vcore_one_sysc;       /* see sys_change_vcore */
index 3f04979..e092a22 100644 (file)
@@ -583,7 +583,7 @@ static void handle_refl_fault(struct uthread *uth, struct user_context *ctx)
  * called only when the uthread already was running, and we were interrupted by
  * the kernel (event, etc).  Do not call this to run a fresh uthread, even if
  * you've set it to be current. */
-void run_current_uthread(void)
+void __attribute__((noreturn)) run_current_uthread(void)
 {
        struct uthread *uth;
        uint32_t vcoreid = vcore_id();
@@ -632,7 +632,7 @@ void run_current_uthread(void)
  * necessary (we only must do it once for an entire time in VC ctx, and in
  * loops), and might have been optimizing a rare event at a cost in both
  * instructions and complexity. */
-void run_uthread(struct uthread *uthread)
+void __attribute__((noreturn)) run_uthread(struct uthread *uthread)
 {
        uint32_t vcoreid = vcore_id();
        struct preempt_data *vcpd = vcpd_of(vcoreid);