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
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')));

View File

@ -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;

View File

@ -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;