From 2310a9a2f076d92a5ecabf443764a53345e717fc Mon Sep 17 00:00:00 2001 From: Walter Bright Date: Sat, 26 Sep 2026 16:45:12 -0700 Subject: [PATCH 1/2] trouble with compact_unwind fixup --- compiler/src/dmd/backend/code.d | 7 ++--- compiler/src/dmd/backend/dout.d | 2 ++ compiler/src/dmd/backend/dwarfdbginf.d | 1 + compiler/src/dmd/backend/dwarfeh.d | 15 +++++++++-- compiler/src/dmd/backend/machobj.d | 36 +++++++++++++++++++++----- compiler/src/dmd/backend/x86/cgcod.d | 2 ++ compiler/src/dmd/glue/package.d | 6 +++++ compiler/src/dmd/glue/toobj.d | 3 +++ 8 files changed, 60 insertions(+), 12 deletions(-) diff --git a/compiler/src/dmd/backend/code.d b/compiler/src/dmd/backend/code.d index 975d8aee959a..de552ed7c392 100644 --- a/compiler/src/dmd/backend/code.d +++ b/compiler/src/dmd/backend/code.d @@ -256,7 +256,7 @@ alias IDXSTR = uint; alias IDXSEC = uint; alias IDXSYM = uint; -struct seg_data +struct seg_data // SegData is an array of these, indexed by segment index { segidx_t SDseg; // index into SegData[] targ_size_t SDoffset; // starting offset for data @@ -275,8 +275,9 @@ struct seg_data } //ELFOBJ || MACHOBJ - IDXSEC SDshtidx; // section header table index into SECbuf[] - OutBuffer *SDbuf; // buffer to hold data + IDXSEC SDshtidx; // ELFOBJ : index into SecHdrTab[] + // MACHOBJ: index into section_64s[] or sections[] + OutBuffer *SDbuf; // buffer to hold segment data // union // struct // { diff --git a/compiler/src/dmd/backend/dout.d b/compiler/src/dmd/backend/dout.d index d07e85413470..b3694f78ce93 100644 --- a/compiler/src/dmd/backend/dout.d +++ b/compiler/src/dmd/backend/dout.d @@ -1123,6 +1123,8 @@ Ldone: } globsym.setLength(0); +import dmd.backend.machobj : segsizes; +printf("segsizes D "); segsizes(); //printf("done with writefunc()\n"); //dfo.dtor(); // save allocation for next time } diff --git a/compiler/src/dmd/backend/dwarfdbginf.d b/compiler/src/dmd/backend/dwarfdbginf.d index 3bda1ba85056..c8ef66f25cf1 100644 --- a/compiler/src/dmd/backend/dwarfdbginf.d +++ b/compiler/src/dmd/backend/dwarfdbginf.d @@ -3344,6 +3344,7 @@ static if (1) return; int seg = dwarf_except_table_alloc(sfunc); +printf("seg: %d except_table_seg: %d\n", seg, except_table_seg); OutBuffer* buf = SegData[seg].SDbuf; buf.reserve(100); diff --git a/compiler/src/dmd/backend/dwarfeh.d b/compiler/src/dmd/backend/dwarfeh.d index 8b9453d57083..404bc4d7ecf3 100644 --- a/compiler/src/dmd/backend/dwarfeh.d +++ b/compiler/src/dmd/backend/dwarfeh.d @@ -75,8 +75,9 @@ void genDwarfEh(Funcsym* sfunc, int seg, OutBuffer* et, bool scancode, uint star et.reserve(100); block* startblock = sfunc.Sfunc.Fstartblock; - //printf("genDwarfEh: func = %s, offset = x%x, startblock.Boffset = x%x, scancode = %d startoffset=x%x, retoffset=x%x\n", - //sfunc.Sident.ptr, cast(int)sfunc.Soffset, cast(int)startblock.Boffset, scancode, startoffset, retoffset); + static if (1) + printf("genDwarfEh: sfunc: %s seg: %d offset: x%x startblock.Boffset: x%x, scancode: %d startoffset: x%x retoffset: x%x\n", + sfunc.Sident.ptr, seg, cast(int)sfunc.Soffset, cast(int)startblock.Boffset, scancode, startoffset, retoffset); static if (0) { @@ -338,10 +339,20 @@ else * [1] address x0000 pcrel 0 length 2 value x160 type 1 RELOC_PAIR */ +/* Arrgh the segments get renumbered! */ if (config.objfmt == OBJ_ELF) elf_dwarf_reftoident(seg, et.length(), s, 0); else if (config.objfmt == OBJ_MACH) + { +printf("seg: %d et.length: %zx\n", seg, et.length()); +printf("SegData[%d].SDbuf.length: %zx\n", seg, SegData[seg].SDbuf.length); +assert(et == SegData[seg].SDbuf); mach_dwarf_reftoident(seg, et.length(), s, 0); +printf("SegData[%d].SDbuf.length: %zx et.length: %zx SDoffset: %zx\n", seg, SegData[seg].SDbuf.length, et.length, SegData[seg].SDoffset); + +import dmd.backend.machobj : segsizes; +segsizes(); + } } assert(TToffset == et.length() - startsize); } diff --git a/compiler/src/dmd/backend/machobj.d b/compiler/src/dmd/backend/machobj.d index d3a12532e82a..854dacad8f37 100644 --- a/compiler/src/dmd/backend/machobj.d +++ b/compiler/src/dmd/backend/machobj.d @@ -601,6 +601,17 @@ void MachObj_termfile() } } +void segsizes() @trusted +{ + printf("Segsizes\n"); + for (int seg = 1; seg < SegData.length; seg++) + { + seg_data* pseg = SegData[seg]; + if (pseg.SDbuf && pseg.SDbuf.length()) + printf("\tpseg: %p SDbuf: %p %d SDbuf.length %zx\n", pseg, pseg.SDbuf, seg, pseg.SDbuf.length()); + } +} + /********************************* * Terminate package. */ @@ -618,6 +629,8 @@ void MachObj_term(const(char)[] objfilename) dwarf_termfile(); } + segsizes(); + /* Write out the object file in the following order: * header @@ -787,12 +800,19 @@ void MachObj_term(const(char)[] objfilename) foreach (i, s; table) printf("table[%d] = %d %d\n", cast(int)i, table[i], table[table[i]]); - //printf("Setup offsets and sizes foffset %d\n\tsection_length %d, SegData.length %d\n",foffset,section_length,SegData.length); + printf("\nSetup offsets and sizes foffset %d\n\tSegData.length %zx\n",foffset,SegData.length); { + for (int seg = 1; seg < SegData.length; seg++) + { + seg_data* pseg = SegData[seg]; + if (pseg.SDbuf && pseg.SDbuf.length()) + printf("%d\tSDbuf.length %zx\n", seg, pseg.SDbuf.length()); + } + /* For each segment, write the segment data bytes out to fobjbuf */ for (int seg = 1; seg < SegData.length; seg++) { - //printf("writing seg %d as %d\n", seg, table[seg]); + printf("writing seg %d as %d\n", seg, table[seg]); seg_data* pseg = SegData[table[seg]]; if (I64) { @@ -810,22 +830,22 @@ void MachObj_term(const(char)[] objfilename) { psechdr.offset = 0; psechdr.size = pseg.SDoffset; // accumulated size - //printf("\tzero section name %s size %d\n", psechdr.sectname.ptr, cast(int)pseg.SDoffset); + printf("\tzero section name %s size %zx\n", psechdr.sectname.ptr, pseg.SDoffset); } else { psechdr.offset = foffset; psechdr.size = 0; - //printf("\tsection name %s,", psechdr.sectname.ptr); + printf("\t%d section name %s,", table[seg], psechdr.sectname.ptr); if (pseg.SDbuf && pseg.SDbuf.length()) { - //printf("\tsize %d\n", cast(int)pseg.SDbuf.length()); + printf("\tSDbuf.length %zx\n", pseg.SDbuf.length()); psechdr.size = pseg.SDbuf.length(); machobj.fobjbuf.write(pseg.SDbuf.buf, cast(uint)psechdr.size); foffset += psechdr.size; } - //else - //printf("\n"); + else + printf("\n"); } psechdr.addr = vmaddr; vmaddr += psechdr.size; @@ -2709,6 +2729,8 @@ void MachObj_func_term(Symbol* sfunc) //dbg_printf("MachObj_func_term(%s) offset %x, Coffset %x symidx %d\n", // sfunc.Sident.ptr, sfunc.Soffset,SegData[cseg].SDoffset,sfunc.Sxtrnnum); dwarf_func_term(sfunc); +import dmd.backend.machobj : segsizes; +printf("segsizes B "); segsizes(); } /******************************** diff --git a/compiler/src/dmd/backend/x86/cgcod.d b/compiler/src/dmd/backend/x86/cgcod.d index 08400077ed44..f19b04ddb186 100644 --- a/compiler/src/dmd/backend/x86/cgcod.d +++ b/compiler/src/dmd/backend/x86/cgcod.d @@ -564,6 +564,8 @@ static if (0) assert(global87.stackused == 0); /* nobody in 8087 stack */ global87.save.dtor(); // clean up ndp save array +import dmd.backend.machobj : segsizes; +printf("segsizes A "); segsizes(); } /********************************************* diff --git a/compiler/src/dmd/glue/package.d b/compiler/src/dmd/glue/package.d index eff9b7b0a2af..ce556ebbd38f 100644 --- a/compiler/src/dmd/glue/package.d +++ b/compiler/src/dmd/glue/package.d @@ -196,6 +196,8 @@ public void generateCodeAndWrite(Module[] modules, const(char)*[] libmodules, } destroy(tmpname); } +import dmd.backend.machobj : segsizes; +printf("segsizes I: "); segsizes; } // FIXME: does not work on old bootstrap compilers @@ -991,6 +993,8 @@ void FuncDeclaration_toObjFile(FuncDeclaration fd, bool multiobj) } writefunc(s); // hand off to backend +import dmd.backend.machobj : segsizes; +printf("segsizes E "); segsizes(); buildCapture(fd); @@ -1089,6 +1093,8 @@ void FuncDeclaration_toObjFile(FuncDeclaration fd, bool multiobj) //printf("Setting start address\n"); objmod.startaddress(irs.startaddress); } +import dmd.backend.machobj : segsizes; +printf("segsizes F "); segsizes(); } private: diff --git a/compiler/src/dmd/glue/toobj.d b/compiler/src/dmd/glue/toobj.d index 3521830a5b70..ae71d154075f 100644 --- a/compiler/src/dmd/glue/toobj.d +++ b/compiler/src/dmd/glue/toobj.d @@ -1024,6 +1024,9 @@ void toObjFile(Dsymbol ds, bool multiobj) scope v = new ToObjFile(multiobj, ds.isCsymbol()); ds.accept(v); + +import dmd.backend.machobj : segsizes; +printf("segsizes G "); segsizes(); } From 4a93cf474f5bb48336de7aefcd366fc9f227b3e0 Mon Sep 17 00:00:00 2001 From: Walter Bright Date: Mon, 28 Sep 2026 22:11:42 -0700 Subject: [PATCH 2/2] fix MachObj_reftoidentAArch64() --- compiler/src/dmd/backend/code.d | 4 +-- compiler/src/dmd/backend/dout.d | 2 -- compiler/src/dmd/backend/dwarfdbginf.d | 2 +- compiler/src/dmd/backend/dwarfeh.d | 15 +++----- compiler/src/dmd/backend/machobj.d | 48 ++++++++++---------------- compiler/src/dmd/backend/x86/cgcod.d | 2 -- compiler/src/dmd/glue/package.d | 6 ---- compiler/src/dmd/glue/toobj.d | 3 -- 8 files changed, 26 insertions(+), 56 deletions(-) diff --git a/compiler/src/dmd/backend/code.d b/compiler/src/dmd/backend/code.d index de552ed7c392..dab9e14e2ff4 100644 --- a/compiler/src/dmd/backend/code.d +++ b/compiler/src/dmd/backend/code.d @@ -256,7 +256,7 @@ alias IDXSTR = uint; alias IDXSEC = uint; alias IDXSYM = uint; -struct seg_data // SegData is an array of these, indexed by segment index +struct seg_data // SegData is an array of these, indexed by segment index { segidx_t SDseg; // index into SegData[] targ_size_t SDoffset; // starting offset for data @@ -276,7 +276,7 @@ struct seg_data // SegData is an array of these, indexed by segment index //ELFOBJ || MACHOBJ IDXSEC SDshtidx; // ELFOBJ : index into SecHdrTab[] - // MACHOBJ: index into section_64s[] or sections[] + // MACHOBJ: index into section_64s[] or sections[] OutBuffer *SDbuf; // buffer to hold segment data // union // struct diff --git a/compiler/src/dmd/backend/dout.d b/compiler/src/dmd/backend/dout.d index b3694f78ce93..d07e85413470 100644 --- a/compiler/src/dmd/backend/dout.d +++ b/compiler/src/dmd/backend/dout.d @@ -1123,8 +1123,6 @@ Ldone: } globsym.setLength(0); -import dmd.backend.machobj : segsizes; -printf("segsizes D "); segsizes(); //printf("done with writefunc()\n"); //dfo.dtor(); // save allocation for next time } diff --git a/compiler/src/dmd/backend/dwarfdbginf.d b/compiler/src/dmd/backend/dwarfdbginf.d index c8ef66f25cf1..c7b4f9d7fd57 100644 --- a/compiler/src/dmd/backend/dwarfdbginf.d +++ b/compiler/src/dmd/backend/dwarfdbginf.d @@ -3344,7 +3344,7 @@ static if (1) return; int seg = dwarf_except_table_alloc(sfunc); -printf("seg: %d except_table_seg: %d\n", seg, except_table_seg); + //printf("seg: %d except_table_seg: %d\n", seg, except_table_seg); OutBuffer* buf = SegData[seg].SDbuf; buf.reserve(100); diff --git a/compiler/src/dmd/backend/dwarfeh.d b/compiler/src/dmd/backend/dwarfeh.d index 404bc4d7ecf3..0192956acf67 100644 --- a/compiler/src/dmd/backend/dwarfeh.d +++ b/compiler/src/dmd/backend/dwarfeh.d @@ -75,7 +75,7 @@ void genDwarfEh(Funcsym* sfunc, int seg, OutBuffer* et, bool scancode, uint star et.reserve(100); block* startblock = sfunc.Sfunc.Fstartblock; - static if (1) + static if (0) printf("genDwarfEh: sfunc: %s seg: %d offset: x%x startblock.Boffset: x%x, scancode: %d startoffset: x%x retoffset: x%x\n", sfunc.Sident.ptr, seg, cast(int)sfunc.Soffset, cast(int)startblock.Boffset, scancode, startoffset, retoffset); @@ -339,20 +339,13 @@ else * [1] address x0000 pcrel 0 length 2 value x160 type 1 RELOC_PAIR */ -/* Arrgh the segments get renumbered! */ if (config.objfmt == OBJ_ELF) elf_dwarf_reftoident(seg, et.length(), s, 0); else if (config.objfmt == OBJ_MACH) - { -printf("seg: %d et.length: %zx\n", seg, et.length()); -printf("SegData[%d].SDbuf.length: %zx\n", seg, SegData[seg].SDbuf.length); -assert(et == SegData[seg].SDbuf); + { + assert(et == SegData[seg].SDbuf); mach_dwarf_reftoident(seg, et.length(), s, 0); -printf("SegData[%d].SDbuf.length: %zx et.length: %zx SDoffset: %zx\n", seg, SegData[seg].SDbuf.length, et.length, SegData[seg].SDoffset); - -import dmd.backend.machobj : segsizes; -segsizes(); - } + } } assert(TToffset == et.length() - startsize); } diff --git a/compiler/src/dmd/backend/machobj.d b/compiler/src/dmd/backend/machobj.d index 854dacad8f37..6517e61b733d 100644 --- a/compiler/src/dmd/backend/machobj.d +++ b/compiler/src/dmd/backend/machobj.d @@ -601,15 +601,16 @@ void MachObj_termfile() } } +static if (0) void segsizes() @trusted { - printf("Segsizes\n"); - for (int seg = 1; seg < SegData.length; seg++) - { - seg_data* pseg = SegData[seg]; - if (pseg.SDbuf && pseg.SDbuf.length()) - printf("\tpseg: %p SDbuf: %p %d SDbuf.length %zx\n", pseg, pseg.SDbuf, seg, pseg.SDbuf.length()); - } + printf("Segsizes\n"); + for (int seg = 1; seg < SegData.length; seg++) + { + seg_data* pseg = SegData[seg]; + if (pseg.SDbuf && pseg.SDbuf.length()) + printf("\tpseg: %p SDbuf: %p %d SDbuf.length %zx\n", pseg, pseg.SDbuf, seg, pseg.SDbuf.length()); + } } /********************************* @@ -629,9 +630,6 @@ void MachObj_term(const(char)[] objfilename) dwarf_termfile(); } - segsizes(); - - /* Write out the object file in the following order: * header * commands @@ -800,19 +798,12 @@ void MachObj_term(const(char)[] objfilename) foreach (i, s; table) printf("table[%d] = %d %d\n", cast(int)i, table[i], table[table[i]]); - printf("\nSetup offsets and sizes foffset %d\n\tSegData.length %zx\n",foffset,SegData.length); + //printf("\nSetup offsets and sizes foffset %d\n\tSegData.length %zx\n",foffset,SegData.length); { - for (int seg = 1; seg < SegData.length; seg++) - { - seg_data* pseg = SegData[seg]; - if (pseg.SDbuf && pseg.SDbuf.length()) - printf("%d\tSDbuf.length %zx\n", seg, pseg.SDbuf.length()); - } - /* For each segment, write the segment data bytes out to fobjbuf */ for (int seg = 1; seg < SegData.length; seg++) { - printf("writing seg %d as %d\n", seg, table[seg]); + //printf("writing seg %d as %d\n", seg, table[seg]); seg_data* pseg = SegData[table[seg]]; if (I64) { @@ -830,22 +821,22 @@ void MachObj_term(const(char)[] objfilename) { psechdr.offset = 0; psechdr.size = pseg.SDoffset; // accumulated size - printf("\tzero section name %s size %zx\n", psechdr.sectname.ptr, pseg.SDoffset); + //printf("\tzero section name %s size %zx\n", psechdr.sectname.ptr, pseg.SDoffset); } else { psechdr.offset = foffset; psechdr.size = 0; - printf("\t%d section name %s,", table[seg], psechdr.sectname.ptr); + //printf("\t%d section name %s,", table[seg], psechdr.sectname.ptr); if (pseg.SDbuf && pseg.SDbuf.length()) { - printf("\tSDbuf.length %zx\n", pseg.SDbuf.length()); + //printf("\tSDbuf.length %zx\n", pseg.SDbuf.length()); psechdr.size = pseg.SDbuf.length(); machobj.fobjbuf.write(pseg.SDbuf.buf, cast(uint)psechdr.size); foffset += psechdr.size; } - else - printf("\n"); + //else + //printf("\n"); } psechdr.addr = vmaddr; vmaddr += psechdr.size; @@ -2729,8 +2720,6 @@ void MachObj_func_term(Symbol* sfunc) //dbg_printf("MachObj_func_term(%s) offset %x, Coffset %x symidx %d\n", // sfunc.Sident.ptr, sfunc.Soffset,SegData[cseg].SDoffset,sfunc.Sxtrnnum); dwarf_func_term(sfunc); -import dmd.backend.machobj : segsizes; -printf("segsizes B "); segsizes(); } /******************************** @@ -3279,7 +3268,7 @@ int MachObj_reftoidentAArch64(int seg, targ_size_t offset, Symbol* s, targ_size_ if (log) { debug printf("\nMachObj_reftoidentAArch64('%s' seg %d, offset x%llx, val x%llx, flags x%x) ", - s.Sident.ptr,seg,cast(ulong)offset,cast(ulong)val,flags); + s.Sident.ptr,seg,offset,val,flags); //CF_print(flags); //debug printf("retsize = %d\n", retsize); //dbg_printf("Sseg = %d, Sxtrnnum = %d\n",s.Sseg,s.Sxtrnnum); @@ -3337,7 +3326,7 @@ int MachObj_reftoidentAArch64(int seg, targ_size_t offset, Symbol* s, targ_size_ } else buf.write64(val); - if (save > offset + retsize) + if (save >= offset + retsize) buf.setsize(save); return retsize; @@ -3482,7 +3471,8 @@ int mach_dwarf_reftoident(int seg, targ_size_t offset, Symbol* s, targ_size_t va { //printf("dwarf_reftoident(seg=%d offset=x%x s=%s val=x%x\n", seg, cast(int)offset, s.Sident.ptr, cast(int)val); if (machobj.AArch64) - MachObj_reftoident(seg, offset, s, val + 4, CF.selfrel); + //MachObj_reftoident(seg, offset, s, val + 4, CF.selfrel); + MachObj_reftoident(seg, offset, s, val + 4, CF.off); else MachObj_reftoident(seg, offset, s, val + 4, I64 ? CF.off : CF.indirect); return 4; diff --git a/compiler/src/dmd/backend/x86/cgcod.d b/compiler/src/dmd/backend/x86/cgcod.d index f19b04ddb186..08400077ed44 100644 --- a/compiler/src/dmd/backend/x86/cgcod.d +++ b/compiler/src/dmd/backend/x86/cgcod.d @@ -564,8 +564,6 @@ static if (0) assert(global87.stackused == 0); /* nobody in 8087 stack */ global87.save.dtor(); // clean up ndp save array -import dmd.backend.machobj : segsizes; -printf("segsizes A "); segsizes(); } /********************************************* diff --git a/compiler/src/dmd/glue/package.d b/compiler/src/dmd/glue/package.d index ce556ebbd38f..eff9b7b0a2af 100644 --- a/compiler/src/dmd/glue/package.d +++ b/compiler/src/dmd/glue/package.d @@ -196,8 +196,6 @@ public void generateCodeAndWrite(Module[] modules, const(char)*[] libmodules, } destroy(tmpname); } -import dmd.backend.machobj : segsizes; -printf("segsizes I: "); segsizes; } // FIXME: does not work on old bootstrap compilers @@ -993,8 +991,6 @@ void FuncDeclaration_toObjFile(FuncDeclaration fd, bool multiobj) } writefunc(s); // hand off to backend -import dmd.backend.machobj : segsizes; -printf("segsizes E "); segsizes(); buildCapture(fd); @@ -1093,8 +1089,6 @@ printf("segsizes E "); segsizes(); //printf("Setting start address\n"); objmod.startaddress(irs.startaddress); } -import dmd.backend.machobj : segsizes; -printf("segsizes F "); segsizes(); } private: diff --git a/compiler/src/dmd/glue/toobj.d b/compiler/src/dmd/glue/toobj.d index ae71d154075f..3521830a5b70 100644 --- a/compiler/src/dmd/glue/toobj.d +++ b/compiler/src/dmd/glue/toobj.d @@ -1024,9 +1024,6 @@ void toObjFile(Dsymbol ds, bool multiobj) scope v = new ToObjFile(multiobj, ds.isCsymbol()); ds.accept(v); - -import dmd.backend.machobj : segsizes; -printf("segsizes G "); segsizes(); }