mirror of
https://github.com/sarah-walker-pcem/pcem.git
synced 2025-07-23 11:43:03 +02:00
40 lines
1.6 KiB
C
40 lines
1.6 KiB
C
#ifndef _CODEGEN_ALLOCATOR_H_
|
|
#define _CODEGEN_ALLOCATOR_H_
|
|
|
|
/*The allocator handles all allocation of executable memory. Since the two-pass
|
|
recompiler design makes applying hard limits to codeblock size difficult, the
|
|
allocator allows memory to be provided as and when required.
|
|
|
|
The allocator provides a block size of a little under 1 kB (slightly lower to
|
|
limit cache aliasing). Each generated codeblock is allocated one block by default,
|
|
and will allocate additional block(s) once the existing memory is sorted. Blocks
|
|
are chained together by jump instructions.
|
|
|
|
Due to the chaining, the total memory size is limited by the range of a jump
|
|
instruction. ARMv7 is restricted to +/- 32 MB, ARMv8 to +/- 128 MB, x86 to
|
|
+/- 2GB. As a result, total memory size is limited to 32 MB on ARMv7*/
|
|
#ifdef __ARM_EABI__
|
|
#define MEM_BLOCK_NR 32768
|
|
#else
|
|
#define MEM_BLOCK_NR 131072
|
|
#endif
|
|
|
|
#define MEM_BLOCK_MASK (MEM_BLOCK_NR - 1)
|
|
#define MEM_BLOCK_SIZE 0x3c0
|
|
|
|
void codegen_allocator_init();
|
|
/*Allocate a mem_block_t, and the associated backing memory.
|
|
If parent is non-NULL, then the new block will be added to the list in
|
|
parent->next*/
|
|
struct mem_block_t *codegen_allocator_allocate(struct mem_block_t *parent, int code_block);
|
|
/*Free a mem_block_t, and any subsequent blocks in the list at block->next*/
|
|
void codegen_allocator_free(struct mem_block_t *block);
|
|
/*Get a pointer to the backing memory associated with block*/
|
|
uint8_t *codeblock_allocator_get_ptr(struct mem_block_t *block);
|
|
/*Cache clean memory block list*/
|
|
void codegen_allocator_clean_blocks(struct mem_block_t *block);
|
|
|
|
extern int codegen_allocator_usage;
|
|
|
|
#endif /* _CODEGEN_ALLOCATOR_H_ */
|