PR modula2/113889 Incorrect constant string value if declared in a definition module
This patch fixes a bug exposed when a constant string is declared in a
definition module and imported by a program module. The bug fix
was to defer the string assignment and concatenation until quadruples
were generated. The conststring symbol has a known field which
must be checked prior to retrieving the string contents.
gcc/m2/ChangeLog:
PR modula2/113889
* gm2-compiler/M2ALU.mod (StringFitsArray): Add tokeno parameter
to GetStringLength.
(InitialiseArrayOfCharWithString): Add tokeno parameter to
GetStringLength.
(CheckGetCharFromString): Add tokeno parameter to GetStringLength.
* gm2-compiler/M2Const.mod (constResolveViaMeta): Replace
PutConstString with PutConstStringKnown.
* gm2-compiler/M2GCCDeclare.mod (DeclareCharConstant): Add tokenno
parameter and add assert. Use tokenno to generate location.
(DeclareStringConstant): Add tokenno and add asserts.
Add tokenno parameter to calls to GetStringLength.
(PromoteToString): Add assert and add tokenno parameter to
GetStringLength.
(PromoteToCString): Add assert and add tokenno parameter to
GetStringLength.
(DeclareConstString): New procedure function.
(TryDeclareConst): Remove size local variable.
Check IsConstStringKnown.
Call DeclareConstString.
(PrintString): New procedure.
(PrintVerboseFromList): Call PrintString.
(CheckResolveSubrange): Check IsConstStringKnown before creating
subrange for char or issuing an error.
* gm2-compiler/M2GenGCC.mod (ResolveConstantExpressions): Add
StringLengthOp, StringConvertM2nulOp, StringConvertCnulOp case
clauses.
(FindSize): Add assert IsConstStringKnown.
(StringToChar): New variable tokenno.
Add tokenno parameter to GetStringLength.
(FoldStringLength): New procedure.
(FoldStringConvertM2nul): New procedure.
(FoldStringConvertCnul): New procedure.
(CodeAddr): Add tokenno parameter.
Replace CurrentQuadToken with tokenno.
Add tokenno parameter to GetStringLength.
(PrepareCopyString): Rewrite.
(IsConstStrKnown): New procedure function.
(FoldAdd): Detect conststring op2 and op3 which are known and
concat. Place result into op1.
(FoldStandardFunction): Pass tokenno as a parameter to
GetStringLength.
(CodeXIndr): Rewrite comment.
Rename op1 to left, op3 to right.
Pass rightpos to GetStringLength.
* gm2-compiler/M2Quads.def (QuadrupleOp): Add
StringConvertCnulOp, StringConvertM2nulOp and StringLengthOp.
* gm2-compiler/M2Quads.mod (import): Remove MakeConstLitString.
Add CopyConstString and PutConstStringKnown.
(IsInitialisingConst): Add StringConvertCnulOp,
StringConvertM2nulOp and StringLengthOp.
(callRequestDependant): Replace MakeConstLitString with
MakeConstString.
(DeferMakeConstStringCnul): New procedure function.
(DeferMakeConstStringM2nul): New procedure function.
(CheckParameter): Add early return if the string const is unknown.
(DescribeType): Add token parameter to GetStringLength.
Check for IsConstStringKnown.
(ManipulateParameters): Use DeferMakeConstStringCnul and
DeferMakeConstStringM2nul.
(MakeLengthConst): Remove and replace with...
(DeferMakeLengthConst): ... this.
(doBuildBinaryOp): Create ConstString and set it to contents
unknown.
Check IsConstStringKnown before generating error message.
(WriteQuad): Add StringConvertCnulOp, StringConvertM2nulOp and
StringLengthOp.
(WriteOperator): Add StringConvertCnulOp, StringConvertM2nulOp and
StringLengthOp.
* gm2-compiler/M2SymInit.mod (CheckReadBeforeInitQuad): Add
StringConvertCnulOp, StringConvertM2nulOp and StringLengthOp.
* gm2-compiler/NameKey.mod (LengthKey): Allow NulName to return 0.
* gm2-compiler/P2SymBuild.mod (BuildString): Replace
MakeConstLitString with MakeConstString.
(DetermineType): Replace PutConstString with PutConstStringKnown.
* gm2-compiler/SymbolTable.def (MakeConstVar): Tidy up comment.
(MakeConstLitString): Remove.
(MakeConstString): New procedure function.
(MakeConstStringCnul): New procedure function.
(MakeConstStringM2nul): New procedure function.
(PutConstStringKnown): New procedure.
(CopyConstString): New procedure.
(IsConstStringKnown): New procedure function.
(IsConstStringM2): New procedure function.
(IsConstStringC): New procedure function.
(IsConstStringM2nul): New procedure function.
(IsConstStringCnul): New procedure function.
(GetStringLength): Add token parameter.
(PutConstString): Remove.
(GetConstStringM2): Remove.
(GetConstStringC): Remove.
(GetConstStringM2nul): Remove.
(GetConstStringCnul): Remove.
(MakeConstStringC): Remove.
* gm2-compiler/SymbolTable.mod (SymConstString): Remove
M2Variant, NulM2Variant, CVariant, NulCVariant.
Add Known.
(CheckAnonymous): Replace $$ with __anon.
(IsNameAnonymous): Replace $$ with __anon.
(MakeConstVar): Detect whether the name is nul and treat as
a temporary constant.
(MakeConstLitString): Remove.
(BackFillString): Remove.
(InitConstString): Rewrite.
(GetConstStringM2): Remove.
(GetConstStringC): Remove.
(GetConstStringContent): New procedure function.
(GetConstStringM2nul): Remove.
(GetConstStringCnul): Remove.
(MakeConstStringCnul): Rewrite.
(MakeConstStringM2nul): Rewrite.
(MakeConstStringC): Remove.
(MakeConstString): Rewrite.
(PutConstStringKnown): New procedure.
(CopyConstString): New procedure.
(PutConstString): Remove.
(IsConstStringKnown): New procedure function.
(IsConstStringM2): New procedure function.
(IsConstStringC): Rewrite.
(IsConstStringM2nul): Rewrite.
(IsConstStringCnul): Rewrite.
(GetConstStringKind): New procedure function.
(GetString): Check Known.
(GetStringLength): Add token parameter and check Known.
gcc/testsuite/ChangeLog:
PR modula2/113889
* gm2/pim/run/pass/pim-run-pass.exp: Add filter for
constdef.mod.
* gm2/extensions/run/pass/callingc2.mod: New test.
* gm2/extensions/run/pass/callingc3.mod: New test.
* gm2/extensions/run/pass/callingc4.mod: New test.
* gm2/extensions/run/pass/callingc5.mod: New test.
* gm2/extensions/run/pass/callingc6.mod: New test.
* gm2/extensions/run/pass/callingc7.mod: New test.
* gm2/extensions/run/pass/callingc8.mod: New test.
* gm2/extensions/run/pass/fixedarray.mod: New test.
* gm2/extensions/run/pass/fixedarray2.mod: New test.
* gm2/pim/run/pass/constdef.def: New test.
* gm2/pim/run/pass/constdef.mod: New test.
* gm2/pim/run/pass/testimportconst.mod: New test.
Signed-off-by:
Gaius Mulley <gaiusmod2@gmail.com>
Showing
- gcc/m2/gm2-compiler/M2ALU.mod 3 additions, 3 deletionsgcc/m2/gm2-compiler/M2ALU.mod
- gcc/m2/gm2-compiler/M2Const.mod 1 addition, 1 deletiongcc/m2/gm2-compiler/M2Const.mod
- gcc/m2/gm2-compiler/M2GCCDeclare.mod 83 additions, 46 deletionsgcc/m2/gm2-compiler/M2GCCDeclare.mod
- gcc/m2/gm2-compiler/M2GenGCC.mod 215 additions, 88 deletionsgcc/m2/gm2-compiler/M2GenGCC.mod
- gcc/m2/gm2-compiler/M2Quads.def 3 additions, 0 deletionsgcc/m2/gm2-compiler/M2Quads.def
- gcc/m2/gm2-compiler/M2Quads.mod 90 additions, 40 deletionsgcc/m2/gm2-compiler/M2Quads.mod
- gcc/m2/gm2-compiler/M2SymInit.mod 3 additions, 0 deletionsgcc/m2/gm2-compiler/M2SymInit.mod
- gcc/m2/gm2-compiler/NameKey.mod 8 additions, 5 deletionsgcc/m2/gm2-compiler/NameKey.mod
- gcc/m2/gm2-compiler/P2SymBuild.mod 4 additions, 4 deletionsgcc/m2/gm2-compiler/P2SymBuild.mod
- gcc/m2/gm2-compiler/SymbolTable.def 78 additions, 447 deletionsgcc/m2/gm2-compiler/SymbolTable.def
- gcc/m2/gm2-compiler/SymbolTable.mod 133 additions, 317 deletionsgcc/m2/gm2-compiler/SymbolTable.mod
- gcc/testsuite/gm2/extensions/run/pass/callingc2.mod 7 additions, 0 deletionsgcc/testsuite/gm2/extensions/run/pass/callingc2.mod
- gcc/testsuite/gm2/extensions/run/pass/callingc3.mod 13 additions, 0 deletionsgcc/testsuite/gm2/extensions/run/pass/callingc3.mod
- gcc/testsuite/gm2/extensions/run/pass/callingc4.mod 10 additions, 0 deletionsgcc/testsuite/gm2/extensions/run/pass/callingc4.mod
- gcc/testsuite/gm2/extensions/run/pass/callingc5.mod 10 additions, 0 deletionsgcc/testsuite/gm2/extensions/run/pass/callingc5.mod
- gcc/testsuite/gm2/extensions/run/pass/callingc6.mod 10 additions, 0 deletionsgcc/testsuite/gm2/extensions/run/pass/callingc6.mod
- gcc/testsuite/gm2/extensions/run/pass/callingc7.mod 10 additions, 0 deletionsgcc/testsuite/gm2/extensions/run/pass/callingc7.mod
- gcc/testsuite/gm2/extensions/run/pass/callingc8.mod 10 additions, 0 deletionsgcc/testsuite/gm2/extensions/run/pass/callingc8.mod
- gcc/testsuite/gm2/extensions/run/pass/fixedarray.mod 7 additions, 0 deletionsgcc/testsuite/gm2/extensions/run/pass/fixedarray.mod
- gcc/testsuite/gm2/extensions/run/pass/fixedarray2.mod 7 additions, 0 deletionsgcc/testsuite/gm2/extensions/run/pass/fixedarray2.mod
Loading
Please register or sign in to comment