Explorar o código

* correctly generate accesses to jump tables if it contains negative entries, resolves issue #30119

git-svn-id: trunk@33760 -
florian %!s(int64=9) %!d(string=hai) anos
pai
achega
57f93ed40d
Modificáronse 5 ficheiros con 319 adicións e 0 borrados
  1. 2 0
      .gitattributes
  2. 2 0
      compiler/x86/nx86set.pas
  3. 3 0
      compiler/x86_64/nx64set.pas
  4. 154 0
      tests/webtbs/tw30119a.pp
  5. 158 0
      tests/webtbs/tw30119b.pp

+ 2 - 0
.gitattributes

@@ -15071,6 +15071,8 @@ tests/webtbs/tw3004.pp svneol=native#text/plain
 tests/webtbs/tw3005.pp svneol=native#text/plain
 tests/webtbs/tw30082.pp svneol=native#text/plain
 tests/webtbs/tw3010.pp svneol=native#text/plain
+tests/webtbs/tw30119a.pp svneol=native#text/pascal
+tests/webtbs/tw30119b.pp svneol=native#text/pascal
 tests/webtbs/tw3012.pp svneol=native#text/plain
 tests/webtbs/tw30166.pp svneol=native#text/plain
 tests/webtbs/tw3023.pp svneol=native#text/plain

+ 2 - 0
compiler/x86/nx86set.pas

@@ -112,6 +112,8 @@ implementation
              { case expr greater than max_ => goto elselabel }
              cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,opcgsize,OC_A,aint(max_)-aint(min_),hregister,elselabel);
              min_:=0;
+             { do not sign extend when we load the index register, as we applied an offset above }
+             opcgsize:=tcgsize2unsigned[opcgsize];
           end;
         current_asmdata.getglobaldatalabel(table);
         { make it a 32bit register }

+ 3 - 0
compiler/x86_64/nx64set.pas

@@ -112,7 +112,10 @@ implementation
              { case expr greater than max_ => goto elselabel }
              cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,opcgsize,OC_A,aint(max_)-aint(min_),hregister,elselabel);
              min_:=0;
+             { do not sign extend when we load the index register, as we applied an offset above }
+             opcgsize:=tcgsize2unsigned[opcgsize];
           end;
+
         { local label in order to avoid using GOT }
         current_asmdata.getlabel(tablelabel,alt_data);
         indexreg:=cg.makeregsize(current_asmdata.CurrAsmList,hregister,OS_ADDR);

+ 154 - 0
tests/webtbs/tw30119a.pp

@@ -0,0 +1,154 @@
+//{$codepage cp_acp}
+//{$codepage cp1250}
+
+
+program tw30119;
+//uses
+//  fkdane,
+ //  fkrecord;
+//uses
+// cwstring;
+{$H+}
+
+
+type
+
+    rButikPtr = ^rButik;
+  rButik =
+    packed record
+      data                 : word;      {2}
+      dowod                : word;      {4}
+      numer                : int64;      {12}
+      dataDost             : word;      {14}                                       {w zamowieniu  otwarte 00  }
+      memoa,                             {16}   {  1- dot zamowienia                     zamkniete 10
+                                                   2- par fisk    --> WNT z importu      zawieszone 01 anulowane 11
+
+                                                   4- paleta                            pilne
+                                                   8- (nazwa zestawu) (stare :dot produkcji
+                                                   16- numer odbiorcy w tww
+                                                   32- zablokowane                       (stare:druga jednostkia cenaP
+                                                   64- poprano z produkcji - wyrob       (stere data WZ w twn (norm numer WZ))
+                                                   128 : pole memo w tww
+
+                                                }
+      vat                  : byte;
+      towar,                            {18}
+      dostawca,                         {20}
+      odbiorca             : word;    {22}
+      typ                  : shortint;  {23}
+      ilosc,                            {27}
+      cenaZ,                            {31}
+      cenaS                : single;    {35}
+      akwizytor            : byte;      {36}
+      wolne1               : word;      {38} {nr dostawy}
+      cenaE                : single;    {42}
+
+    end;
+
+
+const
+
+  ntFakturaIMP    = 2;
+  ntKoszt         = 3;
+  ntWOC           = 4;
+  ntFI            = 5;
+  ntPW            = 14;
+  ntPrzyjecieTow  = 15;
+  ntFakturaExp    = 25;
+  ntFakturaSprz   = 26;
+  ntKP            = 27;
+  ntUslUnia       = 28;
+  ntfakturaUSL    = 29;{ *}
+  ntPzRWS         = 30;
+  ntFakturaSprzVat= 34;
+  ntFakturaUslVat = 35;  { faktura do paragonu*}
+  ntZamowienieSprz= 36;
+  ntDetal         = 55;
+  ntRW            = 65;
+  ntPrzesun       = 66;
+  ntDekompl       = 67;
+  ntPZO           = 68;
+//  ntWymiana       = 69;{*}
+  ntFakturaSprzDew =  69;
+  ntReklamacjaVAT = 70;
+  ntPZOVat        = 71;
+  ntBO            = 77;
+  ntZobowImp      = 78;
+  ntWZ            = 79;
+  ntZwrotPW       = 80;
+  ntKpZ           = 81;
+  ntKWz           = 82;
+  ntPZOEXP        = 83;
+  ntFakturaW      = 84;
+
+
+
+  ntExpUnia       = 98;
+  ntImpUnia       = 99;
+  ntImpUniaM      = 100;
+
+
+  ntPZOUnia       = 103;
+
+var
+     tab : array [0..10] of double;
+
+
+procedure testCaseRaw(const rr : rButik);
+var
+  kwz: Double;
+begin
+  kwz:=20;
+
+
+    case rr.typ of
+         ntFakturaSprz,ntFakturaSPrzVat,
+         ntPzoExp,ntPzoUnia,
+         ntPzoVat,ntPzo,
+
+         ntDetal,ntPzRWS,
+
+         ntExpUnia,ntFakturaEXP:     begin
+            tab[1]:=tab[1]+rr.ilosc;
+            tab[2]:=tab[2]+kwz;
+           end;
+         ntRW   : begin
+            tab[4]:=tab[4]+kwz;
+         end;
+
+         -ntFakturaIMP,
+         -ntPrzyjecietow : begin
+           tab[3]:=tab[3]+kwz;
+         end;
+         -ntBO : begin
+           tab[5]:=tab[5]+kwz;
+         end;
+
+    end;
+
+end;
+
+procedure testCaseA;
+var
+   r : rButik;
+begin
+ //  zeruj(r);
+   r.ilosc:=1;
+   r.cenaZ:=10;
+   r.typ:=65;
+   testCaseRaw(r);
+//   checkEquals(10,tab[4]);
+   r.typ:=-ntPrzyjecieTow;
+   testCaseRaw(r);
+//   checkEquals(10,tab[3]);
+    r.typ:=65;
+    testCaseRaw(r);
+end;
+
+
+
+begin
+    writeln('start');
+  testCaseA;
+    writeln('stop') ;
+end.

+ 158 - 0
tests/webtbs/tw30119b.pp

@@ -0,0 +1,158 @@
+//{$codepage cp_acp}
+//{$codepage cp1250}
+
+
+program tw30119;
+//uses
+//  fkdane,
+ //  fkrecord;
+//uses
+// cwstring;
+{$H+}
+
+
+type
+
+    rButikPtr = ^rButik;
+  rButik =
+    packed record
+      data                 : word;      {2}
+      dowod                : word;      {4}
+      numer                : int64;      {12}
+      dataDost             : word;      {14}                                       {w zamowieniu  otwarte 00  }
+      memoa,                             {16}   {  1- dot zamowienia                     zamkniete 10
+                                                   2- par fisk    --> WNT z importu      zawieszone 01 anulowane 11
+
+                                                   4- paleta                            pilne
+                                                   8- (nazwa zestawu) (stare :dot produkcji
+                                                   16- numer odbiorcy w tww
+                                                   32- zablokowane                       (stare:druga jednostkia cenaP
+                                                   64- poprano z produkcji - wyrob       (stere data WZ w twn (norm numer WZ))
+                                                   128 : pole memo w tww
+
+                                                }
+      vat                  : byte;
+      towar,                            {18}
+      dostawca,                         {20}
+      odbiorca             : word;    {22}
+      typ                  : -77..103;  {23}
+      ilosc,                            {27}
+      cenaZ,                            {31}
+      cenaS                : single;    {35}
+      akwizytor            : byte;      {36}
+      wolne1               : word;      {38} {nr dostawy}
+      cenaE                : single;    {42}
+
+    end;
+
+
+const
+
+  ntFakturaIMP    = 2;
+  ntKoszt         = 3;
+  ntWOC           = 4;
+  ntFI            = 5;
+  ntPW            = 14;
+  ntPrzyjecieTow  = 15;
+  ntFakturaExp    = 25;
+  ntFakturaSprz   = 26;
+  ntKP            = 27;
+  ntUslUnia       = 28;
+  ntfakturaUSL    = 29;{ *}
+  ntPzRWS         = 30;
+  ntFakturaSprzVat= 34;
+  ntFakturaUslVat = 35;  { faktura do paragonu*}
+  ntZamowienieSprz= 36;
+  ntDetal         = 55;
+  ntRW            = 65;
+  ntPrzesun       = 66;
+  ntDekompl       = 67;
+  ntPZO           = 68;
+//  ntWymiana       = 69;{*}
+  ntFakturaSprzDew =  69;
+  ntReklamacjaVAT = 70;
+  ntPZOVat        = 71;
+  ntBO            = 77;
+  ntZobowImp      = 78;
+  ntWZ            = 79;
+  ntZwrotPW       = 80;
+  ntKpZ           = 81;
+  ntKWz           = 82;
+  ntPZOEXP        = 83;
+  ntFakturaW      = 84;
+
+
+
+  ntExpUnia       = 98;
+  ntImpUnia       = 99;
+  ntImpUniaM      = 100;
+
+
+  ntPZOUnia       = 103;
+
+var
+     tab : array [0..10] of double;
+
+
+procedure testCaseRaw(const rr : rButik);
+var
+  kwz: Double;
+begin
+  kwz:=20;
+
+
+    case rr.typ of
+         ntFakturaSprz,ntFakturaSPrzVat,
+         ntPzoExp,ntPzoUnia,
+         ntPzoVat,ntPzo,
+
+         ntDetal,ntPzRWS,
+
+         ntExpUnia,ntFakturaEXP:     begin
+            tab[1]:=tab[1]+rr.ilosc;
+            tab[2]:=tab[2]+kwz;
+           end;
+         -20..-16:
+           ;
+         -30..-21:
+           ;
+         ntRW   : begin
+            tab[4]:=tab[4]+kwz;
+         end;
+
+         -ntFakturaIMP,
+         -ntPrzyjecietow : begin
+           tab[3]:=tab[3]+kwz;
+         end;
+         -ntBO : begin
+           tab[5]:=tab[5]+kwz;
+         end;
+
+    end;
+
+end;
+
+procedure testCaseA;
+var
+   r : rButik;
+begin
+ //  zeruj(r);
+   r.ilosc:=1;
+   r.cenaZ:=10;
+   r.typ:=65;
+   testCaseRaw(r);
+//   checkEquals(10,tab[4]);
+   r.typ:=-ntPrzyjecieTow;
+   testCaseRaw(r);
+//   checkEquals(10,tab[3]);
+    r.typ:=65;
+    testCaseRaw(r);
+end;
+
+
+
+begin
+    writeln('start');
+  testCaseA;
+    writeln('stop') ;
+end.