diff --git a/compiler/dbgbase.pas b/compiler/dbgbase.pas index 8fd765f09f..9ea8ca4f86 100644 --- a/compiler/dbgbase.pas +++ b/compiler/dbgbase.pas @@ -37,6 +37,9 @@ interface TDebugInfo=class protected { definitions } + { collect all defs in one list so we can reset them easily } + defnumberlist : TFPObjectList; + deftowritelist : TFPObjectList; procedure appenddef(list:TAsmList;def:tdef); procedure beforeappenddef(list:TAsmList;def:tdef);virtual; procedure afterappenddef(list:TAsmList;def:tdef);virtual; @@ -56,6 +59,7 @@ interface procedure appenddef_formal(list:TAsmList;def:tformaldef);virtual; procedure appenddef_undefined(list:TAsmList;def: tundefineddef);virtual; procedure appendprocdef(list:TAsmList;def:tprocdef);virtual; + procedure write_remaining_defs_to_write(list:TAsmList); { symbols } procedure appendsym(list:TAsmList;sym:tsym); procedure beforeappendsym(list:TAsmList;sym:tsym);virtual; @@ -283,6 +287,42 @@ implementation end; + procedure TDebugInfo.write_remaining_defs_to_write(list:TAsmList); + var + n : integer; + looplist, + templist: TFPObjectList; + def : tdef; + begin + templist := TFPObjectList.Create(False); + looplist := deftowritelist; + while looplist.count > 0 do + begin + deftowritelist := templist; + for n := 0 to looplist.count - 1 do + begin + def := tdef(looplist[n]); + case def.dbg_state of + dbg_state_written: + continue; + dbg_state_writing: + internalerror(200610052); + dbg_state_unused: + internalerror(200610053); + dbg_state_used: + appenddef(list,def); + else + internalerror(200610054); + end; + end; + looplist.clear; + templist := looplist; + looplist := deftowritelist; + end; + templist.free; + end; + + {************************************** Symbols **************************************} @@ -396,6 +436,7 @@ implementation var def : tdef; i : longint; + nonewadded : boolean; begin case st.symtabletype of staticsymtable : @@ -403,12 +444,18 @@ implementation globalsymtable : list.concat(tai_comment.Create(strpnew('Defs - Begin unit '+st.name^+' has index '+tostr(st.moduleid)))); end; - for i:=0 to st.DefList.Count-1 do - begin - def:=tdef(st.DefList[i]); - if (def.dbg_state in [dbg_state_used,dbg_state_queued]) then - appenddef(list,def); - end; + repeat + nonewadded:=true; + for i:=0 to st.DefList.Count-1 do + begin + def:=tdef(st.DefList[i]); + if (def.dbg_state in [dbg_state_used,dbg_state_queued]) then + begin + appenddef(list,def); + nonewadded:=false; + end; + end; + until nonewadded; case st.symtabletype of staticsymtable : list.concat(tai_comment.Create(strpnew('Defs - End Staticsymtable'))); diff --git a/compiler/dbgdwarf.pas b/compiler/dbgdwarf.pas index 3e8ee920b0..0b7a21ef8e 100644 --- a/compiler/dbgdwarf.pas +++ b/compiler/dbgdwarf.pas @@ -232,10 +232,6 @@ interface private currabbrevnumber : longint; - { collect all defs in one list so we can reset them easily } - defnumberlist, - deftowritelist : TFPObjectList; - { use this defs to create info for variants and file handles } { unused (MWE) filerecdef, @@ -1333,7 +1329,7 @@ implementation ]); append_labelentry_ref(DW_AT_type,def_dwarf_lab(basedef)); end; - + finish_entry; end; uvoid : @@ -2901,41 +2897,6 @@ implementation procedure TDebugInfoDwarf.inserttypeinfo; - procedure write_defs_to_write; - var - n : integer; - looplist, - templist: TFPObjectList; - def : tdef; - begin - templist := TFPObjectList.Create(False); - looplist := deftowritelist; - while looplist.count > 0 do - begin - deftowritelist := templist; - for n := 0 to looplist.count - 1 do - begin - def := tdef(looplist[n]); - case def.dbg_state of - dbg_state_written: - continue; - dbg_state_writing: - internalerror(200610052); - dbg_state_unused: - internalerror(200610053); - dbg_state_used: - appenddef(nil,def) - else - internalerror(200610054); - end; - end; - looplist.clear; - templist := looplist; - looplist := deftowritelist; - end; - templist.free; - end; - var storefilepos : tfileposinfo; @@ -3044,7 +3005,7 @@ implementation write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],current_module.localsymtable); { write defs not written yet } - write_defs_to_write; + write_remaining_defs_to_write(current_asmdata.asmlists[al_dwarf_info]); { close compilation unit entry } finish_children; diff --git a/compiler/dbgstabs.pas b/compiler/dbgstabs.pas index 7b1537ebcc..96bae2703e 100644 --- a/compiler/dbgstabs.pas +++ b/compiler/dbgstabs.pas @@ -59,7 +59,6 @@ interface private writing_def_stabs : boolean; global_stab_number : word; - defnumberlist : TFPObjectList; vardatadef: trecorddef; { tsym writing } function sym_var_value(const s:string;arg:pointer):string; @@ -295,7 +294,10 @@ implementation referenced by the symbols. Definitions will always include all required stabs } if def.dbg_state=dbg_state_unused then - def.dbg_state:=dbg_state_used; + begin + def.dbg_state:=dbg_state_used; + deftowritelist.Add(def); + end; { Need a new number? } if def.stab_number=0 then begin @@ -1348,8 +1350,12 @@ implementation [c+def_stab_number(tprocdef(sym.owner.defowner)._class),tostr(sym.localloc.reference.offset)]) else begin + if (c='p') then + c:='R' + else + c:='a'; regidx:=findreg_by_number(sym.localloc.register); - ss:=sym_stabstr_evaluate(sym,'"$$t:r$1",${N_RSYM},0,0,$2', + ss:=sym_stabstr_evaluate(sym,'"$$t:$1",${N_RSYM},0,0,$2', [c+def_stab_number(tprocdef(sym.owner.defowner)._class),tostr(regstabs_table[regidx])]); end end; @@ -1493,6 +1499,7 @@ implementation global_stab_number:=0; defnumberlist:=TFPObjectlist.create(false); + deftowritelist:=TFPObjectlist.create(false); stabsvarlist:=TAsmList.create; stabstypelist:=TAsmList.create; @@ -1532,6 +1539,8 @@ implementation if assigned(current_module.localsymtable) then write_symtable_defs(stabstypelist,current_module.localsymtable); + write_remaining_defs_to_write(stabstypelist); + current_asmdata.asmlists[al_stabs].concatlist(stabstypelist); current_asmdata.asmlists[al_stabs].concatlist(stabsvarlist); @@ -1547,6 +1556,8 @@ implementation defnumberlist.free; defnumberlist:=nil; + deftowritelist.free; + deftowritelist:=nil; stabsvarlist.free; stabstypelist.free;