Browse Source

* fixed bug in ppc jumptable generation for case statements with
negative cases caused by wrong automatic type conversion from
longint to unsigned tconstexprint (+ test for such jump tables)
* fixed darwin/ppc64 jumptables in case of jmptablenorange

git-svn-id: trunk@8311 -

Jonas Maebe 18 years ago
parent
commit
0bfce99477
3 changed files with 49 additions and 6 deletions
  1. 1 0
      .gitattributes
  2. 6 6
      compiler/ppcgen/ngppcset.pas
  3. 42 0
      tests/test/cg/tcase2.pp

+ 1 - 0
.gitattributes

@@ -6548,6 +6548,7 @@ tests/test/cg/tcalvar7.pp svneol=native#text/plain
 tests/test/cg/tcalvar8.pp svneol=native#text/plain
 tests/test/cg/tcalvar8.pp svneol=native#text/plain
 tests/test/cg/tcalvar9.pp svneol=native#text/plain
 tests/test/cg/tcalvar9.pp svneol=native#text/plain
 tests/test/cg/tcase.pp svneol=native#text/plain
 tests/test/cg/tcase.pp svneol=native#text/plain
+tests/test/cg/tcase2.pp svneol=native#text/plain
 tests/test/cg/tclacla1.pp svneol=native#text/plain
 tests/test/cg/tclacla1.pp svneol=native#text/plain
 tests/test/cg/tclasize.pp svneol=native#text/plain
 tests/test/cg/tclasize.pp svneol=native#text/plain
 tests/test/cg/tclatype.pp svneol=native#text/plain
 tests/test/cg/tclatype.pp svneol=native#text/plain

+ 6 - 6
compiler/ppcgen/ngppcset.pas

@@ -79,28 +79,28 @@ implementation
 
 
         procedure genitem(list:TAsmList;t : pcaselabel);
         procedure genitem(list:TAsmList;t : pcaselabel);
           var
           var
-            i : aint;
+            i : TConstExprInt;
           begin
           begin
             if assigned(t^.less) then
             if assigned(t^.less) then
               genitem(list,t^.less);
               genitem(list,t^.less);
             { fill possible hole }
             { fill possible hole }
-            i:=last.svalue+1;
+            i:=last+1;
             while i<=t^._low-1 do
             while i<=t^._low-1 do
               begin
               begin
 		if (target_info.system<>system_powerpc64_darwin) then
 		if (target_info.system<>system_powerpc64_darwin) then
                   list.concat(Tai_const.Create_sym(elselabel))
                   list.concat(Tai_const.Create_sym(elselabel))
                 else
                 else
                   list.concat(Tai_const.Create_rel_sym(aitconst_32bit,table,elselabel));
                   list.concat(Tai_const.Create_rel_sym(aitconst_32bit,table,elselabel));
-                inc(i);
+                i:=i+1;
               end;
               end;
-            i:=t^._low.svalue;
+            i:=t^._low;
             while i<=t^._high do
             while i<=t^._high do
               begin
               begin
 		if (target_info.system<>system_powerpc64_darwin) then
 		if (target_info.system<>system_powerpc64_darwin) then
                   list.concat(Tai_const.Create_sym(blocklabel(t^.blockid)))
                   list.concat(Tai_const.Create_sym(blocklabel(t^.blockid)))
                 else
                 else
                   list.concat(Tai_const.Create_rel_sym(aitconst_32bit,table,blocklabel(t^.blockid)));
                   list.concat(Tai_const.Create_rel_sym(aitconst_32bit,table,blocklabel(t^.blockid)));
-                inc(i);
+                i:=i+1;
               end;
               end;
             last:=t^._high;
             last:=t^._high;
             if assigned(t^.greater) then
             if assigned(t^.greater) then
@@ -131,7 +131,7 @@ implementation
         else
         else
           mulfactor:=4;
           mulfactor:=4;
         cg.a_op_const_reg(current_asmdata.CurrAsmList, OP_MUL, OS_INT, mulfactor, indexreg);
         cg.a_op_const_reg(current_asmdata.CurrAsmList, OP_MUL, OS_INT, mulfactor, indexreg);
-        reference_reset_symbol(href, table, (-aint(min_)) * tcgsize2size[OS_ADDR]);
+        reference_reset_symbol(href, table, (-aint(min_)) * mulfactor);
 
 
         if (target_info.system<>system_powerpc64_darwin) then
         if (target_info.system<>system_powerpc64_darwin) then
           begin
           begin

+ 42 - 0
tests/test/cg/tcase2.pp

@@ -0,0 +1,42 @@
+    const
+       maxsmallint = high(smallint);
+       { error codes }
+       grOk =  0;
+       grNoInitGraph = -1;
+       grNotDetected = -2;
+       grFileNotFound = -3;
+       grInvalidDriver = -4;
+       grNoLoadMem = -5;
+       grNoScanMem = -6;
+       grNoFloodMem = -7;
+       grFontNotFound = -8;
+       grNoFontMem = -9;
+       grInvalidMode = -10;
+       grError = -11;
+       grIOerror = -12;
+       grInvalidFont = -13;
+       grInvalidFontNum = -14;
+       grInvalidVersion = -18;
+
+function GraphErrorMsg(ErrorCode: smallint): string;
+Begin
+ GraphErrorMsg:='';
+ case ErrorCode of
+  grOk,grFileNotFound,grInvalidDriver: exit;
+  grNoInitGraph: GraphErrorMsg:='Graphics driver not installed';
+  grNotDetected: GraphErrorMsg:='Graphics hardware not detected';
+  grNoLoadMem,grNoScanMem,grNoFloodMem: GraphErrorMsg := 'Not enough memory for graphics';
+  grNoFontMem: GraphErrorMsg := 'Not enough memory to load font';
+  grFontNotFound: GraphErrorMsg:= 'Font file not found';
+  grInvalidMode: GraphErrorMsg := 'Invalid graphics mode';
+  grError: GraphErrorMsg:='Graphics error';
+  grIoError: GraphErrorMsg:='Graphics I/O error';
+  grInvalidFont,grInvalidFontNum: GraphErrorMsg := 'Invalid font';
+  grInvalidVersion: GraphErrorMsg:='Invalid driver version';
+ end;
+end;
+
+begin
+  if GraphErrorMsg(grNoInitGraph) <> 'Graphics driver not installed' then
+    halt(1);
+end.