Prechádzať zdrojové kódy

* fixed constant symbol handling for dwarf

git-svn-id: trunk@2536 -
florian 19 rokov pred
rodič
commit
379617e90b
1 zmenil súbory, kde vykonal 42 pridanie a 4 odobranie
  1. 42 4
      compiler/dbgdwarf.pas

+ 42 - 4
compiler/dbgdwarf.pas

@@ -191,6 +191,10 @@ interface
       private
         currabbrevnumber : longint;
 
+        { collect all defs in one list so we can reset them easily }
+        nextdefnumber    : longint;
+        defnumberlist    : tlist;
+
         writing_def_dwarf : boolean;
 
         { use this defs to create info for variants and file handles }
@@ -437,6 +441,10 @@ implementation
         if def.dwarf_lab=nil then
           begin
             objectlibrary.getdatalabel(def.dwarf_lab);
+            if nextdefnumber>=defnumberlist.count then
+              defnumberlist.count:=nextdefnumber+250;
+            defnumberlist[nextdefnumber]:=def;
+            inc(nextdefnumber);
           end;
         result:=def.dwarf_lab;
       end;
@@ -1600,7 +1608,7 @@ implementation
               DW_AT_name,DW_FORM_string,sym.name+#0
               ]);
             { for string constants, consttype isn't set because they have no real type }
-            if sym.consttyp<>conststring then
+            if not(sym.consttyp in [conststring,constresourcestring]) then
               append_labelentry_ref(DW_AT_type,def_dwarf_lab(sym.consttype.def));
             asmlist[al_dwarf_abbrev].concat(tai_const.create_uleb128bit(ord(DW_AT_const_value)));
             case sym.consttyp of
@@ -1610,11 +1618,27 @@ implementation
                   asmlist[al_dwarf_info].concat(tai_string.create(strpas(pchar(sym.value.valueptr))));
                   asmlist[al_dwarf_info].concat(tai_const.create_8bit(0));
                 end;
+              constset,
+              constwstring,
+              constguid,
+              constresourcestring:
+                { ignore for now }
+                ;
               constord:
                 begin
                   asmlist[al_dwarf_abbrev].concat(tai_const.create_uleb128bit(ord(DW_FORM_sdata)));
                   asmlist[al_dwarf_info].concat(tai_const.create_sleb128bit(sym.value.valueord));
                 end;
+              constnil:
+                begin
+{$ifdef cpu64bit}
+                  asmlist[al_dwarf_abbrev].concat(tai_const.create_uleb128bit(ord(DW_FORM_data8)));
+                  asmlist[al_dwarf_info].concat(tai_const.create_64bit(0));
+{$else cpu64bit}
+                  asmlist[al_dwarf_abbrev].concat(tai_const.create_uleb128bit(ord(DW_FORM_data4)));
+                  asmlist[al_dwarf_info].concat(tai_const.create_32bit(0));
+{$endif cpu64bit}
+                end;
               constpointer:
                 begin
 {$ifdef cpu64bit}
@@ -1651,7 +1675,7 @@ implementation
                   end;
                 end;
               else
-                internalerror(200601291);
+                internalerror(200601292);
             end;
             finish_entry;
           end;
@@ -1790,8 +1814,6 @@ implementation
             end;
         end;
         {
-        if stabstr<>nil then
-          list.concat(Tai_stab.create(stab_stabs,stabstr));
         { 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);
@@ -1864,6 +1886,7 @@ implementation
      var
         storefilepos  : tfileposinfo;
         lenstartlabel : tasmlabel;
+        i : longint;
       begin
         storefilepos:=aktfilepos;
         aktfilepos:=current_module.mainfilepos;
@@ -1871,6 +1894,9 @@ implementation
         currabbrevnumber:=0;
         writing_def_dwarf:=false;
 
+        nextdefnumber:=0;
+        defnumberlist:=tlist.create;
+
         vardatadef:=search_system_type('TVARDATA').restype.def;
 
         { not exported (FK)
@@ -1937,6 +1963,18 @@ implementation
         { end of debug info table }
         asmlist[al_dwarf_info].concat(tai_const.create_8bit(0));
         asmlist[al_dwarf_info].concat(tai_symbol.createname('.Ledebug_info0',AT_DATA,0));
+       { reset all def labels }
+        for i:=0 to defnumberlist.count-1 do
+          begin
+            if assigned(defnumberlist[i]) then
+              begin
+                tdef(defnumberlist[i]).dwarf_lab:=nil;
+                tdef(defnumberlist[i]).dbg_state:=dbg_state_unused;
+              end;
+          end;
+
+        defnumberlist.free;
+        defnumberlist:=nil;
 
         aktfilepos:=storefilepos;
       end;