Преглед на файлове

* generate advance_loc records only if there was code/data since the last advance_loc entry

git-svn-id: trunk@48686 -
florian преди 4 години
родител
ревизия
436a0d3f9e
променени са 1 файла, в които са добавени 17 реда и са изтрити 0 реда
  1. 17 0
      compiler/cfidwarf.pas

+ 17 - 0
compiler/cfidwarf.pas

@@ -542,9 +542,26 @@ implementation
     procedure TDwarfAsmCFILowLevel.cfa_advance_loc(list:TAsmList);
       var
         currloclabel : tasmlabel;
+        hp : tai;
       begin
         if FLastloclabel=nil then
           internalerror(200404082);
+        { search the list backwards and check if we really need an advance loc,
+          i.e. if real code/data has been generated since the last cfa_advance_loc
+          call
+        }
+        hp:=tai(list.Last);
+        while assigned(hp) do
+          begin
+            { if we encounter FLastloclabel without encountering code/data, see check below,
+              we do not need insert an advance_loc entry }
+            if (hp.typ=ait_label) and (tai_label(hp).labsym=FLastloclabel) then
+              exit;
+            { stop if we find any tai which results in code or data }
+            if not(hp.typ in ([ait_label]+SkipInstr)) then
+              break;
+            hp:=tai(hp.Previous);
+          end;
         current_asmdata.getlabel(currloclabel,alt_dbgframe);
         list.concat(tai_label.create(currloclabel));
         DwarfList.concat(tdwarfitem.create_reloffset(DW_CFA_advance_loc4,doe_32bit,FLastloclabel,currloclabel));