Преглед на файлове

* generalize def and symbol handling
* stabs uses ansistring instead of pchars
* write procdef in separate loop. this fixes debugging of nested/overloaded procs

git-svn-id: trunk@10189 -

peter преди 17 години
родител
ревизия
13f6396221
променени са 3 файла, в които са добавени 1375 реда и са изтрити 1258 реда
  1. 374 39
      compiler/dbgbase.pas
  2. 466 624
      compiler/dbgdwarf.pas
  3. 535 595
      compiler/dbgstabs.pas

+ 374 - 39
compiler/dbgbase.pas

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

Файловите разлики са ограничени, защото са твърде много
+ 466 - 624
compiler/dbgdwarf.pas


Файловите разлики са ограничени, защото са твърде много
+ 535 - 595
compiler/dbgstabs.pas


Някои файлове не бяха показани, защото твърде много файлове са промени