Browse Source

* removed write depend def, write only defs when needed

git-svn-id: trunk@4816 -
Marc Weustink 19 years ago
parent
commit
88e00bd264
4 changed files with 191 additions and 245 deletions
  1. 186 240
      compiler/dbgdwarf.pas
  2. 2 2
      compiler/dbgstabs.pas
  3. 1 1
      compiler/symsym.pas
  4. 2 2
      compiler/symtype.pas

+ 186 - 240
compiler/dbgdwarf.pas

@@ -1,4 +1,3 @@
-
 {
 {
     Copyright (c) 2003-2006 by Peter Vreman and Florian Klaempfl
     Copyright (c) 2003-2006 by Peter Vreman and Florian Klaempfl
 
 
@@ -201,8 +200,11 @@ interface
         currabbrevnumber : longint;
         currabbrevnumber : longint;
 
 
         { collect all defs in one list so we can reset them easily }
         { collect all defs in one list so we can reset them easily }
+        { not used (MWE)
         nextdefnumber    : longint;
         nextdefnumber    : longint;
-        defnumberlist    : TFPObjectList;
+        }
+        defnumberlist,
+        deftowritelist   : TFPObjectList;
 
 
         writing_def_dwarf : boolean;
         writing_def_dwarf : boolean;
 
 
@@ -217,9 +219,9 @@ interface
         loclist: tdynamicarray;
         loclist: tdynamicarray;
         asmline: TAsmList;
         asmline: TAsmList;
 
 
+        function def_dwarf_lab(def:tdef) : tasmsymbol;
         function get_file_index(afile: tinputfile): Integer;
         function get_file_index(afile: tinputfile): Integer;
         procedure write_symtable_syms(st:tsymtable);
         procedure write_symtable_syms(st:tsymtable);
-        function def_dwarf_lab(def:tdef) : tasmsymbol;
       protected
       protected
         isdwarf64: Boolean;
         isdwarf64: Boolean;
         vardatadef: trecorddef;
         vardatadef: trecorddef;
@@ -228,21 +230,21 @@ interface
         procedure append_labelentry_ref(attr : tdwarf_attribute;sym : tasmsymbol);
         procedure append_labelentry_ref(attr : tdwarf_attribute;sym : tasmsymbol);
         procedure append_labelentry_data(attr : tdwarf_attribute;sym : tasmsymbol);
         procedure append_labelentry_data(attr : tdwarf_attribute;sym : tasmsymbol);
 
 
-        procedure appendtag(list:TAsmList;def:tdef);
-        procedure appendtag_orddef(def:torddef); virtual;
-        procedure appendtag_floatdef(def:tfloatdef); virtual;
-        procedure appendtag_filedef(def:tfiledef); virtual;
-        procedure appendtag_enumdef(def:tenumdef); virtual;
-        procedure appendtag_arraydef(def:tarraydef); virtual;
-        procedure appendtag_recorddef(def:trecorddef); virtual;
-        procedure appendtag_objectdef(def:tobjectdef); virtual; abstract;
-        procedure appendtag_pointerdef(def:tpointerdef); virtual;
-        procedure appendtag_stringdef(def:tstringdef); virtual;
-        procedure appendtag_procvardef(def:tprocvardef); virtual;
-        procedure appendtag_variantdef(def:tvariantdef); virtual; abstract;
-        procedure appendtag_setdef(def:tsetdef); virtual; abstract;
-        procedure appendtag_formaldef(def:tformaldef); virtual;
-        procedure appendtag_undefineddef(def:tundefineddef); virtual; abstract;
+        procedure appenddef(def:tdef);
+        procedure appenddef_ord(def:torddef); virtual;
+        procedure appenddef_float(def:tfloatdef); virtual;
+        procedure appenddef_file(def:tfiledef); virtual;
+        procedure appenddef_enum(def:tenumdef); virtual;
+        procedure appenddef_array(def:tarraydef); virtual;
+        procedure appenddef_record(def:trecorddef); virtual;
+        procedure appenddef_object(def:tobjectdef); virtual; abstract;
+        procedure appenddef_pointer(def:tpointerdef); virtual;
+        procedure appenddef_string(def:tstringdef); virtual;
+        procedure appenddef_procvar(def:tprocvardef); virtual;
+        procedure appenddef_variant(def:tvariantdef); virtual; abstract;
+        procedure appenddef_set(def:tsetdef); virtual; abstract;
+        procedure appenddef_formal(def:tformaldef); virtual;
+        procedure appenddef_unineddef(def:tundefineddef); virtual; abstract;
 
 
 
 
         procedure appendsym(sym:tsym);
         procedure appendsym(sym:tsym);
@@ -259,24 +261,22 @@ interface
 
 
         procedure appendprocdef(pd:tprocdef); virtual;
         procedure appendprocdef(pd:tprocdef); virtual;
 
 
-        procedure enum_members_callback(p:Tnamedindexitem;arg:pointer);
+        procedure enum_membersyms_callback(p:Tnamedindexitem;arg:pointer);
 
 
         procedure finish_children;
         procedure finish_children;
         procedure finish_entry;
         procedure finish_entry;
-
-        procedure insertdef_dependency(list:TAsmList;def:tdef); virtual;
       public
       public
         constructor Create;override;
         constructor Create;override;
         destructor Destroy;override;
         destructor Destroy;override;
 
 
-        procedure insertdef(list:TAsmList;def:tdef);override;
+        procedure insertdef(unused:TAsmList;def:tdef);override;
 
 
         procedure insertmoduleinfo;override;
         procedure insertmoduleinfo;override;
         procedure inserttypeinfo;override;
         procedure inserttypeinfo;override;
         procedure referencesections(list:TAsmList);override;
         procedure referencesections(list:TAsmList);override;
         procedure insertlineinfo(list:TAsmList);override;
         procedure insertlineinfo(list:TAsmList);override;
         function  dwarf_version: Word; virtual; abstract;
         function  dwarf_version: Word; virtual; abstract;
-        procedure write_symtable_defs(list:TAsmList;st:tsymtable);override;
+        procedure write_symtable_defs(unused:TAsmList;st:tsymtable);override;
       end;
       end;
 
 
       { TDebugInfoDwarf2 }
       { TDebugInfoDwarf2 }
@@ -284,12 +284,12 @@ interface
       TDebugInfoDwarf2 = class(TDebugInfoDwarf)
       TDebugInfoDwarf2 = class(TDebugInfoDwarf)
       private
       private
       protected
       protected
-        procedure appendtag_filedef(def:tfiledef); override;
-        procedure appendtag_formaldef(def:tformaldef); override;
-        procedure appendtag_objectdef(def:tobjectdef); override;
-        procedure appendtag_setdef(def:tsetdef); override;
-        procedure appendtag_undefineddef(def:tundefineddef); override;
-        procedure appendtag_variantdef(def:tvariantdef); override;
+        procedure appenddef_file(def:tfiledef); override;
+        procedure appenddef_formal(def:tformaldef); override;
+        procedure appenddef_object(def:tobjectdef); override;
+        procedure appenddef_set(def:tsetdef); override;
+        procedure appenddef_unineddef(def:tundefineddef); override;
+        procedure appenddef_variant(def:tvariantdef); override;
       public
       public
         function  dwarf_version: Word; override;
         function  dwarf_version: Word; override;
       end;
       end;
@@ -298,16 +298,13 @@ interface
 
 
       TDebugInfoDwarf3 = class(TDebugInfoDwarf)
       TDebugInfoDwarf3 = class(TDebugInfoDwarf)
       private
       private
-        procedure property_write_defs(p :tnamedindexitem;arg:pointer);
       protected
       protected
-        procedure appendtag_filedef(def:tfiledef); override;
-        procedure appendtag_formaldef(def:tformaldef); override;
-        procedure appendtag_objectdef(def:tobjectdef); override;
-        procedure appendtag_setdef(def:tsetdef); override;
-        procedure appendtag_undefineddef(def:tundefineddef); override;
-        procedure appendtag_variantdef(def:tvariantdef); override;
-
-        procedure insertdef_dependency(list:TAsmList;def:tdef); override;
+        procedure appenddef_file(def:tfiledef); override;
+        procedure appenddef_formal(def:tformaldef); override;
+        procedure appenddef_object(def:tobjectdef); override;
+        procedure appenddef_set(def:tsetdef); override;
+        procedure appenddef_unineddef(def:tundefineddef); override;
+        procedure appenddef_variant(def:tvariantdef); override;
       public
       public
         function  dwarf_version: Word; override;
         function  dwarf_version: Word; override;
       end;
       end;
@@ -613,10 +610,6 @@ end;
 
 
     function TDebugInfoDwarf.def_dwarf_lab(def:tdef) : tasmsymbol;
     function TDebugInfoDwarf.def_dwarf_lab(def:tdef) : tasmsymbol;
       begin
       begin
-        { dwarf must already be written, or we must be busy writing it }
-        if writing_def_dwarf and
-           not(def.dbg_state in [dbg_state_writing,dbg_state_written]) then
-          internalerror(200601241);
         { Keep track of used dwarf entries, this info is only usefull for dwarf entries
         { Keep track of used dwarf entries, this info is only usefull for dwarf entries
           referenced by the symbols. Definitions will always include all
           referenced by the symbols. Definitions will always include all
           required stabs }
           required stabs }
@@ -645,6 +638,8 @@ end;
                   end
                   end
                 else
                 else
                   current_asmdata.getdatalabel(TAsmLabel(def.dwarf_lab));
                   current_asmdata.getdatalabel(TAsmLabel(def.dwarf_lab));
+                if def.dbg_state=dbg_state_used then
+                  deftowritelist.Add(def);
               end;
               end;
             defnumberlist.Add(def);
             defnumberlist.Add(def);
           end;
           end;
@@ -671,6 +666,18 @@ end;
         inherited Destroy;
         inherited Destroy;
       end;
       end;
 
 
+    procedure TDebugInfoDwarf.enum_membersyms_callback(p: Tnamedindexitem; arg: pointer);
+      begin
+        case tsym(p).typ of
+          fieldvarsym:
+            appendsym_fieldvar(tfieldvarsym(p));
+          propertysym:
+            appendsym_property(tpropertysym(p));
+          procsym:
+            appendsym_proc(tprocsym(p));
+        end;
+      end;
+
     function TDebugInfoDwarf.get_file_index(afile: tinputfile): Integer;
     function TDebugInfoDwarf.get_file_index(afile: tinputfile): Integer;
       var
       var
         dirname: String;
         dirname: String;
@@ -892,20 +899,7 @@ end;
         current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(0));
         current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(0));
       end;
       end;
 
 
-
-    procedure TDebugInfoDwarf.enum_members_callback(p: Tnamedindexitem; arg: pointer);
-      begin
-        case tsym(p).typ of
-          fieldvarsym:
-            appendsym_fieldvar(tfieldvarsym(p));
-          propertysym:
-            appendsym_property(tpropertysym(p));
-          procsym:
-            appendsym_proc(tprocsym(p));
-        end;
-      end;
-
-    procedure TDebugInfoDwarf.appendtag_orddef(def:torddef);
+    procedure TDebugInfoDwarf.appenddef_ord(def:torddef);
       begin
       begin
         case def.typ of
         case def.typ of
           s8bit,
           s8bit,
@@ -1043,7 +1037,7 @@ end;
         end;
         end;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf.appendtag_floatdef(def:tfloatdef);
+    procedure TDebugInfoDwarf.appenddef_float(def:tfloatdef);
       begin
       begin
         case def.typ of
         case def.typ of
           s32real,
           s32real,
@@ -1091,13 +1085,13 @@ end;
         finish_entry;
         finish_entry;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf.appendtag_formaldef(def: tformaldef);
+    procedure TDebugInfoDwarf.appenddef_formal(def: tformaldef);
       begin
       begin
         { implemented in derived classes }
         { implemented in derived classes }
       end;
       end;
 
 
 
 
-    procedure TDebugInfoDwarf.appendtag_enumdef(def:tenumdef);
+    procedure TDebugInfoDwarf.appenddef_enum(def:tenumdef);
       var
       var
         hp : tenumsym;
         hp : tenumsym;
       begin
       begin
@@ -1129,13 +1123,13 @@ end;
         finish_children;
         finish_children;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf.appendtag_filedef(def: tfiledef);
+    procedure TDebugInfoDwarf.appenddef_file(def: tfiledef);
       begin
       begin
         { implemented in derived classes }
         { implemented in derived classes }
       end;
       end;
 
 
 
 
-    procedure TDebugInfoDwarf.appendtag_arraydef(def:tarraydef);
+    procedure TDebugInfoDwarf.appenddef_array(def:tarraydef);
       var
       var
         size : aint;
         size : aint;
         elesize : aint;
         elesize : aint;
@@ -1198,7 +1192,7 @@ end;
       end;
       end;
 
 
 
 
-    procedure TDebugInfoDwarf.appendtag_recorddef(def:trecorddef);
+    procedure TDebugInfoDwarf.appenddef_record(def:trecorddef);
       begin
       begin
         if assigned(def.typesym) then
         if assigned(def.typesym) then
           append_entry(DW_TAG_structure_type,true,[
           append_entry(DW_TAG_structure_type,true,[
@@ -1210,12 +1204,12 @@ end;
             DW_AT_byte_size,DW_FORM_udata,def.size
             DW_AT_byte_size,DW_FORM_udata,def.size
             ]);
             ]);
         finish_entry;
         finish_entry;
-        def.symtable.foreach(@enum_members_callback,nil);
+        def.symtable.foreach(@enum_membersyms_callback,nil);
         finish_children;
         finish_children;
       end;
       end;
 
 
 
 
-    procedure TDebugInfoDwarf.appendtag_pointerdef(def:tpointerdef);
+    procedure TDebugInfoDwarf.appenddef_pointer(def:tpointerdef);
       begin
       begin
         append_entry(DW_TAG_pointer_type,false,[]);
         append_entry(DW_TAG_pointer_type,false,[]);
         if not(is_voidpointer(def)) then
         if not(is_voidpointer(def)) then
@@ -1224,7 +1218,7 @@ end;
       end;
       end;
 
 
 
 
-    procedure TDebugInfoDwarf.appendtag_stringdef(def:tstringdef);
+    procedure TDebugInfoDwarf.appenddef_string(def:tstringdef);
       var
       var
         slen : aint;
         slen : aint;
         arr : tasmlabel;
         arr : tasmlabel;
@@ -1310,7 +1304,7 @@ end;
         end;
         end;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf.appendtag_procvardef(def:tprocvardef);
+    procedure TDebugInfoDwarf.appenddef_procvar(def:tprocvardef);
 
 
       procedure doappend;
       procedure doappend;
         var
         var
@@ -1384,153 +1378,77 @@ end;
           doappend;
           doappend;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf.appendtag(list:TAsmList;def:tdef);
+    procedure TDebugInfoDwarf.appenddef(def:tdef);
       var
       var
         labsym : tasmsymbol;
         labsym : tasmsymbol;
       begin
       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;
+
         current_asmdata.asmlists[al_dwarf_info].concat(tai_comment.Create(strpnew('Definition '+def.typename)));
         current_asmdata.asmlists[al_dwarf_info].concat(tai_comment.Create(strpnew('Definition '+def.typename)));
         labsym:=def_dwarf_lab(def);
         labsym:=def_dwarf_lab(def);
         if df_has_dwarf_dbg_info in def.defoptions then
         if df_has_dwarf_dbg_info in def.defoptions then
-          list.concat(tai_symbol.create_global(labsym,0))
+          current_asmdata.asmlists[al_dwarf_info].concat(tai_symbol.create_global(labsym,0))
         else
         else
-          list.concat(tai_symbol.create(labsym,0));
+          current_asmdata.asmlists[al_dwarf_info].concat(tai_symbol.create(labsym,0));
+          
         case def.deftype of
         case def.deftype of
           stringdef :
           stringdef :
-            appendtag_stringdef(tstringdef(def));
+            appenddef_string(tstringdef(def));
           enumdef :
           enumdef :
-            appendtag_enumdef(tenumdef(def));
+            appenddef_enum(tenumdef(def));
           orddef :
           orddef :
-            appendtag_orddef(torddef(def));
+            appenddef_ord(torddef(def));
           pointerdef :
           pointerdef :
-            appendtag_pointerdef(tpointerdef(def));
+            appenddef_pointer(tpointerdef(def));
           floatdef :
           floatdef :
-            appendtag_floatdef(tfloatdef(def));
+            appenddef_float(tfloatdef(def));
           filedef :
           filedef :
-            appendtag_filedef(tfiledef(def));
+            appenddef_file(tfiledef(def));
           recorddef :
           recorddef :
-            appendtag_recorddef(trecorddef(def));
+            appenddef_record(trecorddef(def));
           variantdef :
           variantdef :
-            appendtag_variantdef(tvariantdef(def));
+            appenddef_variant(tvariantdef(def));
           classrefdef :
           classrefdef :
-            appendtag_pointerdef(tpointerdef(pvmttype.def));
+            appenddef_pointer(tpointerdef(pvmttype.def));
           setdef :
           setdef :
-            appendtag_setdef(tsetdef(def));
+            appenddef_set(tsetdef(def));
           formaldef :
           formaldef :
-            appendtag_formaldef(tformaldef(def));
+            appenddef_formal(tformaldef(def));
           arraydef :
           arraydef :
-            appendtag_arraydef(tarraydef(def));
+            appenddef_array(tarraydef(def));
           procvardef :
           procvardef :
-            appendtag_procvardef(tprocvardef(def));
+            appenddef_procvar(tprocvardef(def));
           objectdef :
           objectdef :
-            appendtag_objectdef(tobjectdef(def));
+            appenddef_object(tobjectdef(def));
           undefineddef :
           undefineddef :
-            appendtag_undefineddef(tundefineddef(def));
+            appenddef_unineddef(tundefineddef(def));
         else
         else
           internalerror(200601281);
           internalerror(200601281);
         end;
         end;
-      end;
-
-
-    procedure TDebugInfoDwarf.insertdef(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;
-        { write dependencies first }
-        insertdef_dependency(list, def);
-
-        appendtag(list,def);
 
 
-        def.dbg_state:=dbg_state_written;
+        def.dbg_state := dbg_state_written;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf.insertdef_dependency(list: TAsmList; def: tdef);
-      var
-        anc : tobjectdef;
-        oldtypesym : tsym;
-        i : longint;
+
+    procedure TDebugInfoDwarf.insertdef(unused:TAsmList; def:tdef);
       begin
       begin
-        case def.deftype of
-          stringdef :
-            begin
-              { todo: check if these are needed or valid for dwarf3 (MWE)}
-              if tstringdef(def).string_typ=st_widestring then
-                insertdef(list,cwidechartype.def)
-              else
-                begin
-                  insertdef(list,cchartype.def);
-                  insertdef(list,u8inttype.def);
-                end;
-            end;
-          floatdef :
-            insertdef(list,s32inttype.def);
-          filedef :
-            begin
-              { todo: check if these are needed or valid for dwarf3 (MWE)}
-              insertdef(list,s32inttype.def);
-              if isdwarf64 then
-                insertdef(list,s64inttype.def);
-              insertdef(list,u8inttype.def);
-              insertdef(list,cchartype.def);
-            end;
-          classrefdef :
-            insertdef(list,pvmttype.def);
-          pointerdef :
-            insertdef(list,tpointerdef(def).pointertype.def);
-          setdef :
-            if assigned(tsetdef(def).elementtype.def) then
-              insertdef(list,tsetdef(def).elementtype.def);
-          procvardef:
-            begin
-              insertdef(list,tprocvardef(def).rettype.def);
-              if tprocvardef(def).is_methodpointer then
-                insertdef(list,class_tobject);
-              { parameters }
-              for i:=0 to tprocvardef(def).paras.count-1 do
-                insertdef(list,tparavarsym(tprocvardef(def).paras[i]).vartype.def);
-            end;
-          procdef :
-            insertdef(list,tprocdef(def).rettype.def);
-          enumdef :
-            if assigned(tenumdef(def).basedef) then
-              insertdef(list,tenumdef(def).basedef);
-          arraydef :
-            begin
-              insertdef(list,tarraydef(def).rangetype.def);
-              insertdef(list,tarraydef(def).elementtype.def);
-            end;
-          recorddef :
-            trecorddef(def).symtable.foreach(@field_write_defs,list);
-          variantdef :
-            trecorddef(vardatadef).symtable.foreach(@field_write_defs,list);
-          objectdef :
-            begin
-              { todo: check if vmtarraytype is needed or valid for dwarf3 (MWE)}
-              insertdef(list,vmtarraytype.def);
-              { first the parents }
-              anc:=tobjectdef(def);
-              while assigned(anc.childof) do
-                begin
-                  anc:=anc.childof;
-                  insertdef(list,anc);
-                end;
-              tobjectdef(def).symtable.foreach(@field_write_defs,list);
-              tobjectdef(def).symtable.foreach(@method_write_defs,list);
-            end;
-        end;
+        appenddef(def);
       end;
       end;
 
 
+    procedure TDebugInfoDwarf.write_symtable_defs(unused:TAsmList;st:tsymtable);
 
 
-    procedure TDebugInfoDwarf.write_symtable_defs(list:TAsmList;st:tsymtable);
-
-       procedure dowritedwarf(list:TAsmList;st:tsymtable);
+       procedure dowritedwarf(st:tsymtable);
          var
          var
            p : tdef;
            p : tdef;
          begin
          begin
@@ -1538,7 +1456,8 @@ end;
            while assigned(p) do
            while assigned(p) do
              begin
              begin
                if (p.dbg_state=dbg_state_used) then
                if (p.dbg_state=dbg_state_used) then
-                 insertdef(list,p);
+                 appenddef(p);
+
                p:=tdef(p.indexnext);
                p:=tdef(p.indexnext);
              end;
              end;
          end;
          end;
@@ -1548,19 +1467,19 @@ end;
       begin
       begin
         case st.symtabletype of
         case st.symtabletype of
           staticsymtable :
           staticsymtable :
-            list.concat(tai_comment.Create(strpnew('Defs - Begin Staticsymtable')));
+            current_asmdata.asmlists[al_dwarf_info].concat(tai_comment.Create(strpnew('Defs - Begin Staticsymtable')));
           globalsymtable :
           globalsymtable :
-            list.concat(tai_comment.Create(strpnew('Defs - Begin unit '+st.name^+' has index '+tostr(st.moduleid))));
+            current_asmdata.asmlists[al_dwarf_info].concat(tai_comment.Create(strpnew('Defs - Begin unit '+st.name^+' has index '+tostr(st.moduleid))));
         end;
         end;
         old_writing_def_dwarf:=writing_def_dwarf;
         old_writing_def_dwarf:=writing_def_dwarf;
         writing_def_dwarf:=true;
         writing_def_dwarf:=true;
-        dowritedwarf(list,st);
+        dowritedwarf(st);
         writing_def_dwarf:=old_writing_def_dwarf;
         writing_def_dwarf:=old_writing_def_dwarf;
         case st.symtabletype of
         case st.symtabletype of
           staticsymtable :
           staticsymtable :
-            list.concat(tai_comment.Create(strpnew('Defs - End Staticsymtable')));
+            current_asmdata.asmlists[al_dwarf_info].concat(tai_comment.Create(strpnew('Defs - End Staticsymtable')));
           globalsymtable :
           globalsymtable :
-            list.concat(tai_comment.Create(strpnew('Defs - End unit '+st.name^+' has index '+tostr(st.moduleid))));
+            current_asmdata.asmlists[al_dwarf_info].concat(tai_comment.Create(strpnew('Defs - End unit '+st.name^+' has index '+tostr(st.moduleid))));
         end;
         end;
       end;
       end;
 
 
@@ -1633,10 +1552,10 @@ end;
 
 
             { last write the types from this procdef }
             { last write the types from this procdef }
             if assigned(pd.parast) then
             if assigned(pd.parast) then
-              write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],pd.parast);
+              write_symtable_defs(nil,pd.parast);
             if assigned(pd.localst) and
             if assigned(pd.localst) and
                (pd.localst.symtabletype=localsymtable) then
                (pd.localst.symtabletype=localsymtable) then
-              write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],pd.localst);
+              write_symtable_defs(nil,pd.localst);
 
 
             finish_children;
             finish_children;
           end;
           end;
@@ -1883,6 +1802,12 @@ end;
           ]);
           ]);
           append_labelentry_ref(DW_AT_type,def_dwarf_lab(sym.restype.def));
           append_labelentry_ref(DW_AT_type,def_dwarf_lab(sym.restype.def));
           finish_entry;
           finish_entry;
+          
+          { Moved fom append sym, do we need this (MWE)
+          { For object types write also the symtable entries }
+          if (sym.typ=typesym) and (ttypesym(sym).restype.def.deftype=objectdef) then
+            write_symtable_syms(list,tobjectdef(ttypesym(sym).restype.def).symtable);
+          }
         end;
         end;
 
 
       procedure TDebugInfoDwarf.appendsym_unit(sym: tunitsym);
       procedure TDebugInfoDwarf.appendsym_unit(sym: tunitsym);
@@ -1951,8 +1876,10 @@ end;
         end;
         end;
 
 
     procedure TDebugInfoDwarf.appendsym(sym:tsym);
     procedure TDebugInfoDwarf.appendsym(sym:tsym);
-
       begin
       begin
+        if sym.isdbgwritten then
+          exit;
+
         current_asmdata.asmlists[al_dwarf_info].concat(tai_comment.Create(strpnew('Symbol '+sym.name)));
         current_asmdata.asmlists[al_dwarf_info].concat(tai_comment.Create(strpnew('Symbol '+sym.name)));
         case sym.typ of
         case sym.typ of
           globalvarsym :
           globalvarsym :
@@ -1992,12 +1919,7 @@ end;
               internalerror(200601242);
               internalerror(200601242);
             end;
             end;
         end;
         end;
-        {
-        { For object types write also the symtable entries }
-        if (sym.typ=typesym) and (ttypesym(sym).restype.def.deftype=objectdef) then
-          write_symtable_syms(list,tobjectdef(ttypesym(sym).restype.def).symtable);
-        sym.isstabwritten:=true;
-        }
+        sym.isdbgwritten:=true;
       end;
       end;
 
 
 
 
@@ -2011,7 +1933,7 @@ end;
         p:=tsym(st.symindex.first);
         p:=tsym(st.symindex.first);
         while assigned(p) do
         while assigned(p) do
           begin
           begin
-            if (not p.isstabwritten) then
+            if (not p.isdbgwritten) then
               appendsym(p);
               appendsym(p);
             p:=tsym(p.indexnext);
             p:=tsym(p.indexnext);
           end;
           end;
@@ -2179,10 +2101,48 @@ end;
 
 
 
 
     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(def)
+                  else
+                    internalerror(200610054);
+                  end;
+                end;
+              looplist.clear;
+              templist := looplist;
+              looplist := deftowritelist;
+            end;
+          templist.free;
+        end;
+
+    
       var
       var
         storefilepos  : tfileposinfo;
         storefilepos  : tfileposinfo;
         lenstartlabel : tasmlabel;
         lenstartlabel : tasmlabel;
         i : longint;
         i : longint;
+        def: tdef;
       begin
       begin
         storefilepos:=aktfilepos;
         storefilepos:=aktfilepos;
         aktfilepos:=current_module.mainfilepos;
         aktfilepos:=current_module.mainfilepos;
@@ -2190,8 +2150,11 @@ end;
         currabbrevnumber:=0;
         currabbrevnumber:=0;
         writing_def_dwarf:=false;
         writing_def_dwarf:=false;
 
 
+        { not used (MWE)
         nextdefnumber:=0;
         nextdefnumber:=0;
+        }
         defnumberlist:=TFPObjectList.create(false);
         defnumberlist:=TFPObjectList.create(false);
+        deftowritelist:=TFPObjectList.create(false);
 
 
         { not exported (FK)
         { not exported (FK)
         filerecdef:=gettypedef('FILEREC');
         filerecdef:=gettypedef('FILEREC');
@@ -2265,6 +2228,9 @@ end;
           write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],current_module.globalsymtable);
           write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],current_module.globalsymtable);
         if assigned(current_module.localsymtable) then
         if assigned(current_module.localsymtable) then
           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_to_write;
 
 
         { close compilation unit entry }
         { close compilation unit entry }
         finish_children;
         finish_children;
@@ -2279,16 +2245,19 @@ end;
         { reset all def labels }
         { reset all def labels }
         for i:=0 to defnumberlist.count-1 do
         for i:=0 to defnumberlist.count-1 do
           begin
           begin
-            if assigned(defnumberlist[i]) then
+            def := tdef(defnumberlist[i]);
+            if assigned(def) then
               begin
               begin
-                tdef(defnumberlist[i]).dwarf_lab:=nil;
-                tdef(defnumberlist[i]).dbg_state:=dbg_state_unused;
+                def.dwarf_lab:=nil;
+                def.dbg_state:=dbg_state_unused;
               end;
               end;
           end;
           end;
 
 
         defnumberlist.free;
         defnumberlist.free;
         defnumberlist:=nil;
         defnumberlist:=nil;
-
+        deftowritelist.free;
+        deftowritelist:=nil;
+        
         aktfilepos:=storefilepos;
         aktfilepos:=storefilepos;
       end;
       end;
 
 
@@ -2446,7 +2415,7 @@ end;
 
 
 ****************************************************************************}
 ****************************************************************************}
 
 
-    procedure TDebugInfoDwarf2.appendtag_filedef(def: tfiledef);
+    procedure TDebugInfoDwarf2.appenddef_file(def: tfiledef);
       begin
       begin
         { gdb 6.4 doesn't support files so far so we use some fake recorddef
         { gdb 6.4 doesn't support files so far so we use some fake recorddef
           file recs. are less than 1k so using data2 is enough }
           file recs. are less than 1k so using data2 is enough }
@@ -2462,7 +2431,7 @@ end;
         finish_entry;
         finish_entry;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf2.appendtag_formaldef(def: tformaldef);
+    procedure TDebugInfoDwarf2.appenddef_formal(def: tformaldef);
       begin
       begin
         { gdb 6.4 doesn't support DW_TAG_unspecified_type so we
         { gdb 6.4 doesn't support DW_TAG_unspecified_type so we
           replace it with a unsigned type with size 0 (FK)
           replace it with a unsigned type with size 0 (FK)
@@ -2475,7 +2444,7 @@ end;
         finish_entry;
         finish_entry;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf2.appendtag_objectdef(def: tobjectdef);
+    procedure TDebugInfoDwarf2.appenddef_object(def: tobjectdef);
       procedure doappend;
       procedure doappend;
         begin
         begin
           if assigned(def.objname) then
           if assigned(def.objname) then
@@ -2500,9 +2469,7 @@ end;
               finish_entry;
               finish_entry;
             end;
             end;
 
 
-          def.symtable.foreach(@enum_members_callback,nil);
-          write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],def.symtable);
-
+          def.symtable.foreach(@enum_membersyms_callback,nil);
           finish_children;
           finish_children;
         end;
         end;
 
 
@@ -2534,7 +2501,7 @@ end;
         end;
         end;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf2.appendtag_setdef(def: tsetdef);
+    procedure TDebugInfoDwarf2.appenddef_set(def: tsetdef);
       begin
       begin
         { at least gdb up to 6.4 doesn't support sets in dwarf, there is a patch available to fix this:
         { at least gdb up to 6.4 doesn't support sets in dwarf, there is a patch available to fix this:
           http://sources.redhat.com/ml/gdb-patches/2005-05/msg00278.html (FK) }
           http://sources.redhat.com/ml/gdb-patches/2005-05/msg00278.html (FK) }
@@ -2553,7 +2520,7 @@ end;
         finish_entry;
         finish_entry;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf2.appendtag_undefineddef(def: tundefineddef);
+    procedure TDebugInfoDwarf2.appenddef_unineddef(def: tundefineddef);
       begin
       begin
         { gdb 6.4 doesn't support DW_TAG_unspecified_type so we
         { gdb 6.4 doesn't support DW_TAG_unspecified_type so we
           replace it with a unsigned type with size 0 (FK)
           replace it with a unsigned type with size 0 (FK)
@@ -2566,10 +2533,10 @@ end;
         finish_entry;
         finish_entry;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf2.appendtag_variantdef(def: tvariantdef);
+    procedure TDebugInfoDwarf2.appenddef_variant(def: tvariantdef);
       begin
       begin
         { variants aren't known to dwarf2 but writting tvardata should be enough }
         { variants aren't known to dwarf2 but writting tvardata should be enough }
-        appendtag_recorddef(trecorddef(vardatadef));
+        appenddef_record(trecorddef(vardatadef));
       end;
       end;
 
 
     function TDebugInfoDwarf2.dwarf_version: Word;
     function TDebugInfoDwarf2.dwarf_version: Word;
@@ -2581,7 +2548,7 @@ end;
                               TDebugInfoDwarf3
                               TDebugInfoDwarf3
 ****************************************************************************}
 ****************************************************************************}
 
 
-    procedure TDebugInfoDwarf3.appendtag_filedef(def: tfiledef);
+    procedure TDebugInfoDwarf3.appenddef_file(def: tfiledef);
       begin
       begin
         if assigned(def.typesym) then
         if assigned(def.typesym) then
           append_entry(DW_TAG_file_type,false,[
           append_entry(DW_TAG_file_type,false,[
@@ -2597,14 +2564,14 @@ end;
         finish_entry;
         finish_entry;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf3.appendtag_formaldef(def: tformaldef);
+    procedure TDebugInfoDwarf3.appenddef_formal(def: tformaldef);
       begin
       begin
         append_entry(DW_TAG_unspecified_type,false,[
         append_entry(DW_TAG_unspecified_type,false,[
           ]);
           ]);
         finish_entry;
         finish_entry;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf3.appendtag_objectdef(def: tobjectdef);
+    procedure TDebugInfoDwarf3.appenddef_object(def: tobjectdef);
 
 
       procedure dostruct(tag: tdwarf_tag);
       procedure dostruct(tag: tdwarf_tag);
         begin
         begin
@@ -2696,11 +2663,11 @@ end;
             end;
             end;
 
 
         { add members }
         { add members }
-        def.symtable.foreach(@enum_members_callback,nil);
+        def.symtable.foreach(@enum_membersyms_callback,nil);
         finish_children;
         finish_children;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf3.appendtag_setdef(def: tsetdef);
+    procedure TDebugInfoDwarf3.appenddef_set(def: tsetdef);
       begin
       begin
         if assigned(def.typesym) then
         if assigned(def.typesym) then
           append_entry(DW_TAG_set_type,false,[
           append_entry(DW_TAG_set_type,false,[
@@ -2711,11 +2678,12 @@ end;
           append_entry(DW_TAG_set_type,false,[
           append_entry(DW_TAG_set_type,false,[
             DW_AT_byte_size,DW_FORM_data2,def.size
             DW_AT_byte_size,DW_FORM_data2,def.size
             ]);
             ]);
-        append_labelentry_ref(DW_AT_type,def_dwarf_lab(tsetdef(def).elementtype.def));
+        if assigned(tsetdef(def).elementtype.def) then
+          append_labelentry_ref(DW_AT_type,def_dwarf_lab(tsetdef(def).elementtype.def));
         finish_entry;
         finish_entry;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf3.appendtag_undefineddef(def: tundefineddef);
+    procedure TDebugInfoDwarf3.appenddef_unineddef(def: tundefineddef);
       begin
       begin
         { ??? can a undefined def have a typename ? }
         { ??? can a undefined def have a typename ? }
         if assigned(def.typesym) then
         if assigned(def.typesym) then
@@ -2728,7 +2696,7 @@ end;
         finish_entry;
         finish_entry;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf3.appendtag_variantdef(def: tvariantdef);
+    procedure TDebugInfoDwarf3.appenddef_variant(def: tvariantdef);
       const
       const
         VARIANTS: array[1..27] of record Value: Word; Name: String end = (
         VARIANTS: array[1..27] of record Value: Word; Name: String end = (
           (value:0;     name:''),
           (value:0;     name:''),
@@ -2817,28 +2785,6 @@ end;
         Result:=3;
         Result:=3;
       end;
       end;
 
 
-    procedure TDebugInfoDwarf3.insertdef_dependency(list: TAsmList; def: tdef);
-      begin
-        case def.deftype of
-          objectdef :
-            begin
-              inherited insertdef_dependency(list, def);
-              tobjectdef(def).symtable.foreach(@property_write_defs,list);
-            end;
-        else
-          inherited insertdef_dependency(list, def);
-        end;
-      end;
-
-    procedure TDebugInfoDwarf3.property_write_defs(p: tnamedindexitem; arg: pointer);
-      begin
-        if Tsym(p).typ <> propertysym then
-          exit;
-
-        insertdef(TAsmList(arg),tpropertysym(p).proptype.def);
-        if ppo_indexed in tpropertysym(p).propoptions then
-          insertdef(TAsmList(arg),tpropertysym(p).indextype.def);
-      end;
 
 
 {****************************************************************************
 {****************************************************************************
 ****************************************************************************}
 ****************************************************************************}

+ 2 - 2
compiler/dbgstabs.pas

@@ -1324,7 +1324,7 @@ implementation
         { For object types write also the symtable entries }
         { For object types write also the symtable entries }
         if (sym.typ=typesym) and (ttypesym(sym).restype.def.deftype=objectdef) then
         if (sym.typ=typesym) and (ttypesym(sym).restype.def.deftype=objectdef) then
           write_symtable_syms(list,tobjectdef(ttypesym(sym).restype.def).symtable);
           write_symtable_syms(list,tobjectdef(ttypesym(sym).restype.def).symtable);
-        sym.isstabwritten:=true;
+        sym.isdbgwritten:=true;
       end;
       end;
 
 
 
 
@@ -1341,7 +1341,7 @@ implementation
         p:=tsym(st.symindex.first);
         p:=tsym(st.symindex.first);
         while assigned(p) do
         while assigned(p) do
           begin
           begin
-            if (not p.isstabwritten) then
+            if (not p.isdbgwritten) then
               insertsym(list,p);
               insertsym(list,p);
             p:=tsym(p.indexnext);
             p:=tsym(p.indexnext);
           end;
           end;

+ 1 - 1
compiler/symsym.pas

@@ -413,7 +413,7 @@ implementation
          refs:=0;
          refs:=0;
          lastwritten:=nil;
          lastwritten:=nil;
          refcount:=0;
          refcount:=0;
-         isstabwritten := false;
+         isdbgwritten := false;
       end;
       end;
 
 
 
 

+ 2 - 2
compiler/symtype.pas

@@ -112,7 +112,7 @@ interface
          defref,
          defref,
          lastwritten : tref;
          lastwritten : tref;
          refcount    : longint;
          refcount    : longint;
-         isstabwritten : boolean;
+         isdbgwritten : boolean;
          constructor create(st:tsymtyp;const n : string);
          constructor create(st:tsymtyp;const n : string);
          destructor destroy;override;
          destructor destroy;override;
          function  realname:string;
          function  realname:string;
@@ -335,7 +335,7 @@ implementation
             inc(refcount);
             inc(refcount);
           end;
           end;
          lastref:=defref;
          lastref:=defref;
-         isstabwritten := false;
+         isdbgwritten := false;
          symoptions:=current_object_option;
          symoptions:=current_object_option;
       end;
       end;