Attempt to fix missing stabs definitions problem

git-svn-id: trunk@15238 -
This commit is contained in:
pierre 2010-05-06 22:53:26 +00:00
parent 354122a8c5
commit 11d6509a56
3 changed files with 69 additions and 50 deletions

View File

@ -37,6 +37,9 @@ interface
TDebugInfo=class TDebugInfo=class
protected protected
{ definitions } { definitions }
{ collect all defs in one list so we can reset them easily }
defnumberlist : TFPObjectList;
deftowritelist : TFPObjectList;
procedure appenddef(list:TAsmList;def:tdef); procedure appenddef(list:TAsmList;def:tdef);
procedure beforeappenddef(list:TAsmList;def:tdef);virtual; procedure beforeappenddef(list:TAsmList;def:tdef);virtual;
procedure afterappenddef(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_formal(list:TAsmList;def:tformaldef);virtual;
procedure appenddef_undefined(list:TAsmList;def: tundefineddef);virtual; procedure appenddef_undefined(list:TAsmList;def: tundefineddef);virtual;
procedure appendprocdef(list:TAsmList;def:tprocdef);virtual; procedure appendprocdef(list:TAsmList;def:tprocdef);virtual;
procedure write_remaining_defs_to_write(list:TAsmList);
{ symbols } { symbols }
procedure appendsym(list:TAsmList;sym:tsym); procedure appendsym(list:TAsmList;sym:tsym);
procedure beforeappendsym(list:TAsmList;sym:tsym);virtual; procedure beforeappendsym(list:TAsmList;sym:tsym);virtual;
@ -283,6 +287,42 @@ implementation
end; 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 Symbols
**************************************} **************************************}
@ -396,6 +436,7 @@ implementation
var var
def : tdef; def : tdef;
i : longint; i : longint;
nonewadded : boolean;
begin begin
case st.symtabletype of case st.symtabletype of
staticsymtable : staticsymtable :
@ -403,12 +444,18 @@ implementation
globalsymtable : globalsymtable :
list.concat(tai_comment.Create(strpnew('Defs - Begin unit '+st.name^+' has index '+tostr(st.moduleid)))); list.concat(tai_comment.Create(strpnew('Defs - Begin unit '+st.name^+' has index '+tostr(st.moduleid))));
end; end;
for i:=0 to st.DefList.Count-1 do repeat
begin nonewadded:=true;
def:=tdef(st.DefList[i]); for i:=0 to st.DefList.Count-1 do
if (def.dbg_state in [dbg_state_used,dbg_state_queued]) then begin
appenddef(list,def); def:=tdef(st.DefList[i]);
end; 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 case st.symtabletype of
staticsymtable : staticsymtable :
list.concat(tai_comment.Create(strpnew('Defs - End Staticsymtable'))); list.concat(tai_comment.Create(strpnew('Defs - End Staticsymtable')));

View File

@ -232,10 +232,6 @@ interface
private private
currabbrevnumber : longint; 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 } { use this defs to create info for variants and file handles }
{ unused (MWE) { unused (MWE)
filerecdef, filerecdef,
@ -1333,7 +1329,7 @@ implementation
]); ]);
append_labelentry_ref(DW_AT_type,def_dwarf_lab(basedef)); append_labelentry_ref(DW_AT_type,def_dwarf_lab(basedef));
end; end;
finish_entry; finish_entry;
end; end;
uvoid : uvoid :
@ -2901,41 +2897,6 @@ implementation
procedure TDebugInfoDwarf.inserttypeinfo; 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 var
storefilepos : tfileposinfo; storefilepos : tfileposinfo;
@ -3044,7 +3005,7 @@ implementation
write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],current_module.localsymtable); write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],current_module.localsymtable);
{ write defs not written yet } { write defs not written yet }
write_defs_to_write; write_remaining_defs_to_write(current_asmdata.asmlists[al_dwarf_info]);
{ close compilation unit entry } { close compilation unit entry }
finish_children; finish_children;

View File

@ -59,7 +59,6 @@ interface
private private
writing_def_stabs : boolean; writing_def_stabs : boolean;
global_stab_number : word; global_stab_number : word;
defnumberlist : TFPObjectList;
vardatadef: trecorddef; vardatadef: trecorddef;
{ tsym writing } { tsym writing }
function sym_var_value(const s:string;arg:pointer):string; function sym_var_value(const s:string;arg:pointer):string;
@ -295,7 +294,10 @@ implementation
referenced by the symbols. Definitions will always include all referenced by the symbols. Definitions will always include all
required stabs } required stabs }
if def.dbg_state=dbg_state_unused then 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? } { Need a new number? }
if def.stab_number=0 then if def.stab_number=0 then
begin begin
@ -1348,8 +1350,12 @@ implementation
[c+def_stab_number(tprocdef(sym.owner.defowner)._class),tostr(sym.localloc.reference.offset)]) [c+def_stab_number(tprocdef(sym.owner.defowner)._class),tostr(sym.localloc.reference.offset)])
else else
begin begin
if (c='p') then
c:='R'
else
c:='a';
regidx:=findreg_by_number(sym.localloc.register); 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])]); [c+def_stab_number(tprocdef(sym.owner.defowner)._class),tostr(regstabs_table[regidx])]);
end end
end; end;
@ -1493,6 +1499,7 @@ implementation
global_stab_number:=0; global_stab_number:=0;
defnumberlist:=TFPObjectlist.create(false); defnumberlist:=TFPObjectlist.create(false);
deftowritelist:=TFPObjectlist.create(false);
stabsvarlist:=TAsmList.create; stabsvarlist:=TAsmList.create;
stabstypelist:=TAsmList.create; stabstypelist:=TAsmList.create;
@ -1532,6 +1539,8 @@ implementation
if assigned(current_module.localsymtable) then if assigned(current_module.localsymtable) then
write_symtable_defs(stabstypelist,current_module.localsymtable); 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(stabstypelist);
current_asmdata.asmlists[al_stabs].concatlist(stabsvarlist); current_asmdata.asmlists[al_stabs].concatlist(stabsvarlist);
@ -1547,6 +1556,8 @@ implementation
defnumberlist.free; defnumberlist.free;
defnumberlist:=nil; defnumberlist:=nil;
deftowritelist.free;
deftowritelist:=nil;
stabsvarlist.free; stabsvarlist.free;
stabstypelist.free; stabstypelist.free;