diff options
author | Ash Wolf <ninji@wuffs.org> | 2023-01-13 01:36:56 +0000 |
---|---|---|
committer | Ash Wolf <ninji@wuffs.org> | 2023-01-13 01:36:56 +0000 |
commit | 9d985413ce2b60a1a8cf001913ee8dac81c03aac (patch) | |
tree | 348ab31884f2dd89d285e06c42e656e35835ff38 /compiler_and_linker/FrontEnd/Common | |
parent | 3a6db389b250439a0cce6b45ef1424a5728f5d18 (diff) | |
download | MWCC-9d985413ce2b60a1a8cf001913ee8dac81c03aac.tar.gz MWCC-9d985413ce2b60a1a8cf001913ee8dac81c03aac.zip |
fix lots more issues, add endian conversions to ObjGenMachO, add 64-bit kludge to Switch.c
Diffstat (limited to 'compiler_and_linker/FrontEnd/Common')
-rw-r--r-- | compiler_and_linker/FrontEnd/Common/CompilerTools.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/compiler_and_linker/FrontEnd/Common/CompilerTools.c b/compiler_and_linker/FrontEnd/Common/CompilerTools.c index fff4809..272cd81 100644 --- a/compiler_and_linker/FrontEnd/Common/CompilerTools.c +++ b/compiler_and_linker/FrontEnd/Common/CompilerTools.c @@ -53,6 +53,69 @@ unsigned char *CTool_CtoPstr(char *cstr) { return (unsigned char *) cstr; } +#ifdef CW_64_BIT_SUPPORT +enum { PoolCapacity = 64 }; +typedef struct ITPPool { + void *pointers[PoolCapacity]; + UInt32 baseIndex; + UInt32 size; + struct ITPPool *next; +} ITPPool; +static ITPPool *poolHead; +static ITPPool *poolTail; + +void *CTool_ResolveIndexToPointer(UInt32 index) { + ITPPool *pool = poolHead; + + if (index == 0) + return NULL; + + while (pool && index >= PoolCapacity) { + pool = pool->next; + index -= PoolCapacity; + } + + if (pool && index < pool->size) + return pool->pointers[index]; + else + return NULL; +} + +UInt32 CTool_CreateIndexFromPointer(void *ptr) { + ITPPool *pool = poolTail; + UInt32 index; + + if (ptr == NULL) + return 0; + + if (!pool || pool->size >= PoolCapacity) { + pool = lalloc(sizeof(ITPPool)); + pool->size = 0; + if (poolTail) { + pool->baseIndex = poolTail->baseIndex + PoolCapacity; + poolTail->next = pool; + } else { + pool->baseIndex = 0; + // always reserve index 0 for NULL + pool->pointers[0] = NULL; + pool->size = 1; + poolHead = pool; + } + poolTail = pool; + } + + index = pool->baseIndex + pool->size; + pool->pointers[pool->size] = ptr; + pool->size++; + return index; +} + +static void CTool_ResetPointerPool(void) { + poolHead = NULL; + poolTail = NULL; +} +#endif + static void GListError(void) { if (GListErrorProc) GListErrorProc(); @@ -845,6 +908,10 @@ void freelheap(void) { blockp->blockfree = blockp->blocksize - sizeof(HeapBlock); blockp = blockp->next; } + +#ifdef CW_64_BIT_SUPPORT + CTool_ResetPointerPool(); +#endif } } |