mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-06 22:08:41 +00:00
simplified chunk size tracking
This commit is contained in:
+17
-13
@@ -362,7 +362,6 @@ lnk_chunk_align_array_list_push(Arena *arena, Arena *scratch, LNK_ChunkAlignArra
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
internal LNK_ChunkLayout
|
internal LNK_ChunkLayout
|
||||||
lnk_layout_from_chunk(Arena *arena, LNK_Chunk *root, U64 total_chunk_count)
|
lnk_layout_from_chunk(Arena *arena, LNK_Chunk *root, U64 total_chunk_count)
|
||||||
{
|
{
|
||||||
@@ -397,7 +396,6 @@ lnk_layout_from_chunk(Arena *arena, LNK_Chunk *root, U64 total_chunk_count)
|
|||||||
struct Stack *next;
|
struct Stack *next;
|
||||||
LNK_ChunkArray chunk_array;
|
LNK_ChunkArray chunk_array;
|
||||||
U64 ichunk;
|
U64 ichunk;
|
||||||
U64 cursor;
|
|
||||||
};
|
};
|
||||||
struct Stack *stack = push_array(scratch.arena, struct Stack, 1);
|
struct Stack *stack = push_array(scratch.arena, struct Stack, 1);
|
||||||
stack->chunk_array.count = 1;
|
stack->chunk_array.count = 1;
|
||||||
@@ -409,8 +407,8 @@ lnk_layout_from_chunk(Arena *arena, LNK_Chunk *root, U64 total_chunk_count)
|
|||||||
U64 cursor = 0;
|
U64 cursor = 0;
|
||||||
|
|
||||||
ProfBegin("Traverse chunks from root");
|
ProfBegin("Traverse chunks from root");
|
||||||
while (stack) {
|
for (; stack != 0; ) {
|
||||||
while (stack->ichunk < stack->chunk_array.count) {
|
for (; stack->ichunk < stack->chunk_array.count; ) {
|
||||||
LNK_Chunk *chunk = stack->chunk_array.v[stack->ichunk++];
|
LNK_Chunk *chunk = stack->chunk_array.v[stack->ichunk++];
|
||||||
|
|
||||||
// skip discarded chunk
|
// skip discarded chunk
|
||||||
@@ -447,6 +445,11 @@ lnk_layout_from_chunk(Arena *arena, LNK_Chunk *root, U64 total_chunk_count)
|
|||||||
} break;
|
} break;
|
||||||
|
|
||||||
case LNK_Chunk_LeafArray: {
|
case LNK_Chunk_LeafArray: {
|
||||||
|
#if BUILD_DEBUG
|
||||||
|
for (U64 i = 0; i < chunk->u.arr->count; ++i) {
|
||||||
|
Assert(chunk->u.arr->v[i]->type == LNK_Chunk_Leaf);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
// apply sort
|
// apply sort
|
||||||
if (chunk->sort_chunk) {
|
if (chunk->sort_chunk) {
|
||||||
lnk_chunk_array_sort(*chunk->u.arr);
|
lnk_chunk_array_sort(*chunk->u.arr);
|
||||||
@@ -455,7 +458,6 @@ lnk_layout_from_chunk(Arena *arena, LNK_Chunk *root, U64 total_chunk_count)
|
|||||||
// recurse into sub chunks
|
// recurse into sub chunks
|
||||||
struct Stack *frame = push_array(scratch.arena, struct Stack, 1);
|
struct Stack *frame = push_array(scratch.arena, struct Stack, 1);
|
||||||
frame->chunk_array = *chunk->u.arr;
|
frame->chunk_array = *chunk->u.arr;
|
||||||
frame->cursor = cursor;
|
|
||||||
SLLStackPush(stack, frame);
|
SLLStackPush(stack, frame);
|
||||||
} goto _continue;
|
} goto _continue;
|
||||||
|
|
||||||
@@ -475,7 +477,6 @@ lnk_layout_from_chunk(Arena *arena, LNK_Chunk *root, U64 total_chunk_count)
|
|||||||
// recurse into sub chunks
|
// recurse into sub chunks
|
||||||
struct Stack *frame = push_array(scratch.arena, struct Stack, 1);
|
struct Stack *frame = push_array(scratch.arena, struct Stack, 1);
|
||||||
frame->chunk_array = chunk_array;
|
frame->chunk_array = chunk_array;
|
||||||
frame->cursor = cursor;
|
|
||||||
SLLStackPush(stack, frame);
|
SLLStackPush(stack, frame);
|
||||||
} goto _continue;
|
} goto _continue;
|
||||||
|
|
||||||
@@ -494,19 +495,22 @@ lnk_layout_from_chunk(Arena *arena, LNK_Chunk *root, U64 total_chunk_count)
|
|||||||
U64 align_size = AlignPadPow2(cursor, chunk->align);
|
U64 align_size = AlignPadPow2(cursor, chunk->align);
|
||||||
lnk_chunk_align_array_list_push(arena, scratch.arena, &align_list, align_cap, cursor, align_size);
|
lnk_chunk_align_array_list_push(arena, scratch.arena, &align_list, align_cap, cursor, align_size);
|
||||||
|
|
||||||
// check stack cursor for correctness
|
U64 chunk_start_off = layout.chunk_off_array[chunk->ref.chunk_id];
|
||||||
Assert(cursor >= prev->cursor);
|
Assert(chunk_start_off != max_U64);
|
||||||
|
Assert(chunk_start_off <= cursor);
|
||||||
|
|
||||||
// store id -> virt size
|
// store id -> virt size
|
||||||
U64 virt_chunk_size = cursor - prev->cursor;
|
Assert(layout.chunk_virt_size_array[chunk->ref.chunk_id] == max_U64);
|
||||||
|
U64 virt_chunk_size = cursor - chunk_start_off;
|
||||||
layout.chunk_virt_size_array[chunk->ref.chunk_id] = virt_chunk_size;
|
layout.chunk_virt_size_array[chunk->ref.chunk_id] = virt_chunk_size;
|
||||||
|
|
||||||
// store id -> file size
|
|
||||||
U64 file_chunk_size = (cursor + align_size) - prev->cursor;
|
|
||||||
layout.chunk_file_size_array[chunk->ref.chunk_id] = file_chunk_size;
|
|
||||||
|
|
||||||
// advance cursor
|
// advance cursor
|
||||||
cursor += align_size;
|
cursor += align_size;
|
||||||
|
|
||||||
|
// store id -> file size
|
||||||
|
Assert(layout.chunk_file_size_array[chunk->ref.chunk_id] == max_U64);
|
||||||
|
U64 file_chunk_size = cursor - chunk_start_off;
|
||||||
|
layout.chunk_file_size_array[chunk->ref.chunk_id] = file_chunk_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
// move to next frame
|
// move to next frame
|
||||||
|
|||||||
Reference in New Issue
Block a user