aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backendC/CleanCompilerSources/backendsupport.c135
-rw-r--r--backendC/CleanCompilerSources/backendsupport.h7
2 files changed, 141 insertions, 1 deletions
diff --git a/backendC/CleanCompilerSources/backendsupport.c b/backendC/CleanCompilerSources/backendsupport.c
index b2d4fe2..0ae86b8 100644
--- a/backendC/CleanCompilerSources/backendsupport.c
+++ b/backendC/CleanCompilerSources/backendsupport.c
@@ -66,3 +66,138 @@ fatal_backend_error (char *s)
#endif
Debugger ();
}
+
+#if 1
+/*
+ Memory management
+ =================
+*/
+
+static enum {kMemoryInitClear, kMemoryInitSet} gMemoryInit = kMemoryInitSet;
+
+# define kDefaultConvertBufferSize (32 * 1024)
+
+typedef struct convert_buffer ConvertBufferS, *ConvertBufferP;
+
+struct convert_buffer
+{
+ ConvertBufferP cb_next;
+ int cb_size;
+ char cb_memory [kDefaultConvertBufferSize]; /* or more bytes */
+};
+
+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 (int min_size)
+{
+ ConvertBufferP newBuffer;
+ int new_convert_buffer_size;
+
+ new_convert_buffer_size=sizeof (ConvertBufferS);
+
+ while (min_size>new_convert_buffer_size)
+ new_convert_buffer_size+=kDefaultConvertBufferSize;
+
+ newBuffer = (ConvertBufferP) malloc (new_convert_buffer_size);
+
+ if (newBuffer == NULL)
+ FatalCompError ("backendsupport.c", "AllocConvertBuffer", "out of memory");
+
+ new_convert_buffer_size -= sizeof (ConvertBufferS)-kDefaultConvertBufferSize;
+
+ newBuffer->cb_size=new_convert_buffer_size;
+
+ if (gFirstBuffer == NULL)
+ gCurrentBuffer = gFirstBuffer = newBuffer;
+ else
+ gCurrentBuffer = gCurrentBuffer->cb_next = newBuffer;
+
+ gCurrentBuffer->cb_next = NULL;
+
+ gBytesLeft = new_convert_buffer_size;
+ gMemory = gCurrentBuffer->cb_memory;
+
+ InvalidateMemory (gMemory, new_convert_buffer_size);
+
+ if (gFirstBuffer == NULL)
+ gFirstBuffer = gCurrentBuffer;
+} /* AllocConvertBuffer */
+
+void
+FreeConvertBuffers (void)
+{
+ ConvertBufferP buffer;
+
+ buffer = gFirstBuffer;
+
+ while (buffer != NULL)
+ {
+ ConvertBufferP nextBuffer;
+
+ nextBuffer = buffer->cb_next;
+
+ InvalidateMemory (buffer,buffer->cb_size);
+ 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 (size);
+
+ if (size>gBytesLeft){
+ static char s[100];
+
+ sprintf (s,"ConvertAlloc: size = %d, gBytesLeft = %d",size,gBytesLeft);
+ fatal_backend_error (s);
+ }
+ }
+
+ Assert (size <= gBytesLeft);
+
+ memory = gMemory;
+ gBytesLeft -= size;
+ gMemory += size;
+
+ return ((void *) memory);
+} /* ConvertAlloc */
+#endif \ No newline at end of file
diff --git a/backendC/CleanCompilerSources/backendsupport.h b/backendC/CleanCompilerSources/backendsupport.h
index 084ff30..f9ce867 100644
--- a/backendC/CleanCompilerSources/backendsupport.h
+++ b/backendC/CleanCompilerSources/backendsupport.h
@@ -18,7 +18,12 @@ extern void fatal_backend_error (char *s);
Memory management
=================
*/
+#if 1
+extern void FreeConvertBuffers (void);
+extern void *ConvertAlloc (SizeT size);
+#else
# define FreeConvertBuffers()
# define ConvertAlloc(size) CompAlloc (size)
+#endif
# define ConvertAllocType(t) ((t*) ConvertAlloc (SizeOf (t)))
-# define ArraySize(array) ((unsigned) (sizeof (array) / sizeof (array[0]))) \ No newline at end of file
+# define ArraySize(array) ((unsigned) (sizeof (array) / sizeof (array[0])))