diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 022d0a2e..f5952139 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -3944,8 +3944,10 @@ T_BeginTest(merge_duplicate_types) { { 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; str8_serial_begin(scratch.arena, &srl); @@ -3958,18 +3960,36 @@ T_BeginTest(merge_duplicate_types) CV_SymObjName obj_name = {0}; 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, 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); - debug_s = str8_serial_end(scratch.arena, &srl); + pch_debug_s = str8_serial_end(scratch.arena, &srl); } String8 debug_p; { @@ -4004,6 +4024,51 @@ T_BeginTest(merge_duplicate_types) 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; { String8List srl; @@ -4012,9 +4077,8 @@ T_BeginTest(merge_duplicate_types) CV_Signature sig = CV_Signature_C13; str8_serial_push_struct(scratch.arena, &srl, &sig); - CV_LeafPreComp precomp = { .start_index = CV_MinComplexTypeIndex, .count = 3, sig = pch_sig }; - String8 pch_obj_name = str8_lit("pch.obj"); - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPreComp) + pch_obj_name.size + 1); + CV_LeafPreComp precomp = { .start_index = CV_MinComplexTypeIndex, .count = 2, sig = pch_sig }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(precomp) + pch_obj_name.size + 1); str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PRECOMP); str8_serial_push_struct(scratch.arena, &srl, &precomp); 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); } - String8 same_but_different; + String8 c_debug_t; { String8List 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_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; { 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$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); } @@ -4070,6 +4199,7 @@ T_BeginTest(merge_duplicate_types) { 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$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, a_debug_s); a_obj = coff_obj_writer_serialize(scratch.arena, cow); } @@ -4083,7 +4213,9 @@ T_BeginTest(merge_duplicate_types) String8 c_obj; { 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); } @@ -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("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); }