mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 12:29:25 +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
|
||||
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')));
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user