mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 10:19:17 +02:00
Attempt to fix missing stabs definitions problem
git-svn-id: trunk@15238 -
This commit is contained in:
parent
354122a8c5
commit
11d6509a56
@ -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')));
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user