浏览代码

* 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) }
     function min(a,b : longint) : longint;{$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) }
     function max(a,b : longint) : longint;{$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.
       Since Tconstexprint may be automatically converted to int, which causes
@@ -227,6 +229,18 @@ implementation
       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}
     {
       return the maximum of a and b
@@ -251,6 +265,18 @@ implementation
       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}
     {
       return the maximum of a and b

+ 1 - 3
compiler/pass_2.pas

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

+ 6 - 2
compiler/rgobj.pas

@@ -830,8 +830,12 @@ unit rgobj;
         if supreg>=first_imaginary then
           with reginfo[supreg] do
             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
                 begin
                   if not assigned(live_start) then