|
@@ -34,20 +34,52 @@ interface
|
|
|
|
|
|
type
|
|
|
TDebugInfo=class
|
|
|
- constructor Create;virtual;
|
|
|
-
|
|
|
+ protected
|
|
|
+ { definitions }
|
|
|
+ procedure appenddef(list:TAsmList;def:tdef);
|
|
|
+ procedure beforeappenddef(list:TAsmList;def:tdef);virtual;
|
|
|
+ procedure afterappenddef(list:TAsmList;def:tdef);virtual;
|
|
|
+ procedure appenddef_ord(list:TAsmList;def:torddef);virtual;
|
|
|
+ procedure appenddef_float(list:TAsmList;def:tfloatdef);virtual;
|
|
|
+ procedure appenddef_file(list:TAsmList;def:tfiledef);virtual;
|
|
|
+ procedure appenddef_enum(list:TAsmList;def:tenumdef);virtual;
|
|
|
+ procedure appenddef_array(list:TAsmList;def:tarraydef);virtual;
|
|
|
+ procedure appenddef_record(list:TAsmList;def:trecorddef);virtual;
|
|
|
+ procedure appenddef_object(list:TAsmList;def:tobjectdef);virtual;
|
|
|
+ procedure appenddef_pointer(list:TAsmList;def:tpointerdef);virtual;
|
|
|
+ procedure appenddef_string(list:TAsmList;def:tstringdef);virtual;
|
|
|
+ procedure appenddef_procvar(list:TAsmList;def:tprocvardef);virtual;
|
|
|
+ procedure appenddef_variant(list:TAsmList;def:tvariantdef);virtual;
|
|
|
+ procedure appenddef_set(list:TAsmList;def:tsetdef);virtual;
|
|
|
+ procedure appenddef_formal(list:TAsmList;def:tformaldef);virtual;
|
|
|
+ procedure appenddef_undefined(list:TAsmList;def: tundefineddef);virtual;
|
|
|
+ procedure appendprocdef(list:TAsmList;def:tprocdef);virtual;
|
|
|
+ { symbols }
|
|
|
+ procedure appendsym(list:TAsmList;sym:tsym);
|
|
|
+ procedure beforeappendsym(list:TAsmList;sym:tsym);virtual;
|
|
|
+ procedure afterappendsym(list:TAsmList;sym:tsym);virtual;
|
|
|
+ procedure appendsym_staticvar(list:TAsmList;sym:tstaticvarsym);virtual;
|
|
|
+ procedure appendsym_paravar(list:TAsmList;sym:tparavarsym);virtual;
|
|
|
+ procedure appendsym_localvar(list:TAsmList;sym:tlocalvarsym);virtual;
|
|
|
+ procedure appendsym_fieldvar(list:TAsmList;sym:tfieldvarsym);virtual;
|
|
|
+ procedure appendsym_unit(list:TAsmList;sym:tunitsym);virtual;
|
|
|
+ procedure appendsym_const(list:TAsmList;sym:tconstsym);virtual;
|
|
|
+ procedure appendsym_type(list:TAsmList;sym:ttypesym);virtual;
|
|
|
+ procedure appendsym_label(list:TAsmList;sym:tlabelsym);virtual;
|
|
|
+ procedure appendsym_absolute(list:TAsmList;sym:tabsolutevarsym);virtual;
|
|
|
+ procedure appendsym_property(list:TAsmList;sym:tpropertysym);virtual;
|
|
|
+ { symtable }
|
|
|
+ procedure write_symtable_syms(list:TAsmList;st:TSymtable);
|
|
|
+ procedure write_symtable_defs(list:TAsmList;st:TSymtable);
|
|
|
+ procedure write_symtable_procdefs(list:TAsmList;st:TSymtable);
|
|
|
procedure reset_unit_type_info;
|
|
|
-
|
|
|
+ procedure write_used_unit_type_info(list:TAsmList;hp:tmodule);
|
|
|
+ public
|
|
|
+ constructor Create;virtual;
|
|
|
procedure inserttypeinfo;virtual;
|
|
|
procedure insertmoduleinfo;virtual;
|
|
|
procedure insertlineinfo(list:TAsmList);virtual;
|
|
|
procedure referencesections(list:TAsmList);virtual;
|
|
|
- procedure insertdef(list:TAsmList;def:tdef);virtual;abstract;
|
|
|
- procedure write_symtable_defs(list:TAsmList;st:TSymtable);virtual;abstract;
|
|
|
-
|
|
|
- procedure write_used_unit_type_info(list:TAsmList;hp:tmodule);
|
|
|
- procedure field_write_defs(p:TObject;arg:pointer);
|
|
|
- procedure method_write_defs(p:TObject;arg:pointer);
|
|
|
end;
|
|
|
TDebugInfoClass=class of TDebugInfo;
|
|
|
|
|
@@ -63,72 +95,371 @@ interface
|
|
|
implementation
|
|
|
|
|
|
uses
|
|
|
+ cutils,
|
|
|
verbose;
|
|
|
|
|
|
|
|
|
- constructor tdebuginfo.Create;
|
|
|
+ constructor TDebugInfo.Create;
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.insertmoduleinfo;
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.inserttypeinfo;
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.insertlineinfo(list:TAsmList);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.referencesections(list:TAsmList);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+{**************************************
|
|
|
+ Definition
|
|
|
+**************************************}
|
|
|
+
|
|
|
+ procedure TDebugInfo.appendprocdef(list:TAsmList;def:tprocdef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.beforeappenddef(list:TAsmList;def:tdef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.afterappenddef(list:TAsmList;def:tdef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef_ord(list:TAsmList;def:torddef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef_float(list:TAsmList;def:tfloatdef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef_formal(list:TAsmList;def: tformaldef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef_undefined(list:TAsmList;def: tundefineddef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef_set(list:TAsmList;def: tsetdef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef_object(list:TAsmList;def: tobjectdef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef_variant(list:TAsmList;def: tvariantdef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef_enum(list:TAsmList;def:tenumdef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef_file(list:TAsmList;def: tfiledef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef_array(list:TAsmList;def:tarraydef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef_record(list:TAsmList;def:trecorddef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef_pointer(list:TAsmList;def:tpointerdef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef_string(list:TAsmList;def:tstringdef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef_procvar(list:TAsmList;def:tprocvardef);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appenddef(list:TAsmList;def:tdef);
|
|
|
+ begin
|
|
|
+ if (def.dbg_state in [dbg_state_writing,dbg_state_written]) then
|
|
|
+ exit;
|
|
|
+ { never write generic template defs }
|
|
|
+ if df_generic in def.defoptions then
|
|
|
+ begin
|
|
|
+ def.dbg_state:=dbg_state_written;
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ { to avoid infinite loops }
|
|
|
+ def.dbg_state := dbg_state_writing;
|
|
|
+ beforeappenddef(list,def);
|
|
|
+ case def.typ of
|
|
|
+ stringdef :
|
|
|
+ appenddef_string(list,tstringdef(def));
|
|
|
+ enumdef :
|
|
|
+ appenddef_enum(list,tenumdef(def));
|
|
|
+ orddef :
|
|
|
+ appenddef_ord(list,torddef(def));
|
|
|
+ pointerdef :
|
|
|
+ appenddef_pointer(list,tpointerdef(def));
|
|
|
+ floatdef :
|
|
|
+ appenddef_float(list,tfloatdef(def));
|
|
|
+ filedef :
|
|
|
+ appenddef_file(list,tfiledef(def));
|
|
|
+ recorddef :
|
|
|
+ appenddef_record(list,trecorddef(def));
|
|
|
+ variantdef :
|
|
|
+ appenddef_variant(list,tvariantdef(def));
|
|
|
+ classrefdef :
|
|
|
+ appenddef_pointer(list,tpointerdef(pvmttype));
|
|
|
+ setdef :
|
|
|
+ appenddef_set(list,tsetdef(def));
|
|
|
+ formaldef :
|
|
|
+ appenddef_formal(list,tformaldef(def));
|
|
|
+ arraydef :
|
|
|
+ appenddef_array(list,tarraydef(def));
|
|
|
+ procvardef :
|
|
|
+ appenddef_procvar(list,tprocvardef(def));
|
|
|
+ objectdef :
|
|
|
+ appenddef_object(list,tobjectdef(def));
|
|
|
+ undefineddef :
|
|
|
+ appenddef_undefined(list,tundefineddef(def));
|
|
|
+ else
|
|
|
+ internalerror(200601281);
|
|
|
+ end;
|
|
|
+ afterappenddef(list,def);
|
|
|
+ def.dbg_state := dbg_state_written;
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+{**************************************
|
|
|
+ Symbols
|
|
|
+**************************************}
|
|
|
+
|
|
|
+ procedure TDebugInfo.beforeappendsym(list:TAsmList;sym:tsym);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.afterappendsym(list:TAsmList;sym:tsym);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appendsym_staticvar(list:TAsmList;sym:tstaticvarsym);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appendsym_paravar(list:TAsmList;sym: tparavarsym);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appendsym_localvar(list:TAsmList;sym: tlocalvarsym);
|
|
|
begin
|
|
|
end;
|
|
|
|
|
|
|
|
|
- procedure tdebuginfo.insertmoduleinfo;
|
|
|
+ procedure TDebugInfo.appendsym_fieldvar(list:TAsmList;sym: tfieldvarsym);
|
|
|
begin
|
|
|
end;
|
|
|
|
|
|
|
|
|
- procedure tdebuginfo.inserttypeinfo;
|
|
|
+ procedure TDebugInfo.appendsym_const(list:TAsmList;sym:tconstsym);
|
|
|
begin
|
|
|
end;
|
|
|
|
|
|
|
|
|
- procedure tdebuginfo.insertlineinfo(list:TAsmList);
|
|
|
+ procedure TDebugInfo.appendsym_label(list:TAsmList;sym: tlabelsym);
|
|
|
begin
|
|
|
end;
|
|
|
|
|
|
|
|
|
- procedure tdebuginfo.referencesections(list:TAsmList);
|
|
|
+ procedure TDebugInfo.appendsym_property(list:TAsmList;sym: tpropertysym);
|
|
|
begin
|
|
|
end;
|
|
|
|
|
|
|
|
|
- procedure tdebuginfo.reset_unit_type_info;
|
|
|
+ procedure TDebugInfo.appendsym_type(list:TAsmList;sym: ttypesym);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appendsym_unit(list:TAsmList;sym: tunitsym);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appendsym_absolute(list:TAsmList;sym:tabsolutevarsym);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.appendsym(list:TAsmList;sym:tsym);
|
|
|
+ begin
|
|
|
+ if sym.isdbgwritten then
|
|
|
+ exit;
|
|
|
+ beforeappendsym(list,sym);
|
|
|
+ case sym.typ of
|
|
|
+ staticvarsym :
|
|
|
+ appendsym_staticvar(list,tstaticvarsym(sym));
|
|
|
+ unitsym:
|
|
|
+ appendsym_unit(list,tunitsym(sym));
|
|
|
+ labelsym :
|
|
|
+ appendsym_label(list,tlabelsym(sym));
|
|
|
+ localvarsym :
|
|
|
+ appendsym_localvar(list,tlocalvarsym(sym));
|
|
|
+ paravarsym :
|
|
|
+ appendsym_paravar(list,tparavarsym(sym));
|
|
|
+ constsym :
|
|
|
+ appendsym_const(list,tconstsym(sym));
|
|
|
+ typesym :
|
|
|
+ appendsym_type(list,ttypesym(sym));
|
|
|
+ enumsym :
|
|
|
+ { ignore enum syms, they are written by the owner }
|
|
|
+ ;
|
|
|
+ syssym :
|
|
|
+ { ignore sys syms, they are only of internal use }
|
|
|
+ ;
|
|
|
+ procsym :
|
|
|
+ { ignore proc syms, they are written by procdefs }
|
|
|
+ ;
|
|
|
+ absolutevarsym :
|
|
|
+ appendsym_absolute(list,tabsolutevarsym(sym));
|
|
|
+ propertysym :
|
|
|
+ appendsym_property(list,tpropertysym(sym));
|
|
|
+ else
|
|
|
+ internalerror(200601242);
|
|
|
+ end;
|
|
|
+ afterappendsym(list,sym);
|
|
|
+ sym.isdbgwritten:=true;
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+{**************************************
|
|
|
+ Symtables
|
|
|
+**************************************}
|
|
|
+
|
|
|
+ procedure TDebugInfo.write_symtable_defs(list:TAsmList;st:TSymtable);
|
|
|
var
|
|
|
- hp : tmodule;
|
|
|
+ def : tdef;
|
|
|
+ i : longint;
|
|
|
begin
|
|
|
- hp:=tmodule(loaded_units.first);
|
|
|
- while assigned(hp) do
|
|
|
+ case st.symtabletype of
|
|
|
+ staticsymtable :
|
|
|
+ list.concat(tai_comment.Create(strpnew('Defs - Begin Staticsymtable')));
|
|
|
+ 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
|
|
|
- hp.is_dbginfo_written:=false;
|
|
|
- hp:=tmodule(hp.next);
|
|
|
+ def:=tdef(st.DefList[i]);
|
|
|
+ if (def.dbg_state=dbg_state_used) then
|
|
|
+ appenddef(list,def);
|
|
|
end;
|
|
|
+ case st.symtabletype of
|
|
|
+ staticsymtable :
|
|
|
+ list.concat(tai_comment.Create(strpnew('Defs - End Staticsymtable')));
|
|
|
+ globalsymtable :
|
|
|
+ list.concat(tai_comment.Create(strpnew('Defs - End unit '+st.name^+' has index '+tostr(st.moduleid))));
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
|
|
|
- procedure TDebugInfo.field_write_defs(p:TObject;arg:pointer);
|
|
|
+ procedure TDebugInfo.write_symtable_syms(list:TAsmList;st:TSymtable);
|
|
|
+ var
|
|
|
+ i : longint;
|
|
|
+ sym : tsym;
|
|
|
begin
|
|
|
- if (Tsym(p).typ=fieldvarsym) and
|
|
|
- not(sp_static in Tsym(p).symoptions) then
|
|
|
- insertdef(TAsmList(arg),tfieldvarsym(p).vardef);
|
|
|
+ case st.symtabletype of
|
|
|
+ staticsymtable :
|
|
|
+ list.concat(tai_comment.Create(strpnew('Syms - Begin Staticsymtable')));
|
|
|
+ globalsymtable :
|
|
|
+ list.concat(tai_comment.Create(strpnew('Syms - Begin unit '+st.name^+' has index '+tostr(st.moduleid))));
|
|
|
+ end;
|
|
|
+ for i:=0 to st.SymList.Count-1 do
|
|
|
+ begin
|
|
|
+ sym:=tsym(st.SymList[i]);
|
|
|
+ if not(sp_hidden in sym.symoptions) and
|
|
|
+ (not sym.isdbgwritten) then
|
|
|
+ appendsym(list,sym);
|
|
|
+ end;
|
|
|
+ case st.symtabletype of
|
|
|
+ staticsymtable :
|
|
|
+ list.concat(tai_comment.Create(strpnew('Syms - End Staticsymtable')));
|
|
|
+ globalsymtable :
|
|
|
+ list.concat(tai_comment.Create(strpnew('Syms - End unit '+st.name^+' has index '+tostr(st.moduleid))));
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
|
|
|
- procedure TDebugInfo.method_write_defs(p:TObject;arg:pointer);
|
|
|
+ procedure TDebugInfo.write_symtable_procdefs(list:TAsmList;st:TSymtable);
|
|
|
var
|
|
|
- i : longint;
|
|
|
- pd : tprocdef;
|
|
|
+ i : longint;
|
|
|
+ def : tdef;
|
|
|
begin
|
|
|
- if tsym(p).typ<>procsym then
|
|
|
- exit;
|
|
|
- for i:=0 to tprocsym(p).ProcdefList.Count-1 do
|
|
|
+ for i:=0 to st.DefList.Count-1 do
|
|
|
+ begin
|
|
|
+ def:=tdef(st.DefList[i]);
|
|
|
+ case def.typ of
|
|
|
+ procdef :
|
|
|
+ begin
|
|
|
+ appendprocdef(list,tprocdef(def));
|
|
|
+ if assigned(tprocdef(def).localst) then
|
|
|
+ write_symtable_procdefs(list,tprocdef(def).localst);
|
|
|
+ end;
|
|
|
+ objectdef :
|
|
|
+ begin
|
|
|
+ write_symtable_procdefs(list,tobjectdef(def).symtable);
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure TDebugInfo.reset_unit_type_info;
|
|
|
+ var
|
|
|
+ hp : tmodule;
|
|
|
+ begin
|
|
|
+ hp:=tmodule(loaded_units.first);
|
|
|
+ while assigned(hp) do
|
|
|
begin
|
|
|
- pd:=tprocdef(tprocsym(p).ProcdefList[i]);
|
|
|
- insertdef(TAsmList(arg),pd.returndef);
|
|
|
- if (po_virtualmethod in pd.procoptions) then
|
|
|
- insertdef(TAsmList(arg),pd._class);
|
|
|
- if assigned(pd.parast) then
|
|
|
- write_symtable_defs(TAsmList(arg),pd.parast);
|
|
|
- if assigned(pd.localst) then
|
|
|
- write_symtable_defs(TAsmList(arg),pd.localst);
|
|
|
+ hp.is_dbginfo_written:=false;
|
|
|
+ hp:=tmodule(hp.next);
|
|
|
end;
|
|
|
end;
|
|
|
|
|
@@ -156,6 +487,10 @@ implementation
|
|
|
end;
|
|
|
|
|
|
|
|
|
+{****************************************************************************
|
|
|
+ Init / Done
|
|
|
+****************************************************************************}
|
|
|
+
|
|
|
procedure InitDebugInfo(hp:tmodule);
|
|
|
begin
|
|
|
if not assigned(CDebugInfo[target_dbg.id]) then
|
|
@@ -199,5 +534,5 @@ implementation
|
|
|
);
|
|
|
|
|
|
initialization
|
|
|
- RegisterDebugInfo(dbg_none_info,tdebuginfo);
|
|
|
+ RegisterDebugInfo(dbg_none_info,TDebugInfo);
|
|
|
end.
|