diff --git a/src/raddbg_cons/raddbg_cons.c b/src/raddbg_cons/raddbg_cons.c index c2b3f058..c4dd67ae 100644 --- a/src/raddbg_cons/raddbg_cons.c +++ b/src/raddbg_cons/raddbg_cons.c @@ -72,7 +72,12 @@ cons_bake_file(Arena *arena, CONS_Root *root, String8List *out){ CONS__DSections dss = {0}; cons__dsection(arena, &dss, 0, 0, RADDBG_DataSectionTag_NULL); - CONS__BakeCtx *bctx = cons__bake_ctx_begin(); + CONS__BakeParams bctx_params = {0}; + { + bctx_params.strings_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); + bctx_params.idx_runs_bucket_count = u64_up_to_pow2(root->symbol_map.pair_count*8); + } + CONS__BakeCtx *bctx = cons__bake_ctx_begin(&bctx_params); //////////////////////////////// // MAIN PART: allocating and filling out sections of the file @@ -1896,13 +1901,16 @@ cons__dsection(Arena *arena, CONS__DSections *dss, void *data, U64 size, RADDBG_ } static CONS__BakeCtx* -cons__bake_ctx_begin(void){ +cons__bake_ctx_begin(CONS__BakeParams *params) +{ Arena *arena = arena_alloc(); CONS__BakeCtx *result = push_array(arena, CONS__BakeCtx, 1); result->arena = arena; - result->strs.buckets_count = 16384; +#define BKTCOUNT(x) ((x)?(u64_up_to_pow2(x)):(16384)) + result->strs.buckets_count = BKTCOUNT(params->strings_bucket_count); + result->idxs.buckets_count = BKTCOUNT(params->idx_runs_bucket_count); +#undef BKTCOUNT result->strs.buckets = push_array(arena, CONS__StringNode *, result->strs.buckets_count); - result->idxs.buckets_count = 16384; result->idxs.buckets = push_array(arena, CONS__IdxRunNode *, result->idxs.buckets_count); cons__string(result, str8_lit("")); diff --git a/src/raddbg_cons/raddbg_cons.h b/src/raddbg_cons/raddbg_cons.h index d3ce0400..a2c71726 100644 --- a/src/raddbg_cons/raddbg_cons.h +++ b/src/raddbg_cons/raddbg_cons.h @@ -728,11 +728,18 @@ typedef struct CONS__BakeCtx{ CONS__PathTree *tree; } CONS__BakeCtx; +typedef struct CONS__BakeParams CONS__BakeParams; +struct CONS__BakeParams +{ + U64 strings_bucket_count; + U64 idx_runs_bucket_count; +}; + //- cons intermediate functions static U32 cons__dsection(Arena *arena, CONS__DSections *dss, void *data, U64 size, RADDBG_DataSectionTag tag); -static CONS__BakeCtx* cons__bake_ctx_begin(void); +static CONS__BakeCtx* cons__bake_ctx_begin(CONS__BakeParams *params); static void cons__bake_ctx_release(CONS__BakeCtx *bake_ctx); static U32 cons__string(CONS__BakeCtx *bctx, String8 str); @@ -908,4 +915,4 @@ typedef struct CONS__NameMapBaked{ static CONS__NameMapBaked* cons__name_map_bake(Arena *arena, CONS_Root *root, CONS__BakeCtx *bctx, CONS__NameMap *map); -#endif //RADDBG_CONS_H +#endif // RADDBG_CONS_H