option to noinline mm_alloc & mm_free

This commit is contained in:
dzaima 2022-11-14 23:10:46 +02:00
parent 5e94de7983
commit 360aabb7cc
5 changed files with 24 additions and 4 deletions

View File

@ -1,3 +1,7 @@
#if ALLOC_NOINLINE
#define ALLOC_IMPL 1
#endif
#include "../core.h"
#if MM==0

12
src/h.h
View File

@ -104,6 +104,14 @@
#if defined(OBJ_TRACK)
#define OBJ_COUNTER 1
#endif
#if ALLOC_STAT
#define ALLOC_NOINLINE
#endif
#if ALLOC_NOINLINE
#define ALLOC_FN
#else
#define ALLOC_FN static
#endif
typedef int8_t i8;
typedef uint8_t u8;
@ -327,8 +335,8 @@ extern B bi_emptyHVec, bi_emptyIVec, bi_emptyCVec, bi_emptySVec;
#define emptyIVec() incG(bi_emptyIVec)
#define emptyCVec() incG(bi_emptyCVec)
#define emptySVec() incG(bi_emptySVec)
static void* mm_alloc(u64 sz, u8 type);
static void mm_free(Value* x);
ALLOC_FN void* mm_alloc(u64 sz, u8 type);
ALLOC_FN void mm_free(Value* x);
static u64 mm_size(Value* x);
static void mm_visit(B x);
static void mm_visitP(void* x);

View File

@ -15,6 +15,7 @@
#endif // objdump -b binary -m i386 -M x86-64,intel --insn-width=10 -D --adjust-vma=$(cat asm_off) asm_bin | tail -n+8 | sed "$(cat asm_sed);s/\\t/ /g;s/.*: //"
#define ALLOC_IMPL_ALWAYS 1
// separate memory management system for executable code; isn't garbage-collected
EmptyValue* mmX_buckets[64];
u64 mmX_ctrs[64];
@ -63,6 +64,7 @@ static void* mmap_nvm(u64 sz) {
static void* mmX_allocN(usz sz, u8 type) { assert(sz>=16); return mmX_allocL(64-CLZ(sz-1ull), type); }
#undef BN
#undef BSZ
#undef ALLOC_IMPL_ALWAYS
// all the instructions to be called by the generated code

View File

@ -19,11 +19,14 @@ extern EmptyValue* mm_buckets[64];
#define LOG2(X) ((u8)(64-CLZ((X)-1ull)))
static void* mm_alloc(u64 sz, u8 type) {
#if !ALLOC_NOINLINE || ALLOC_IMPL || ALLOC_IMPL_ALWAYS
ALLOC_FN void* mm_alloc(u64 sz, u8 type) {
assert(sz>=16);
onAlloc(sz, type);
return mm_allocL(LOG2(sz), type);
}
#endif
static u64 mm_round(usz sz) {
return BSZ(LOG2(sz));

View File

@ -1,5 +1,7 @@
#define buckets BN(buckets)
static void BN(free)(Value* x) {
#if !ALLOC_NOINLINE || ALLOC_IMPL || ALLOC_IMPL_ALWAYS
ALLOC_FN void BN(free)(Value* x) {
onFree(x);
#ifdef DONT_FREE
if (x->type!=t_freed) x->flags = x->type;
@ -45,4 +47,5 @@ static void* BN(allocL)(i64 bucket, u8 type) {
#endif
return x;
}
#endif
#undef buckets