From 79e3ac1a26211f8abf029a553617dad32f44befe Mon Sep 17 00:00:00 2001 From: ceriel Date: Wed, 20 Apr 1988 16:58:29 +0000 Subject: [PATCH] improved setjmp --- lang/cem/libcc/gen/setjmp.e | 60 +++++++------------------------------ 1 file changed, 11 insertions(+), 49 deletions(-) diff --git a/lang/cem/libcc/gen/setjmp.e b/lang/cem/libcc/gen/setjmp.e index 8bc5af41f..9dedbc2c1 100644 --- a/lang/cem/libcc/gen/setjmp.e +++ b/lang/cem/libcc/gen/setjmp.e @@ -7,8 +7,6 @@ ; ----------------- ; | signal mask | (only for Berkeley 4.2) ; ----------------- -; | PC of caller | -; ----------------- ; | | ; | GTO descriptor | ; | (SP, LB, PC) | @@ -16,19 +14,13 @@ ; ----------------- ; ; setjmp saves the signalmask, PC, SP, and LB of caller, and creates a -; GTO descriptor with a program counter indicating a piece of code that -; gets the return value right before jumping to the caller of setjmp in -; the setjmp buffer, which has a layout as displayed above. -; The big problem here is how to het the return address, i.e. the PC of +; GTO descriptor from this. +; The big problem here is how to get the return address, i.e. the PC of ; the caller; This problem is solved by the front-end, which must pass ; it as an extra parameter to setjmp. gtobuf bss 3*EM_PSIZE,0,0 -retval - bss EM_WSIZE,0,0 -jmpbuf_addr - bss EM_PSIZE,0,0 inp $fill_ret_area exp $setjmp @@ -41,50 +33,23 @@ jmpbuf_addr lfr EM_WSIZE lal 0 loi EM_PSIZE - stf 4*EM_PSIZE + stf 3*EM_PSIZE #endif ; create GTO descriptor for longjmp lxl 0 dch ; Local Base of caller lxa 0 ; Stackpointer of caller -.1 - rom *1 - lae .1 - loi EM_PSIZE ; where the longjmp ends up - lal 0 - loi EM_PSIZE - sti 3*EM_PSIZE ; stored in jmpbuf - ; also save return address, which has been supplied by the compiler lal EM_PSIZE loi EM_PSIZE lal 0 loi EM_PSIZE - adp 3*EM_PSIZE - sti EM_PSIZE + sti 3*EM_PSIZE ; stored in jmpbuf loc 0 ret EM_WSIZE -1 - ; so, the longjmp returns here. - ; now, create a GTO descriptor for the final GTO - lae jmpbuf_addr - loi EM_PSIZE - adp 3*EM_PSIZE - loi EM_PSIZE - lae gtobuf - sti EM_PSIZE ; this is the return address - lae jmpbuf_addr - loi EM_PSIZE - adp EM_PSIZE - loi 2*EM_PSIZE - lae gtobuf+EM_PSIZE - sti 2*EM_PSIZE ; that's it, the GTO descriptor is ready; - ; now take care of the return value ... - cal $fill_ret_area - gto gtobuf ; there we go ... end 0 pro $fill_ret_area,0 - loe retval + lol 0 ret EM_WSIZE end 0 @@ -94,14 +59,14 @@ jmpbuf_addr loi EM_PSIZE #ifdef __BSD4_2 dup EM_PSIZE - lof 4*EM_PSIZE + lof 3*EM_PSIZE cal $sigsetmask asp EM_WSIZE lfr EM_WSIZE asp EM_WSIZE #endif - lae jmpbuf_addr - sti EM_PSIZE ; save address of jmpbuf + lae gtobuf + blm 3*EM_PSIZE lol EM_PSIZE dup EM_WSIZE zne *3 @@ -109,10 +74,7 @@ jmpbuf_addr asp EM_WSIZE loc 1 3 - ste retval ; save return value - lal 0 - loi EM_PSIZE - lae gtobuf - blm 3*EM_PSIZE ; create GTO descriptor - gto gtobuf ; and GTO + cal $fill_ret_area + asp EM_WSIZE + gto gtobuf ; there we go ... end 0 -- 2.34.1