Forráskód Böngészése

Attempt to fix missing stabs definitions problem

git-svn-id: trunk@15238 -
pierre 15 éve
szülő
commit
11d6509a56
3 módosított fájl, 69 hozzáadás és 50 törlés
  1. 53 6
      compiler/dbgbase.pas
  2. 2 41
      compiler/dbgdwarf.pas
  3. 14 3
      compiler/dbgstabs.pas

+ 53 - 6
compiler/dbgbase.pas

@@ -37,6 +37,9 @@ interface
       TDebugInfo=class
       protected
         { definitions }
+        { collect all defs in one list so we can reset them easily }
+        defnumberlist      : TFPObjectList;
+        deftowritelist     : TFPObjectList;
         procedure appenddef(list:TAsmList;def:tdef);
         procedure beforeappenddef(list:TAsmList;def:tdef);virtual;
         procedure afterappenddef(list:TAsmList;def:tdef);virtual;
@@ -56,6 +59,7 @@ interface
         procedure appenddef_formal(list:TAsmList;def:tformaldef);virtual;
         procedure appenddef_undefined(list:TAsmList;def: tundefineddef);virtual;
         procedure appendprocdef(list:TAsmList;def:tprocdef);virtual;
+        procedure write_remaining_defs_to_write(list:TAsmList);
         { symbols }
         procedure appendsym(list:TAsmList;sym:tsym);
         procedure beforeappendsym(list:TAsmList;sym:tsym);virtual;
@@ -283,6 +287,42 @@ implementation
       end;
 
 
+    procedure TDebugInfo.write_remaining_defs_to_write(list:TAsmList);
+      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(list,def);
+                else
+                  internalerror(200610054);
+                end;
+              end;
+            looplist.clear;
+            templist := looplist;
+            looplist := deftowritelist;
+          end;
+        templist.free;
+      end;
+
+
 {**************************************
           Symbols
 **************************************}
@@ -396,6 +436,7 @@ implementation
       var
         def : tdef;
         i   : longint;
+        nonewadded : boolean;
       begin
         case st.symtabletype of
           staticsymtable :
@@ -403,12 +444,18 @@ implementation
           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
-            def:=tdef(st.DefList[i]);
-            if (def.dbg_state in [dbg_state_used,dbg_state_queued]) then
-              appenddef(list,def);
-          end;
+        repeat
+          nonewadded:=true;
+          for i:=0 to st.DefList.Count-1 do
+            begin
+              def:=tdef(st.DefList[i]);
+              if (def.dbg_state in [dbg_state_used,dbg_state_queued]) then
+                begin
+                  appenddef(list,def);
+                  nonewadded:=false;
+                end;
+            end;
+        until nonewadded;
         case st.symtabletype of
           staticsymtable :
             list.concat(tai_comment.Create(strpnew('Defs - End Staticsymtable')));

+ 2 - 41
compiler/dbgdwarf.pas

@@ -232,10 +232,6 @@ interface
       private
         currabbrevnumber : longint;
 
-        { collect all defs in one list so we can reset them easily }
-        defnumberlist,
-        deftowritelist   : TFPObjectList;
-
         { use this defs to create info for variants and file handles }
         { unused (MWE)
         filerecdef,
@@ -1333,7 +1329,7 @@ implementation
                       ]);
                   append_labelentry_ref(DW_AT_type,def_dwarf_lab(basedef));
                 end;
-                
+
               finish_entry;
             end;
           uvoid :
@@ -2901,41 +2897,6 @@ implementation
 
     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(nil,def)
-                  else
-                    internalerror(200610054);
-                  end;
-                end;
-              looplist.clear;
-              templist := looplist;
-              looplist := deftowritelist;
-            end;
-          templist.free;
-        end;
-
 
       var
         storefilepos  : tfileposinfo;
@@ -3044,7 +3005,7 @@ implementation
           write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],current_module.localsymtable);
 
         { write defs not written yet }
-        write_defs_to_write;
+        write_remaining_defs_to_write(current_asmdata.asmlists[al_dwarf_info]);
 
         { close compilation unit entry }
         finish_children;

+ 14 - 3
compiler/dbgstabs.pas

@@ -59,7 +59,6 @@ interface
       private
         writing_def_stabs  : boolean;
         global_stab_number : word;
-        defnumberlist      : TFPObjectList;
         vardatadef: trecorddef;
         { tsym writing }
         function  sym_var_value(const s:string;arg:pointer):string;
@@ -295,7 +294,10 @@ implementation
           referenced by the symbols. Definitions will always include all
           required stabs }
         if def.dbg_state=dbg_state_unused then
-          def.dbg_state:=dbg_state_used;
+          begin
+            def.dbg_state:=dbg_state_used;
+            deftowritelist.Add(def);
+          end;
         { Need a new number? }
         if def.stab_number=0 then
           begin
@@ -1348,8 +1350,12 @@ implementation
                         [c+def_stab_number(tprocdef(sym.owner.defowner)._class),tostr(sym.localloc.reference.offset)])
                 else
                   begin
+                    if (c='p') then
+                      c:='R'
+                    else
+                      c:='a';
                     regidx:=findreg_by_number(sym.localloc.register);
-                    ss:=sym_stabstr_evaluate(sym,'"$$t:r$1",${N_RSYM},0,0,$2',
+                    ss:=sym_stabstr_evaluate(sym,'"$$t:$1",${N_RSYM},0,0,$2',
                         [c+def_stab_number(tprocdef(sym.owner.defowner)._class),tostr(regstabs_table[regidx])]);
                   end
               end;
@@ -1493,6 +1499,7 @@ implementation
 
         global_stab_number:=0;
         defnumberlist:=TFPObjectlist.create(false);
+        deftowritelist:=TFPObjectlist.create(false);
         stabsvarlist:=TAsmList.create;
         stabstypelist:=TAsmList.create;
 
@@ -1532,6 +1539,8 @@ implementation
         if assigned(current_module.localsymtable) then
           write_symtable_defs(stabstypelist,current_module.localsymtable);
 
+        write_remaining_defs_to_write(stabstypelist);
+
         current_asmdata.asmlists[al_stabs].concatlist(stabstypelist);
         current_asmdata.asmlists[al_stabs].concatlist(stabsvarlist);
 
@@ -1547,6 +1556,8 @@ implementation
 
         defnumberlist.free;
         defnumberlist:=nil;
+        deftowritelist.free;
+        deftowritelist:=nil;
 
         stabsvarlist.free;
         stabstypelist.free;