public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-7622] PR modula2/109729 cannot use a CHAR type as a FOR loop iterator
@ 2023-07-28 14:12 Gaius Mulley
  0 siblings, 0 replies; only message in thread
From: Gaius Mulley @ 2023-07-28 14:12 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:3e9aaa9bcb2fc64e64f4e8a2aa0f6f7395a21c52

commit r13-7622-g3e9aaa9bcb2fc64e64f4e8a2aa0f6f7395a21c52
Author: Gaius Mulley <gaiusmod2@gmail.com>
Date:   Fri Jul 28 15:00:29 2023 +0100

    PR modula2/109729 cannot use a CHAR type as a FOR loop iterator
    
    This patch introduces a new quadruple ArithAddOp which is used in
    the construction of FOR loop to ensure that when constant folding
    is applied it does not concatenate two constant char operands into
    a string constant.  Overloading only occurs with constant operands.
    
    gcc/m2/ChangeLog:
    
            PR modula2/109729
            PR modula2/110246
            * gm2-compiler/M2GenGCC.mod (CodeStatement): Detect
            ArithAddOp and call CodeAddChecked.
            (ResolveConstantExpressions): Detect ArithAddOp and call
            FoldArithAdd.
            (FoldArithAdd): New procedure.
            (FoldAdd): Refactor to use FoldArithAdd.
            * gm2-compiler/M2Quads.def (QuadOperator): Add ArithAddOp.
            * gm2-compiler/M2Quads.mod: Remove commented imports.
            (QuadFrame): Changed comments to use GNU coding standards.
            (ArithPlusTok): New global variable.
            (BuildForToByDo): Use ArithPlusTok instead of PlusTok.
            (MakeOp): Detect ArithPlusTok and return ArithAddOp.
            (WriteQuad): Add ArithAddOp clause.
            (WriteOperator): Add ArithAddOp clause.
            (Init): Initialize ArithPlusTok.
    
    gcc/testsuite/ChangeLog:
    
            PR modula2/109729
            * gm2/pim/run/pass/ForChar.mod: New test.
    
    (cherry picked from commit ac7c9954ece9a75c5e7c3b76a4800f2432002487)
    
    Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>

Diff:
---
 gcc/m2/gm2-compiler/M2GenGCC.mod           | 24 ++++++++++---
 gcc/m2/gm2-compiler/M2Quads.def            |  1 +
 gcc/m2/gm2-compiler/M2Quads.mod            | 57 +++++++++++++++++-------------
 gcc/testsuite/gm2/pim/run/pass/ForChar.mod | 33 +++++++++++++++++
 4 files changed, 85 insertions(+), 30 deletions(-)

diff --git a/gcc/m2/gm2-compiler/M2GenGCC.mod b/gcc/m2/gm2-compiler/M2GenGCC.mod
index 1f593cf6939..15fb929cd87 100644
--- a/gcc/m2/gm2-compiler/M2GenGCC.mod
+++ b/gcc/m2/gm2-compiler/M2GenGCC.mod
@@ -476,6 +476,7 @@ BEGIN
    DummyOp            : |
    InitAddressOp      : CodeInitAddress(q, op1, op2, op3) |
    BecomesOp          : CodeBecomes(q) |
+   ArithAddOp,
    AddOp              : CodeAddChecked (q, op2, op3) |
    SubOp              : CodeSubChecked (q, op2, op3) |
    MultOp             : CodeMultChecked (q, op2, op3) |
@@ -586,6 +587,7 @@ BEGIN
          LogicalAndOp       : FoldSetAnd (tokenno, p, quad, op1, op2, op3) |
          LogicalXorOp       : FoldSymmetricDifference (tokenno, p, quad, op1, op2, op3) |
          BecomesOp          : FoldBecomes (tokenno, p, quad, op1, op3) |
+         ArithAddOp         : FoldArithAdd (op1pos, p, quad, op1, op2, op3) |
          AddOp              : FoldAdd (op1pos, p, quad, op1, op2, op3) |
          SubOp              : FoldSub (op1pos, p, quad, op1, op2, op3) |
          MultOp             : FoldMult (op1pos, p, quad, op1, op2, op3) |
@@ -3623,7 +3625,8 @@ END GetStr ;
 
 
 (*
-   FoldAdd - check addition for constant folding.
+   FoldAdd - check addition for constant folding.  It checks for conststrings
+             overloading the +.
 *)
 
 PROCEDURE FoldAdd (tokenno: CARDINAL; p: WalkAction;
@@ -3643,14 +3646,25 @@ BEGIN
       SubQuad (quad) ;
       s := KillString (s)
    ELSE
-      IF BinaryOperands (quad, op2, op3)
-      THEN
-         FoldBinary (tokenno, p, BuildAdd, quad, op1, op2, op3)
-      END
+      FoldArithAdd (tokenno, p, quad, op1, op2, op3)
    END
 END FoldAdd ;
 
 
+(*
+   FoldArithAdd - check arithmetic addition for constant folding.
+*)
+
+PROCEDURE FoldArithAdd (tokenno: CARDINAL; p: WalkAction;
+                        quad: CARDINAL; op1, op2, op3: CARDINAL) ;
+BEGIN
+   IF BinaryOperands (quad, op2, op3)
+   THEN
+      FoldBinary (tokenno, p, BuildAdd, quad, op1, op2, op3)
+   END
+END FoldArithAdd ;
+
+
 (*
    CodeAddChecked - code an addition instruction, determine whether checking
                     is required.
diff --git a/gcc/m2/gm2-compiler/M2Quads.def b/gcc/m2/gm2-compiler/M2Quads.def
index f1b841e744d..84c01e23693 100644
--- a/gcc/m2/gm2-compiler/M2Quads.def
+++ b/gcc/m2/gm2-compiler/M2Quads.def
@@ -165,6 +165,7 @@ TYPE
                    DivCeilOp, ModCeilOp,
                    DivFloorOp, ModFloorOp, DivTruncOp, ModTruncOp,
       	       	   LogicalOrOp, LogicalAndOp, LogicalXorOp, LogicalDiffOp,
+                   ArithAddOp,
                    InclOp, ExclOp, LogicalShiftOp, LogicalRotateOp,
                    UnboundedOp, HighOp,
                    CoerceOp, ConvertOp, CastOp,
diff --git a/gcc/m2/gm2-compiler/M2Quads.mod b/gcc/m2/gm2-compiler/M2Quads.mod
index 2380efb7041..57f272f6106 100644
--- a/gcc/m2/gm2-compiler/M2Quads.mod
+++ b/gcc/m2/gm2-compiler/M2Quads.mod
@@ -248,8 +248,6 @@ FROM M2Range IMPORT InitAssignmentRangeCheck,
                     InitWholeZeroDivisionCheck,
                     InitWholeZeroRemainderCheck,
                     InitParameterRangeCheck,
-                    (* CheckRangeAddVariableRead,  *)
-                    (* CheckRangeRemoveVariableRead,  *)
                     WriteRangeCheck ;
 
 FROM M2CaseList IMPORT PushCase, PopCase, AddRange, BeginCaseList, EndCaseList, ElseCase ;
@@ -289,14 +287,14 @@ TYPE
                              Operand1           : CARDINAL ;
                              Operand2           : CARDINAL ;
                              Operand3           : CARDINAL ;
-                             Next               : CARDINAL ;     (* Next quadruple                 *)
-                             LineNo             : CARDINAL ;     (* Line No of source text         *)
-                             TokenNo            : CARDINAL ;     (* Token No of source text        *)
-                             NoOfTimesReferenced: CARDINAL ;     (* No of times quad is referenced *)
-                             CheckOverflow      : BOOLEAN ;      (* should backend check overflow  *)
+                             Next               : CARDINAL ;     (* Next quadruple.                 *)
+                             LineNo             : CARDINAL ;     (* Line No of source text.         *)
+                             TokenNo            : CARDINAL ;     (* Token No of source text.        *)
+                             NoOfTimesReferenced: CARDINAL ;     (* No of times quad is referenced. *)
+                             CheckOverflow      : BOOLEAN ;      (* should backend check overflow   *)
                              op1pos,
                              op2pos,
-                             op3pos             : CARDINAL ;     (* token position of operands.    *)
+                             op3pos             : CARDINAL ;     (* Token position of operands.     *)
                           END ;
 
    WithFrame = POINTER TO RECORD
@@ -309,10 +307,11 @@ TYPE
 
    ForLoopInfo = POINTER TO RECORD
                                IncrementQuad,
-                               StartOfForLoop,                 (* we keep a list of all for      *)
-                               EndOfForLoop,                   (* loops so we can check index    *)
+                               StartOfForLoop,                 (* We keep a list of all for         *)
+                               EndOfForLoop,                   (* loops so we can check index.      *)
                                ForLoopIndex,
-                               IndexTok      : CARDINAL ;      (* variables are not abused       *)
+                               IndexTok      : CARDINAL ;      (* Used to ensure iterators are not  *)
+                                                               (* user modified.                    *)
                             END ;
 
    LineNote  = POINTER TO RECORD
@@ -334,37 +333,39 @@ VAR
    WhileStack,
    ForStack,
    ExitStack,
-   ReturnStack          : StackOfWord ;   (* Return quadruple of the procedure.      *)
-   PriorityStack        : StackOfWord ;   (* temporary variable holding old priority *)
+   ReturnStack          : StackOfWord ;   (* Return quadruple of the procedure.       *)
+   PriorityStack        : StackOfWord ;   (* Temporary variable holding old priority. *)
    SuppressWith         : BOOLEAN ;
    QuadArray            : Index ;
    NextQuad             : CARDINAL ;  (* Next quadruple number to be created.    *)
    FreeList             : CARDINAL ;  (* FreeList of quadruples.                 *)
    CurrentProc          : CARDINAL ;  (* Current procedure being compiled, used  *)
-                                      (* to determine which procedure a RETURN   *)
+                                      (* to determine which procedure a RETURN.  *)
                                       (* ReturnValueOp must have as its 3rd op.  *)
    InitQuad             : CARDINAL ;  (* Initial Quad BackPatch that starts the  *)
                                       (* suit of Modules.                        *)
    LastQuadNo           : CARDINAL ;  (* Last Quadruple accessed by GetQuad.     *)
+   ArithPlusTok,                      (* Internal + token for arithmetic only.   *)
    LogicalOrTok,                      (* Internal _LOR token.                    *)
    LogicalAndTok,                     (* Internal _LAND token.                   *)
    LogicalXorTok,                     (* Internal _LXOR token.                   *)
    LogicalDifferenceTok : Name ;      (* Internal _LDIFF token.                  *)
    InConstExpression,
-   IsAutoOn,                          (* should parser automatically push idents *)
+   IsAutoOn,                          (* Should parser automatically push        *)
+                                      (* idents?                                 *)
    MustNotCheckBounds   : BOOLEAN ;
-   ForInfo              : Index ;     (* start and end of all FOR loops       *)
-   GrowInitialization   : CARDINAL ;  (* upper limit of where the initialized    *)
+   ForInfo              : Index ;     (* Start and end of all FOR loops.         *)
+   GrowInitialization   : CARDINAL ;  (* Upper limit of where the initialized    *)
                                       (* quadruples.                             *)
    BuildingHigh,
    BuildingSize,
-   QuadrupleGeneration  : BOOLEAN ;      (* should we be generating quadruples?  *)
-   FreeLineList         : LineNote ;  (* free list of line notes                 *)
-   VarientFields        : List ;      (* the list of all varient fields created  *)
-   VarientFieldNo       : CARDINAL ;  (* used to retrieve the VarientFields      *)
+   QuadrupleGeneration  : BOOLEAN ;      (* Should we be generating quadruples?  *)
+   FreeLineList         : LineNote ;  (* Free list of line notes.                *)
+   VarientFields        : List ;      (* The list of all varient fields created. *)
+   VarientFieldNo       : CARDINAL ;  (* Used to retrieve the VarientFields      *)
                                       (* in order.                               *)
    NoOfQuads            : CARDINAL ;  (* Number of used quadruples.              *)
-   Head                 : CARDINAL ;  (* Head of the list of quadruples *)
+   Head                 : CARDINAL ;  (* Head of the list of quadruples.         *)
 
 
 (*
@@ -4436,7 +4437,7 @@ BEGIN
    PushT (TimesTok) ;
    PushTFtok (BySym, ByType, bytok) ;
    doBuildBinaryOp (FALSE, FALSE) ;
-   PushT (PlusTok) ;
+   PushT (ArithPlusTok) ;
    PushTFtok (e1, GetSType (e1), e1tok) ;
    doBuildBinaryOp (FALSE, FALSE) ;
    BuildForLoopToRangeCheck ;
@@ -12906,7 +12907,7 @@ BEGIN
          left := t
       END ;
       combinedTok := MakeVirtualTok (optokpos, leftpos, rightpos) ;
-      GenQuadO (combinedTok, MakeOp(Op), left, right, 0, FALSE) ;  (* True  Exit *)
+      GenQuadO (combinedTok, MakeOp (Op), left, right, 0, FALSE) ;  (* True  Exit *)
       GenQuadO (combinedTok, GotoOp, NulSym, NulSym, 0, FALSE) ;  (* False Exit *)
       PushBool (NextQuad-2, NextQuad-1)
    END
@@ -12946,7 +12947,10 @@ END BuildNot ;
 
 PROCEDURE MakeOp (t: Name) : QuadOperator ;
 BEGIN
-   IF t=PlusTok
+   IF t=ArithPlusTok
+   THEN
+      RETURN ArithAddOp
+   ELSIF t=PlusTok
    THEN
       RETURN( AddOp )
    ELSIF t=MinusTok
@@ -13394,6 +13398,7 @@ BEGIN
       LogicalAndOp,
       LogicalXorOp,
       LogicalDiffOp,
+      ArithAddOp,
       CoerceOp,
       ConvertOp,
       CastOp,
@@ -13454,6 +13459,7 @@ PROCEDURE WriteOperator (Operator: QuadOperator) ;
 BEGIN
    CASE Operator OF
 
+   ArithAddOp               : printf0('Arith +           ') |
    InitAddressOp            : printf0('InitAddress       ') |
    LogicalOrOp              : printf0('Or                ') |
    LogicalAndOp             : printf0('And               ') |
@@ -15120,6 +15126,7 @@ BEGIN
    LogicalAndTok := MakeKey('_LAND') ;
    LogicalXorTok := MakeKey('_LXOR') ;
    LogicalDifferenceTok := MakeKey('_LDIFF') ;
+   ArithPlusTok := MakeKey ('_ARITH_+') ;
    QuadArray := InitIndex (1) ;
    FreeList := 1 ;
    NewQuad(NextQuad) ;
diff --git a/gcc/testsuite/gm2/pim/run/pass/ForChar.mod b/gcc/testsuite/gm2/pim/run/pass/ForChar.mod
new file mode 100644
index 00000000000..604ce9bd4b9
--- /dev/null
+++ b/gcc/testsuite/gm2/pim/run/pass/ForChar.mod
@@ -0,0 +1,33 @@
+MODULE ForChar ;
+
+FROM StrLib IMPORT StrEqual ;
+FROM libc IMPORT printf, exit ;
+
+
+(*
+   Test -
+*)
+
+PROCEDURE Test ;
+VAR
+   ch    : CHAR ;
+   digits: ARRAY [0..10] OF CHAR ;
+   c     : CARDINAL ;
+BEGIN
+   c := 0 ;
+   FOR ch := '0' TO '9' DO
+      digits[c] := ch ;
+      INC (c)
+   END ;
+   digits[10] := 0C ;
+   IF NOT StrEqual (digits, "0123456789")
+   THEN
+      printf ("digits should equal 0123456789, but is %s\n", digits) ;
+      exit (1)
+   END
+END Test ;
+
+
+BEGIN
+   Test
+END ForChar.

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-07-28 14:12 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-28 14:12 [gcc r13-7622] PR modula2/109729 cannot use a CHAR type as a FOR loop iterator Gaius Mulley

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).