瀏覽代碼

ARM: avoid some range check errors, while running a compiler compiled with -CR

git-svn-id: trunk@33257 -
Károly Balogh 9 年之前
父節點
當前提交
e0c21b6f8b
共有 3 個文件被更改,包括 8 次插入8 次删除
  1. 6 6
      compiler/arm/aasmcpu.pas
  2. 1 1
      compiler/nutils.pas
  3. 1 1
      compiler/ogelf.pas

+ 6 - 6
compiler/arm/aasmcpu.pas

@@ -2779,15 +2779,15 @@ implementation
 
       function MakeRegList(reglist: tcpuregisterset): word;
         var
-          i, w: word;
+          i, w: integer;
         begin
           result:=0;
-          w:=1;
+          w:=0;
           for i:=RS_R0 to RS_R15 do
             begin
               if i in reglist then
-                result:=result or w;
-              w:=w shl 1
+                result:=result or (1 shl w);
+              inc(w);
             end;
         end;
 
@@ -2980,9 +2980,9 @@ implementation
                   bytes:=bytes or (((oper[0]^.ref^.offset-8) shr 2) and $ffffff);
 
                   if (opcode<>A_BL) or (condition<>C_None) then
-                    objdata.writereloc(bytes,4,currsym,RELOC_RELATIVE_24)
+                    objdata.writereloc(aint(bytes),4,currsym,RELOC_RELATIVE_24)
                   else
-                    objdata.writereloc(bytes,4,currsym,RELOC_RELATIVE_CALL);
+                    objdata.writereloc(aint(bytes),4,currsym,RELOC_RELATIVE_CALL);
 
                   exit;
                 end;

+ 1 - 1
compiler/nutils.pas

@@ -814,7 +814,7 @@ implementation
               ordconstn:
                 begin
 {$ifdef ARM}
-                  if not(is_shifter_const(tordconstnode(p).value.svalue,dummy)) then
+                  if not(is_shifter_const(aint(tordconstnode(p).value.svalue),dummy)) then
                     result:=2;
 {$endif ARM}
                   exit;

+ 1 - 1
compiler/ogelf.pas

@@ -864,7 +864,7 @@ implementation
                if (reltype in [RELOC_RELATIVE_24,RELOC_RELATIVE_CALL]) and
                   (p.objsection=CurrObjSec) then
                  begin
-                   data:=(data and $ff000000) or (((((data and $ffffff) shl 2)+(symaddr-CurrObjSec.Size)) shr 2) and $FFFFFF); // TODO: Check overflow
+                   data:=aint((data and $ff000000) or (((((data and $ffffff) shl 2)+(symaddr-CurrObjSec.Size)) shr 2) and $FFFFFF)); // TODO: Check overflow
                  end
                else
 {$endif ARM}