瀏覽代碼

* avoid overflows of execution weight

git-svn-id: trunk@39623 -
florian 7 年之前
父節點
當前提交
ea32ddd5b2
共有 3 個文件被更改,包括 33 次插入5 次删除
  1. 26 0
      compiler/cutils.pas
  2. 1 3
      compiler/pass_2.pas
  3. 6 2
      compiler/rgobj.pas

+ 26 - 0
compiler/cutils.pas

@@ -42,9 +42,11 @@ interface
     {# Returns the minimal value between @var(a) and @var(b) }
     {# Returns the minimal value between @var(a) and @var(b) }
     function min(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
     function min(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
     function min(a,b : int64) : int64;{$ifdef USEINLINE}inline;{$endif}
     function min(a,b : int64) : int64;{$ifdef USEINLINE}inline;{$endif}
+    function min(a,b : qword) : qword;{$ifdef USEINLINE}inline;{$endif}
     {# Returns the maximum value between @var(a) and @var(b) }
     {# Returns the maximum value between @var(a) and @var(b) }
     function max(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
     function max(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
     function max(a,b : int64) : int64;{$ifdef USEINLINE}inline;{$endif}
     function max(a,b : int64) : int64;{$ifdef USEINLINE}inline;{$endif}
+    function max(a,b : qword) : qword;{$ifdef USEINLINE}inline;{$endif}
 
 
     { These functions are intenionally put here and not in the constexp unit.
     { These functions are intenionally put here and not in the constexp unit.
       Since Tconstexprint may be automatically converted to int, which causes
       Since Tconstexprint may be automatically converted to int, which causes
@@ -227,6 +229,18 @@ implementation
       end;
       end;
 
 
 
 
+    function min(a,b : qword) : qword;
+    {
+      return the minimal of a and b
+    }
+      begin
+         if a<=b then
+           min:=a
+         else
+           min:=b;
+      end;
+
+
     function max(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
     function max(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
     {
     {
       return the maximum of a and b
       return the maximum of a and b
@@ -251,6 +265,18 @@ implementation
       end;
       end;
 
 
 
 
+    function max(a,b : qword) : qword;{$ifdef USEINLINE}inline;{$endif}
+    {
+      return the maximum of a and b
+    }
+      begin
+         if a>=b then
+           max:=a
+         else
+           max:=b;
+      end;
+
+
     function max(const a,b : Tconstexprint) : Tconstexprint;{$ifdef USEINLINE}inline;{$endif}
     function max(const a,b : Tconstexprint) : Tconstexprint;{$ifdef USEINLINE}inline;{$endif}
     {
     {
       return the maximum of a and b
       return the maximum of a and b

+ 1 - 3
compiler/pass_2.pas

@@ -58,9 +58,7 @@ procedure secondpass(p : tnode);
 implementation
 implementation
 
 
    uses
    uses
-{$ifdef EXTDEBUG}
      cutils,
      cutils,
-{$endif}
      globtype,verbose,
      globtype,verbose,
      globals,
      globals,
      aasmdata,
      aasmdata,
@@ -194,7 +192,7 @@ implementation
             current_settings.localswitches:=p.localswitches;
             current_settings.localswitches:=p.localswitches;
             codegenerror:=false;
             codegenerror:=false;
             if assigned(p.optinfo) then
             if assigned(p.optinfo) then
-              cg.executionweight:=p.optinfo^.executionweight
+              cg.executionweight:=min(p.optinfo^.executionweight,QWord(high(cg.executionweight)))
             else
             else
               cg.executionweight:=100;
               cg.executionweight:=100;
 {$ifdef EXTDEBUG}
 {$ifdef EXTDEBUG}

+ 6 - 2
compiler/rgobj.pas

@@ -830,8 +830,12 @@ unit rgobj;
         if supreg>=first_imaginary then
         if supreg>=first_imaginary then
           with reginfo[supreg] do
           with reginfo[supreg] do
             begin
             begin
-              // if aweight>weight then
-              inc(weight,aweight);
+              { avoid overflow }
+              if high(weight)-aweight<weight then
+                weight:=high(weight)
+              else
+                inc(weight,aweight);
+
               if (live_range_direction=rad_forward) then
               if (live_range_direction=rad_forward) then
                 begin
                 begin
                   if not assigned(live_start) then
                   if not assigned(live_start) then