diff options
Diffstat (limited to 'gcc/m2/mc-boot/GRTExceptions.c')
-rw-r--r-- | gcc/m2/mc-boot/GRTExceptions.c | 1221 |
1 files changed, 1221 insertions, 0 deletions
diff --git a/gcc/m2/mc-boot/GRTExceptions.c b/gcc/m2/mc-boot/GRTExceptions.c new file mode 100644 index 0000000..046e681 --- /dev/null +++ b/gcc/m2/mc-boot/GRTExceptions.c @@ -0,0 +1,1221 @@ +/* do not edit automatically generated by mc from RTExceptions. */ +/* RTExceptions.mod runtime exception handler routines. + +Copyright (C) 2008-2021 Free Software Foundation, Inc. +Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>. + +This file is part of GNU Modula-2. + +GNU Modula-2 is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GNU Modula-2 is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +<http://www.gnu.org/licenses/>. */ + +#include "config.h" +#include "system.h" +# if !defined (PROC_D) +# define PROC_D + typedef void (*PROC_t) (void); + typedef struct { PROC_t proc; } PROC; +# endif + +# if !defined (FALSE) +# define FALSE (1==0) +# endif + +# include "GStorage.h" +# include "Gmcrts.h" +#ifndef __cplusplus +extern void throw (unsigned int); +#endif +#if defined(__cplusplus) +# undef NULL +# define NULL 0 +#endif +#define _RTExceptions_H +#define _RTExceptions_C + +# include "GASCII.h" +# include "GStrLib.h" +# include "GStorage.h" +# include "GSYSTEM.h" +# include "Glibc.h" +# include "GM2RTS.h" +# include "GSysExceptions.h" +# include "GM2EXCEPTION.h" + +typedef struct RTExceptions_ProcedureHandler_p RTExceptions_ProcedureHandler; + +# define MaxBuffer 4096 +typedef struct RTExceptions__T1_r RTExceptions__T1; + +typedef char *RTExceptions_PtrToChar; + +typedef struct RTExceptions__T2_a RTExceptions__T2; + +typedef struct RTExceptions__T3_r RTExceptions__T3; + +typedef RTExceptions__T3 *RTExceptions_Handler; + +typedef RTExceptions__T1 *RTExceptions_EHBlock; + +typedef void (*RTExceptions_ProcedureHandler_t) (void); +struct RTExceptions_ProcedureHandler_p { RTExceptions_ProcedureHandler_t proc; }; + +struct RTExceptions__T2_a { char array[MaxBuffer+1]; }; +struct RTExceptions__T1_r { + RTExceptions__T2 buffer; + unsigned int number; + RTExceptions_Handler handlers; + RTExceptions_EHBlock right; + }; + +struct RTExceptions__T3_r { + RTExceptions_ProcedureHandler p; + unsigned int n; + RTExceptions_Handler right; + RTExceptions_Handler left; + RTExceptions_Handler stack; + }; + +static unsigned int inException; +static RTExceptions_Handler freeHandler; +static RTExceptions_EHBlock freeEHB; +static RTExceptions_EHBlock currentEHB; +static void * currentSource; + +/* + Raise - invoke the exception handler associated with, number, + in the active EHBlock. It keeps a record of the number + and message in the EHBlock for later use. +*/ + +extern "C" void RTExceptions_Raise (unsigned int number, void * file, unsigned int line, unsigned int column, void * function, void * message); + +/* + SetExceptionBlock - sets, source, as the active EHB. +*/ + +extern "C" void RTExceptions_SetExceptionBlock (RTExceptions_EHBlock source); + +/* + GetExceptionBlock - returns the active EHB. +*/ + +extern "C" RTExceptions_EHBlock RTExceptions_GetExceptionBlock (void); + +/* + GetTextBuffer - returns the address of the EHB buffer. +*/ + +extern "C" void * RTExceptions_GetTextBuffer (RTExceptions_EHBlock e); + +/* + GetTextBufferSize - return the size of the EHB text buffer. +*/ + +extern "C" unsigned int RTExceptions_GetTextBufferSize (RTExceptions_EHBlock e); + +/* + GetNumber - return the exception number associated with, + source. +*/ + +extern "C" unsigned int RTExceptions_GetNumber (RTExceptions_EHBlock source); + +/* + InitExceptionBlock - creates and returns a new exception block. +*/ + +extern "C" RTExceptions_EHBlock RTExceptions_InitExceptionBlock (void); + +/* + KillExceptionBlock - destroys the EHB, e, and all its handlers. +*/ + +extern "C" RTExceptions_EHBlock RTExceptions_KillExceptionBlock (RTExceptions_EHBlock e); + +/* + PushHandler - install a handler in EHB, e. +*/ + +extern "C" void RTExceptions_PushHandler (RTExceptions_EHBlock e, unsigned int number, RTExceptions_ProcedureHandler p); + +/* + PopHandler - removes the handler associated with, number, from + EHB, e. +*/ + +extern "C" void RTExceptions_PopHandler (RTExceptions_EHBlock e, unsigned int number); + +/* + DefaultErrorCatch - displays the current error message in + the current exception block and then + calls HALT. +*/ + +extern "C" void RTExceptions_DefaultErrorCatch (void); + +/* + BaseExceptionsThrow - configures the Modula-2 exceptions to call + THROW which in turn can be caught by an + exception block. If this is not called then + a Modula-2 exception will simply call an + error message routine and then HALT. +*/ + +extern "C" void RTExceptions_BaseExceptionsThrow (void); + +/* + IsInExceptionState - returns TRUE if the program is currently + in the exception state. +*/ + +extern "C" unsigned int RTExceptions_IsInExceptionState (void); + +/* + SetExceptionState - returns the current exception state and + then sets the current exception state to, + to. +*/ + +extern "C" unsigned int RTExceptions_SetExceptionState (unsigned int to); + +/* + SwitchExceptionState - assigns, from, with the current exception + state and then assigns the current exception + to, to. +*/ + +extern "C" void RTExceptions_SwitchExceptionState (unsigned int *from, unsigned int to); + +/* + GetBaseExceptionBlock - returns the initial language exception block + created. +*/ + +extern "C" RTExceptions_EHBlock RTExceptions_GetBaseExceptionBlock (void); + +/* + SetExceptionSource - sets the current exception source to, source. +*/ + +extern "C" void RTExceptions_SetExceptionSource (void * source); + +/* + GetExceptionSource - returns the current exception source. +*/ + +extern "C" void * RTExceptions_GetExceptionSource (void); + +/* + ErrorString - writes a string to stderr. +*/ + +static void ErrorString (const char *a_, unsigned int _a_high); + +/* + findHandler - +*/ + +static RTExceptions_Handler findHandler (RTExceptions_EHBlock e, unsigned int number); + +/* + InvokeHandler - invokes the associated handler for the current + exception in the active EHB. +*/ + +static void InvokeHandler (void); + +/* + DoThrow - throw the exception number in the exception block. +*/ + +static void DoThrow (void); + +/* + addChar - adds, ch, to the current exception handler text buffer + at index, i. The index in then incremented. +*/ + +static void addChar (char ch, unsigned int *i); + +/* + stripPath - returns the filename from the path. +*/ + +static void * stripPath (void * s); + +/* + addFile - adds the filename determined by, s, however it strips + any preceeding path. +*/ + +static void addFile (void * s, unsigned int *i); + +/* + addStr - adds a C string from address, s, into the current + handler text buffer. +*/ + +static void addStr (void * s, unsigned int *i); + +/* + addNum - adds a number, n, to the current handler + text buffer. +*/ + +static void addNum (unsigned int n, unsigned int *i); + +/* + New - returns a new EHBlock. +*/ + +static RTExceptions_EHBlock New (void); + +/* + NewHandler - returns a new handler. +*/ + +static RTExceptions_Handler NewHandler (void); + +/* + KillHandler - returns, NIL, and places, h, onto the free list. +*/ + +static RTExceptions_Handler KillHandler (RTExceptions_Handler h); + +/* + KillHandlers - kills all handlers in the list. +*/ + +static RTExceptions_Handler KillHandlers (RTExceptions_Handler h); + +/* + InitHandler - +*/ + +static RTExceptions_Handler InitHandler (RTExceptions_Handler h, RTExceptions_Handler l, RTExceptions_Handler r, RTExceptions_Handler s, unsigned int number, RTExceptions_ProcedureHandler proc); + +/* + SubHandler - +*/ + +static void SubHandler (RTExceptions_Handler h); + +/* + AddHandler - add, e, to the end of the list of handlers. +*/ + +static void AddHandler (RTExceptions_EHBlock e, RTExceptions_Handler h); + +/* + indexf - raise an index out of bounds exception. +*/ + +static void indexf (void * a); + +/* + range - raise an assignment out of range exception. +*/ + +static void range (void * a); + +/* + casef - raise a case selector out of range exception. +*/ + +static void casef (void * a); + +/* + invalidloc - raise an invalid location exception. +*/ + +static void invalidloc (void * a); + +/* + function - raise a ... function ... exception. --fixme-- what does this exception catch? +*/ + +static void function (void * a); + +/* + wholevalue - raise an illegal whole value exception. +*/ + +static void wholevalue (void * a); + +/* + wholediv - raise a division by zero exception. +*/ + +static void wholediv (void * a); + +/* + realvalue - raise an illegal real value exception. +*/ + +static void realvalue (void * a); + +/* + realdiv - raise a division by zero in a real number exception. +*/ + +static void realdiv (void * a); + +/* + complexvalue - raise an illegal complex value exception. +*/ + +static void complexvalue (void * a); + +/* + complexdiv - raise a division by zero in a complex number exception. +*/ + +static void complexdiv (void * a); + +/* + protection - raise a protection exception. +*/ + +static void protection (void * a); + +/* + systemf - raise a system exception. +*/ + +static void systemf (void * a); + +/* + coroutine - raise a coroutine exception. +*/ + +static void coroutine (void * a); + +/* + exception - raise a exception exception. +*/ + +static void exception (void * a); + +/* + Init - initialises this module. +*/ + +static void Init (void); + +/* + TidyUp - deallocate memory used by this module. +*/ + +static void TidyUp (void); + + +/* + ErrorString - writes a string to stderr. +*/ + +static void ErrorString (const char *a_, unsigned int _a_high) +{ + int n; + char a[_a_high+1]; + + /* make a local copy of each unbounded array. */ + memcpy (a, a_, _a_high+1); + + n = static_cast<int> (libc_write (2, &a, static_cast<size_t> (StrLib_StrLen ((const char *) a, _a_high)))); +} + + +/* + findHandler - +*/ + +static RTExceptions_Handler findHandler (RTExceptions_EHBlock e, unsigned int number) +{ + RTExceptions_Handler h; + + h = e->handlers->right; + while ((h != e->handlers) && (number != h->n)) + { + h = h->right; + } + if (h == e->handlers) + { + return NULL; + } + else + { + return h; + } + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + InvokeHandler - invokes the associated handler for the current + exception in the active EHB. +*/ + +static void InvokeHandler (void) +{ + RTExceptions_Handler h; + + h = findHandler (currentEHB, currentEHB->number); + if (h == NULL) + { + throw (RTExceptions_GetNumber (RTExceptions_GetExceptionBlock ())); + } + else + { + (*h->p.proc) (); + } +} + + +/* + DoThrow - throw the exception number in the exception block. +*/ + +static void DoThrow (void) +{ + throw (RTExceptions_GetNumber (RTExceptions_GetExceptionBlock ())); +} + + +/* + addChar - adds, ch, to the current exception handler text buffer + at index, i. The index in then incremented. +*/ + +static void addChar (char ch, unsigned int *i) +{ + if (((*i) <= MaxBuffer) && (currentEHB != NULL)) + { + currentEHB->buffer.array[(*i)] = ch; + (*i) += 1; + } +} + + +/* + stripPath - returns the filename from the path. +*/ + +static void * stripPath (void * s) +{ + RTExceptions_PtrToChar f; + RTExceptions_PtrToChar p; + + p = static_cast<RTExceptions_PtrToChar> (s); + f = static_cast<RTExceptions_PtrToChar> (s); + while ((*p) != ASCII_nul) + { + if ((*p) == '/') + { + p += 1; + f = p; + } + else + { + p += 1; + } + } + return reinterpret_cast<void *> (f); + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + addFile - adds the filename determined by, s, however it strips + any preceeding path. +*/ + +static void addFile (void * s, unsigned int *i) +{ + RTExceptions_PtrToChar p; + + p = static_cast<RTExceptions_PtrToChar> (stripPath (s)); + while ((p != NULL) && ((*p) != ASCII_nul)) + { + addChar ((*p), i); + p += 1; + } +} + + +/* + addStr - adds a C string from address, s, into the current + handler text buffer. +*/ + +static void addStr (void * s, unsigned int *i) +{ + RTExceptions_PtrToChar p; + + p = static_cast<RTExceptions_PtrToChar> (s); + while ((p != NULL) && ((*p) != ASCII_nul)) + { + addChar ((*p), i); + p += 1; + } +} + + +/* + addNum - adds a number, n, to the current handler + text buffer. +*/ + +static void addNum (unsigned int n, unsigned int *i) +{ + if (n < 10) + { + addChar ( ((char) ((n % 10)+ ((unsigned int) ('0')))), i); + } + else + { + addNum (n / 10, i); + addNum (n % 10, i); + } +} + + +/* + New - returns a new EHBlock. +*/ + +static RTExceptions_EHBlock New (void) +{ + RTExceptions_EHBlock e; + + if (freeEHB == NULL) + { + Storage_ALLOCATE ((void **) &e, sizeof (RTExceptions__T1)); + } + else + { + e = freeEHB; + freeEHB = freeEHB->right; + } + return e; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + NewHandler - returns a new handler. +*/ + +static RTExceptions_Handler NewHandler (void) +{ + RTExceptions_Handler h; + + if (freeHandler == NULL) + { + Storage_ALLOCATE ((void **) &h, sizeof (RTExceptions__T3)); + } + else + { + h = freeHandler; + freeHandler = freeHandler->right; + } + return h; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + KillHandler - returns, NIL, and places, h, onto the free list. +*/ + +static RTExceptions_Handler KillHandler (RTExceptions_Handler h) +{ + h->right = freeHandler; + freeHandler = h; + return NULL; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + KillHandlers - kills all handlers in the list. +*/ + +static RTExceptions_Handler KillHandlers (RTExceptions_Handler h) +{ + h->left->right = freeHandler; + freeHandler = h; + return NULL; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + InitHandler - +*/ + +static RTExceptions_Handler InitHandler (RTExceptions_Handler h, RTExceptions_Handler l, RTExceptions_Handler r, RTExceptions_Handler s, unsigned int number, RTExceptions_ProcedureHandler proc) +{ + h->p = proc; + h->n = number; + h->right = r; + h->left = l; + h->stack = s; + return h; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + SubHandler - +*/ + +static void SubHandler (RTExceptions_Handler h) +{ + h->right->left = h->left; + h->left->right = h->right; +} + + +/* + AddHandler - add, e, to the end of the list of handlers. +*/ + +static void AddHandler (RTExceptions_EHBlock e, RTExceptions_Handler h) +{ + h->right = e->handlers; + h->left = e->handlers->left; + e->handlers->left->right = h; + e->handlers->left = h; +} + + +/* + indexf - raise an index out of bounds exception. +*/ + +static void indexf (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_indexException)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 612, 9, const_cast<void*> (reinterpret_cast<const void*>("indexf")), const_cast<void*> (reinterpret_cast<const void*>("array index out of bounds"))); +} + + +/* + range - raise an assignment out of range exception. +*/ + +static void range (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_rangeException)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 624, 9, const_cast<void*> (reinterpret_cast<const void*>("range")), const_cast<void*> (reinterpret_cast<const void*>("assignment out of range"))); +} + + +/* + casef - raise a case selector out of range exception. +*/ + +static void casef (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_caseSelectException)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 636, 9, const_cast<void*> (reinterpret_cast<const void*>("casef")), const_cast<void*> (reinterpret_cast<const void*>("case selector out of range"))); +} + + +/* + invalidloc - raise an invalid location exception. +*/ + +static void invalidloc (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_invalidLocation)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 648, 9, const_cast<void*> (reinterpret_cast<const void*>("invalidloc")), const_cast<void*> (reinterpret_cast<const void*>("invalid address referenced"))); +} + + +/* + function - raise a ... function ... exception. --fixme-- what does this exception catch? +*/ + +static void function (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_functionException)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 660, 9, const_cast<void*> (reinterpret_cast<const void*>("function")), const_cast<void*> (reinterpret_cast<const void*>("... function ... "))); /* --fixme-- what has happened ? */ +} + + +/* + wholevalue - raise an illegal whole value exception. +*/ + +static void wholevalue (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_wholeValueException)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 672, 9, const_cast<void*> (reinterpret_cast<const void*>("wholevalue")), const_cast<void*> (reinterpret_cast<const void*>("illegal whole value exception"))); +} + + +/* + wholediv - raise a division by zero exception. +*/ + +static void wholediv (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_wholeDivException)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 684, 9, const_cast<void*> (reinterpret_cast<const void*>("wholediv")), const_cast<void*> (reinterpret_cast<const void*>("illegal whole value exception"))); +} + + +/* + realvalue - raise an illegal real value exception. +*/ + +static void realvalue (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_realValueException)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 696, 9, const_cast<void*> (reinterpret_cast<const void*>("realvalue")), const_cast<void*> (reinterpret_cast<const void*>("illegal real value exception"))); +} + + +/* + realdiv - raise a division by zero in a real number exception. +*/ + +static void realdiv (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_realDivException)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 708, 9, const_cast<void*> (reinterpret_cast<const void*>("realdiv")), const_cast<void*> (reinterpret_cast<const void*>("real number division by zero exception"))); +} + + +/* + complexvalue - raise an illegal complex value exception. +*/ + +static void complexvalue (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_complexValueException)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 720, 9, const_cast<void*> (reinterpret_cast<const void*>("complexvalue")), const_cast<void*> (reinterpret_cast<const void*>("illegal complex value exception"))); +} + + +/* + complexdiv - raise a division by zero in a complex number exception. +*/ + +static void complexdiv (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_complexDivException)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 732, 9, const_cast<void*> (reinterpret_cast<const void*>("complexdiv")), const_cast<void*> (reinterpret_cast<const void*>("complex number division by zero exception"))); +} + + +/* + protection - raise a protection exception. +*/ + +static void protection (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_protException)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 744, 9, const_cast<void*> (reinterpret_cast<const void*>("protection")), const_cast<void*> (reinterpret_cast<const void*>("protection exception"))); +} + + +/* + systemf - raise a system exception. +*/ + +static void systemf (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_sysException)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 756, 9, const_cast<void*> (reinterpret_cast<const void*>("systemf")), const_cast<void*> (reinterpret_cast<const void*>("system exception"))); +} + + +/* + coroutine - raise a coroutine exception. +*/ + +static void coroutine (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_coException)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 768, 9, const_cast<void*> (reinterpret_cast<const void*>("coroutine")), const_cast<void*> (reinterpret_cast<const void*>("coroutine exception"))); +} + + +/* + exception - raise a exception exception. +*/ + +static void exception (void * a) +{ + RTExceptions_Raise ( ((unsigned int) (M2EXCEPTION_exException)), const_cast<void*> (reinterpret_cast<const void*>("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod")), 780, 9, const_cast<void*> (reinterpret_cast<const void*>("exception")), const_cast<void*> (reinterpret_cast<const void*>("exception exception"))); +} + + +/* + Init - initialises this module. +*/ + +static void Init (void) +{ + inException = FALSE; + freeHandler = NULL; + freeEHB = NULL; + currentEHB = RTExceptions_InitExceptionBlock (); + currentSource = NULL; + RTExceptions_BaseExceptionsThrow (); + SysExceptions_InitExceptionHandlers ((SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) indexf}, (SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) range}, (SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) casef}, (SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) invalidloc}, (SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) function}, (SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) wholevalue}, (SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) wholediv}, (SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) realvalue}, (SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) realdiv}, (SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) complexvalue}, (SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) complexdiv}, (SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) protection}, (SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) systemf}, (SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) coroutine}, (SysExceptions_PROCEXCEPTION) {(SysExceptions_PROCEXCEPTION_t) exception}); +} + + +/* + TidyUp - deallocate memory used by this module. +*/ + +static void TidyUp (void) +{ + RTExceptions_Handler f; + RTExceptions_EHBlock e; + + if (currentEHB != NULL) + { + currentEHB = RTExceptions_KillExceptionBlock (currentEHB); + } + while (freeHandler != NULL) + { + f = freeHandler; + freeHandler = freeHandler->right; + Storage_DEALLOCATE ((void **) &f, sizeof (RTExceptions__T3)); + } + while (freeEHB != NULL) + { + e = freeEHB; + freeEHB = freeEHB->right; + Storage_DEALLOCATE ((void **) &e, sizeof (RTExceptions__T1)); + } +} + + +/* + Raise - invoke the exception handler associated with, number, + in the active EHBlock. It keeps a record of the number + and message in the EHBlock for later use. +*/ + +extern "C" void RTExceptions_Raise (unsigned int number, void * file, unsigned int line, unsigned int column, void * function, void * message) +{ + unsigned int i; + + currentEHB->number = number; + i = 0; + addFile (file, &i); + addChar (':', &i); + addNum (line, &i); + addChar (':', &i); + addNum (column, &i); + addChar (':', &i); + addChar (' ', &i); + addChar ('I', &i); + addChar ('n', &i); + addChar (' ', &i); + addStr (function, &i); + addChar (ASCII_nl, &i); + addFile (file, &i); + addChar (':', &i); + addNum (line, &i); + addChar (':', &i); + addNum (column, &i); + addChar (':', &i); + addStr (message, &i); + addChar (ASCII_nl, &i); + addChar (ASCII_nul, &i); + InvokeHandler (); +} + + +/* + SetExceptionBlock - sets, source, as the active EHB. +*/ + +extern "C" void RTExceptions_SetExceptionBlock (RTExceptions_EHBlock source) +{ + currentEHB = source; +} + + +/* + GetExceptionBlock - returns the active EHB. +*/ + +extern "C" RTExceptions_EHBlock RTExceptions_GetExceptionBlock (void) +{ + return currentEHB; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + GetTextBuffer - returns the address of the EHB buffer. +*/ + +extern "C" void * RTExceptions_GetTextBuffer (RTExceptions_EHBlock e) +{ + return &e->buffer; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + GetTextBufferSize - return the size of the EHB text buffer. +*/ + +extern "C" unsigned int RTExceptions_GetTextBufferSize (RTExceptions_EHBlock e) +{ + return sizeof (e->buffer); + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + GetNumber - return the exception number associated with, + source. +*/ + +extern "C" unsigned int RTExceptions_GetNumber (RTExceptions_EHBlock source) +{ + return source->number; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + InitExceptionBlock - creates and returns a new exception block. +*/ + +extern "C" RTExceptions_EHBlock RTExceptions_InitExceptionBlock (void) +{ + RTExceptions_EHBlock e; + + e = New (); + e->number = UINT_MAX; + e->handlers = NewHandler (); /* add the dummy onto the head */ + e->handlers->right = e->handlers; /* add the dummy onto the head */ + e->handlers->left = e->handlers; + e->right = e; + return e; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + KillExceptionBlock - destroys the EHB, e, and all its handlers. +*/ + +extern "C" RTExceptions_EHBlock RTExceptions_KillExceptionBlock (RTExceptions_EHBlock e) +{ + e->handlers = KillHandlers (e->handlers); + e->right = freeEHB; + freeEHB = e; + return NULL; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + PushHandler - install a handler in EHB, e. +*/ + +extern "C" void RTExceptions_PushHandler (RTExceptions_EHBlock e, unsigned int number, RTExceptions_ProcedureHandler p) +{ + RTExceptions_Handler h; + RTExceptions_Handler i; + + h = findHandler (e, number); + if (h == NULL) + { + i = InitHandler (NewHandler (), NULL, NULL, NULL, number, p); + } + else + { + /* remove, h, */ + SubHandler (h); + /* stack it onto a new handler */ + i = InitHandler (NewHandler (), NULL, NULL, h, number, p); + } + /* add new handler */ + AddHandler (e, i); +} + + +/* + PopHandler - removes the handler associated with, number, from + EHB, e. +*/ + +extern "C" void RTExceptions_PopHandler (RTExceptions_EHBlock e, unsigned int number) +{ + RTExceptions_Handler h; + RTExceptions_Handler i; + + h = findHandler (e, number); + if (h != NULL) + { + /* remove, h, */ + SubHandler (h); + if (h->stack != NULL) + { + AddHandler (e, h->stack); + } + h = KillHandler (h); + } +} + + +/* + DefaultErrorCatch - displays the current error message in + the current exception block and then + calls HALT. +*/ + +extern "C" void RTExceptions_DefaultErrorCatch (void) +{ + RTExceptions_EHBlock e; + int n; + + e = RTExceptions_GetExceptionBlock (); + n = static_cast<int> (libc_write (2, RTExceptions_GetTextBuffer (e), libc_strlen (RTExceptions_GetTextBuffer (e)))); + M2RTS_HALT (-1); + __builtin_unreachable (); +} + + +/* + BaseExceptionsThrow - configures the Modula-2 exceptions to call + THROW which in turn can be caught by an + exception block. If this is not called then + a Modula-2 exception will simply call an + error message routine and then HALT. +*/ + +extern "C" void RTExceptions_BaseExceptionsThrow (void) +{ + M2EXCEPTION_M2Exceptions i; + + for (i=M2EXCEPTION_indexException; i<=M2EXCEPTION_exException; i= static_cast<M2EXCEPTION_M2Exceptions>(static_cast<int>(i+1))) + { + RTExceptions_PushHandler (RTExceptions_GetExceptionBlock (), (unsigned int ) (i), (RTExceptions_ProcedureHandler) {(RTExceptions_ProcedureHandler_t) DoThrow}); + } +} + + +/* + IsInExceptionState - returns TRUE if the program is currently + in the exception state. +*/ + +extern "C" unsigned int RTExceptions_IsInExceptionState (void) +{ + return inException; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + SetExceptionState - returns the current exception state and + then sets the current exception state to, + to. +*/ + +extern "C" unsigned int RTExceptions_SetExceptionState (unsigned int to) +{ + unsigned int old; + + old = inException; + inException = to; + return old; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + SwitchExceptionState - assigns, from, with the current exception + state and then assigns the current exception + to, to. +*/ + +extern "C" void RTExceptions_SwitchExceptionState (unsigned int *from, unsigned int to) +{ + (*from) = inException; + inException = to; +} + + +/* + GetBaseExceptionBlock - returns the initial language exception block + created. +*/ + +extern "C" RTExceptions_EHBlock RTExceptions_GetBaseExceptionBlock (void) +{ + if (currentEHB == NULL) + { + M2RTS_Halt ((const char *) "../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.mod", 60, 598, (const char *) "GetBaseExceptionBlock", 21, (const char *) "currentEHB has not been initialized yet", 39); + } + else + { + return currentEHB; + } + ReturnException ("../../gcc-git-devel-modula2/gcc/m2/gm2-libs/RTExceptions.def", 25, 1); + __builtin_unreachable (); +} + + +/* + SetExceptionSource - sets the current exception source to, source. +*/ + +extern "C" void RTExceptions_SetExceptionSource (void * source) +{ + currentSource = source; +} + + +/* + GetExceptionSource - returns the current exception source. +*/ + +extern "C" void * RTExceptions_GetExceptionSource (void) +{ + return currentSource; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + +extern "C" void _M2_RTExceptions_init (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[]) +{ + Init (); +} + +extern "C" void _M2_RTExceptions_finish (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[]) +{ + TidyUp (); +} |