Browse Source

+ dwarf: procvardefs

git-svn-id: trunk@2426 -
florian 19 years ago
parent
commit
733875c108
1 changed files with 101 additions and 4 deletions
  1. 101 4
      compiler/dbgdwarf.pas

+ 101 - 4
compiler/dbgdwarf.pas

@@ -886,6 +886,82 @@ implementation
           finish_entry;
         end;
 
+      procedure append_dwarftag_procvardef(def:tprocvardef);
+
+        procedure doappend;
+          var
+            i : longint;
+          begin
+            if assigned(def.typesym) then
+              append_entry(DW_TAG_subroutine_type,true,[
+                DW_AT_name,DW_FORM_string,def.typesym.name+#0,
+                DW_AT_prototyped,DW_FORM_flag,true
+              ])
+            else
+              append_entry(DW_TAG_subroutine_type,true,[
+                DW_AT_prototyped,DW_FORM_flag,true
+              ]);
+            append_labelentry_ref(DW_AT_type,def_dwarf_lab(tprocvardef(def).rettype.def));
+
+            { write parameters }
+            for i:=0 to def.paras.count-1 do
+              begin
+                append_entry(DW_TAG_subroutine_type,false,[
+                  DW_AT_name,DW_FORM_string,tparavarsym(def.paras[i]).name+#0
+                ]);
+                append_labelentry_ref(DW_AT_type,def_dwarf_lab(tparavarsym(def.paras[i]).vartype.def));
+                finish_entry;
+              end;
+
+            finish_children;
+          end;
+
+        var
+          proc : tasmlabel;
+
+        begin
+          if def.is_methodpointer then
+            begin
+              { create a structure with two elements }
+              objectlibrary.getdatalabel(proc);
+              append_entry(DW_TAG_structure_type,true,[
+                DW_AT_byte_size,DW_FORM_data1,2*sizeof(aint)
+              ]);
+              finish_entry;
+
+              { proc entry }
+              append_entry(DW_TAG_member,false,[
+                DW_AT_name,DW_FORM_string,'PROC'#0,
+                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,proc);
+              finish_entry;
+
+              { self entry }
+              append_entry(DW_TAG_member,false,[
+                DW_AT_name,DW_FORM_string,'SELF'#0,
+                DW_AT_data_member_location,DW_FORM_block1,1+lengthuleb128(sizeof(aint))
+                ]);
+              asmlist[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_plus_uconst)));
+              asmlist[al_dwarf_info].concat(tai_const.create_uleb128bit(sizeof(aint)));
+              append_labelentry_ref(DW_AT_type,def_dwarf_lab(class_tobject));
+              finish_entry;
+
+              finish_children;
+
+              asmlist[al_dwarf_info].concat(tai_symbol.create(proc,0));
+              doappend;
+              finish_entry;
+            end
+          else
+            begin
+              doappend;
+              finish_entry;
+            end;
+        end;
+
 
       begin
         list.concat(tai_symbol.create(def_dwarf_lab(def),0));
@@ -984,13 +1060,25 @@ implementation
         {
           procdef :
             result:=procdef_stabstr(tprocdef(def));
+        }
           procvardef :
-            result:=strpnew('*f'+def_stab_number(tprocvardef(def).rettype.def));
+            append_dwarftag_procvardef(tprocvardef(def));
+        {
           objectdef :
             result:=objectdef_stabstr(tobjectdef(def));
-          undefineddef :
-            result:=def_stabstr_evaluate(def,'formal${numberstring};',[]);
         }
+          undefineddef :
+            begin
+              { gdb 6.4 doesn't support DW_TAG_unspecified_type so we
+                replace it with a unsigned type with size 0 (FK)
+              }
+              append_entry(DW_TAG_base_type,false,[
+                DW_AT_name,DW_FORM_string,'FormalDef'#0,
+                DW_AT_encoding,DW_FORM_data1,DW_ATE_unsigned,
+                DW_AT_byte_size,DW_FORM_data1,0
+              ]);
+              finish_entry;
+            end;
         else
           internalerror(200601281);
         end;
@@ -1001,6 +1089,7 @@ implementation
       var
         anc : tobjectdef;
         oldtypesym : tsym;
+        i : longint;
       begin
         if (def.dbg_state in [dbg_state_writing,dbg_state_written]) then
           exit;
@@ -1041,7 +1130,15 @@ implementation
             insertdef(list,tpointerdef(def).pointertype.def);
           setdef :
             insertdef(list,tsetdef(def).elementtype.def);
-          procvardef,
+          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
+                append_labelentry_ref(DW_AT_type,def_dwarf_lab(tparavarsym(tprocvardef(def).paras[i]).vartype.def));
+            end;
           procdef :
             insertdef(list,tprocdef(def).rettype.def);
           arraydef :