mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-14 17:28:07 +00:00
WIP test PCH type merging
This commit is contained in:
+143
-11
@@ -3944,8 +3944,10 @@ T_BeginTest(merge_duplicate_types)
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
U32 pch_sig = 0xCAFEBABE;
|
U32 pch_sig = 0xCAFEBABE;
|
||||||
|
String8 pch_obj_name = str8_lit("C:\\devel\\raddebugger\\build\\torture\\merge_duplicate_types\\pch.obj");
|
||||||
|
String8 a_obj_name = str8_lit("C:\\devel\\raddebugger\\build\\torture\\merge_duplicate_types\\a.obj");
|
||||||
|
|
||||||
String8 debug_s;
|
String8 pch_debug_s;
|
||||||
{
|
{
|
||||||
String8List srl;
|
String8List srl;
|
||||||
str8_serial_begin(scratch.arena, &srl);
|
str8_serial_begin(scratch.arena, &srl);
|
||||||
@@ -3958,18 +3960,36 @@ T_BeginTest(merge_duplicate_types)
|
|||||||
|
|
||||||
CV_SymObjName obj_name = {0};
|
CV_SymObjName obj_name = {0};
|
||||||
obj_name.sig = pch_sig;
|
obj_name.sig = pch_sig;
|
||||||
String8 obj_name_string = str8_lit("a.obj");
|
String8 obj_name_string = pch_obj_name;
|
||||||
str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1);
|
str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1);
|
||||||
str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME);
|
str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME);
|
||||||
str8_serial_push_struct(scratch.arena, &srl, &obj_name);
|
str8_serial_push_struct(scratch.arena, &srl, &obj_name);
|
||||||
str8_serial_push_cstr(scratch.arena, &srl, obj_name_string);
|
str8_serial_push_cstr(scratch.arena, &srl, obj_name_string);
|
||||||
str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign);
|
str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign);
|
||||||
|
|
||||||
|
String8 comp3_data = cv_make_comp3(scratch.arena,
|
||||||
|
0,
|
||||||
|
CV_Language_C,
|
||||||
|
CV_Arch_X64,
|
||||||
|
/* ver_fe_major */ 0,
|
||||||
|
/* ver_fe_minor */ 0,
|
||||||
|
/* ver_fe_build */ 0,
|
||||||
|
/* ver_feqfe */ 0,
|
||||||
|
/* ver_major */ 14,
|
||||||
|
/* ver_minor */ 36,
|
||||||
|
/* ver_build */ 32537,
|
||||||
|
/* ver_qfe */ 0,
|
||||||
|
str8_lit(BUILD_TITLE));
|
||||||
|
str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + comp3_data.size);
|
||||||
|
str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_COMPILE3);
|
||||||
|
str8_serial_push_string(scratch.arena, &srl, comp3_data);
|
||||||
|
str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign);
|
||||||
|
|
||||||
ss_header->kind = CV_C13SubSectionKind_Symbols;
|
ss_header->kind = CV_C13SubSectionKind_Symbols;
|
||||||
ss_header->size = srl.total_size - ss_start_off;
|
ss_header->size = srl.total_size - ss_start_off;
|
||||||
str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign);
|
str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign);
|
||||||
|
|
||||||
debug_s = str8_serial_end(scratch.arena, &srl);
|
pch_debug_s = str8_serial_end(scratch.arena, &srl);
|
||||||
}
|
}
|
||||||
String8 debug_p;
|
String8 debug_p;
|
||||||
{
|
{
|
||||||
@@ -4004,6 +4024,51 @@ T_BeginTest(merge_duplicate_types)
|
|||||||
debug_p = str8_serial_end(scratch.arena, &srl);
|
debug_p = str8_serial_end(scratch.arena, &srl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String8 a_debug_s;
|
||||||
|
{
|
||||||
|
String8List srl;
|
||||||
|
str8_serial_begin(scratch.arena, &srl);
|
||||||
|
|
||||||
|
CV_Signature sig = CV_Signature_C13;
|
||||||
|
str8_serial_push_struct(scratch.arena, &srl, &sig);
|
||||||
|
|
||||||
|
CV_C13SubSectionHeader *ss_header = str8_serial_push_size(scratch.arena, &srl, sizeof(*ss_header));
|
||||||
|
U64 ss_start_off = srl.total_size;
|
||||||
|
|
||||||
|
CV_SymObjName obj_name = {0};
|
||||||
|
obj_name.sig = pch_sig;
|
||||||
|
String8 obj_name_string = a_obj_name;
|
||||||
|
str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1);
|
||||||
|
str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME);
|
||||||
|
str8_serial_push_struct(scratch.arena, &srl, &obj_name);
|
||||||
|
str8_serial_push_cstr(scratch.arena, &srl, obj_name_string);
|
||||||
|
str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign);
|
||||||
|
|
||||||
|
String8 comp3_data = cv_make_comp3(scratch.arena,
|
||||||
|
0,
|
||||||
|
CV_Language_C,
|
||||||
|
CV_Arch_X64,
|
||||||
|
/* ver_fe_major */ 0,
|
||||||
|
/* ver_fe_minor */ 0,
|
||||||
|
/* ver_fe_build */ 0,
|
||||||
|
/* ver_feqfe */ 0,
|
||||||
|
/* ver_major */ 14,
|
||||||
|
/* ver_minor */ 36,
|
||||||
|
/* ver_build */ 32537,
|
||||||
|
/* ver_qfe */ 0,
|
||||||
|
str8_lit(BUILD_TITLE));
|
||||||
|
str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + comp3_data.size);
|
||||||
|
str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_COMPILE3);
|
||||||
|
str8_serial_push_string(scratch.arena, &srl, comp3_data);
|
||||||
|
str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign);
|
||||||
|
|
||||||
|
ss_header->kind = CV_C13SubSectionKind_Symbols;
|
||||||
|
ss_header->size = srl.total_size - ss_start_off;
|
||||||
|
str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign);
|
||||||
|
|
||||||
|
a_debug_s = str8_serial_end(scratch.arena, &srl);
|
||||||
|
}
|
||||||
|
|
||||||
String8 debug_t;
|
String8 debug_t;
|
||||||
{
|
{
|
||||||
String8List srl;
|
String8List srl;
|
||||||
@@ -4012,9 +4077,8 @@ T_BeginTest(merge_duplicate_types)
|
|||||||
CV_Signature sig = CV_Signature_C13;
|
CV_Signature sig = CV_Signature_C13;
|
||||||
str8_serial_push_struct(scratch.arena, &srl, &sig);
|
str8_serial_push_struct(scratch.arena, &srl, &sig);
|
||||||
|
|
||||||
CV_LeafPreComp precomp = { .start_index = CV_MinComplexTypeIndex, .count = 3, sig = pch_sig };
|
CV_LeafPreComp precomp = { .start_index = CV_MinComplexTypeIndex, .count = 2, sig = pch_sig };
|
||||||
String8 pch_obj_name = str8_lit("pch.obj");
|
str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(precomp) + pch_obj_name.size + 1);
|
||||||
str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPreComp) + pch_obj_name.size + 1);
|
|
||||||
str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PRECOMP);
|
str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PRECOMP);
|
||||||
str8_serial_push_struct(scratch.arena, &srl, &precomp);
|
str8_serial_push_struct(scratch.arena, &srl, &precomp);
|
||||||
str8_serial_push_cstr(scratch.arena, &srl, pch_obj_name);
|
str8_serial_push_cstr(scratch.arena, &srl, pch_obj_name);
|
||||||
@@ -4035,7 +4099,7 @@ T_BeginTest(merge_duplicate_types)
|
|||||||
debug_t = str8_serial_end(scratch.arena, &srl);
|
debug_t = str8_serial_end(scratch.arena, &srl);
|
||||||
}
|
}
|
||||||
|
|
||||||
String8 same_but_different;
|
String8 c_debug_t;
|
||||||
{
|
{
|
||||||
String8List srl;
|
String8List srl;
|
||||||
str8_serial_begin(scratch.arena, &srl);
|
str8_serial_begin(scratch.arena, &srl);
|
||||||
@@ -4055,14 +4119,79 @@ T_BeginTest(merge_duplicate_types)
|
|||||||
str8_serial_push_struct(scratch.arena, &srl, &proc);
|
str8_serial_push_struct(scratch.arena, &srl, &proc);
|
||||||
str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign);
|
str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign);
|
||||||
|
|
||||||
same_but_different = str8_serial_end(scratch.arena, &srl);
|
c_debug_t = str8_serial_end(scratch.arena, &srl);
|
||||||
|
}
|
||||||
|
|
||||||
|
String8 c_debug_s;
|
||||||
|
{
|
||||||
|
String8List srl;
|
||||||
|
str8_serial_begin(scratch.arena, &srl);
|
||||||
|
|
||||||
|
CV_Signature sig = CV_Signature_C13;
|
||||||
|
str8_serial_push_struct(scratch.arena, &srl, &sig);
|
||||||
|
|
||||||
|
CV_C13SubSectionHeader *ss_header = str8_serial_push_size(scratch.arena, &srl, sizeof(*ss_header));
|
||||||
|
U64 ss_start_off = srl.total_size;
|
||||||
|
|
||||||
|
// S_OBJNAME
|
||||||
|
CV_SymObjName obj_name = {0};
|
||||||
|
obj_name.sig = pch_sig;
|
||||||
|
String8 obj_name_string = a_obj_name;
|
||||||
|
str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1);
|
||||||
|
str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME);
|
||||||
|
str8_serial_push_struct(scratch.arena, &srl, &obj_name);
|
||||||
|
str8_serial_push_cstr(scratch.arena, &srl, obj_name_string);
|
||||||
|
str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign);
|
||||||
|
|
||||||
|
// S_COMPILE3
|
||||||
|
String8 comp3_data = cv_make_comp3(scratch.arena,
|
||||||
|
0,
|
||||||
|
CV_Language_C,
|
||||||
|
CV_Arch_X64,
|
||||||
|
/* ver_fe_major */ 0,
|
||||||
|
/* ver_fe_minor */ 0,
|
||||||
|
/* ver_fe_build */ 0,
|
||||||
|
/* ver_feqfe */ 0,
|
||||||
|
/* ver_major */ 14,
|
||||||
|
/* ver_minor */ 36,
|
||||||
|
/* ver_build */ 32537,
|
||||||
|
/* ver_qfe */ 0,
|
||||||
|
str8_lit(BUILD_TITLE));
|
||||||
|
str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + comp3_data.size);
|
||||||
|
str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_COMPILE3);
|
||||||
|
str8_serial_push_string(scratch.arena, &srl, comp3_data);
|
||||||
|
str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign);
|
||||||
|
|
||||||
|
// S_LPROC32
|
||||||
|
U16 *foo_size = str8_serial_push_size(scratch.arena, &srl, sizeof(*foo_size));
|
||||||
|
U64 foo_off = srl.total_size;
|
||||||
|
str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_LPROC32);
|
||||||
|
CV_SymProc32 *foo_proc = str8_serial_push_size(scratch.arena, &srl, sizeof(*foo_proc));
|
||||||
|
foo_proc->itype = 0x1001;
|
||||||
|
foo_proc->sec = 1;
|
||||||
|
foo_proc->len = 1;
|
||||||
|
str8_serial_push_cstr(scratch.arena, &srl, str8_lit("foo"));
|
||||||
|
str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign);
|
||||||
|
*foo_size = srl.total_size - foo_off;
|
||||||
|
|
||||||
|
// S_PROC_ID_END
|
||||||
|
str8_serial_push_u16(scratch.arena, &srl, 2);
|
||||||
|
str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_END);
|
||||||
|
str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign);
|
||||||
|
|
||||||
|
// $$Symbols header
|
||||||
|
ss_header->kind = CV_C13SubSectionKind_Symbols;
|
||||||
|
ss_header->size = srl.total_size - ss_start_off;
|
||||||
|
str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign);
|
||||||
|
|
||||||
|
c_debug_s = str8_serial_end(scratch.arena, &srl);
|
||||||
}
|
}
|
||||||
|
|
||||||
String8 pch_obj;
|
String8 pch_obj;
|
||||||
{
|
{
|
||||||
COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64);
|
COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64);
|
||||||
coff_obj_writer_push_section(cow, str8_lit(".debug$P"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_p);
|
coff_obj_writer_push_section(cow, str8_lit(".debug$P"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_p);
|
||||||
coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_s);
|
coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, pch_debug_s);
|
||||||
pch_obj = coff_obj_writer_serialize(scratch.arena, cow);
|
pch_obj = coff_obj_writer_serialize(scratch.arena, cow);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4070,6 +4199,7 @@ T_BeginTest(merge_duplicate_types)
|
|||||||
{
|
{
|
||||||
COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64);
|
COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64);
|
||||||
coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_t);
|
coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_t);
|
||||||
|
coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, a_debug_s);
|
||||||
a_obj = coff_obj_writer_serialize(scratch.arena, cow);
|
a_obj = coff_obj_writer_serialize(scratch.arena, cow);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4083,7 +4213,9 @@ T_BeginTest(merge_duplicate_types)
|
|||||||
String8 c_obj;
|
String8 c_obj;
|
||||||
{
|
{
|
||||||
COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64);
|
COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64);
|
||||||
coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, same_but_different);
|
coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_lit((U8[]){ 0xc3 }));
|
||||||
|
coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, c_debug_t);
|
||||||
|
coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, c_debug_s);
|
||||||
c_obj = coff_obj_writer_serialize(scratch.arena, cow);
|
c_obj = coff_obj_writer_serialize(scratch.arena, cow);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4095,7 +4227,7 @@ T_BeginTest(merge_duplicate_types)
|
|||||||
T_Ok(t_write_file(str8_lit("b.obj"), b_obj));
|
T_Ok(t_write_file(str8_lit("b.obj"), b_obj));
|
||||||
T_Ok(t_write_file(str8_lit("c.obj"), c_obj));
|
T_Ok(t_write_file(str8_lit("c.obj"), c_obj));
|
||||||
|
|
||||||
t_invoke_linkerf("/subsystem:console /entry:entry /debug:full /out:a.exe a.obj b.obj c.obj pch.obj entry.obj");
|
t_invoke_linkerf("/subsystem:console /entry:entry /debug:full /out:a.exe pch.obj a.obj c.obj entry.obj");
|
||||||
T_Ok(g_last_exit_code == 0);
|
T_Ok(g_last_exit_code == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user