GetNextQuad, GetQuad, QuadOperator,
SubQuad, DisplayQuadRange ;
-FROM M2Scope IMPORT ScopeBlock, ForeachScopeBlockDo ;
-FROM M2GenGCC IMPORT ConvertQuadsToTree ;
+FROM M2Scope IMPORT ScopeBlock, ForeachScopeBlockDo3 ;
CONST
PROCEDURE InitBasicBlocks (sb: ScopeBlock) : BasicBlock ;
BEGIN
HeadOfBasicBlock := NIL ;
- ForeachScopeBlockDo (sb, ConvertQuads2BasicBlock) ;
+ ForeachScopeBlockDo3 (sb, ConvertQuads2BasicBlock) ;
RETURN HeadOfBasicBlock
END InitBasicBlocks ;
DeclareProcedure, InitDeclarations,
DeclareModuleVariables, MarkExported ;
-FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock, ForeachScopeBlockDo ;
+FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock,
+ ForeachScopeBlockDo2, ForeachScopeBlockDo3 ;
+
FROM m2top IMPORT StartGlobalContext, EndGlobalContext, SetFlagUnitAtATime ;
FROM M2Error IMPORT FlushErrors, FlushWarnings ;
FROM M2Swig IMPORT GenerateSwigFile ;
InitOptimizeVariables ;
OptimTimes := 1 ;
Current := CountQuads () ;
- ForeachScopeBlockDo (sb, InitialDeclareAndOptimize) ;
- ForeachScopeBlockDo (sb, ScopeBlockVariableAnalysis) ;
+ ForeachScopeBlockDo3 (sb, InitialDeclareAndOptimize) ;
+ ForeachScopeBlockDo3 (sb, ScopeBlockVariableAnalysis) ;
REPEAT
- ForeachScopeBlockDo (sb, SecondDeclareAndOptimize) ;
+ ForeachScopeBlockDo3 (sb, SecondDeclareAndOptimize) ;
Previous := Current ;
Current := CountQuads () ;
INC (OptimTimes)
UNTIL (OptimTimes=MaxOptimTimes) OR (Current=Previous) ;
- ForeachScopeBlockDo (sb, LoopAnalysis)
+ ForeachScopeBlockDo3 (sb, LoopAnalysis)
END OptimizeScopeBlock ;
THEN
n := GetSymName(scope) ;
printf1('before coding procedure %a\n', n) ;
- ForeachScopeBlockDo(sb, DisplayQuadRange) ;
+ ForeachScopeBlockDo3 (sb, DisplayQuadRange) ;
printf0('===============\n')
END ;
- ForeachScopeBlockDo(sb, ConvertQuadsToTree)
+ ForeachScopeBlockDo2 (sb, ConvertQuadsToTree)
ELSIF IsModuleWithinProcedure(scope)
THEN
IF DisplayQuadruples
THEN
n := GetSymName(scope) ;
printf1('before coding module %a within procedure\n', n) ;
- ForeachScopeBlockDo(sb, DisplayQuadRange) ;
+ ForeachScopeBlockDo3 (sb, DisplayQuadRange) ;
printf0('===============\n')
END ;
- ForeachScopeBlockDo(sb, ConvertQuadsToTree) ;
+ ForeachScopeBlockDo2 (sb, ConvertQuadsToTree) ;
ForeachProcedureDo(scope, CodeBlock)
ELSE
IF DisplayQuadruples
THEN
n := GetSymName(scope) ;
printf1('before coding module %a\n', n) ;
- ForeachScopeBlockDo(sb, DisplayQuadRange) ;
+ ForeachScopeBlockDo3 (sb, DisplayQuadRange) ;
printf0('===============\n')
END ;
- ForeachScopeBlockDo(sb, ConvertQuadsToTree) ;
+ ForeachScopeBlockDo2 (sb, ConvertQuadsToTree) ;
IF WholeProgram
THEN
ForeachSourceModuleDo(CodeProcedures)
FROM M2Bitset IMPORT Bitset, Bitnum ;
FROM SymbolConversion IMPORT AddModGcc, Mod2Gcc, GccKnowsAbout, Poison, RemoveMod2Gcc ;
FROM M2GenGCC IMPORT ResolveConstantExpressions ;
-FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock, ForeachScopeBlockDo ;
+FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock, ForeachScopeBlockDo3 ;
FROM M2ALU IMPORT Addn, Sub, Equ, GreEqu, Gre, Less, PushInt, PushCard, ConvertToType,
PushIntegerTree, PopIntegerTree, PopRealTree, ConvertToInt, PopSetTree,
PushBinding (scope) ;
REPEAT
copy := DupGroup (copy) ;
- ForeachScopeBlockDo (sb, DeclareTypesConstantsProceduresInRange)
+ ForeachScopeBlockDo3 (sb, DeclareTypesConstantsProceduresInRange)
UNTIL EqualGroup (copy, GlobalGroup) ;
KillGroup (copy) ;
PopBinding (scope) ;
the GCC tree structure.
*)
-PROCEDURE ConvertQuadsToTree (Scope: CARDINAL; Start, End: CARDINAL) ;
+PROCEDURE ConvertQuadsToTree (Start, End: CARDINAL) ;
(*
the GCC tree structure.
*)
-PROCEDURE ConvertQuadsToTree (Scope: CARDINAL; Start, End: CARDINAL) ;
+PROCEDURE ConvertQuadsToTree (Start, End: CARDINAL) ;
BEGIN
REPEAT
CodeStatement (Start) ;
(*
- MaybeDebugBuiltinAlloca -
+ MaybeDebugBuiltinAlloca - if DebugBuiltins is set
+ then call Builtins.alloca_trace
+ else call Builtins.alloca.
*)
PROCEDURE MaybeDebugBuiltinAlloca (location: location_t; tok: CARDINAL; high: Tree) : Tree ;
(*
- MaybeDebugBuiltinMemcpy -
+ MaybeDebugBuiltinMemcpy - if DebugBuiltins is set
+ then call memcpy
+ else call Builtins.memcpy.
*)
-PROCEDURE MaybeDebugBuiltinMemcpy (location: location_t; tok: CARDINAL; src, dest, nbytes: Tree) : Tree ;
+PROCEDURE MaybeDebugBuiltinMemcpy (location: location_t; src, dest, nbytes: Tree) : Tree ;
VAR
call,
func: Tree ;
END MaybeDebugBuiltinMemcpy ;
-(*
- MaybeDebugBuiltinMemset -
-*)
-
-PROCEDURE MaybeDebugBuiltinMemset (location: location_t; tok: CARDINAL;
- ptr, bytevalue, nbytes: Tree) : Tree ;
-VAR
- call,
- func: Tree ;
-BEGIN
- IF DebugBuiltins
- THEN
- func := Mod2Gcc (Memset) ;
- call := BuildCall3 (location, func, GetPointerType (), ptr, bytevalue, nbytes) ;
- ELSE
- call := BuiltinMemSet (location, ptr, bytevalue, nbytes)
- END ;
- SetLastFunction (call) ;
- RETURN BuildFunctValue (location, call)
-END MaybeDebugBuiltinMemset ;
-
-
(*
MakeCopyUse - make a copy of the unbounded array and alter all references
from the old unbounded array to the new unbounded array.
Addr := GetAddressOfUnbounded (location, param) ;
NewArray := MaybeDebugBuiltinAlloca (location, tokenno, High) ;
- NewArray := MaybeDebugBuiltinMemcpy (location, tokenno, NewArray, Addr, High) ;
+ NewArray := MaybeDebugBuiltinMemcpy (location, NewArray, Addr, High) ;
(* now assign param.Addr := ADR(NewArray) *)
exprpos, becomespos,
virtpos : CARDINAL ;
op : QuadOperator ;
- desloc, exprloc : location_t ;
BEGIN
GetQuadOtok (quad, becomespos, op,
des, op2, expr, overflowChecking,
PROCEDURE checkArrayElements (des, expr: CARDINAL; virtpos, despos, exprpos: CARDINAL) : BOOLEAN ;
VAR
- e1, e3 : Tree ;
- t1, t3 : CARDINAL ;
- location: location_t ;
+ e1, e3: Tree ;
+ t1, t3: CARDINAL ;
BEGIN
t1 := GetType (des) ;
t3 := GetType (expr) ;
expr, des)
END ;
AddStatement (location,
- MaybeDebugBuiltinMemcpy (location, virtpos,
+ MaybeDebugBuiltinMemcpy (location,
BuildAddr (location, Mod2Gcc (des), FALSE),
BuildAddr (location, exprt, FALSE),
length))
THEN
checkDeclare (des) ;
AddStatement (location,
- MaybeDebugBuiltinMemcpy (location, virtpos,
+ MaybeDebugBuiltinMemcpy (location,
BuildAddr(location, Mod2Gcc (des), FALSE),
BuildAddr(location, Mod2Gcc (expr), FALSE),
BuildSize(location, Mod2Gcc (des), FALSE)))
NoWalkProcedure -
*)
-PROCEDURE NoWalkProcedure (param: CARDINAL) ;
+PROCEDURE NoWalkProcedure (param: CARDINAL <* unused *>) ;
BEGIN
END NoWalkProcedure ;
(*
CheckElementSetTypes - returns TRUE if all expression checks pass.
- If the expression check fails quad is removed,
- the walk procedure (des) is called and NoChange is
- set to FALSE.
+ If the expression check fails quad is removed,
+ the walk procedure (des) is called and NoChange is
+ set to FALSE.
*)
-PROCEDURE CheckElementSetTypes (quad: CARDINAL; p: WalkAction) : BOOLEAN ;
+PROCEDURE CheckElementSetTypes (quad: CARDINAL) : BOOLEAN ;
VAR
lefttype,
righttype,
(* does not work t := BuildCoerce(Mod2Gcc(op1), Mod2Gcc(op2), Mod2Gcc(op3)) *)
checkDeclare (op1) ;
AddStatement (location,
- MaybeDebugBuiltinMemcpy(location, CurrentQuadToken,
+ MaybeDebugBuiltinMemcpy(location,
BuildAddr(location, Mod2Gcc(op1), FALSE),
BuildAddr(location, Mod2Gcc(op3), FALSE),
FindSize(CurrentQuadToken, op2)))
IF IsConst(op1) AND IsConst(op2)
THEN
InternalError ('should not get to here (if we do we should consider calling FoldIfIn)')
- ELSIF CheckElementSetTypes (quad, NoWalkProcedure)
+ ELSIF CheckElementSetTypes (quad)
THEN
IF IsConst(op1)
THEN
IF IsConst(op1) AND IsConst(op2)
THEN
InternalError ('should not get to here (if we do we should consider calling FoldIfIn)')
- ELSIF CheckElementSetTypes (quad, NoWalkProcedure)
+ ELSIF CheckElementSetTypes (quad)
THEN
IF IsConst(op1)
THEN
op3, op1)
END ;
AddStatement (location,
- MaybeDebugBuiltinMemcpy (location, tokenno,
+ MaybeDebugBuiltinMemcpy (location,
Mod2Gcc (op1),
BuildAddr (location, newstr, FALSE),
length))
FROM M2Error IMPORT InternalError ;
FROM M2Batch IMPORT GetModuleNo ;
FROM M2Quiet IMPORT qprintf1 ;
-FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock, ForeachScopeBlockDo ;
+FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock,
+ ForeachScopeBlockDo2, ForeachScopeBlockDo3 ;
FROM SymbolTable IMPORT GetSymName,
GetProcedureQuads, GetModuleQuads,
IF IsProcedure(scope)
THEN
PutProcedureReachable(scope) ;
- ForeachScopeBlockDo(sb, KnownReachable)
+ ForeachScopeBlockDo2 (sb, KnownReachable)
ELSIF IsModuleWithinProcedure(scope)
THEN
- ForeachScopeBlockDo(sb, KnownReachable) ;
+ ForeachScopeBlockDo2 (sb, KnownReachable) ;
ForeachProcedureDo(scope, CheckExportedReachable)
ELSE
- ForeachScopeBlockDo(sb, KnownReachable) ;
+ ForeachScopeBlockDo2 (sb, KnownReachable) ;
ForeachProcedureDo(scope, CheckExportedReachable)
END ;
ForeachInnerModuleDo(scope, RemoveProcedures) ;
END RemoveProcedures ;
-PROCEDURE KnownReachable (Scope: CARDINAL;
- Start, End: CARDINAL) ;
+PROCEDURE KnownReachable (Start, End: CARDINAL) ;
VAR
Op : QuadOperator ;
Op1, Op2, Op3: CARDINAL ;
FROM M2Error IMPORT InternalError ;
FROM M2Batch IMPORT GetModuleNo ;
FROM M2Quiet IMPORT qprintf1 ;
-FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock, ForeachScopeBlockDo ;
+FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock ;
FROM M2StackWord IMPORT StackOfWord, InitStackWord, KillStackWord, PushWord, PopWord, PeepWord ;
FROM M2Options IMPORT CompilerDebugging ;
FROM Lists IMPORT InitList, KillList, List, IncludeItemIntoList, IsItemInList ;
which were generated within a scope.
*)
-EXPORT QUALIFIED ScopeBlock, ScopeProcedure,
- InitScopeBlock, KillScopeBlock,
- ForeachScopeBlockDo ;
-
TYPE
ScopeBlock ;
- ScopeProcedure = PROCEDURE (CARDINAL, CARDINAL, CARDINAL) ;
+ ScopeProcedure2 = PROCEDURE (CARDINAL, CARDINAL) ;
+ ScopeProcedure3 = PROCEDURE (CARDINAL, CARDINAL, CARDINAL) ;
(*
(*
- ForeachScopeBlockDo - calls a procedure, p, for each block of contigeous quadruples
- defining an outer scope, sb.
+ ForeachScopeBlockDo2 - calls a procedure p for each block of contigeous quadruples
+ defining an outer scope sb.
+*)
+
+PROCEDURE ForeachScopeBlockDo2 (sb: ScopeBlock; p: ScopeProcedure2) ;
+
+
+(*
+ ForeachScopeBlockDo3 - calls a procedure p for each block of contigeous quadruples
+ defining an outer scope sb.
*)
-PROCEDURE ForeachScopeBlockDo (sb: ScopeBlock; p: ScopeProcedure) ;
+PROCEDURE ForeachScopeBlockDo3 (sb: ScopeBlock; p: ScopeProcedure3) ;
END M2Scope.
(*
- ForeachScopeBlockDo -
+ ForeachScopeBlockDo2 - calls a procedure p for each block of contigeous quadruples
+ defining an outer scope sb.
*)
-PROCEDURE ForeachScopeBlockDo (sb: ScopeBlock; p: ScopeProcedure) ;
+PROCEDURE ForeachScopeBlockDo2 (sb: ScopeBlock; p: ScopeProcedure2) ;
+BEGIN
+ IF DisplayQuadruples
+ THEN
+ printf0 ("ForeachScopeBlockDo\n")
+ END ;
+ WHILE sb#NIL DO
+ WITH sb^ DO
+ IF DisplayQuadruples
+ THEN
+ DisplayScope (sb)
+ END ;
+ enter (sb) ;
+ IF (low # 0) AND (high # 0)
+ THEN
+ p (low, high)
+ END ;
+ leave (sb)
+ END ;
+ sb := sb^.next
+ END ;
+ IF DisplayQuadruples
+ THEN
+ printf0 ("end ForeachScopeBlockDo\n\n")
+ END ;
+END ForeachScopeBlockDo2 ;
+
+
+(*
+ ForeachScopeBlockDo3 - calls a procedure p for each block of contigeous quadruples
+ defining an outer scope sb.
+*)
+
+PROCEDURE ForeachScopeBlockDo3 (sb: ScopeBlock; p: ScopeProcedure3) ;
BEGIN
IF DisplayQuadruples
THEN
THEN
printf0 ("end ForeachScopeBlockDo\n\n")
END ;
-END ForeachScopeBlockDo ;
+END ForeachScopeBlockDo3 ;
(*