From 3a121c06f3cff8206883dea526bec4569876b059 Mon Sep 17 00:00:00 2001 From: Gaius Mulley Date: Tue, 17 Jan 2023 13:27:42 +0000 Subject: PR-108404 M2RTS_Halt fails with a segv PR-108404 occurs because the C prototype does not match the Modula-2 procedure M2RTS_Halt. This patch provides a new procedure M2RTS_HaltC which avoids the C/C++ code from having to fabricate a Modula-2 string. gcc/m2/ChangeLog: * gm2-libs-iso/M2RTS.def (Halt): Parameter file renamed to filename. (HaltC): New procedure declaration. (ErrorMessage): Parameter file renamed to filename. * gm2-libs-iso/M2RTS.mod (Halt): Parameter file renamed to filename. (HaltC): New procedure implementation. (ErrorStringC): New procedure implementation. (ErrorMessageC): New procedure implementation. * gm2-libs/M2RTS.def (Halt): Parameter file renamed to filename. (HaltC): New procedure declaration. (ErrorMessage): Parameter file renamed to filename. * gm2-libs/M2RTS.mod (Halt): Parameter file renamed to filename. (HaltC): New procedure implementation. (ErrorStringC): New procedure implementation. (ErrorMessageC): New procedure implementation. libgm2/ChangeLog: * libm2iso/RTco.cc (_M2_RTco_fini): Call M2RTS_HaltC. (newSem): Call M2RTS_HaltC. (currentThread): Call M2RTS_HaltC. (never): Call M2RTS_HaltC. (defined): Call M2RTS_HaltC. (initThread): Call M2RTS_HaltC. (RTco_transfer): Call M2RTS_HaltC. * libm2iso/m2rts.h (M2RTS_Halt): Provide parameter names. (M2RTS_HaltC): New procedure declaration. Signed-off-by: Gaius Mulley --- libgm2/libm2iso/RTco.cc | 31 +++++++++++++++++-------------- libgm2/libm2iso/m2rts.h | 4 +++- 2 files changed, 20 insertions(+), 15 deletions(-) (limited to 'libgm2') diff --git a/libgm2/libm2iso/RTco.cc b/libgm2/libm2iso/RTco.cc index b6e46653530..eeb38106f12 100644 --- a/libgm2/libm2iso/RTco.cc +++ b/libgm2/libm2iso/RTco.cc @@ -110,6 +110,7 @@ _M2_RTco_fini (int argc, char *argv[], char *envp[]) { } + static void initSem (threadSem *sem, int value) { @@ -171,8 +172,8 @@ newSem (void) = (threadSem *)malloc (sizeof (threadSem)); nSemaphores += 1; if (nSemaphores == SEM_POOL) - M2RTS_Halt (__FILE__, __LINE__, __FUNCTION__, - "too many semaphores created"); + M2RTS_HaltC (__FILE__, __LINE__, __FUNCTION__, + "too many semaphores created"); #else threadSem *sem = (threadSem *)malloc (sizeof (threadSem)); @@ -250,8 +251,8 @@ currentThread (void) for (tid = 0; tid < nThreads; tid++) if (pthread_self () == threadArray[tid].p) return tid; - M2RTS_Halt (__FILE__, __LINE__, __FUNCTION__, - "failed to find currentThread"); + M2RTS_HaltC (__FILE__, __LINE__, __FUNCTION__, + "failed to find currentThread"); } extern "C" int @@ -297,8 +298,8 @@ RTco_turnInterrupts (unsigned int newLevel) static void never (void) { - M2RTS_Halt (__FILE__, __LINE__, __FUNCTION__, - "the main thread should never call here"); + M2RTS_HaltC (__FILE__, __LINE__, __FUNCTION__, + "the main thread should never call here"); } static void * @@ -316,7 +317,8 @@ execThread (void *t) #if 0 M2RTS_CoroutineException ( __FILE__, __LINE__, __COLUMN__, __FUNCTION__, "coroutine finishing"); #endif - M2RTS_Halt (__FILE__, __LINE__, __FUNCTION__, "execThread should never finish"); + M2RTS_HaltC (__FILE__, __LINE__, __FUNCTION__, + "execThread should never finish"); return NULL; } @@ -326,7 +328,8 @@ newThread (void) #if defined(POOL) nThreads += 1; if (nThreads == THREAD_POOL) - M2RTS_Halt (__FILE__, __LINE__, __FUNCTION__, "too many threads created"); + M2RTS_HaltC (__FILE__, __LINE__, __FUNCTION__, + "too many threads created"); return nThreads - 1; #else if (nThreads == 0) @@ -360,14 +363,14 @@ initThread (void (*proc) (void), unsigned int stackSize, /* set thread creation attributes. */ result = pthread_attr_init (&attr); if (result != 0) - M2RTS_Halt (__FILE__, __LINE__, __FUNCTION__, + M2RTS_HaltC (__FILE__, __LINE__, __FUNCTION__, "failed to create thread attribute"); if (stackSize > 0) { result = pthread_attr_setstacksize (&attr, stackSize); if (result != 0) - M2RTS_Halt (__FILE__, __LINE__, __FUNCTION__, + M2RTS_HaltC (__FILE__, __LINE__, __FUNCTION__, "failed to set stack size attribute"); } @@ -376,7 +379,7 @@ initThread (void (*proc) (void), unsigned int stackSize, result = pthread_create (&threadArray[tid].p, &attr, execThread, (void *)&threadArray[tid]); if (result != 0) - M2RTS_Halt (__FILE__, __LINE__, __FUNCTION__, "thread_create failed"); + M2RTS_HaltC (__FILE__, __LINE__, __FUNCTION__, "thread_create failed"); tprintf (" created thread [%d] function = 0x%p 0x%p\n", tid, proc, (void *)&threadArray[tid]); return tid; @@ -404,14 +407,14 @@ RTco_transfer (int *p1, int p2) int tid = currentThread (); if (!initialized) - M2RTS_Halt ( + M2RTS_HaltC ( __FILE__, __LINE__, __FUNCTION__, "cannot transfer to a process before the process has been created"); if (tid == p2) { /* error. */ - M2RTS_Halt (__FILE__, __LINE__, __FUNCTION__, - "attempting to transfer to ourself"); + M2RTS_HaltC (__FILE__, __LINE__, __FUNCTION__, + "attempting to transfer to ourself"); } else { diff --git a/libgm2/libm2iso/m2rts.h b/libgm2/libm2iso/m2rts.h index 57e6e90d94d..1f3bc2db7c4 100644 --- a/libgm2/libm2iso/m2rts.h +++ b/libgm2/libm2iso/m2rts.h @@ -38,4 +38,6 @@ extern "C" void M2RTS_ConstructModules (const char *, extern "C" void M2RTS_Terminate (void); extern "C" void M2RTS_DeconstructModules (void); -extern "C" void M2RTS_Halt (const char *, int, const char *, const char *) __attribute__ ((noreturn)); +extern "C" void M2RTS_HaltC (const char *filename, int line, + const char *functionname, const char *desc) + __attribute__ ((noreturn)); -- cgit v1.2.1