diff --git a/compiler/src/dmd/backend/code.d b/compiler/src/dmd/backend/code.d index 975d8aee959a..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 +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/dwarfdbginf.d b/compiler/src/dmd/backend/dwarfdbginf.d index 3bda1ba85056..c7b4f9d7fd57 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..0192956acf67 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 (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); static if (0) { @@ -341,7 +342,10 @@ else if (config.objfmt == OBJ_ELF) elf_dwarf_reftoident(seg, et.length(), s, 0); else if (config.objfmt == OBJ_MACH) + { + assert(et == SegData[seg].SDbuf); mach_dwarf_reftoident(seg, et.length(), s, 0); + } } assert(TToffset == et.length() - startsize); } diff --git a/compiler/src/dmd/backend/machobj.d b/compiler/src/dmd/backend/machobj.d index d3a12532e82a..6517e61b733d 100644 --- a/compiler/src/dmd/backend/machobj.d +++ b/compiler/src/dmd/backend/machobj.d @@ -601,6 +601,18 @@ 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()); + } +} + /********************************* * Terminate package. */ @@ -618,7 +630,6 @@ void MachObj_term(const(char)[] objfilename) dwarf_termfile(); } - /* Write out the object file in the following order: * header * commands @@ -787,7 +798,7 @@ 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 each segment, write the segment data bytes out to fobjbuf */ for (int seg = 1; seg < SegData.length; seg++) @@ -810,16 +821,16 @@ 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; @@ -3257,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); @@ -3315,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; @@ -3460,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;