validate info stream

This commit is contained in:
Nikita Smith
2026-04-10 17:02:04 -07:00
parent c5dc7bee3e
commit b4bbc38ab2
6 changed files with 90 additions and 37 deletions
+2 -3
View File
@@ -1453,10 +1453,9 @@ msf_find_stream(MSF_Context *msf, MSF_StreamNumber sn)
} }
internal void internal void
msf_release(MSF_Context **msf_ptr) msf_release(MSF_Context *msf)
{ {
arena_release((*msf_ptr)->arena); arena_release(msf->arena);
*msf_ptr = 0;
} }
internal String8List internal String8List
+1 -1
View File
@@ -127,7 +127,7 @@ typedef struct
//////////////////////////////// ////////////////////////////////
internal MSF_Context * msf_alloc(MSF_UInt page_size, MSF_UInt active_fpm); internal MSF_Context * msf_alloc(MSF_UInt page_size, MSF_UInt active_fpm);
internal void msf_release(MSF_Context **msf_ptr); internal void msf_release(MSF_Context *msf_ptr);
internal MSF_Error msf_build(MSF_Context *msf); internal MSF_Error msf_build(MSF_Context *msf);
internal U64 msf_get_save_size(MSF_Context *msf); internal U64 msf_get_save_size(MSF_Context *msf);
internal String8List msf_get_page_data_nodes(Arena *arena, MSF_Context *msf); internal String8List msf_get_page_data_nodes(Arena *arena, MSF_Context *msf);
+17 -24
View File
@@ -200,7 +200,8 @@ pdb_hash_table_grow(PDB_HashTable *ht, U64 new_capacity)
for (U32 i = 0; i < ht->max; ++i) { for (U32 i = 0; i < ht->max; ++i) {
if (bit_array_is_bit_set(ht->present_bits, i)) { if (bit_array_is_bit_set(ht->present_bits, i)) {
PDB_HashTableBucket *bucket = &ht->bucket_arr[i]; PDB_HashTableBucket *bucket = &ht->bucket_arr[i];
B32 is_set = pdb_hash_table_try_set(&new_ht, bucket->key, bucket->value); PDB_HashTableBucket *is_set = pdb_hash_table_try_set(&new_ht, bucket->key, bucket->value);
is_set->insert_idx = bucket->insert_idx;
Assert(is_set); Assert(is_set);
} }
} }
@@ -215,11 +216,11 @@ pdb_hash_table_hash(String8 key)
return (U16)pdb_hash_v1(key); return (U16)pdb_hash_v1(key);
} }
internal B32 internal PDB_HashTableBucket *
pdb_hash_table_try_set(PDB_HashTable *ht, String8 key, String8 value) pdb_hash_table_try_set(PDB_HashTable *ht, String8 key, String8 value)
{ {
ProfBeginFunction(); ProfBeginFunction();
B32 is_set = 0; PDB_HashTableBucket *is_set = 0;
U32 best_ibucket = pdb_hash_table_hash(key) % ht->max; U32 best_ibucket = pdb_hash_table_hash(key) % ht->max;
U32 ibucket = best_ibucket; U32 ibucket = best_ibucket;
do { do {
@@ -234,7 +235,7 @@ pdb_hash_table_try_set(PDB_HashTable *ht, String8 key, String8 value)
bit_array_set_bit32(ht->deleted_bits, ibucket, 0); bit_array_set_bit32(ht->deleted_bits, ibucket, 0);
ht->count += 1; ht->count += 1;
is_set = 1; is_set = bucket;
break; break;
} }
ibucket = (ibucket + 1) % ht->max; ibucket = (ibucket + 1) % ht->max;
@@ -255,7 +256,7 @@ pdb_hash_table_set(PDB_HashTable *ht, String8 key, String8 value)
} }
// set new item // set new item
B32 is_set = pdb_hash_table_try_set(ht, key, value); PDB_HashTableBucket *is_set = pdb_hash_table_try_set(ht, key, value);
AssertAlways(is_set); AssertAlways(is_set);
ProfEnd(); ProfEnd();
@@ -1696,11 +1697,10 @@ gsi_alloc(void)
} }
internal void internal void
gsi_release(PDB_GsiContext **gsi_ptr) gsi_release(PDB_GsiContext *gsi)
{ {
ProfBeginFunction(); ProfBeginFunction();
arena_release((*gsi_ptr)->arena); arena_release(gsi->arena);
*gsi_ptr = NULL;
ProfEnd(); ProfEnd();
} }
@@ -2238,12 +2238,11 @@ psi_build(TP_Context *tp, PDB_PsiContext *psi, MSF_Context *msf, MSF_StreamNumbe
} }
internal void internal void
psi_release(PDB_PsiContext **psi_ptr) psi_release(PDB_PsiContext *psi)
{ {
ProfBeginFunction(); ProfBeginFunction();
gsi_release(&(*psi_ptr)->gsi); gsi_release(psi->gsi);
arena_release((*psi_ptr)->arena); arena_release(psi->arena);
*psi_ptr = NULL;
ProfEnd(); ProfEnd();
} }
@@ -2916,11 +2915,10 @@ dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumbe
} }
internal void internal void
dbi_release(PDB_DbiContext **dbi_ptr) dbi_release(PDB_DbiContext *dbi)
{ {
ProfBeginFunction(); ProfBeginFunction();
arena_release((*dbi_ptr)->arena); arena_release(dbi->arena);
*dbi_ptr = 0;
ProfEnd(); ProfEnd();
} }
@@ -3077,18 +3075,13 @@ pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U3
} }
internal void internal void
pdb_release(PDB_Context **pdb_ptr) pdb_release(PDB_Context *pdb)
{ {
ProfBeginFunction(); ProfBeginFunction();
PDB_Context *pdb = *pdb_ptr; dbi_release(pdb->dbi);
msf_release(&pdb->msf); gsi_release(pdb->gsi);
dbi_release(&pdb->dbi); for (U64 i = 1; i < ArrayCount(pdb->type_servers); ++i) { pdb_type_server_release(&pdb->type_servers[i]); }
gsi_release(&pdb->gsi);
for (U64 i = 1; i < ArrayCount(pdb->type_servers); ++i) {
pdb_type_server_release(&pdb->type_servers[i]);
}
arena_release(pdb->arena); arena_release(pdb->arena);
*pdb_ptr = 0;
ProfEnd(); ProfEnd();
} }
+5 -5
View File
@@ -332,7 +332,7 @@ typedef struct
// PDB // PDB
internal PDB_Context * pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U32 age, Guid guid); internal PDB_Context * pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U32 age, Guid guid);
internal void pdb_release(PDB_Context **pdb_ptr); internal void pdb_release(PDB_Context *pdb);
internal void pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht, B32 build_gsi, B32 is_stripped); internal void pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht, B32 build_gsi, B32 is_stripped);
internal void pdb_set_machine(PDB_Context *pdb, COFF_MachineType machine); internal void pdb_set_machine(PDB_Context *pdb, COFF_MachineType machine);
internal void pdb_set_guid(PDB_Context *pdb, Guid guid); internal void pdb_set_guid(PDB_Context *pdb, Guid guid);
@@ -359,7 +359,7 @@ internal PDB_SrcError pdb_add_src(PDB_InfoContext *info, MSF_Context *msf,
internal PDB_GsiContext * gsi_alloc(void); internal PDB_GsiContext * gsi_alloc(void);
internal void gsi_build(TP_Context *tp, PDB_GsiContext *gsi, MSF_Context *msf, MSF_StreamNumber gsi_sn, MSF_StreamNumber symbols_sn); internal void gsi_build(TP_Context *tp, PDB_GsiContext *gsi, MSF_Context *msf, MSF_StreamNumber gsi_sn, MSF_StreamNumber symbols_sn);
internal void gsi_release(PDB_GsiContext **gsi_ptr); internal void gsi_release(PDB_GsiContext *gsi);
internal void gsi_write_build_result(TP_Context *tp, PDB_GsiBuildResult build, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn); internal void gsi_write_build_result(TP_Context *tp, PDB_GsiBuildResult build, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn);
internal PDB_GsiBuildResult gsi_build_ex(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 symbol_data_base, B32 export_symbol_ptr_arr, U64 msf_page_size); internal PDB_GsiBuildResult gsi_build_ex(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 symbol_data_base, B32 export_symbol_ptr_arr, U64 msf_page_size);
internal U32 gsi_hash(PDB_GsiContext *gsi, String8 input); internal U32 gsi_hash(PDB_GsiContext *gsi, String8 input);
@@ -373,7 +373,7 @@ internal CV_SymbolNode * gsi_search(PDB_GsiContext *gsi, CV_Symbol *symbol);
internal PDB_PsiContext * psi_alloc(void); internal PDB_PsiContext * psi_alloc(void);
internal void psi_build(TP_Context *tp, PDB_PsiContext *psi, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn); internal void psi_build(TP_Context *tp, PDB_PsiContext *psi, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn);
internal void psi_release(PDB_PsiContext **psi_ptr); internal void psi_release(PDB_PsiContext *psi);
internal CV_SymbolNode * psi_push(PDB_PsiContext *psi, CV_Pub32Flags flags, U32 offset, U16 isect, String8 name); internal CV_SymbolNode * psi_push(PDB_PsiContext *psi, CV_Pub32Flags flags, U32 offset, U16 isect, String8 name);
// TODO: // TODO:
@@ -385,7 +385,7 @@ internal CV_SymbolNode * psi_push(PDB_PsiContext *psi, CV_Pub32Flags flags, U32
internal PDB_DbiContext * dbi_alloc(COFF_MachineType machine, U32 age); internal PDB_DbiContext * dbi_alloc(COFF_MachineType machine, U32 age);
internal void dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber dbi_sn, CV_StringHashTable string_ht, B32 is_stripped); internal void dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber dbi_sn, CV_StringHashTable string_ht, B32 is_stripped);
internal void dbi_release(PDB_DbiContext **dbi_ptr); internal void dbi_release(PDB_DbiContext *dbi);
internal PDB_DbiModule * dbi_push_module(PDB_DbiContext *dbi, String8 obj_path, String8 lib_path); internal PDB_DbiModule * dbi_push_module(PDB_DbiContext *dbi, String8 obj_path, String8 lib_path);
internal String8 dbi_module_read_symbol_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod); internal String8 dbi_module_read_symbol_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod);
internal String8 dbi_module_read_c11_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod); internal String8 dbi_module_read_c11_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod);
@@ -409,7 +409,7 @@ internal String8 pdb_data_from_hash_table(Arena *arena, PDB_Hash
internal void pdb_hash_table_set(PDB_HashTable *ht, String8 key, String8 value); internal void pdb_hash_table_set(PDB_HashTable *ht, String8 key, String8 value);
internal B32 pdb_hash_table_get(PDB_HashTable *ht, String8 key, String8 *value_out); internal B32 pdb_hash_table_get(PDB_HashTable *ht, String8 key, String8 *value_out);
internal void pdb_hash_table_delete(PDB_HashTable *ht, String8 key); internal void pdb_hash_table_delete(PDB_HashTable *ht, String8 key);
internal B32 pdb_hash_table_try_set(PDB_HashTable *ht, String8 key, String8 value); internal PDB_HashTableBucket * pdb_hash_table_try_set(PDB_HashTable *ht, String8 key, String8 value);
internal B32 pdb_hash_table_is_present(PDB_HashTable *ht, U32 k); internal B32 pdb_hash_table_is_present(PDB_HashTable *ht, U32 k);
internal B32 pdb_hash_table_is_deleted(PDB_HashTable *ht, U32 k); internal B32 pdb_hash_table_is_deleted(PDB_HashTable *ht, U32 k);
internal U32 pdb_hash_table_hash(String8 key); internal U32 pdb_hash_table_hash(String8 key);
+13 -3
View File
@@ -114,9 +114,19 @@ t_run_fail_handler(void *raw_ctx)
internal T_RunResult internal T_RunResult
t_run(T_Run run) t_run(T_Run run)
{ {
T_RunCtx ctx = {0}; T_RunCtx ctx = { .run = run };
ctx.run = run;
os_safe_call(t_run_caller, t_run_fail_handler, &ctx); B32 do_safe_call = 1;
#if OS_WINDOWS
if (IsDebuggerPresent()) {
do_safe_call = 0;
}
#endif
if (do_safe_call) {
os_safe_call(t_run_caller, t_run_fail_handler, &ctx);
} else {
t_run_caller(&ctx);
}
return ctx.result; return ctx.result;
} }
+52 -1
View File
@@ -4626,7 +4626,58 @@ T_BeginTest(get_msf_stream_pages)
T_Ok(stream_data.first->string.size == 1); T_Ok(stream_data.first->string.size == 1);
} }
msf_release(&msf); msf_release(msf);
}
T_BeginTest(validate_info_stream)
{
COFF_TimeStamp time_stamp = 123;
U32 age = 1;
Guid guid = { .data1 = max_U32, .data2 = max_U16 - 1, .data3 = max_U16 - 2, .data4 = { 1, 2, 3, 4, 5, 6, 7, 8 } };
PDB_Context *pdb = pdb_alloc(MSF_DEFAULT_PAGE_SIZE, COFF_MachineType_X64, time_stamp, age, guid);
char *stream_names[] = { "one", "two", "three", "four", "five" };
MSF_StreamNumber stream_numbers[ArrayCount(stream_names)] = {0};
for EachElement(i, stream_names) {
stream_numbers[i] = pdb_push_named_stream(&pdb->info->named_stream_ht, pdb->msf, str8_cstring(stream_names[i]));
T_Ok(stream_numbers[i] != MSF_INVALID_STREAM_NUMBER);
}
TP_Context *tp = tp_alloc(arena, 1, 1, str8_lit("foo"));
TP_Arena *tp_arena = tp_arena_alloc(tp);
pdb_build(tp, tp_arena, pdb, (CV_StringHashTable){0}, 1, 0);
T_Ok(msf_build(pdb->msf) == MSF_Error_OK);
String8List raw_msf_list = msf_get_page_data_nodes(arena, pdb->msf);
T_Ok(t_write_file_list(str8_lit("test.pdb"), raw_msf_list));
String8 raw_msf = t_read_file(arena, str8_lit("test.pdb"));
MSF_Parsed *msf_parsed = msf_parsed_from_data(arena, raw_msf);
String8 info_data = msf_data_from_stream(msf_parsed, PDB_FixedStream_Info);
#if 0
fprintf(stderr, "\n");
for EachIndex(i, info_data.size) {
fprintf(stderr, "0x%02x, ", info_data.str[i]);
if (i % 19 == 18 && i > 0) { fprintf(stderr, "\n"); }
}
#endif
U8 expected_info_data[] = {
0x94, 0x2e, 0x31, 0x01, 0x7b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfd,
0xff, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x22, 0x00, 0x00, 0x00, 0x6f, 0x6e, 0x65, 0x00, 0x74, 0x77,
0x6f, 0x00, 0x74, 0x68, 0x72, 0x65, 0x65, 0x00, 0x66, 0x6f, 0x75, 0x72, 0x00, 0x66, 0x69, 0x76, 0x65, 0x00, 0x2f,
0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00,
0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x13,
0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x51, 0x33, 0x01,
};
T_Ok(str8_match(info_data, str8_array_fixed(expected_info_data), 0));
pdb_release(pdb);
tp_arena_release(&tp_arena);
tp_release(tp);
} }
T_BeginTest(patch_cv_symbol_tree) T_BeginTest(patch_cv_symbol_tree)