Răsfoiți Sursa

+ dwarf: objectdef

git-svn-id: trunk@2429 -
florian 19 ani în urmă
părinte
comite
12730b4cb1
2 a modificat fișierele cu 62 adăugiri și 37 ștergeri
  1. 1 1
      compiler/dbgbase.pas
  2. 61 36
      compiler/dbgdwarf.pas

+ 1 - 1
compiler/dbgbase.pas

@@ -116,7 +116,7 @@ implementation
       var
         pd : tprocdef;
       begin
-        if tsym(p).typ = procsym then
+        if tsym(p).typ=procsym then
           begin
             pd:=tprocsym(p).first_procdef;
             insertdef(taasmoutput(arg),pd.rettype.def);

+ 61 - 36
compiler/dbgdwarf.pas

@@ -878,6 +878,65 @@ implementation
         end;
 
 
+      procedure append_dwarftag_objectdef(def:tobjectdef);
+
+        procedure doappend;
+          begin
+            if assigned(def.objname) then
+              append_entry(DW_TAG_structure_type,true,[
+                DW_AT_name,DW_FORM_string,def.objname^+#0,
+                DW_AT_byte_size,DW_FORM_udata,def.size
+                ])
+            else
+              append_entry(DW_TAG_structure_type,true,[
+                DW_AT_byte_size,DW_FORM_udata,def.size
+                ]);
+            finish_entry;
+            if assigned(def.childof) then
+              begin
+                append_entry(DW_TAG_inheritance,false,[
+                  DW_AT_accessibility,DW_FORM_data1,DW_ACCESS_public,
+                  DW_AT_data_member_location,DW_FORM_block1,1+lengthuleb128(0)
+                ]);
+                asmlist[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_plus_uconst)));
+                asmlist[al_dwarf_info].concat(tai_const.create_uleb128bit(0));
+                append_labelentry_ref(DW_AT_type,def_dwarf_lab(def.childof));
+                finish_entry;
+              end;
+
+            def.symtable.foreach(@field_add_dwarftag,nil);
+
+            finish_children;
+          end;
+
+        var
+          obj : tasmlabel;
+
+        begin
+          case def.objecttype of
+            odt_cppclass,
+            odt_object:
+              doappend;
+            odt_interfacecom,
+            odt_interfacecorba,
+            odt_dispinterface,
+            odt_class:
+              begin
+                objectlibrary.getdatalabel(obj);
+                { implicit pointer }
+                append_entry(DW_TAG_pointer_type,false,[]);
+                append_labelentry_ref(DW_AT_type,obj);
+                finish_entry;
+
+                asmlist[al_dwarf_info].concat(tai_symbol.create(obj,0));
+                doappend;
+              end;
+            else
+              internalerror(200602041);
+          end;
+        end;
+
+
       procedure append_dwarftag_pointerdef(def:tpointerdef);
         begin
           append_entry(DW_TAG_pointer_type,false,[]);
@@ -1164,43 +1223,9 @@ implementation
             end;
         end;
 
-        case def.deftype of
-          objectdef :
-            begin
-              { classes require special code to write the record and the invisible pointer }
-              if is_class(def) then
-                begin
-                  { Write the record class itself }
-                  tobjectdef(def).writing_class_record_dbginfo:=true;
-                  append_dwarftag(list,def);
-                  tobjectdef(def).writing_class_record_dbginfo:=false;
-                  { Write the invisible pointer class }
-                  oldtypesym:=def.typesym;
-                  def.typesym:=nil;
-                  append_dwarftag(list,def);
-                  def.typesym:=oldtypesym;
-                end
-              else
-                append_dwarftag(list,def);
-              { VMT symbol }
-              if (oo_has_vmt in tobjectdef(def).objectoptions) and
-                 assigned(def.owner) and
-                 assigned(def.owner.name) then
-                {
-                list.concat(Tai_stab.create(stab_stabs,strpnew('"vmt_'+def.owner.name^+tobjectdef(def).name+':S'+
-                       def_stab_number(vmttype.def)+'",'+tostr(N_STSYM)+',0,0,'+tobjectdef(def).vmt_mangledname)));
-                }
-                ;
-            end;
-          procdef :
-            begin
-              { procdefs are handled separatly }
-            end;
-          else
-            append_dwarftag(list,def);
-        end;
+        append_dwarftag(list,def);
 
-        def.dbg_state := dbg_state_written;
+        def.dbg_state:=dbg_state_written;
       end;