]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR modula2/110126 variables are reported as unused when referenced by ASM
authorGaius Mulley <gaiusmod2@gmail.com>
Thu, 8 Jun 2023 23:55:50 +0000 (00:55 +0100)
committerGaius Mulley <gaiusmod2@gmail.com>
Thu, 8 Jun 2023 23:55:50 +0000 (00:55 +0100)
This patches fixes two problems with the asm statement.
gm2 -Wall -c fooasm3.mod generates an incorrect warning and
gm2 cannot concatenate strings before an ASM statement.
The asm statement now accepts a constant expression (rather than
a string) and it updates the variable read/write use lists as
appropriate.

gcc/m2/ChangeLog:

PR modula2/110126
* gm2-compiler/M2GenGCC.mod (BuildTreeFromInterface): Remove
tokenno parameter.  Use object tok instead of tokenno.
(BuildTrashTreeFromInterface): Use object tok instead of
GetDeclaredMod.
(CodeInline): Remove tokenno from parameter list to BuildTreeFromInterface.
* gm2-compiler/M2Quads.def (BuildAsmElement): Exported and
defined.
* gm2-compiler/M2Quads.mod (BuildOptimizeOff): Reformatted.
(BuildInline): Reformatted.
(BuildLineNo): Reformatted.
(UseLineNote): Reformatted.
(BuildAsmElement): New procedure.
* gm2-compiler/P0SyntaxCheck.bnf (AsmOperands): Use
ConstExpression instead of string.
(AsmElement): Use ConstExpression instead of string.
(TrashList): Use ConstExpression instead of string.
* gm2-compiler/P1Build.bnf (AsmOperands): Use
ConstExpression instead of string.
(AsmElement): Use ConstExpression instead of string.
(TrashList): Use ConstExpression instead of string.
* gm2-compiler/P2Build.bnf (AsmOperands): Use
ConstExpression instead of string.
(AsmElement): Use ConstExpression instead of string.
(TrashList): Use ConstExpression instead of string.
* gm2-compiler/P3Build.bnf (AsmOperands): Rewrite.
(AsmOperandSpec): Rewrite.
(AsmOutputList): New rule.
(AsmInputList): New rule.
(TrashList): Rewrite.
* gm2-compiler/PCBuild.bnf (AsmOperands): Use
ConstExpression instead of string.
(AsmElement): Use ConstExpression instead of string.
(TrashList): Use ConstExpression instead of string.
* gm2-compiler/PHBuild.bnf (AsmOperands): Use
ConstExpression instead of string.
(AsmElement): Use ConstExpression instead of string.
(TrashList): Use ConstExpression instead of string.
* gm2-compiler/SymbolTable.def (PutRegInterface):
Rewrite interface.
(GetRegInterface): Rewrite interface.
* gm2-compiler/SymbolTable.mod (SetFirstUsed): New procedure.
(PutFirstUsed): New procedure.
(PutRegInterface): Rewrite.
(GetRegInterface): Rewrite.

gcc/testsuite/ChangeLog:

PR modula2/110126
* gm2/pim/pass/fooasm3.mod: New test.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
12 files changed:
gcc/m2/gm2-compiler/M2GenGCC.mod
gcc/m2/gm2-compiler/M2Quads.def
gcc/m2/gm2-compiler/M2Quads.mod
gcc/m2/gm2-compiler/P0SyntaxCheck.bnf
gcc/m2/gm2-compiler/P1Build.bnf
gcc/m2/gm2-compiler/P2Build.bnf
gcc/m2/gm2-compiler/P3Build.bnf
gcc/m2/gm2-compiler/PCBuild.bnf
gcc/m2/gm2-compiler/PHBuild.bnf
gcc/m2/gm2-compiler/SymbolTable.def
gcc/m2/gm2-compiler/SymbolTable.mod
gcc/testsuite/gm2/pim/pass/fooasm3.mod [new file with mode: 0644]

index 67a003e3dd6f3c31bed8b416dd73ed21e7771dcd..90e237d82f560452b1e3f4a037260fc2a822302c 100644 (file)
@@ -701,8 +701,9 @@ END FindType ;
    BuildTreeFromInterface - generates a GCC tree from an interface definition.
 *)
 
-PROCEDURE BuildTreeFromInterface (tokenno: CARDINAL; sym: CARDINAL) : Tree ;
+PROCEDURE BuildTreeFromInterface (sym: CARDINAL) : Tree ;
 VAR
+   tok     : CARDINAL ;
    i       : CARDINAL ;
    name    : Name ;
    str,
@@ -715,19 +716,19 @@ BEGIN
    THEN
       i := 1 ;
       REPEAT
-         GetRegInterface (sym, i, name, str, obj) ;
+         GetRegInterface (sym, i, tok, name, str, obj) ;
          IF str#NulSym
          THEN
             IF IsConstString (str)
             THEN
-               DeclareConstant (tokenno, obj) ;
+               DeclareConstant (tok, obj) ;
                IF name = NulName
                THEN
                   gccName := NIL
                ELSE
                   gccName := BuildStringConstant (KeyToCharStar (name), LengthKey (name))
                END ;
-               tree := ChainOnParamValue (tree, gccName, PromoteToString (tokenno, str), Mod2Gcc (obj))
+               tree := ChainOnParamValue (tree, gccName, PromoteToString (tok, str), Mod2Gcc (obj))
             ELSE
                WriteFormat0 ('a constraint to the GNU ASM statement must be a constant string')
             END
@@ -745,25 +746,26 @@ END BuildTreeFromInterface ;
 
 PROCEDURE BuildTrashTreeFromInterface (sym: CARDINAL) : Tree ;
 VAR
+   tok : CARDINAL ;
    i   : CARDINAL ;
    str,
    obj : CARDINAL ;
    name: Name ;
    tree: Tree ;
 BEGIN
-   tree := Tree(NIL) ;
+   tree := Tree (NIL) ;
    IF sym#NulSym
    THEN
       i := 1 ;
       REPEAT
-         GetRegInterface(sym, i, name, str, obj) ;
-         IF str#NulSym
+         GetRegInterface (sym, i, tok, name, str, obj) ;
+         IF str # NulSym
          THEN
-            IF IsConstString(str)
+            IF IsConstString (str)
             THEN
-               tree := AddStringToTreeList(tree, PromoteToString(GetDeclaredMod(str), str))
+               tree := AddStringToTreeList (tree, PromoteToString (tok, str))
             ELSE
-               WriteFormat0('a constraint to the GNU ASM statement must be a constant string')
+               WriteFormat0 ('a constraint to the GNU ASM statement must be a constant string')
             END
          END ;
 (*
@@ -772,10 +774,10 @@ BEGIN
             InternalError ('not expecting the object to be non null in the trash list')
          END ;
 *)
-         INC(i)
-      UNTIL (str=NulSym) AND (obj=NulSym)
+         INC (i)
+      UNTIL (str = NulSym) AND (obj = NulSym)
    END ;
-   RETURN( tree )
+   RETURN tree
 END BuildTrashTreeFromInterface ;
 
 
@@ -801,8 +803,8 @@ BEGIN
       can handle the register dependency providing the user
       specifies VOLATILE and input/output/trash sets correctly.
    *)
-   inputs  := BuildTreeFromInterface (tokenno, GetGnuAsmInput(GnuAsm)) ;
-   outputs := BuildTreeFromInterface (tokenno, GetGnuAsmOutput(GnuAsm)) ;
+   inputs  := BuildTreeFromInterface (GetGnuAsmInput(GnuAsm)) ;
+   outputs := BuildTreeFromInterface (GetGnuAsmOutput(GnuAsm)) ;
    trash   := BuildTrashTreeFromInterface (GetGnuAsmTrash(GnuAsm)) ;
    labels  := NIL ;  (* at present it makes no sence for Modula-2 to jump to a label,
                         given that labels are not allowed in Modula-2.  *)
index 582daeb21a77ea35622bc0b576d7528e5dbb4a59..493111e7c1bce4af7a20c3484920d33a719acb54 100644 (file)
@@ -144,7 +144,7 @@ EXPORT QUALIFIED StartBuildDefFile, StartBuildModFile, EndBuildFile,
                  IsAutoPushOn, PushAutoOn, PushAutoOff, PopAuto,
                  PushInConstExpression, PopInConstExpression,
                  IsInConstExpression,
-                 MustCheckOverflow ;
+                 MustCheckOverflow, BuildAsmElement ;
 
 
 TYPE
@@ -2711,4 +2711,30 @@ PROCEDURE PopInConstExpression ;
 PROCEDURE IsInConstExpression () : BOOLEAN ;
 
 
+(*
+   BuildAsmElement - the stack is expected to contain:
+
+
+                        Entry                      Exit
+                        =====                      ====
+
+                 Ptr ->
+                        +------------------+
+                        | expr | tokpos    |
+                        |------------------|
+                        | str              |
+                        |------------------|
+                        | name             |
+                        |------------------|       +------------------+
+                        | CurrentInterface |       | CurrentInterface |
+                        |------------------|       |------------------|
+                        | CurrentAsm       |       | CurrentAsm       |
+                        |------------------|       |------------------|
+                        | n                |       | n                |
+                        |------------------|       |------------------|
+*)
+
+PROCEDURE BuildAsmElement (input, output, trash: BOOLEAN) ;
+
+
 END M2Quads.
index 65e3c49cf50d8b209b17725651324e877b44ae4c..8639d5e580783e0a8b3baedf5f39b82818974c0c 100644 (file)
@@ -94,6 +94,8 @@ FROM SymbolTable IMPORT ModeOfAddr, GetMode, PutMode, GetSymName, IsUnknown,
                         NoOfElements,
                         NoOfParam,
                         StartScope, EndScope,
+                        IsGnuAsm, IsGnuAsmVolatile,
+                        MakeRegInterface, PutRegInterface,
                         HasExceptionBlock, PutExceptionBlock,
                         HasExceptionFinally, PutExceptionFinally,
                         GetParent, GetRecord, IsRecordField, IsFieldVarient, IsRecord,
@@ -13995,7 +13997,7 @@ END BuildOptimizeOn ;
 
 PROCEDURE BuildOptimizeOff ;
 BEGIN
-   GenQuad(OptimizeOffOp, NulSym, NulSym, NulSym)
+   GenQuad (OptimizeOffOp, NulSym, NulSym, NulSym)
 END BuildOptimizeOff ;
 
 
@@ -14020,8 +14022,8 @@ PROCEDURE BuildInline ;
 VAR
    Sym: CARDINAL ;
 BEGIN
-   PopT(Sym) ;
-   GenQuad(InlineOp, NulSym, NulSym, Sym)
+   PopT (Sym) ;
+   GenQuad (InlineOp, NulSym, NulSym, Sym)
 END BuildInline ;
 
 
@@ -14047,11 +14049,11 @@ VAR
 BEGIN
    IF (NextQuad#Head) AND (GenerateLineDebug OR GenerateDebugging) AND FALSE
    THEN
-      filename := makekey(string(GetFileName())) ;
-      f := GetQF(NextQuad-1) ;
-      IF NOT ((f^.Operator=LineNumberOp) AND (f^.Operand1=WORD(filename)))
+      filename := makekey (string (GetFileName ())) ;
+      f := GetQF (NextQuad-1) ;
+      IF NOT ((f^.Operator = LineNumberOp) AND (f^.Operand1 = WORD (filename)))
       THEN
-         GenQuad(LineNumberOp, WORD(filename), NulSym, WORD(GetLineNo()))
+         GenQuad (LineNumberOp, WORD (filename), NulSym, WORD (GetLineNo ()))
       END
    END
 END BuildLineNo ;
@@ -14066,14 +14068,14 @@ VAR
    f: QuadFrame ;
 BEGIN
    WITH l^ DO
-      f := GetQF(NextQuad-1) ;
-      IF (f^.Operator=LineNumberOp) AND (f^.Operand1=WORD(File))
+      f := GetQF (NextQuad-1) ;
+      IF (f^.Operator = LineNumberOp) AND (f^.Operand1 = WORD (File))
       THEN
          (* do nothing *)
       ELSE
          IF FALSE
          THEN
-            GenQuad(LineNumberOp, WORD(File), NulSym, WORD(Line))
+            GenQuad (LineNumberOp, WORD (File), NulSym, WORD (Line))
          END
       END ;
       Next := FreeLineList
@@ -14396,6 +14398,68 @@ BEGIN
 END AddVarientEquality ;
 
 
+(*
+   BuildAsmElement - the stack is expected to contain:
+
+
+                        Entry                      Exit
+                        =====                      ====
+
+                 Ptr ->
+                        +------------------+
+                        | expr | tokpos    |
+                        |------------------|
+                        | str              |
+                        |------------------|
+                        | name             |
+                        |------------------|       +------------------+
+                        | CurrentInterface |       | CurrentInterface |
+                        |------------------|       |------------------|
+                        | CurrentAsm       |       | CurrentAsm       |
+                        |------------------|       |------------------|
+                        | n                |       | n                |
+                        |------------------|       |------------------|
+*)
+
+PROCEDURE BuildAsmElement (input, output, trash: BOOLEAN) ;
+VAR
+   n, str, expr, tokpos,
+   CurrentInterface,
+   CurrentAsm, name    : CARDINAL ;
+BEGIN
+   PopTtok (expr, tokpos) ;
+   PopT (str) ;
+   PopT (name) ;
+   PopT (CurrentInterface) ;
+   PopT (CurrentAsm) ;
+   Assert (IsGnuAsm (CurrentAsm) OR IsGnuAsmVolatile (CurrentAsm)) ;
+   PopT (n) ;
+   INC (n) ;
+   IF CurrentInterface = NulSym
+   THEN
+      CurrentInterface := MakeRegInterface ()
+   END ;
+   IF input
+   THEN
+      PutRegInterface (tokpos, CurrentInterface, n, name, str, expr,
+                       NextQuad, 0)
+   END ;
+   IF output
+   THEN
+      PutRegInterface (tokpos, CurrentInterface, n, name, str, expr,
+                       0, NextQuad)
+   END ;
+   IF trash
+   THEN
+      PutRegInterface (tokpos, CurrentInterface, n, name, str, expr,
+                       0, NextQuad)
+   END ;
+   PushT (n) ;
+   PushT (CurrentAsm) ;
+   PushT (CurrentInterface)
+END BuildAsmElement ;
+
+
 (*
    IncOperandD - increment the dimension number associated with symbol
                  at, pos, on the boolean stack.
index f2c74c7cc23a1fe2d48fc401dbace26ae0da1ace..52a8629f0bbc8f9a0bc953b97931cb904feac009 100644 (file)
@@ -918,14 +918,14 @@ NamedOperand := '[' Ident ']' =:
 
 AsmOperandName := [ NamedOperand ] =:
 
-AsmOperands  := string [ ':' AsmList [ ':' AsmList [ ':' TrashList ] ] ]
+AsmOperands  := ConstExpression ':' AsmList [ ':' AsmList [ ':' TrashList ] ]
               =:
 
 AsmList      := [ AsmElement ] { ',' AsmElement } =:
 
-AsmElement   := AsmOperandName string '(' Expression ')'
+AsmElement   := AsmOperandName ConstExpression '(' Expression ')'
               =:
 
-TrashList    := [ string ] { ',' string } =:
+TrashList    := [ ConstExpression ] { ',' ConstExpression } =:
 
 FNB
index c234d00efec3525bacf739334fb53093e780101f..5be6af4ddcb3a278faa32cf358cc8eeef3d9f50e 100644 (file)
@@ -1037,14 +1037,14 @@ NamedOperand := '[' Ident ']' =:
 
 AsmOperandName := [ NamedOperand ] =:
 
-AsmOperands  := string [ ':' AsmList [ ':' AsmList [ ':' TrashList ] ] ]
-             =:
+AsmOperands  := ConstExpression ':' AsmList [ ':' AsmList [ ':' TrashList ] ]
+              =:
 
 AsmList      := [ AsmElement ] { ',' AsmElement } =:
 
-AsmElement   := AsmOperandName string '(' Expression ')'
-             =:
+AsmElement   := AsmOperandName ConstExpression '(' Expression ')'
+              =:
 
-TrashList    := [ string ] { ',' string } =:
+TrashList    := [ ConstExpression ] { ',' ConstExpression } =:
 
 FNB
index ea5cfe73a5d0d730319eda80cb754e745a9acc1c..0a82e6b97f18d70e354a9f131e61d994163cef29 100644 (file)
@@ -1227,14 +1227,14 @@ NamedOperand := '[' Ident ']' =:
 
 AsmOperandName := [ NamedOperand ] =:
 
-AsmOperands  := string [ ':' AsmList [ ':' AsmList [ ':' TrashList ] ] ]
-             =:
+AsmOperands  := ConstExpression ':' AsmList [ ':' AsmList [ ':' TrashList ] ]
+              =:
 
 AsmList      := [ AsmElement ] { ',' AsmElement } =:
 
-AsmElement   := AsmOperandName string '(' Expression ')'
-             =:
+AsmElement   := AsmOperandName ConstExpression '(' Expression ')'
+              =:
 
-TrashList    := [ string ] { ',' string } =:
+TrashList    := [ ConstExpression ] { ',' ConstExpression } =:
 
 FNB
index 328ef4f1a3539ecf61c1a5cb5d8fa065522ecf19..8fbe19111b6a471b5eab4d24dc4f12fa8ecfac30 100644 (file)
@@ -126,6 +126,7 @@ FROM M2Quads IMPORT PushT, PopT, PushTF, PopTF, PopNothing, Annotate,
                     BuildRetry,
                     DisplayStack,
                     AddVarientRange, AddVarientEquality,
+                    BuildAsmElement,
                     BeginVarient, EndVarient, BeginVarientList, EndVarientList,
                     PushInConstExpression, PopInConstExpression, IsInConstExpression,
                     BuildDefaultFieldAlignment, BuildPragmaField,
@@ -1489,7 +1490,7 @@ AsmStatement :=                                                            % VAR
 AsmOperands :=                                                             % VAR CurrentAsm, count: CARDINAL ;
                                                                                  str: CARDINAL ;
                                                                            %
-               string                                                      % IF Pass3
+               ConstExpression                                             % IF Pass3
                                                                              THEN
                                                                                 PopT(str) ;
                                                                                 PopT(CurrentAsm) ;
@@ -1517,7 +1518,7 @@ AsmOperands :=                                                             % VAR
 
 AsmOperandSpec :=                                                          % VAR CurrentAsm, outputs, inputs, trash, count: CARDINAL ;
                                                                            %
-                  [ ':' AsmList                                            % IF Pass3
+                    ':' AsmOutputList                                      % IF Pass3
                                                                              THEN
                                                                                 PopT(outputs) ;
                                                                                 PopT(CurrentAsm) ;
@@ -1533,7 +1534,7 @@ AsmOperandSpec :=                                                          % VAR
                                                                                 PushT(NulSym)    (* the InterfaceSym *)
                                                                              END
                                                                            %
-                     [ ':' AsmList                                         % IF Pass3
+                     [ ':' AsmInputList                                    % IF Pass3
                                                                              THEN
                                                                                 PopT(inputs) ;
                                                                                 PopT(CurrentAsm) ;
@@ -1549,7 +1550,7 @@ AsmOperandSpec :=                                                          % VAR
                                                                                 PushT(NulSym)    (* the InterfaceSym *)
                                                                              END
                                                                            %
-                        [ ':' TrashList                                    % IF Pass3
+                        [ ':' AsmTrashList                                 % IF Pass3
                                                                              THEN
                                                                                 PopT(trash) ;
                                                                                 PopT(CurrentAsm) ;
@@ -1565,26 +1566,12 @@ AsmOperandSpec :=                                                          % VAR
                                                                                 PushT(NulSym)    (* the InterfaceSym *)
                                                                              END
                                                                            %
-                           ] ] ]
+                           ] ]
             =:
 
-AsmList     :=                                                             % VAR count, CurrentAsm, CurrentInterface: CARDINAL ; %
-                                                                           % IF Pass3
-                                                                             THEN
-                                                                                PopT(CurrentInterface) ;
-                                                                                PopT(CurrentAsm) ;
-                                                                                PopT(count) ;
-                                                                                Assert(IsGnuAsm(CurrentAsm) OR IsGnuAsmVolatile(CurrentAsm)) ;
-                                                                                PushT(count) ;
-                                                                                PushT(CurrentAsm) ;
-                                                                                PushT(CurrentInterface) ;
-                                                                                IF DebugAsm
-                                                                                THEN
-                                                                                   printf1('8: AsmList has a count of asm operands: %d\n', count)
-                                                                                END
-                                                                             END
-                                                                           %
-               [ AsmElement ] { ',' AsmElement } =:
+AsmOutputList := [ AsmOutputElement ] { ',' AsmOutputElement } =:
+
+AsmInputList := [ AsmInputElement ] { ',' AsmInputElement } =:
 
 NamedOperand := '[' Ident ']' =:
 
@@ -1597,85 +1584,48 @@ AsmOperandName :=  ( NamedOperand
                                     )
                 =:
 
-AsmElement :=                                                              % VAR n, str, expr,
-                                                                                 CurrentInterface,
-                                                                                 CurrentAsm, name: CARDINAL ; %
-              AsmOperandName
+AsmInputElement := AsmOperandName
+                   ConstExpression '(' Expression                          % IF Pass3
+                                                                             THEN
+                                                                                BuildAsmElement (TRUE, FALSE, FALSE)
+                                                                             END
+                                                                           %
+                                   ')'
+                 =:
 
-              string '(' Expression                                        % IF Pass3
+AsmOutputElement := AsmOperandName
+                    ConstExpression '(' Expression                         % IF Pass3
                                                                              THEN
-                                                                                PopT(expr) ;
-                                                                                PopT(str) ;
-                                                                                PopT(name) ;
-                                                                                PopT(CurrentInterface) ;
-                                                                                PopT(CurrentAsm) ;
-                                                                                Assert(IsGnuAsm(CurrentAsm) OR IsGnuAsmVolatile(CurrentAsm)) ;
-                                                                                PopT(n) ;
-                                                                                INC(n) ;
-                                                                                IF CurrentInterface=NulSym
-                                                                                THEN
-                                                                                   CurrentInterface := MakeRegInterface()
-                                                                                END ;
-                                                                                IF DebugAsm
-                                                                                THEN
-                                                                                   printf1('5: count of asm operands: %d\n', n)
-                                                                                END ;
-                                                                                PutRegInterface(CurrentInterface, n, name, str, expr) ;
-                                                                                PushT(n) ;
-                                                                                PushT(CurrentAsm) ;
-                                                                                PushT(CurrentInterface)
+                                                                                BuildAsmElement (FALSE, TRUE, FALSE)
                                                                              END
                                                                            %
-                      ')'
-           =:
+                                    ')'
+                  =:
 
-TrashList :=                                                               % VAR CurrentInterface,
-                                                                                 CurrentAsm,
-                                                                                 n, str          : CARDINAL ; %
-             [ string                                                      % IF Pass3
+AsmTrashList :=                                                            % VAR expr, tokpos  : CARDINAL ; %
+                 [ ConstExpression                                         % IF Pass3
                                                                              THEN
-                                                                                PopT(str) ;
-                                                                                PopT(CurrentInterface) ;
-                                                                                PopT(CurrentAsm) ;
-                                                                                PopT(n) ;
-                                                                                INC(n) ;
-                                                                                Assert(IsGnuAsm(CurrentAsm) OR IsGnuAsmVolatile(CurrentAsm)) ;
-                                                                                IF DebugAsm
-                                                                                THEN
-                                                                                   printf1('6: count of asm trash operands: %d\n', n)
-                                                                                END ;
-                                                                                IF CurrentInterface=NulSym
-                                                                                THEN
-                                                                                   CurrentInterface := MakeRegInterface()
-                                                                                END ;
-                                                                                PutRegInterface(CurrentInterface, n, NulName, str, NulSym) ;
-                                                                                PushT(n) ;
-                                                                                PushT(CurrentAsm) ;
-                                                                                PushT(CurrentInterface)
+                                                                                PopTtok (expr, tokpos) ;
+                                                                                PushT (NulSym) ;
+                                                                                PushTtok (expr, tokpos) ;
+                                                                                BuildAsmElement (FALSE, FALSE, TRUE) ;
+                                                                                PopTtok (expr, tokpos) ;
+                                                                                PopNothing ;
+                                                                                PushTtok (expr, tokpos) ;
                                                                              END
+
                                                                            %
-             ] { ',' string                                                % IF Pass3
+                 ] { ',' ConstExpression                                   % IF Pass3
                                                                              THEN
-                                                                                PopT(str) ;
-                                                                                PopT(CurrentInterface) ;
-                                                                                PopT(CurrentAsm) ;
-                                                                                PopT(n) ;
-                                                                                INC(n) ;
-                                                                                Assert(IsGnuAsm(CurrentAsm) OR IsGnuAsmVolatile(CurrentAsm)) ;
-                                                                                IF DebugAsm
-                                                                                THEN
-                                                                                   printf1('7: count of asm trash operands: %d\n', n)
-                                                                                END ;
-                                                                                IF CurrentInterface=NulSym
-                                                                                THEN
-                                                                                   CurrentInterface := MakeRegInterface()
-                                                                                END ;
-                                                                                PutRegInterface(CurrentInterface, n, NulName, str, NulSym) ;
-                                                                                PushT(n) ;
-                                                                                PushT(CurrentAsm) ;
-                                                                                PushT(CurrentInterface)
+                                                                                PopTtok (expr, tokpos) ;
+                                                                                PushT (NulSym) ;
+                                                                                PushTtok (expr, tokpos) ;
+                                                                                BuildAsmElement (FALSE, FALSE, TRUE) ;
+                                                                                PopTtok (expr, tokpos) ;
+                                                                                PopNothing ;
+                                                                                PushTtok (expr, tokpos) ;
                                                                              END
                                                                            %
-                } =:
+                   } =:
 
 FNB
index ba25d51de0a2ce99dfd087228624098fef9833d7..bffb1ea569ccdcc9e07a7c84c79fcebd404f6a53 100644 (file)
@@ -1252,12 +1252,14 @@ NamedOperand := '[' Ident ']' =:
 
 AsmOperandName := [ NamedOperand ] =:
 
-AsmOperands := string [ ':' AsmList [ ':' AsmList [ ':' TrashList ] ] ] =:
+AsmOperands  := ConstExpression ':' AsmList [ ':' AsmList [ ':' TrashList ] ]
+              =:
 
-AsmList     := [ AsmElement ] { ',' AsmElement } =:
+AsmList      := [ AsmElement ] { ',' AsmElement } =:
 
-AsmElement := AsmOperandName string '(' Expression ')' =:
+AsmElement   := AsmOperandName ConstExpression '(' Expression ')'
+              =:
 
-TrashList := [ string ] { ',' string } =:
+TrashList    := [ ConstExpression ] { ',' ConstExpression } =:
 
 FNB
index 79ebcde97329fc23e7e5ac3d31614db93afe4774..c829a6ee0b0e9af9204884d8f82c919b092c2f13 100644 (file)
@@ -1227,14 +1227,14 @@ NamedOperand := '[' Ident ']' =:
 
 AsmOperandName := [ NamedOperand ] =:
 
-AsmOperands  := AsmOperandName string [ ':' AsmList [ ':' AsmList [ ':' TrashList ] ] ]
-             =:
+AsmOperands  := ConstExpression ':' AsmList [ ':' AsmList [ ':' TrashList ] ]
+              =:
 
 AsmList      := [ AsmElement ] { ',' AsmElement } =:
 
-AsmElement   := string '(' Expression ')'
-             =:
+AsmElement   := AsmOperandName ConstExpression '(' Expression ')'
+              =:
 
-TrashList    := [ string ] { ',' string } =:
+TrashList    := [ ConstExpression ] { ',' ConstExpression } =:
 
 FNB
index c7f584bfb09de9e33a234b1ad9c12c942322f1ec..5249952e22f94841c184d80148bcec4337b2138a 100644 (file)
@@ -998,10 +998,14 @@ PROCEDURE MakeRegInterface () : CARDINAL ;
                      sym, at position, i.
                      The string symbol will either be a register name or a constraint.
                      The object is an optional Modula-2 variable or constant symbol.
+                     read and write are the quadruple numbers representing any read
+                     or write operation.
 *)
 
-PROCEDURE PutRegInterface (sym: CARDINAL; i: CARDINAL;
-                           n: Name; string, object: CARDINAL) ;
+PROCEDURE PutRegInterface (tok: CARDINAL;
+                           sym: CARDINAL; i: CARDINAL;
+                           n: Name; string, object: CARDINAL;
+                           read, write: CARDINAL) ;
 
 
 (*
@@ -1010,7 +1014,8 @@ PROCEDURE PutRegInterface (sym: CARDINAL; i: CARDINAL;
 *)
 
 PROCEDURE GetRegInterface (sym: CARDINAL; i: CARDINAL;
-                           VAR n: Name; VAR string, object: CARDINAL) ;
+                           VAR tok: CARDINAL; VAR n: Name;
+                           VAR string, object: CARDINAL) ;
 
 
 (*
index 1ea5fee9d3e1e15adb7ec98444630fb0b4a72a4b..ad3788d885b97e62ea8ad28e9718542941a8cdad 100644 (file)
@@ -142,9 +142,10 @@ TYPE
                 END ;
 
    PtrToAsmConstraint = POINTER TO RECORD
-                                      name: Name ;
-                                      str : CARDINAL ;   (* regnames or constraints     *)
-                                      obj : CARDINAL ;   (* list of M2 syms             *)
+                                      tokpos: CARDINAL ;
+                                      name  : Name ;
+                                      str   : CARDINAL ;   (* regnames or constraints     *)
+                                      obj   : CARDINAL ;   (* list of M2 syms             *)
                                    END ;
 
    ModuleCtor = RECORD
@@ -2335,6 +2336,46 @@ BEGIN
 END IsDeclaredIn ;
 
 
+(*
+   SetFirstUsed - assigns the FirstUsed field in at to tok providing
+                  it has not already been set.
+*)
+
+PROCEDURE SetFirstUsed (tok: CARDINAL; VAR at: Where) ;
+BEGIN
+   IF at.FirstUsed = UnknownTokenNo
+   THEN
+      at.FirstUsed := tok
+   END
+END SetFirstUsed ;
+
+
+(*
+   PutFirstUsed - sets tok to the first used providing it has not already been set.
+                  It also includes the read and write quad into the usage list
+                  providing the quad numbers are not 0.
+*)
+
+PROCEDURE PutFirstUsed (object: CARDINAL; tok: CARDINAL; read, write: CARDINAL) ;
+VAR
+   pSym: PtrToSymbol ;
+BEGIN
+   IF IsVar (object)
+   THEN
+      pSym := GetPsym (object) ;
+      SetFirstUsed (tok, pSym^.Var.At) ;
+      IF read # 0
+      THEN
+         PutReadQuad (object, GetMode (object), read)
+      END ;
+      IF write # 0
+      THEN
+         PutWriteQuad (object, GetMode (object), write)
+      END
+   END
+END PutFirstUsed ;
+
+
 (*
    MakeGnuAsm - create a GnuAsm symbol.
 *)
@@ -2345,12 +2386,12 @@ VAR
    Sym : CARDINAL ;
 BEGIN
    NewSym(Sym) ;
-   pSym := GetPsym(Sym) ;
+   pSym := GetPsym (Sym) ;
    WITH pSym^ DO
       SymbolType := GnuAsmSym ;
       WITH GnuAsm DO
          String   := NulSym ;
-         InitWhereDeclared(At) ;
+         InitWhereDeclared (At) ;
          Inputs   := NulSym ;
          Outputs  := NulSym ;
          Trashed  := NulSym ;
@@ -2370,7 +2411,7 @@ PROCEDURE PutGnuAsm (sym: CARDINAL; string: CARDINAL) ;
 VAR
    pSym: PtrToSymbol ;
 BEGIN
-   Assert(IsConstString(string)) ;
+   Assert (IsConstString (string)) ;
    pSym := GetPsym(sym) ;
    WITH pSym^ DO
       CASE SymbolType OF
@@ -2397,7 +2438,7 @@ BEGIN
    WITH pSym^ DO
       CASE SymbolType OF
 
-      GnuAsmSym: RETURN( GnuAsm.String )
+      GnuAsmSym: RETURN GnuAsm.String
 
       ELSE
          InternalError ('expecting GnuAsm symbol')
@@ -2435,7 +2476,7 @@ PROCEDURE PutGnuAsmInput (sym: CARDINAL; in: CARDINAL) ;
 VAR
    pSym: PtrToSymbol ;
 BEGIN
-   pSym := GetPsym(sym) ;
+   pSym := GetPsym (sym) ;
    WITH pSym^ DO
       CASE SymbolType OF
 
@@ -2456,7 +2497,7 @@ PROCEDURE PutGnuAsmTrash (sym: CARDINAL; trash: CARDINAL) ;
 VAR
    pSym: PtrToSymbol ;
 BEGIN
-   pSym := GetPsym(sym) ;
+   pSym := GetPsym (sym) ;
    WITH pSym^ DO
       CASE SymbolType OF
 
@@ -2477,11 +2518,11 @@ PROCEDURE GetGnuAsmInput (sym: CARDINAL) : CARDINAL ;
 VAR
    pSym: PtrToSymbol ;
 BEGIN
-   pSym := GetPsym(sym) ;
+   pSym := GetPsym (sym) ;
    WITH pSym^ DO
       CASE SymbolType OF
 
-      GnuAsmSym: RETURN( GnuAsm.Inputs )
+      GnuAsmSym: RETURN GnuAsm.Inputs
 
       ELSE
          InternalError ('expecting PutGnuAsm symbol')
@@ -2498,11 +2539,11 @@ PROCEDURE GetGnuAsmOutput (sym: CARDINAL) : CARDINAL ;
 VAR
    pSym: PtrToSymbol ;
 BEGIN
-   pSym := GetPsym(sym) ;
+   pSym := GetPsym (sym) ;
    WITH pSym^ DO
       CASE SymbolType OF
 
-      GnuAsmSym: RETURN( GnuAsm.Outputs )
+      GnuAsmSym: RETURN GnuAsm.Outputs
 
       ELSE
          InternalError ('expecting PutGnuAsm symbol')
@@ -2519,11 +2560,11 @@ PROCEDURE GetGnuAsmTrash (sym: CARDINAL) : CARDINAL ;
 VAR
    pSym: PtrToSymbol ;
 BEGIN
-   pSym := GetPsym(sym) ;
+   pSym := GetPsym (sym) ;
    WITH pSym^ DO
       CASE SymbolType OF
 
-      GnuAsmSym: RETURN( GnuAsm.Trashed )
+      GnuAsmSym: RETURN GnuAsm.Trashed
 
       ELSE
          InternalError ('expecting PutGnuAsm symbol')
@@ -2540,7 +2581,7 @@ PROCEDURE PutGnuAsmVolatile (Sym: CARDINAL) ;
 VAR
    pSym: PtrToSymbol ;
 BEGIN
-   pSym := GetPsym(Sym) ;
+   pSym := GetPsym (Sym) ;
    WITH pSym^ DO
       CASE SymbolType OF
 
@@ -2561,7 +2602,7 @@ PROCEDURE PutGnuAsmSimple (Sym: CARDINAL) ;
 VAR
    pSym: PtrToSymbol ;
 BEGIN
-   pSym := GetPsym(Sym) ;
+   pSym := GetPsym (Sym) ;
    WITH pSym^ DO
       CASE SymbolType OF
 
@@ -2583,13 +2624,13 @@ VAR
    pSym: PtrToSymbol ;
    Sym : CARDINAL ;
 BEGIN
-   NewSym(Sym) ;
-   pSym := GetPsym(Sym) ;
+   NewSym (Sym) ;
+   pSym := GetPsym (Sym) ;
    WITH pSym^ DO
       SymbolType := InterfaceSym ;
       WITH Interface DO
-         Parameters := InitIndex(1) ;
-         InitWhereDeclared(At)
+         Parameters := InitIndex (1) ;
+         InitWhereDeclared (At)
       END
    END ;
    RETURN( Sym )
@@ -2601,9 +2642,13 @@ END MakeRegInterface ;
                      sym, at position, i.
                      The string symbol will either be a register name or a constraint.
                      The object is an optional Modula-2 variable or constant symbol.
+                     read and write are the quadruple numbers representing any read
+                     or write operation.
 *)
 
-PROCEDURE PutRegInterface (sym: CARDINAL; i: CARDINAL; n: Name; string, object: CARDINAL) ;
+PROCEDURE PutRegInterface (tok: CARDINAL;
+                           sym: CARDINAL; i: CARDINAL; n: Name; string, object: CARDINAL;
+                           read, write: CARDINAL) ;
 VAR
    pSym : PtrToSymbol ;
    p    : PtrToAsmConstraint ;
@@ -2623,10 +2668,12 @@ BEGIN
                        InternalError ('expecting to add parameters sequentially')
                     END ;
                     WITH p^ DO
-                       name := n ;
-                       str  := string ;
-                       obj  := object
-                    END
+                       tokpos := tok ;
+                       name   := n ;
+                       str    := string ;
+                       obj    := object
+                    END ;
+                    PutFirstUsed (object, tok, read, write)
 
       ELSE
          InternalError ('expecting Interface symbol')
@@ -2640,7 +2687,8 @@ END PutRegInterface ;
                      sym, from position, i.
 *)
 
-PROCEDURE GetRegInterface (sym: CARDINAL; i: CARDINAL; VAR n: Name; VAR string, object: CARDINAL) ;
+PROCEDURE GetRegInterface (sym: CARDINAL; i: CARDINAL;
+                           VAR tok: CARDINAL; VAR n: Name; VAR string, object: CARDINAL) ;
 VAR
    pSym: PtrToSymbol ;
    p   : PtrToAsmConstraint ;
@@ -2653,11 +2701,13 @@ BEGIN
                     THEN
                        p := Indexing.GetIndice(Interface.Parameters, i) ;
                        WITH p^ DO
+                          tok    := tokpos ;
                           n      := name ;
                           string := str ;
                           object := obj
                        END
                     ELSE
+                       tok    := UnknownTokenNo ;
                        n      := NulName ;
                        string := NulSym ;
                        object := NulSym
@@ -8953,20 +9003,20 @@ BEGIN
       CASE SymbolType OF
 
       DefImpSym: WITH DefImp DO
-                    CheckForUnknownsname, ExportQualifiedTree,
-                                      'EXPORT QUALIFIED' ) ;
-                    CheckForUnknownsname, ExportUnQualifiedTree,
-                                      'EXPORT UNQUALIFIED' ) ;
-                    CheckForSymbols ExportRequest,
-                                      'requested by another modules import (symbols have not been exported by the appropriate definition module)' ) ;
-                    CheckForUnknowns( name, Unresolved, 'unresolved' ) ;
-                    CheckForUnknowns( name, LocalSymbols, 'locally used' )
+                    CheckForUnknowns (name, ExportQualifiedTree,
+                                      'EXPORT QUALIFIED') ;
+                    CheckForUnknowns (name, ExportUnQualifiedTree,
+                                      'EXPORT UNQUALIFIED') ;
+                    CheckForSymbols  (ExportRequest,
+                                      'requested by another modules import (symbols have not been exported by the appropriate definition module)') ;
+                    CheckForUnknowns (name, Unresolved, 'unresolved') ;
+                    CheckForUnknowns (name, LocalSymbols, 'locally used')
                  END |
       ModuleSym: WITH Module DO
-                    CheckForUnknowns( name, Unresolved, 'unresolved' ) ;
-                    CheckForUnknowns( name, ExportUndeclared, 'exported but undeclared' ) ;
-                    CheckForUnknowns( name, ExportTree, 'exported but undeclared' ) ;
-                    CheckForUnknowns( name, LocalSymbols, 'locally used' )
+                    CheckForUnknowns (name, Unresolved, 'unresolved') ;
+                    CheckForUnknowns (name, ExportUndeclared, 'exported but undeclared') ;
+                    CheckForUnknowns (name, ExportTree, 'exported but undeclared') ;
+                    CheckForUnknowns (name, LocalSymbols, 'locally used')
                  END
 
       ELSE
diff --git a/gcc/testsuite/gm2/pim/pass/fooasm3.mod b/gcc/testsuite/gm2/pim/pass/fooasm3.mod
new file mode 100644 (file)
index 0000000..84e95cc
--- /dev/null
@@ -0,0 +1,12 @@
+MODULE fooasm3 ;
+
+VAR x: INTEGER;
+
+PROCEDURE test;
+BEGIN
+  ASM("" : "=rm"(x));  (* x is an output.  *)
+END test;
+
+BEGIN
+   test
+END fooasm3.