PR modula2/115112 Incorrect line debugging information occurs during INC builtin
This patch fixes location bugs in BuildDecProcedure, BuildIncProcedure, BuildInclProcedure, BuildExclProcedure and BuildThrow. All these procedure functions use the token position passed as a parameter (rather than from the quad stack). It also fixes location bugs in CheckRangeIncDec to ensure that the token position is stored on the quad stack before calling subsidiary procedure functions. gcc/m2/ChangeLog: PR modula2/115112 * gm2-compiler/M2Quads.mod (BuildPseudoProcedureCall): Pass tokno to each build procedure. (BuildThrowProcedure): New parameter functok. (BuildIncProcedure): New parameter proctok. Pass proctok on the quad stack during every push. (BuildDecProcedure): Ditto. (BuildInclProcedure): New parameter proctok. (BuildExclProcedure): New parameter proctok. gcc/testsuite/ChangeLog: PR modula2/115112 * gm2/pim/run/pass/dectest.mod: New test. * gm2/pim/run/pass/inctest.mod: New test. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
This commit is contained in:
parent
f176028371
commit
4d0faaaaf9
3 changed files with 47 additions and 37 deletions
|
@ -7021,19 +7021,19 @@ BEGIN
|
|||
BuildDisposeProcedure (tokno)
|
||||
ELSIF ProcSym = Inc
|
||||
THEN
|
||||
BuildIncProcedure
|
||||
BuildIncProcedure (tokno)
|
||||
ELSIF ProcSym = Dec
|
||||
THEN
|
||||
BuildDecProcedure
|
||||
BuildDecProcedure (tokno)
|
||||
ELSIF ProcSym = Incl
|
||||
THEN
|
||||
BuildInclProcedure
|
||||
BuildInclProcedure (tokno)
|
||||
ELSIF ProcSym = Excl
|
||||
THEN
|
||||
BuildExclProcedure
|
||||
BuildExclProcedure (tokno)
|
||||
ELSIF ProcSym = Throw
|
||||
THEN
|
||||
BuildThrowProcedure
|
||||
BuildThrowProcedure (tokno)
|
||||
ELSE
|
||||
InternalError ('pseudo procedure not implemented yet')
|
||||
END
|
||||
|
@ -7084,14 +7084,12 @@ END GetItemPointedTo ;
|
|||
|----------------|
|
||||
*)
|
||||
|
||||
PROCEDURE BuildThrowProcedure ;
|
||||
PROCEDURE BuildThrowProcedure (functok: CARDINAL) ;
|
||||
VAR
|
||||
functok : CARDINAL ;
|
||||
op : CARDINAL ;
|
||||
NoOfParam: CARDINAL ;
|
||||
BEGIN
|
||||
PopT (NoOfParam) ;
|
||||
functok := OperandTtok (NoOfParam + 1) ;
|
||||
IF NoOfParam = 1
|
||||
THEN
|
||||
op := OperandT (NoOfParam) ;
|
||||
|
@ -7328,19 +7326,19 @@ BEGIN
|
|||
IF IsExpressionCompatible (dtype, etype)
|
||||
THEN
|
||||
(* the easy case simulate a straightforward macro *)
|
||||
PushTF (des, dtype) ;
|
||||
PushTFtok (des, dtype, tokenpos) ;
|
||||
PushT (tok) ;
|
||||
PushTF (expr, etype) ;
|
||||
PushTFtok (expr, etype, tokenpos) ;
|
||||
doBuildBinaryOp (FALSE, TRUE)
|
||||
ELSE
|
||||
IF (IsOrdinalType (dtype) OR (dtype = Address) OR IsPointer (dtype)) AND
|
||||
(IsOrdinalType (etype) OR (etype = Address) OR IsPointer (etype))
|
||||
THEN
|
||||
PushTF (des, dtype) ;
|
||||
PushTFtok (des, dtype, tokenpos) ;
|
||||
PushT (tok) ;
|
||||
PushTF (Convert, NulSym) ;
|
||||
PushT (dtype) ;
|
||||
PushT (expr) ;
|
||||
PushTFtok (Convert, NulSym, tokenpos) ;
|
||||
PushTtok (dtype, tokenpos) ;
|
||||
PushTtok (expr, tokenpos) ;
|
||||
PushT (2) ; (* Two parameters *)
|
||||
BuildConvertFunction (Convert, FALSE) ;
|
||||
doBuildBinaryOp (FALSE, TRUE)
|
||||
|
@ -7387,9 +7385,8 @@ END CheckRangeIncDec ;
|
|||
|----------------|
|
||||
*)
|
||||
|
||||
PROCEDURE BuildIncProcedure ;
|
||||
PROCEDURE BuildIncProcedure (proctok: CARDINAL) ;
|
||||
VAR
|
||||
proctok : CARDINAL ;
|
||||
NoOfParam,
|
||||
dtype,
|
||||
OperandSym,
|
||||
|
@ -7397,26 +7394,25 @@ VAR
|
|||
TempSym : CARDINAL ;
|
||||
BEGIN
|
||||
PopT (NoOfParam) ;
|
||||
proctok := OperandTtok (NoOfParam + 1) ;
|
||||
IF (NoOfParam = 1) OR (NoOfParam = 2)
|
||||
THEN
|
||||
VarSym := OperandT (NoOfParam) ; (* bottom/first parameter *)
|
||||
VarSym := OperandT (NoOfParam) ; (* Bottom/first parameter. *)
|
||||
IF IsVar (VarSym)
|
||||
THEN
|
||||
dtype := GetDType (VarSym) ;
|
||||
IF NoOfParam = 2
|
||||
THEN
|
||||
OperandSym := DereferenceLValue (OperandTok (1), OperandT (1))
|
||||
OperandSym := DereferenceLValue (proctok, OperandT (1))
|
||||
ELSE
|
||||
PushOne (proctok, dtype,
|
||||
'the {%EkINC} will cause an overflow {%1ad}') ;
|
||||
PopT (OperandSym)
|
||||
END ;
|
||||
|
||||
PushT (VarSym) ;
|
||||
TempSym := DereferenceLValue (OperandTok (NoOfParam), VarSym) ;
|
||||
CheckRangeIncDec (proctok, TempSym, OperandSym, PlusTok) ; (* TempSym + OperandSym *)
|
||||
BuildAssignmentWithoutBounds (proctok, FALSE, TRUE) (* VarSym := TempSym + OperandSym *)
|
||||
PushTtok (VarSym, proctok) ;
|
||||
TempSym := DereferenceLValue (proctok, VarSym) ;
|
||||
CheckRangeIncDec (proctok, TempSym, OperandSym, PlusTok) ; (* TempSym + OperandSym. *)
|
||||
BuildAssignmentWithoutBounds (proctok, FALSE, TRUE) (* VarSym := TempSym + OperandSym. *)
|
||||
ELSE
|
||||
MetaErrorT1 (proctok,
|
||||
'base procedure {%EkINC} expects a variable as a parameter but was given {%1Ed}',
|
||||
|
@ -7460,9 +7456,8 @@ END BuildIncProcedure ;
|
|||
|----------------|
|
||||
*)
|
||||
|
||||
PROCEDURE BuildDecProcedure ;
|
||||
PROCEDURE BuildDecProcedure (proctok: CARDINAL) ;
|
||||
VAR
|
||||
proctok,
|
||||
NoOfParam,
|
||||
dtype,
|
||||
OperandSym,
|
||||
|
@ -7470,26 +7465,25 @@ VAR
|
|||
TempSym : CARDINAL ;
|
||||
BEGIN
|
||||
PopT (NoOfParam) ;
|
||||
proctok := OperandTtok (NoOfParam + 1) ;
|
||||
IF (NoOfParam = 1) OR (NoOfParam = 2)
|
||||
THEN
|
||||
VarSym := OperandT (NoOfParam) ; (* bottom/first parameter *)
|
||||
VarSym := OperandT (NoOfParam) ; (* Bottom/first parameter. *)
|
||||
IF IsVar (VarSym)
|
||||
THEN
|
||||
dtype := GetDType (VarSym) ;
|
||||
IF NoOfParam = 2
|
||||
THEN
|
||||
OperandSym := DereferenceLValue (OperandTok (1), OperandT (1))
|
||||
OperandSym := DereferenceLValue (proctok, OperandT (1))
|
||||
ELSE
|
||||
PushOne (proctok, dtype,
|
||||
'the {%EkDEC} will cause an overflow {%1ad}') ;
|
||||
PopT (OperandSym)
|
||||
END ;
|
||||
|
||||
PushT (VarSym) ;
|
||||
PushTtok (VarSym, proctok) ;
|
||||
TempSym := DereferenceLValue (OperandTok (NoOfParam), VarSym) ;
|
||||
CheckRangeIncDec (proctok, TempSym, OperandSym, MinusTok) ; (* TempSym - OperandSym *)
|
||||
BuildAssignmentWithoutBounds (proctok, FALSE, TRUE) (* VarSym := TempSym - OperandSym *)
|
||||
CheckRangeIncDec (proctok, TempSym, OperandSym, MinusTok) ; (* TempSym - OperandSym. *)
|
||||
BuildAssignmentWithoutBounds (proctok, FALSE, TRUE) (* VarSym := TempSym - OperandSym. *)
|
||||
ELSE
|
||||
MetaErrorT1 (proctok,
|
||||
'base procedure {%EkDEC} expects a variable as a parameter but was given {%1Ed}',
|
||||
|
@ -7553,9 +7547,8 @@ END DereferenceLValue ;
|
|||
|----------------|
|
||||
*)
|
||||
|
||||
PROCEDURE BuildInclProcedure ;
|
||||
PROCEDURE BuildInclProcedure (proctok: CARDINAL) ;
|
||||
VAR
|
||||
proctok,
|
||||
optok : CARDINAL ;
|
||||
NoOfParam,
|
||||
DerefSym,
|
||||
|
@ -7563,7 +7556,6 @@ VAR
|
|||
VarSym : CARDINAL ;
|
||||
BEGIN
|
||||
PopT (NoOfParam) ;
|
||||
proctok := OperandTtok (NoOfParam + 1) ;
|
||||
IF NoOfParam = 2
|
||||
THEN
|
||||
VarSym := OperandT (2) ;
|
||||
|
@ -7619,9 +7611,8 @@ END BuildInclProcedure ;
|
|||
|----------------|
|
||||
*)
|
||||
|
||||
PROCEDURE BuildExclProcedure ;
|
||||
PROCEDURE BuildExclProcedure (proctok: CARDINAL) ;
|
||||
VAR
|
||||
proctok,
|
||||
optok : CARDINAL ;
|
||||
NoOfParam,
|
||||
DerefSym,
|
||||
|
@ -7629,7 +7620,6 @@ VAR
|
|||
VarSym : CARDINAL ;
|
||||
BEGIN
|
||||
PopT (NoOfParam) ;
|
||||
proctok := OperandTtok (NoOfParam + 1) ;
|
||||
IF NoOfParam=2
|
||||
THEN
|
||||
VarSym := OperandT (2) ;
|
||||
|
|
10
gcc/testsuite/gm2/pim/run/pass/dectest.mod
Normal file
10
gcc/testsuite/gm2/pim/run/pass/dectest.mod
Normal file
|
@ -0,0 +1,10 @@
|
|||
MODULE dectest ;
|
||||
|
||||
VAR
|
||||
c: CARDINAL ;
|
||||
BEGIN
|
||||
c := 20 ;
|
||||
WHILE c > 1 DO
|
||||
DEC (c)
|
||||
END
|
||||
END dectest.
|
10
gcc/testsuite/gm2/pim/run/pass/inctest.mod
Normal file
10
gcc/testsuite/gm2/pim/run/pass/inctest.mod
Normal file
|
@ -0,0 +1,10 @@
|
|||
MODULE inctest ;
|
||||
|
||||
VAR
|
||||
c: CARDINAL ;
|
||||
BEGIN
|
||||
c := 0 ;
|
||||
WHILE c < 20 DO
|
||||
INC (c)
|
||||
END
|
||||
END inctest.
|
Loading…
Add table
Reference in a new issue