aboutsummaryrefslogtreecommitdiff
path: root/backendC/CleanCompilerSources/backendsupport.c
diff options
context:
space:
mode:
Diffstat (limited to 'backendC/CleanCompilerSources/backendsupport.c')
-rw-r--r--backendC/CleanCompilerSources/backendsupport.c138
1 files changed, 138 insertions, 0 deletions
diff --git a/backendC/CleanCompilerSources/backendsupport.c b/backendC/CleanCompilerSources/backendsupport.c
new file mode 100644
index 0000000..55975b4
--- /dev/null
+++ b/backendC/CleanCompilerSources/backendsupport.c
@@ -0,0 +1,138 @@
+# include "system.h"
+# include "comsupport.h"
+# include "backendsupport.h"
+
+
+/*
+ Utilities
+ =========
+*/
+# ifdef _WINDOWS_
+# undef _WINDOWS_
+# include <windows.h>
+# define Debugger() DebugBreak();
+# else
+# define Debugger() { * (int *) NULL = 0; }
+# endif
+
+void
+AssertionFailed (char *conditionString, char *file, int line)
+{
+ FPrintF (StdError, "Error in backend: File %s, Line %d (%s)\n", file, line, conditionString);
+
+ Debugger ();
+} /* AssertionFailed */
+
+/*
+ Memory management
+ =================
+*/
+
+static enum {kMemoryInitClear, kMemoryInitSet} gMemoryInit = kMemoryInitSet;
+
+# define kConvertBufferSize (32 * 1024)
+
+typedef struct convert_buffer ConvertBufferS, *ConvertBufferP;
+
+struct convert_buffer
+{
+ ConvertBufferP cb_next;
+ char cb_memory [kConvertBufferSize];
+};
+
+static void
+InvalidateMemory (void *memory, size_t size)
+{
+ char value, *p;
+ int i;
+
+ switch (gMemoryInit)
+ {
+ case kMemoryInitClear:
+ value = 0;
+ break;
+ case kMemoryInitSet:
+ value = ~0;
+ break;
+ default:
+ Assert (False);
+ break;
+ }
+
+ p = memory;
+ for (i = 0; i < size; i++)
+ *p++ = value;
+} /* InvalidateMemory */
+
+static ConvertBufferP gFirstBuffer = NULL, gCurrentBuffer = NULL;
+static char *gMemory;
+static long gBytesLeft = 0;
+
+static void
+AllocConvertBuffer (void)
+{
+ ConvertBufferP newBuffer;
+
+ newBuffer = (ConvertBufferP) malloc (sizeof (ConvertBufferS));
+
+ if (newBuffer == NULL)
+ FatalCompError ("backendsupport.c", "AllocConvertBuffer", "out of memory");
+
+ if (gFirstBuffer == NULL)
+ gCurrentBuffer = gFirstBuffer = newBuffer;
+ else
+ gCurrentBuffer = gCurrentBuffer->cb_next = newBuffer;
+
+ gCurrentBuffer->cb_next = NULL;
+
+ gBytesLeft = kConvertBufferSize;
+ gMemory = gCurrentBuffer->cb_memory;
+
+ InvalidateMemory (gMemory, kConvertBufferSize);
+
+ if (gFirstBuffer == NULL)
+ gFirstBuffer = gCurrentBuffer;
+} /* AllocConvertBuffer */
+
+void
+FreeConvertBuffers (void)
+{
+ ConvertBufferP buffer;
+
+ buffer = gFirstBuffer;
+
+ while (buffer != NULL)
+ {
+ ConvertBufferP nextBuffer;
+
+ nextBuffer = buffer->cb_next;
+
+ InvalidateMemory (buffer, sizeof (ConvertBufferS));
+ free (buffer);
+
+ buffer = nextBuffer;
+ }
+
+ gFirstBuffer = NULL;
+ gCurrentBuffer = NULL;
+ gBytesLeft = NULL;
+} /* FreeConvertBuffers */
+
+void *
+ConvertAlloc (SizeT size)
+{
+ void *memory;
+
+ size = (size+3) & ~3;
+
+ if (size > gBytesLeft)
+ AllocConvertBuffer ();
+
+ Assert (size <= gBytesLeft);
+
+ memory = gMemory;
+ gBytesLeft -= size;
+ gMemory += size;
+
+ return ((void *) memory);
+} /* ConvertAlloc */