package
coins.ir.hir;
import
coins.*;
import
coins.ir.IrList; //##12
import
coins.ir.*;
import
coins.ir.hir.*;
import
coins.sym.*;
import
coins.flow.*;
import
java.util.*;
//========================================//
//
(##20):Revised on
Feb., Mar. 2003-.
//
(##19):Revised on Dec. 2002-.
//
(##14):Revised on Jun. 2002.
//
(##12):Revised on Mar. 2002.
//
(##10):Revised on Nov., Dec. 2001.
//
(##9): Revised on Oct. 2001.
/** HIR
interface:
<PRE>
* High Level Intermediate Representation
(HIR) interface.
* All HIR classes implement all methods
declared in HIR interface
* and IR interface which is inherited by
the HIR interface.
* See IR, Stmt, Exp, Sym interfaces and
HirRoot class.
*
* Preliminaries
* High level intermediate representation is composed of
operation
* information in a tree form, symbol information, data
flow
* information, and others.
* The operation information tree is composed of nodes
and edges.
* A node with children is called as nonleaf node and a
node without
* child is called a leaf node.
* The term "node" means either leaf node or nonleaf
node,
* the term "subtree" means either pure subtree
composed of
* several nonleafs and leafs, or one leaf.
*
* Class/interface hierarchy:
* (Root is a class, others are interfaces.
* An interface xxx is implemented by corresponding
class
* named xxxImpl or xxx_Impl.)
*
* Root
* |
* |- Sym
* | |- ...
* |
* |- Flow
* | |- ...
* |
* |- IR
* |- IR_factory // IR object creation factory.
* |- IrList // List of indefinite
number of objects.
* | |- HirList
// IrList whose elements are HIR objects. //##12
* |
* |- LIR // Low
level Intermediate Representation
* | |- ...
* |
* |- HIR // High level Intermediate
Representation.
* | // Usual operations on HIR are done by
using HIR methods.
* |
* |- Program
// Program definition node.
* |-
SubpDefinition // Subprogram
definition node.
* |- HirSeq // Sequence
of definite number of
* |
// HIR objects.
* |- HirList
// IrList whose elements are HIR objects.
* |
// (Multi-inheritance of interface) //##14
* |- Stmt
// Statement
* | |- LabeledStmt // Labeled statement.
* | |- AssignStmt // Assignment statement.
* | |- IfStmt //
If-statement.
* | |- JumpStmt // Jump (goto) statement.
* | |
// (Jump unconditionally)
* | |- LoopStmt // Loop statement.
* | | |- ForLoop // For-loop.
* | | |- WhileLoop // While-loop.
* | | |- UntilLoop // Repeat-until loop.
* | | |- IndexedLoop // Loop with index range
* | |
// (such as Fortran DO loop).
* | |- ReturnStmt // Return statement.
* | |- SwitchStmt // Switch (case) statement.
* | |- BlockStmt // Block representing a
sequence
* | |
// of statements.
* | |- ExpStmt // Expression
treated as a statement.
* | |
// Call statement is treated as an
* | |
// expression statement of function call.
* | |
// Loop start condition expression has
* | |
// label and treated as ExpStmt.
* | |- InfStmt // An
information node
* |
// which can be treated as a statement.
* |
// (pragma, comment line,
etc.)
* |- LabelDef
// Label definition node.
* // |- InfNode // IR
information node. //##17 DELETED
* // |
// (pragma, comment line,
etc.)
* |- Exp // Expression
*
|- ConstNode // Constant node
*
|- SymNode // Symbol
node
*
| |- VarNode // Variable name node.
* // | | |- ParamNode // formal parameter name node
* // | | |
//##16 DELETED
*
| | |- ElemNode // struct/union element name node
*
| |
//##16 not DELETED
*
| |- SubpNode // Subprogram name node.
* | |- LabelNode // Label reference
node.
*
| |- TypeNode // Type name node.
*
|
*
|- SubscriptedExp // Subscripted variable.
*
|- PointedExp
// Pointed object.
*
|- QualifiedExp //
Qualified variable.
*
|- FunctionExp
// Function call expression.
*
|- PhiExp //
Phi function used in SSA
*
|- ExpList_ // List of
expressions
*
|
// (implemented as a kind of IrList).
*
|- NullNode // Null
(no-operation) node
*
*
Deleted classes:
* ParamNode, //##16
* StmtBody, AssignExp,
* Nonleaf, Leaf, HIRdetail, BBlock, PBlock,
ExitStmt,
* ContinueStmt. (##10)
*
* Abstract syntax of HIR:
*
*
Abstract syntax of HIR is shown as BNF syntax
*
in the form ( operationCode attr child1 child2 ... ),
*
where, child1 represents source operand 1, child2 represents
*
source operand 2, ...
. Instance of HIR may be regarded
*
as a tree attached with operands as its subtree.
*
The result operand is represented by the root node
*
of the tree. The attr represents attributes
*
such as type of the tree, etc.
*
(Each node may be attached an expression identifier (expId)
*
as an attribute. In such case, the expId attached to
*
the root node of a subtree may be regarded as the identifier
*
corresponding to the result value of the operation
*
specified by the subtree.)
*
Each child is also a subtree of the same form.
*
Some child may be null.
//##20
*
The operationCode and attr are not subtree but
*
information attached to the root node of the subtree.
*
(This notation is not explaining parse tree of HIR but
*
explaining abstract syntax tree of HIR.)
*
*
Notations in the following BNF descriptions..
* identifier starting with lower case letter
except attr: terminal
* identifier starting with upper case letter: nonterminal
* identifier ending with
"_":
* nonterminal that is not an interface
* identifier that does not end with
"_":
*
nonterminal representing an interface
* xxxCode: operation code xxx
* xxxSym : symbol recorded in the symbol table
*
progSym : program name symbol
*
subpSym : subprogram name symbol
*
varSym : variable name
symbol
*
(including array/struct/union name symbol)
*
paramSym: formal parameter name symbol
*
elemSym : struct/union element name symbol
* // fieldSym: field name symbol of a
class
* // classSym: class name symbol
*
labelSym: label name symbol
*
typeSym : type name symbol
* xxxConst: constant recorded in the symbol table
*
intConst : integer
constant
*
(int/short/long/unsigned int/ ...)
*
floatConst : floating constant (float/double/ ...)
*
charConst : character
constant (signed/unsigned)
*
stringConst: character string constant
*
boolConst : boolean
constant
*
(true is 1, false is 0 in integer)
* intConstValue: integer constant
*
(not a symbol table entry but value itself).
* stringConstValue: string constant
*
(not a symbol table entry but value itself).
* null : empty
* NullNode : a leaf node with operation code null.
* List_of_xxx: java.util.List with elements xxxx.
(##10)
*
*
Note:
* Following items are not represented as a subtree
* dangling to a node but are represented as
information
* attached to the node. They are not traversed
when HIR tree
* is traversed but can be get by applying
corresponding HIR
* methods to the node.
* Operation code (xxxCode)
* Symbol table entry
(xxxSym)
* Constant symbol (xxxConst)
* Symbol table
(SymTable, GlobalSymTable_, LocalSymTable_)
* attr
(attribute such as node type which is
*
a symbol representing the type
*
of the result of HIR subtree.)
* Items represented as a subtree is indicated by @
to clarify.
* (@ is not
a syntactic component but a postfix marker
* to decrease misunderstanding.)
*
*
Program ->
// Program represents a compile unit.
* ( progCode attr //
* GlobalSymTable_ // Global symbols of
the program
* ProgSym_ @ // Program
name (may be null).
* InitiationPart_ @ // Initial value specification.
* SubpList_ @ ) //
Subprogram definition list.
*
ProgSym_ ->
* ( symCode attr progSym ) // Program name symbol.
* | null
*
GlobalSymTable_ -> // Global symbol table of the
program.
* SymTable // As
for SymTable, see Sym and SymTable.
* | null
*
InitiationPart_ ->
// Initial value specification (##14)
* InitiationBlock_
* | NullNode
*
InitiationBlock_ ->
// Block containing initiation statements.
* ( blockCode attr
* InitiationStmtSeq_ @ )
*
InitiationStmtSeq_ -> // Sequence of initiation statements
* InitiationStmt_ @ InitiationStmtSeq_ @
* | null
*
InitiationStmt_ ->
// Initiation statement
* ( setDataCode attr
// with Exp_l_: l-value
* Exp_l_ @ ValueSpec_ @ )
// ValueSpec_: constant Exp.
* | AssignStmt
*
ValueSpec_ ->
* ConstNode // Constant value
* | ( listCode attr // List of ValueSpec_
* List_of_ValueSpec_ @ )
* | ( repeatCode attr //
Repeat ValueSpec_
* ValueSpec_ @ intConst @ )
// intConst-times.
*
SubpList_ ->
* ( listCode attr // Subprogram definition list
* List_of_SubpDefinition @ )
*
SubpDefinition -> // Subprogram definition
* ( subpCode attr
* LocalSymTable_ // SymTable local in the
subprogram.
* SubpNode @ //
Subprogram name.
* InitiationPart_ @ //
Subprogram initiation.
* BlockStmt @ // HIR subprogram body
*
// (Control flow should be ended by return).
* LIR @ ) // LIR
representation for the subprogram.
*
SubpNode -> // Subprogram
name node.
* ( symCode attr
* subpSym )
*
LocalSymTable_ -> // Local symbol table (for subprogram, block, etc.)
* SymTable
* | null
*
BlockStmt ->
* ( blockCode attr
* LocalSymTable_ // Define symbols local in the block.
* StmtSeq_ @ ) // Block makes a sequence
of statements
*
// to be treated as one statement.
*
// Statements in StmtSeq_ can be get
*
// by getFirstStmt() and getNextStmt().
*
StmtSeq_ ->
* Stmt @ StmtSeq_ @ // Statement sequence is a statement
* | null
// followed by statements or empty.
*
Stmt
-> // Statement
is
* LabeledStmt // a statement with
label definitions or
* | StmtBody_ // a
statement without label definition.
*
LabeledStmt -> // Labeled statement.
* ( labeledStmtCode attr
* LabelDefinitionList_ @
// List of label definitions.
* StmtBody_ @ ) // Statement
body (statement that is
*
// peeled label off).
*
LabelDefinitionList_ ->
// List of LabelDef nodes.
* ( listCode attr
* List_of_LabelDef @ )
*
LabelDef ->
// Label definition node.
* ( labelDefCode attr
* labelSym )
*
StmtBody_ -> // Statement body.
* AssignStmt // Assignment statement.
* | IfStmt // If statement.
* | JumpStmt // Jump (goto) statement.
* | LoopStmt // Loop statement.
* | CallStmt_ // Subprogram call statement.
* | ReturnStmt // Return statement.
* | SwitchStmt // Switch (case selection) statement.
* | BlockStmt // Block statement.
* | ExpStmt // Expression treated as
a statement.
*
*
AssignStmt ->
// Assign statement.
* ( assignCode attr
* Exp_l_ @ // l_value expression
* Exp @ ) // Expression
to be assigned.
* | ( CompoundAssignOperator_ attr // HIR-C only
* Exp_l_ @
* Exp @ )
* | ( IncrDecrOperator_ attr // HIR-C only
* Exp_l_ @ )
*
Exp_l_ ->
// l-value expression is
* Exp
// an expression representing an object
*
// (memory area to contain data).
*
IfStmt
->
// If statement
* ( ifCode attr
* ConditionalExp_ @ // Conditional expression.
* ThenPart_ @ //
Then-part
* ElsePart_ @ //
Else-part.
* LabeledNull_ @ ) // End-of-if label.
*
ThenPart ->
* LabeledStmt // Executed if ConditionalExp is true.
* | null //
*
ElsePart ->
* LabeledStmt // Executed if ConditionalExp is false.
* | null //
*
LabeledNull_
-> //
LabeledNull_ is
* ( labeledStmtCode attr // a labeled statement
* LabelDefinitionList_ @ // with
null stmt body.
* null @ )
*
JumpStmt ->
* ( jumpCode attr // Jump to the statement with
* LabelNode @ ) // specified label.
*
LoopStmt -> // Loop
statement is either for-loop, while-loop,
*
// until-loop, indexed loop, or other general loop.
*
// All of them are implemented as a general loop
*
// with some restriction depending on the loop type.
*
// Compiler components (other than front part) should
*
// treat general loop, that is, do not assume some child
*
// is null without checking whether the child is null
*
// or not.
* ( LoopCode_ attr // Loop kind code.
* LoopInitPart_ @ // Loop initiation part to
be executed
*
// before repetition. This may be null.
* ConditionalInitPart_ @ //
Conditional initiation part.
*
// Executed once if attached loop
*
// start condition is satisfied.
*
// See LoopStmt interface for detail.
* StartConditionPart_ @ // Loop start conditional expression
*
// with loopBackLabel.
*
// If true, pass through to LoopBody_,
*
// otherwise transfer to LoopEndPart_.
*
// If loop start condition part is null,
*
// pass through to
LoopBody_.
* LoopBody_ @ //
Loop body repetitively executed.
*
// Pass through to EndCondition_.
*
// It is a block statement (BlockStmt)
*
// with loop start label and the blcok
*
// statement contains a labeled statement
*
// with loopStepLabel as its last statement.
*
// This
should not be null but the block may
*
// have no executable statement and contains
*
// only a labeled statement with loopStepLabel.
*
// "continue" jumps to the loopStepLabel.
*
// The loopStepLabel may be omitted if
*
// there is no "jump loopStepLabel".
* EndCondition_ @ // Loop end condition expression.
*
// If true, transfer to LoopEndPart_,
*
// otherwise pass through to
*
// LoopStepPart_.
* LoopStepPart_ @ // Loop step part executed
*
// before jumping to loopBackLabel.
* LoopEndPart_ @ ) // Loop end part
*
// with loopEndLabel.
*
// "exit" (break in C) jumps to here.
* IndexedLoop_ attr // Attributes for IndexedLoop.
//##21
*
// Not given for other loops.
//##21
*
LoopCode_ attr ->
* whileCode attr // while-loop
* | forCode attr // for-loop
* | untilCode attr // until-loop
* | indexedLoopCode attr// indexed-loop //##21
* | loopCode attr // general loop other than
above loops. //##21
*
LoopInitPart_
-> // Loop initiation
part.
* Stmt
* | null
*
ConditionalInitPart_ ->
// Executed at first time only.
* Stmt
// Semantics of this is the same
* | null // to the
following if-statement with label:
*
// if
(exp_of_StartCondition_) {
*
//
statement of ConditionalInitPart_;
*
// goto
loopStartlabel of LoopBody_;
* // }else
*
// goto
loopEndlabel:
*
// where, statement of ConditionalInitPart_
*
// is executed once if start condition
*
// (exp_of_StartCondition_) is true.
*
// Control transfers to LoobBody_
*
// if the exp_of_StartCondition_ is true.
*
StartConditionPart_ -> // Show start condition with
* ( labeledStmtCode attr // loopBacklabel.
* LabelDefinitionList_ @
* ExpStmtOrNull_ @ ) //
loopStartConditionExpression.
*
LoopBody_ ->
// Block statement with loopBodyLabel.
* ( labeledStmtCode attr // The last statement of the
block
* LabelDefinitionList_ @ // is a LabeledNull_
statement with
* BlockStmt_ @ )
// loopStepLabel.
*
EndCondition_ ->
// ExpStmt showing loop end condition.
* ExpStmtOrNull_
*
LoopStepPart_ -> // Statement to be executed
before jumping
* Stmt
// to loopBackLabel.
* | null
*
LoopEndPart_ -> // LabeledNull_
statement with loopEndLabel.
* LabeledNull_
*
NullOrStmt_ -> // Usually null but it may be
* null
// a statement (created during
* | Stmt
// HIR transformation). //##20
*
ExpStmtOrNull_ ->
// Expression statement or null.
* ExpStmt
* | null
*
IndexedLoop_ attr -> //
Attributes for IndexedLoop.
* loopIndex attr // Loop index (induction variable).
*
// See getLoopIndex().
* startValue attr // Start value of the loop index.
*
// See getStartValue().
* endValue attr // End value of the loop index.
*
// See getEndValue().
* stepValue attr // Step value for the loop index.
*
// See getStepValue().
*
*
// Note. LoopInf may contain goto-loop that is difficult or
*
// impossible to be
represent by above LoopStmt.
*
// (goto-loop is not
implemented by LoopStmt.) //##21
*
*
// LoopStmt is executed as follows:
*
// LoopInitPart_;
*
// if
(loopStartConditionExpression != null) {
*
// if
(loopStartConditionExpression == true) {
*
//
ConditionalInitPart_;
*
//
jump to loopBodyLabel;
*
// }else
*
//
jump to loopEndLabel;
*
// }else
*
// jump
to loopBodyLabel;
*
// loopBackLabel:
*
// if
((loopStartConditionExpression != null)&&
*
//
(loopStartConditionExpression == false))
*
//
jump to loopEndLabel;
*
// loopBodyLabel:
*
// Start
of BlockStmt of LoopBody_
*
//
Stastement sequence of the BlockStmt;
*
//
loopStepLabel:;
*
// End of
BlockStmt of LoopBody_
*
// if
((loopEndConditionExpression != null)&&
*
//
(loopEndConditionExpression == false))
*
//
jump to loopEndLabel;
*
//
LoopStepPart;
*
// jump
to loopBackLabel;
*
// loopEndLabel:
*
// Loop
end part;
*
*
// BEGIN #21
*
// ForStmt is created as a general loop where contents of
*
//
ConditionalInitPart_, EndCondition_, LoopEndPart_
*
// are null at first
(but they may become not null
*
// by some optimizing
transformation).
*
// See
isSimpleForLoop().
*
// WhileStmt is created as a general loop where contents of
*
// LoopInitPart_,
ConditionalInitPart_, EndCondition_,
*
// LoopStepPart_,
LoopEndPart_
*
// are null at first
(but they may become not null
*
// by some optimizing
transformation).
*
// See
isSimpleWhileLoop().
*
// UntilStmt is created as a general loop where contents of
*
// LoopInitPart,
ConditionalInitPart_, StartCondition_,
*
// LoopStepPart_,
LoopEndPart_
*
// are null at first
(but they may become not null
*
// by some optimizing
transformation).
*
// See
isSimpleUntilLoop().
*
// IndexedLoopStmt is created as a general loop where contents of
*
//
ConditionalInitPart_, EndCondition_, LoopEndPart_
*
// are null at first
(but they may become not null
*
// by some optimizing
transformation).
*
// See
isSimpleIndexedLoop().
*
// IndexedLoopStmt represents a Fortran type loop where
*
// value of loop
index is incremented or decremented by loop
*
// step value
starting from loop start value and stops
*
// to loop before
crossing the barrier of loop end value.
*
// (See
IndexedLoopStmt interface.)
*
// Indexed loop attributes (IndexedLoopAttr_) are available
*
// only for IndexedLoopStmt.
*
// END #21
*
*
// BEGIN old specifications
*
// Following specifications of LoopStmt are covered by
*
// the previous specifications of LoopStmt.
*
// LoopStmt ->
*
//
WhileStmt // While-loop
*
// | ForStmt // For-loop
*
// | UntilStmt
// Repeat-until-loop
*
// | IndexedLoopStmt // Loop with index range
*
// WhileStmt ->
*
// ( whileCode
attr
*
// NullOrStmt_ @ // Loop initiation part //##20
*
//
ExpStmt @ // ExpStmt in
conditional
*
//
// initiation part
*
//
StartCondition_ @ // Loop start condition
*
//
// with loopBackLabel.
*
//
LoopBody_ @ // Loop body statement.
*
//
LabeledNull_ @
// Loop end condition (null)
*
//
// with loopStepLabel
*
//
LabeledNull_ @
// continue statement jumps here.
*
// LabeledNull_
@ // Loop end part
with loopEndLabel
*
//
// (exit statement jumps to here.)
*
//
null @ ) // No index
range.
*
//
// Repetitively execute while ConditionalExp_ is true.
*
// ForStmt ->
*
// ( forCode
attr //
C-type for-loop statement.
*
//
LoopInitStmt_ @ //
Loop initiation statement.
*
//
ExpStmt @ // ExpStmt in
conditional
*
//
// initiation part
*
//
LoopCondition_ @ // Loop
start condition
*
//
// with loopBackLabel.
*
//
LoopBody_ @ // Loop body statement.
*
//
LabeledNull_ @
// Loop end condition (null)
*
//
// with loopStepLabel
*
//
LoopStepPart_ @ //
continue statement jumps here.
*
//
LabeledNull_ @
// Loop end part with loopEndLabel
*
//
null @ ) // No index
range.
*
// UntilStmt ->
*
// ( untilCode
attr
*
//
NullOrStmt_ @
// Loop initiation part
*
//
NullOrStmt_ @
// Conditional initiation part
*
//
LabeledNull_ @
// Loop start condition
*
//
// with loopBackLabel.
*
//
LoopBody_ @ // Loop body statement.
*
//
LoopCondition_ @ // Loop
end condition (null)
*
//
// with loopStepLabel
*
//
LabeledNull_ @
// continue statement jumps here.
*
//
LabeledNull_ @
// Loop end part with loopEndLabel
*
// null @ ) // No index
range.
*
//
// Repetitively execute until ConditionalExp_
*
//
// becomes true.
*
// IndexedLoop_ ->
//##21
*
// ( indexedLoopCode
attr
*
//
LoopInitPart_ @ // This part may be
null.
*
//
ConditionalInitPart_ @ // This part may be null.
*
//
StartConditionPart_ @ //
LabeledStmt with null statement body.
*
//
// Its label is loopBackLabel.
*
//
LoopBody_ @ // A block statement
(BlockStmt)
*
//
// with loop start label and the blcok
*
//
// statement contains a labeled statement
*
//
// with loopStepLabel as its last statement.
*
//
EndCondition_ @
// This part is null.
*
//
LoopStepPart_ @
// This part may be null.
*
// LoopEndPart_
@ //
LabeledNull_ with loopEndLabel.
*
// IndexRange_
@ ) // Index
range may be null in general loop.
*
// IndexRange_ -> // Show the summary of loop
control for loops
*
// ( seqCode
attr // with variable
incremented/decremented.
*
//
VarNode @ // Induction variable.
*
//
Exp @ //
LoopStartBound.
*
//
Exp @ // LoopEndBound.
*
//
Exp @ ) // StepValue for
the induction variable.
*
// | null
*
// LoopCondition_ ->
*
// (
labeledStmtCode attr
// Expression statement
*
//
LabelDefinitionList_ @ //
with label.
*
//
ExpStmt @ )
*
// The indexed loop is the same to a general loop having
*
// following components:
*
// LoopInitPart_ is ( assignCode attr VarNode loopStartBound ),
*
// loopStartConditionExpression is either
*
// ( cmpLeCode attr VarNode
loopEndBound ) or
*
// ( cmpGeCode attr
VarNode loopEndBound )
*
// (If stepValue is
plus, then former is taken, otherwise
*
// latter is
taken.),
*
// LoopStepPart_ is
*
// ( assignCode attr
VarNode
*
//
( addCode attr VarNode stepValue )).
*
// END old specifications
*
*
CallStmt_ ->
// Subprogram call statement.
* ( expStmtCode attr // Expression statement
* FunctionExp @ ) // with FunctionExp.
*
FunctionExp -> // Subprogram call
expression.
* ( callCode attr
* Exp @
// Expression specifying
*
// subprogram to be called.
* ExpList_ @ ) // Actual
parameter list.
*
ReturnStmt -> // Return
statement.
* ( returnCode attr
* ReturnValue_ @ ) // Return value.
*
ReturnValue_ ->
* Exp
* | null
*
SwitchStmt -> // Switch
statement.
* ( switchCode attr
* Exp @
// Case selection expression.
* JumpTable_ @ // List of
constants and statement labels.
* Stmt @
// Collection of statements to be selected.
* LabeledNull_ @ ) // Indicate end of case statement.
*
JumpTable_ -> // Jump
table.
* ( seqCode attr
* JumpList_ @ // List
of constant-label pairs.
* LabelNode @ ) // Default label.
*
JumpList_ ->
// Jump list.
* ( listCode attr //
Correlate Exp value
* List_of_SwitchCase @ ) // and list of SwitchCase_ pairs.
*
SwitchCase_ -> // List of SwitchCase_ pairs.
* ( seqCode attr
* ConstNode @ // Correlate Exp
value and
* LabelNode @ ) // switch statement label.
*
ExpStmt ->
// Expression statement.
* ( expStmtCode attr
* Exp @ )
// Expression treated as a Stmt.
*
NullNode ->
* ( nullCode attr ) // NullNode is a
terminal
*
// that is not null.
*
InfNode ->
* ( infCode attr // Information node (terminal).
* InfKind_ //
Information kind identifier.
* InfObject_ ) // Information.
*
// (InfKind_ and InfObject_ are not
*
// traversed by HIR traverse operations.)
*
InfKind_ ->
* stringConst // String constant showing the
kind of
*
// information such as pragma, comment, etc.
*
InfObject_ -> //
Information.
* Object // Object such as Sym, Exp, etc. or
* //
a list of Objects. It may or may not be HIR.
*
ConditionalExp_ -> // boolean expression
* Exp
*
Exp ->
// Expression.
* Factor_
* | UnaryExp_
* | BinaryExp_
* | SelectExp //
HIR-C only
* | NullNode
* | InfNode
*
Factor_ ->
* ConstNode
* | SymNode
* | CompoundVar_
* | FunctionExp
* | PhiExp
* //| AssignStmt // HIR-C
* | ExpList_
* | HirSeq
// Sequence of objects
*
UnaryExp_ -> //
Unary expression.
* ( UnaryOperator_ attr
* Exp @ )
* | ( sizeofCode attr@ // size of the type of Exp
* Exp @ ) @@@@
* | ( sizeofCode attr // size of the type
* TypeNode @ ) // represented by
TypeNode.
*
BinaryExp_ -> // Binary
expression.
* ( BinaryOperator_ attr
* Exp @
* Exp @ )
*
CompoundVar_ ->
// Compound variable.
* SubscriptedExp // Subscripted variable.
* | PointedExp // Pointed variable.
* | QualifiedExp // Qualified variable.
*
SubscriptedExp ->
Subscripted variable. //##14
* ( subsCode attr // Array with subscript
expression.
* Exp @ //
Expression indicating the array.
* Exp @ ) // Subscript
expression.
* | ( subsCode attr
* Exp @ //
Expression indicating an array.
* ExpList @ ) // List of
Subscripts.
*
// (1st subscript, 2nd subscript,
*
// etc. for rectangular
array.)
* // At
present, SubscriptedExp takes following form
* // but
it will be changed as above in near future.
*
( subsCode attr //
Array with index expression
*
Exp @
// Expression indicating an array.
*
( indexCode attr
*
Exp @
// Subscript expression
*
ElemSize_ @ )) // Size of
elements (offset
*
// corresponding to subscript increment).
*
ElemSize_
-> //
Element size.
* Exp
*
QualifiedExp ->
// Qualified expression.
* ( qualCode attr // Qualified variable
* Exp @
// Should represent a structure or union.
* ElemNode @ ) // struct/union element.
* // | ( qualCode attr // Class field
* // Exp @ // Should
represent a class.
* // FieldNode @ ) // Field of the class.
*
PointedExp -> // Pointed expression.
* ( arrowCode attr // Pointed variable
* Exp @
// Expression representing
a variable
* PointedElem_ @ ) // Pointed
element.
*
PointedElem_ ->
* ElemNode // Pointed element (with displacement).
* | null // Pointed location (0
displacement).
*
ConstNode ->
//
Constant symbol.
* ( constCode attr intConst ) // integer constant
* | ( constCode attr floatConst ) // float constant
* | ( constCode attr charConst ) // character constant
* | ( constCode attr stringConst ) // string constant
* | ( constCode attr boolConst ) // boolean constant
*
SymNode -> //
Symbol node.
* (symCode Sym ) // Program name, etc.
* | VarNode
* //| ParamNode //##16 DELETED
* | SubpNode
* | LabelNode
* | ElemNode
//##16 not DELETED
* | TypeNode
*
VarNode ->
* ( symCode attr varSym ) // Variable name node
*
SubpNode ->
* ( symCode attr subpSym ) // Subprogram name node
*
LabelNode ->
* ( symCode attr labelSym ) // Label reference
node
*
ElemNode ->
* ( symCode attr elemSym ) // structure/union element
*
// name node.
*
// FieldNode -> ( symCode attr fieldSym ) // Field name node.
*
TypeNode ->
* ( symCode attr typeSym ) // Type name node
*
FunctionExp -> // Function expression.
* ( callCode attr
* Exp @
// Expression specifying function
*
// to be called (SubpNode, etc.).
* ExpList_ @ ) // Actual parameter list.
*
ExpList_ ->
* ( listCode attr // IrList of Exp (List of
* List_of_Exp @ ) // expressions in HIR form.)
*
IrList
->
* ( listCode attr // A List that can be treated as IR.
* List_of_Objects_ @ )
*
HirList ->
* ( listCode attr // An IrList that can be treated as HIR.
* List_of_Objects_ @ )
*
HirSeq ->
* ( seqCode attr HIR @ ) // Sequence of some definite
* | ( seqCode HIR @ HIR @ ) // number of HIR nodes.
*
| ( seqCode HIR @ HIR @ HIR @ )
* | ( seqCode HIR @ HIR @ HIR @ HIR @ )
*
PhiExp ->
* (phiCode attr FlowVarList_ @ ) // phi function
*
FlowVarList_ ->
* ( listCode attr
* List_of_VarLabelPair @ )
* //
List of (Var Label) pairs.
*
VarLabelPair ->
* ( listCode attr VarNode @ Label @) //##9
*
UnaryOperator_ ->
* notCode // bitwise not (~) one's complement
*
// logical not for bool (!)
* | negCode // negate (unary minus)
* | addrCode // get address (&)
* | contentsCode // get contents of pointed memory
* | convCode // type conversion for basic type
* | decayCode // convert array to pointer
* | castCode // type conversion by cast for pointer
* | sizeofCode // sizeof operator
* | encloseCode
// honor parenthesis
* | IncrDecrOperator_ // Increment/decrement. HIR-C only.
*
BinaryOperator_ ->
* | addCode // add
(+)
* | subCode // subtract
(-)
* | offsetCode // Offset between pointers (HIR-C only)
* | multCode // multiply
(*)
* | divCode // divide
(/)
* | modCode // modulo
(%)
* | andCode // bitwise and
(&)
* | orCode // bitwise or
(|)
* | xorCode // bitwise exclusive or (^)
* | shiftLLCode
// shift left logical (<<) //
* | shiftRCode // shift right arithmetic (>>)
* | shiftRLCode
// shift right logical
(>>) //
* | indexCode // index (subscript)
* | undecayCode
// convert pointer to array //##10
* | CompareOperator_
* | CompareZeroOperator_
// HIR-C only //##20
* | ShortCircuitOperator_ //
HIR-C only
* | commaCode // comma operator // HIR-C only
*
CompareOperator_ ->
* cmpEqCode // equal
* | cmpNeCode // not equal
* | cmpGtCode // greater than
* | cmpGeCode // greater or equal
* | cmpLtCode // less than
* | cmpLeCode // less or equal
*
CompareZeroOperator_ ->
// HIR-C only //##20
* eqZeroCode // equal zero // HIR-C
only //##20
*
ShortCircuitOperator_ ->
// HIR-C only
* lgAndCode // logical and (&&) // HIR-C only
* | lgOrCode // logical or (||)
// HIR-C only
*
IncrDeclOperator_ ->
// HIR-C only
* preIncrCode // pre-increment
(++) // HIR-C only
* | preDecrCode
// pre-decrement (--) //
HIR-C only
* | postIncrCode // post-increment (++) // HIR-C only
* | postDecrCode // post-decrement (--) // HIR-C only
*
CompoundAssignmentOperator_ -> // HIR-C only
* multAssignCode // *= // HIR-C only
* | divAssignCode // /= // HIR-C only
* | modAssignCode // %= // HIR-C only
* | addAssignCode // += // HIR-C only
* | subAssignCode // -= // HIR-C only
* | shiftLAssignCode // <<= // HIR-C only
* | shiftRAssignCode // >>= // HIR-C only
* | andAssignCode // &= // HIR-C only
* | xorAssignCode // ^= // HIR-C only
* | orAssignCode // |= // HIR-C only
*
SelectExp -> // (Exp ? Exp : Exp) // HIR-C only
* ( selectCode attr
* ConditionalExp @ Exp @ Exp @ )
*
*
attr ->
// Attribute attached to the HIR node //##20
* typeSym // Shows the
type of HIR subtree.
* OptionalAttrSeq_ // Sequence of optional
attributes
*
// that are not inevitable at the first stage
*
// of HIR generation. The optional attributes
*
// may be attached to give information used
*
// in some specific compiler modules or
*
// to help compiling processes.
*
OptionalAttrSeq_ ->
* OptionalAttr_ OptionalAttrSeq_
* | null
*
OptionalAttr_ ->
* StmtAttr_ // Attributes for statements
* | IndexNumber_ // Index number to identify the HIR node.
* | Flag_ //
true/false flag.
* | InfItem_ // Node-wise information.
* | ExpId //
Expression identifier used in flow analysis.
* | Work_ //
Phase-wise information.
*
StmtAttr_ -> // Attributes attached to statement
subtrees.
* FileName_ // Source program file containing
the statement.
* LineNumber_ // Line number of the line in which the
*
// statement started.
*
FileName_ ->
* stringConstValue
*
LineNumber_
* intConstvalue
*
IndexNumber_ ->
* intConstValue
*
Flag_ ->
* FlagNumber_
* FlagValue_
*
FlagNumber_ ->
* intConstValue // Such as
FLAG_NOCHANGE, FLAG_C_PTR,
*
// FLAG_CONST_EXP
*
FlagValue_ ->
* true
* | false
*
InfItem_ ->
* InfKind_ InfObject_
*
*
*
Deleted methods:
* buildXxx, getSym (use getSym in IR or
getSymNodeSym in SymNode)
* insertBBlockCode, insertGBlockCode,
insertPBlockCode.
*
Deleted operators:
* addUCode, subUCode, multUCode, divUCode.
* (Decide by Type attached to each node.)
* addA, subA, multA, divA, modA, shiftL. (##9)
* lgNot
(##10)
*
*
Construction of HIR objects:
*
Most HIR objects are constructed by object factory methods
*
such as program(....), subpDefinition(....), assignStmt(....),
*
ifStmt(....), exp(....), etc. specified in the HIR interface.
*
Users are recommended to use the object factory methods so as
*
to avoid forgetting to specify essential data and to make
*
relation with other objects.
It is not recommended to use
*
"new" directly to construct HIR objects.
*
***
Operator number
public static final int
OP_PROG = 1, // Program
OP_SUBP_DEF = 2, // SubpDefinition
OP_LABEL_DEF = 3, // LabelDef node
OP_INF = 4, // Information node
OP_CONST
= 5, // ConstNode
OP_SYM = 6, // SymNode
OP_VAR = 7, // VarNode
OP_PARAM
= 8, // VarNode
OP_SUBP = 9, // SubpNode
OP_TYPE = 10, // TypeNode
OP_LABEL
= 11, // LabelNode
OP_ELEM = 12, // ElemNode
OP_LIST = 14, // List of CompilerObjects
// such as IR nodes and symbols
OP_SEQ =
15, // Sequence of HIR
objects //##10
OP_ENCLOSE =
16, // Enclose subexpression
//##9
OP_SUBS = 17, // subscripted variable
OP_INDEX
= 18, // index
modification of subscripted var
OP_QUAL = 19, // struct/union qualification
OP_ARROW
= 20, // pointer
reference
OP_STMT = 21, // Statement code lower. Stmt is
// an abstract class and there is
// no instance having OP_STMT.
OP_LABELED_STMT = 21, // Use the same number as Stmt
// because Stmt
is an abstract class.
OP_ASSIGN =
22, // AssignStmt
OP_IF
= 23, // IfStmt
OP_WHILE
= 24, // WhileStmt
OP_FOR =
25, // ForStmt
OP_UNTIL
= 26, // UntilStmt
OP_INDEXED_LOOP
= 27, //
IndexedLoopStmt (not yet implemented)
OP_JUMP = 28, // JumpStmt
OP_SWITCH =
32, // SwitchStmt
OP_CALL = 33, // Subprogram call
OP_RETURN =
34, // ReturnStmt
OP_BLOCK
= 35, // BlockStmt
OP_EXP_STMT = 36, // ExpStmt (expression statement)
OP_STMT_UPPER = 37,
OP_ADD = 38,
OP_SUB = 39,
OP_MULT = 41,
OP_DIV = 42,
OP_MOD = 43,
OP_AND = 46,
OP_OR
= 47,
OP_XOR = 48,
OP_CMP_EQ =
51,
OP_CMP_NE =
52,
OP_CMP_GT =
53,
OP_CMP_GE =
54,
OP_CMP_LT =
55,
OP_CMP_LE =
56,
OP_SHIFT_LL = 58,
OP_SHIFT_R = 59,
OP_SHIFT_RL = 60,
OP_NOT = 62,
OP_NEG = 63,
OP_ADDR = 64,
OP_CONV = 65,
OP_DECAY
= 66,
OP_UNDECAY =
67, //##10
OP_CONTENTS = 68,
OP_SIZEOF =
70,
OP_SETDATA =
71, //##15
OP_PHI = 72,
OP_NULL = 73,
OP_OFFSET =
76,
OP_LG_AND =
77,
OP_LG_OR
= 78,
OP_SELECT =
79,
OP_COMMA
= 80,
OP_EQ_ZERO =
81, //##20
OP_PRE_INCR = 82,
OP_PRE_DECR = 83,
OP_POST_INCR = 84,
OP_POST_DECR = 85,
OP_ADD_ASSIGN = 86,
OP_SUB_ASSIGN = 87,
OP_MULT_ASSIGN = 88,
OP_DIV_ASSIGN = 89,
OP_MOD_ASSIGN = 90,
OP_SHIFT_L_ASSIGN= 91,
OP_SHIFT_R_ASSIGN= 92,
OP_AND_ASSIGN = 93,
OP_OR_ASSIGN = 94,
OP_XOR_ASSIGN = 95,
OP_EXPLIST = 96, // list of datacode
OP_EXPREPEAT = 97 // repeat of datacode
;
*** Flag
numbers applied to HIR nodes:
static
final int //
Flag numbers used in setFlag/getFlag.
// They should be a number between 1 to 31.
FLAG_NOCHANGE = 1, // This subtree
should not be
// changed in optimization.
FLAG_C_PTR = 2, // The operation (add, sub) is
// pointer operation peculiar to C.
FLAG_CONST_EXP= 3; // This subtree is a
constant expression.
// (constant, address constant, null,
// sizeof
fixed-size-variable,
// expression whose
operands are all constant
// expression)
// Flag numbers 24-31 can
be used in each phase for apbitrary purpose.
// They may be destroyed by
other phases.
*** Coding
rules applied to all classes in the sym packege:
*
* Methods begin with lower case letter.
* Constants (final static int, etc.) are
spelled in upper case letters.
* Indentation is 2 characters. Tab is
not used for indentation.
* Formal parameters begin with p.
* Local variables begin with l.
* Methods and variables are named so
that meaning is easily guessed.
* Short names less than 3 characters are
not used except for
* very local purpose.
*
</PRE>
**/
public
interface
HIR
extends IR, Cloneable {
//##18
//====
Access methods available to build IR nodes. ====//
// (Factory methods for
creating HIR will be explained later.)
/**
program: Make a program node.
*
See Program interface.
*
@param pProgName: Program name (may be null).
*
@param pGlobalSymTable: Symbol table for global symbols.
*
@param pInitiationPart: Initiation statement (may be null).
*
@param pSubpList: List of subprograms. At first, it may be
* an empty list. (See
addSubpDefinition of Program interface.)
**/
public
Program
program(
Sym pProgName, SymTable pGlobalSymTable,
IR pInitiationPart, IrList pSubpList);
/**
subpDefifnition:
*
Make a subprogram definition node and
*
set symRoot.subpCurrent = pSubpSym,
*
set symRoot.symTableCurrentSubp = pLocalSymTable.
*
You may add initiation-part, HIR-body later
*
by using addInitiationStmt, setHirBody of SubpDefinition
*
interface.
*
Start label and end label for the given subprogram
*
are generated to make getStartLabel(), getEndLabel()
*
of Subp interface effective.
*
@param pSubpSym: Subprogram symbol. Should be given.
*
@param pLocalSymTable: Symbol table local in the subprogram;
* If subprogram uses a local symbol
table, this should
* be given (by using pushSymTable() of
SymTable interface).
*
@return the created SubpDefinition instance.
**/
public SubpDefinition
subpDefinition(
Subp pSubpSym, SymTable pLocalSymTable );
/**
subpDefinition without SymTable
*
If source language admits no local symbol for subprogram,
*
use this method to create SubpDefinition without
*
local symbol table.
* Other items are the same as the previous method.
*
@param pSubpSym: Subprogram symbol. Should be given.
*
@return the created SubpDefinition instance.
**/
public
SubpDefinition
subpDefinition(
Subp pSubpSym );
/**
subpDefinition with full specification.
*
Other items are the same as the previous method.
*
@param pSubpSym: Subprogram symbol. Should be given.
*
@param pLocalSymTable: should be given.
*
@param pInitiationPart: Initiation statement block. optional.
*
@param pHirBody: Subprogram body in HIR. optional.
**/
public
SubpDefinition
subpDefinition(
Subp pSubpSym, SymTable pLocalSymTable,
BlockStmt pInitiationPart, BlockStmt pHirBody);
/**
irList: Make an HirList node that makes a LinkedList.
*
The created list can be treated as an HIR node.
*
@param pList: List of objects to be included in the HirList;
* The elements of the list are an HIR
object or Sym object. //##19
*
@return IrList containing pList;
* Resultant list is also an instance
of HIR. //##12
**/
public
coins.ir.IrList
irList(
LinkedList pList );
/**
irList: Make an empty HirList node that make a LinkedList.
*
Use methods of IrList to add elements to the list.
*
The elements to be added are an HIR object or Sym object. //##19
*
The created list can be treated as an HIR node.
*
@return an empty IrList;
* Resultant list is also an instance
of HIR. //##12
**/
public
coins.ir.IrList
irList();
/**
infNode:
*
Build an InfNode representing some information.
*
The information may be defined in each compiler for arbitrary purpose.
*
@param pInfKindInterned: a string to identify the information kind of
* the InfNode; It should be an
interned string (string with intern()).
* See coins.Registry.
*
@param pInfData : any object to be attached (such as Sym or HIR node);
* The object kind is indicated by the
pInfKindInterned;
* If it is an IrList, then it can
represent complicated
* information structure.
**/
public
InfNode
infNode(
String pInfKindInterned, Object pInfData ); //##17
/**
infStmt:
*
Build an InfStmt representing some information.
*
The information may be defined in each compiler for arbitrary purpose.
*
@param pInfKindInterned: a string to identify the information kind of
* the InfNode. It should be an
interned string (string with intern());
* See coins.Registry.
*
@param pInfData : any object to be attached (such as Sym or HIR node);
* The object kind is indicated by the
pInfKindInterned;
* If it is an IrList, then it can
represent complicated
* information structure.
**/
public
InfStmt
infStmt(
String pInfKindInterned, Object pInfData ); //##17
//====
Methods to get/set HIR node information ====//
/**
getType:
*
Get the type attached to this node.
*
The type is usually attached when node is built by HIR
*
factory methods such as exp.
*
@return the type attached to this node.
**/
Type
getType();
/**
setType:
*
Attach a type to this node.
*
When HIR node is created by HIR factory methods,
*
its type is set in the factory methods so that
*
it is unnecessary to call setType again.
*
@param pType: type to be attached to this node;
* It should represent a proper type
corresponding to the
* result of subtree represented by
this node.
**/
void
setType(
Type pType );
/**
getNextStmt: Get statement next to this statement.
*
@return the statement next to this statement if
* this is a statement; If this is not
a statement,
* return null.
**/
public
Stmt
getNextStmt();
/**
getBBlock:
*
Get the basic block containing this node.
*
@return the basic block containing this node if the subprogram
* containing this node is already
devided into basic blocks;
* return null if basic block is not
yet created.
*
See controlFlowAnal of Flow for the creation of basic blocks.
**/
public
BBlock
getBBlock();
/**
getFlag: returns the value (true/false) of the flag indicated
*
by pFlagNumber.
*
See FLAG_NOCHANGE, FLAG_CONST_EXP, etc. of HIR interface.
*
@param pFlagNumber: flag identification number.
*
@return the value of the flag.
**/
boolean
getFlag(
int pFlagNumber);
/**
setFlag: sets the flag specified by pFlagNumber.
*
See FLAG_NOCHANGE, FLAG_CONST_EXP, etc. of HIR interface.
*
Some local flag numbers can be added in each phase.
*
@param pFlagNumber: flag identification number.
*
@param pYesNo: true or false to be set to the flag.
**/
void
setFlag(
int pFlagNumber, boolean pYesNo);
/**
flagsAreAllFalse:
*
@return true if all flags are false or no flag is set,
* false if some flag is true.
**/
boolean
flagsAreAllFalse();
/**
getFlagBox:
*
Users are recommended to use getFlag( int pFlagNumber )
*
except when they understand the treatment of FlagBox
*
in detail.
*
@return the flag box attached to this node;
* null if flag box is not attached (no
flag is set).
**/
public
FlagBox
getFlagBox();
/** setWork:
*
Set information privately used in each phase.
*
@param pWork: any information of arbitrary class to be set to this node;
* You may define a new class that
represents arbitrary information
* and give its reference as pWork.
*
This method is moved to IR interface.
**/
// void
//
setWork( Object pWork );
/**
getWork:
*
Get information set by setWork for this node.
*
Users should cast by the name of the class used in setWork.
*
@return the information object set by setWork.
*
This method is moved to IR interface.
**/
// Object
//
getWork();
//========================================//
/**
getExpId:
*
Get the expression identifier assigned to this node.
*
@return the expression identifier assigned to this node,
* or return null if it is not
assigned.
**/
ExpId
getExpId();
/**
setExpId:
*
Set the expression identifier computed for this node.
**/
void
setExpId(
ExpId pExpId );
/**
setFlowAnalSym:
*
Set ExpId as the flow analysis symbol for this node.
*
@param pFlowAnalSym: ExpId to be assigned to this node.
**/
void
setFlowAnalSym(
ExpId pFlowAnalSym );
/**
getChildNumber:
*
Get the child number of this node.
*
If not found, return -1.
*
(Usually, it is unnecessary to use this because
* the child number is known by stack, etc.)
**/
public int
getChildNumber();
/**
isStmt:
*
@return true if this node is a statement node,
* otherwise return false.
**/
public
boolean
isStmt();
/**
isTerminal:
*
@return true if this node is a terminal node having no child,
* otherwise return false. HirList is
nonterminal node.
**/
public
boolean
isTerminal();
//##20
/**
getStmtContainingThisNode:
*
Get the innermost statement or LabeledStmt containing this node
*
by traversing ancestors of this node.
*
If this is a statement, then this is the innermost statement.
*
If the the parent of the innermost statement is a LabeledStmt,
*
then the LabeledStmt is returned else the innermost statement
*
is returned.
*
@return the innermost statement or LabeledStmt
* containing this node.
**/
public
Stmt
getStmtContainingThisNode();
/**
cutParentLink:
*
Cut both links from/to parent node if they exist.
*
(Used to prepare for moving a node.)
*
This method is prepared for factory methods and it is not
*
recommended to use this method except when user knows the
*
structure of HIR in detail.
**/
public
void
cutParentLink();
/**
cutParentLink: //##19
*
Cut both links from/to parent node if they exist.
*
(Used to prepare for moving a node.)
*
@param pChildNumber: Show that this node is pChildNumber-th child
* of the parent.
*
This method is prepared for factory methods and it is not
*
recommended to use this method except when user knows the
*
structure of HIR in detail.
**/
public
void
cutParentLink(
int pChildNumber );
//==========
Factory methods to create HIR node ==========//
//====
Factory methods to create terminal nodes ====//
/**
varNode:
*
Make a VarNode instance having Var symbol pVar.
*
@param pVar: Variable symbol to be attached to the node.
*
@return the resultant VarNode.
**/
public
VarNode
varNode(
Var pVar );
// public
ParamNode
//
paramNode( Param pParam ); //##16 DELETED
/**
elemNode:
*
Make an ElemNode instance having Elem symbol pElem.
*
@param pElem: Struct/union element symbol to be attached to the node.
*
@return the resultant ElemNode.
**/
public
ElemNode
elemNode(
Elem pElem ); //##16 not DELETED
/**
subpNode:
*
Make a SubpNode instance having Subp symbol pSubp.
*
@param pSubp: Subprogram symbol to be attached to the node.
*
@return the resultant SubpNode.
**/
public
SubpNode
subpNode(
Subp pSubp );
/**
labelNode:
*
Make a LabelNode instance having Label symbol pLabel.
*
(See labelDef.)
*
@param pLabel: Label symbol to be attached to the node.
*
@return the resultant LabelNode.
**/
public
LabelNode
labelNode(
Label pLabel );
/**
constNode:
*
Make a ConstNode instance having constant symbol pConst.
*
@param pConst: Constant symbol to be attached to the node.
*
@return the resultant ConstNode.
**/
public
ConstNode
constNode(
Const pConst );
/**
intConstNode:
*
Make a ConstNode instance having pIntValue as its value.
*
The constant value is changed to Const symbol and attached to
*
the constant node.
*
@param pIntValue: Integer value to be attached to the node.
*
@return the resultant ConstNode.
**/
public ConstNode
intConstNode(
int pIntValue );
///////////////////////////////////////
S.Fukuda 2002.9.3 begin
/**
offsetConstNode:
*
Make a ConstNode instance having pIntValue as its offset value.
*
The offset value pIntValue is changed to Const symbol and
*
attached to the constant node.
*
@param pIntValue: Offset value to be attached to the node.
*
@return the resultant ConstNode.
**/
public
ConstNode
offsetConstNode(
int pIntValue );
///////////////////////////////////////
S.Fukuda 2002.9.3 end
/**
trueNode:
*
Make a ConstNode instance having boolean true value.
*
@return the true ConstNode.
**/
public
ConstNode
trueNode();
/**
falseNode:
*
Make a ConstNode instance having boolean false value.
*
@return the false ConstNode.
**/
public
ConstNode
falseNode();
/**
symNode:
*
Make a SymNode instance having pSym as attached symbol.
*
This method is used for symbols other than Var, Elem, Subp,
*
Label, and constant.
*
@param pSym: Symbol to be attached to the node.
*
@return the resultant SymNode.
**/
public
SymNode
symNode(
Sym pSym );
/**
nullNode:
*
Make a NullNode instance.
*
@return the NullNode.
**/
public
NullNode
nullNode(
);
/**
labelDef:
*
Make a LabelDef instance that defines the label pLabel.
*
(See labelNode.)
*
@param pLabel: Label symbol to be defined.
*
@return the resultant LabelDef.
**/
public
LabelDef
labelDef(
Label pLabel );
//====
Factory methods to create nonterminal nodes ====//
/** exp:
*
Build unary expression except cast.
*
@param pOperator: unary operator such as OP_NOT, OP_NEG, etc.
* defined in HIR interface.
*
@param pExp1: operand expression.
*
@return the resultant unary expression subtree.
**/
public Exp
exp( int pOperator,
Exp pExp1 );
/** exp:
*
Build binary expression.
*
@param pOperator: binary operator such as OP_ADD, OP_MULT, etc.
* defined in HIR interface.
*
@param pExp1: operand 1 expression.
*
@param pExp2: operand 2 expression.
*
@return the resultant binary expression subtree.
**/
public Exp
exp( int
pOperator, Exp pExp1, Exp pExp2 );
/** exp:
*
Build ternary expression (OP_SELECT, etc.).
*
@param pExp1: operand 1 expression.
*
@param pExp2: operand 2 expression.
*
@param pExp3: operand 3 expression.
*
@return the resultant ternary expression subtree.
**/
public Exp
exp( int
pOperator, Exp pExp1, Exp pExp2, Exp pExp3 );
/**
castExp:
//##10 Use convExp
*
Cast pExp to pType.
**/
//## public
Exp
//##
castExp( Type pType, Exp pExp ); //##10
/**
decayExp: //##12
*
Build an expression that decay a vector to a pointer to vector element,
*
or decay a String into a pointer to Char element.
*
@param pExp: vector variable or string constant.
*
@return decay expression with pointer type.
**/
public Exp
decayExp(
Exp pExp );
/**
undecayExp: //##14
*
Build an expression that undecay a pointer to a vector whose element
*
type is pointed type.
*
@param pPointerExp: pointer expression pointing to the
* first element of the resultant
vector.
*
@param pElemCount: Expression showing element count of
* the resultant vector (constant
expression).
*
@return the vector expression.
**/
public Exp
undecayExp(
Exp pPointerExp, ConstNode pElemCount );
public Exp
//SF030531
undecayExp(
Exp pPointerExp, int pElemCount ); //SF030531
/**
subscriptedExp:
*
Build a subscripted expression.
*
@param pArrayExp: array expression to which subscript is
* to be attached;
* If multi-dimensional subscript is
required, make pArrayExp
* as a subscripted variable and add
more by this method.
*
@param pSubscript: subscript expression.
*
@return subscripted expression node having operation code subsCode.
**/
public
SubscriptedExp
subscriptedExp(
Exp pArrayExp, Exp pSubscript );
/**
subscriptedExp with element size parameter: //##12 To be DELETED
*
Build a subscripted expression.
*
@param pArrayExp: array expression to which subscript is
* to be attached;
* If multi-dimensional subscript is
required, make pArrayExp
* as a subscripted variable and add
more by this method.
*
@param pSubscript: subscript expression.
*
@param pElemSize: array element size which is an offset
* incremented according to subscript
increment.
*
@return subscripted expression node having operation code subsCode.
**/
public
SubscriptedExp
subscriptedExp(
Exp pArrayExp, Exp pSubscript, Exp pElemSize );
/**
qualifiedExp:
* Build a qualified expression.
*
@param pStructUnionExp: expression specifying structure or union
* to qualify.
*
@param pElemNode: An element of pStructUnionExp.
*
@return qualified expression node having operation code qualCode.
**/
public
QualifiedExp
qualifiedExp(
Exp pStructUnionExp, ElemNode pElemNode );
/**
pointedExp:
*
Build a pointed expression.
*
@param pStructUnionExp: expression specifying structure or union
* whose element is to be pointed.
*
@param pElemNode: An element of pStructUnionExp.
*
@return pointed expression node having operation code arrowCode.
**/
public
PointedExp
pointedExp(
Exp pStructUnionExp, ElemNode pElemNode );
/**
contentsExp:
*
Build an expression that gets the contents pointed by pPointerExp.
*
@param pPointerExp: Expression representing a pointer.
*
@return the expression that gets the pointed expression.
**/
public Exp
contentsExp(
Exp pPointerExp );
/**
convExp:
*
Build an expression to convert the type of pExp to pType.
*
@param pType: Type to which pExp is to be changed.
*
@param pExp: Expression to be converted.
*
@return the expression converted to pType.
**/
public Exp
convExp(
Type pType, Exp pExp );
/**
sizeofExp:
*
Build the expression that get the size of pType.
*
@param pType: Type of object.
*
@return the expression representing the size of pType.
**/
public Exp
sizeofExp(
Type pType );
/**
sizeofExp:
*
Build the expression that get the size of pExp.
*
@param pExp: Expression whose size is to be taken.
*
@return the expression representing the size of pExp.
**/
public Exp
sizeofExp(
Exp pExp );
/**
functionExp:
*
Build a function expression node that computes function value.
*
The function may have no return value (void return value).
*
If pFunctionSpec is (addr SubpNode) or SubpNode, then the
*
subprogram represented by it is added to the call list
*
of the current subprogram (symRoot.subpCurrent).
*
@param pFunctionSpec: function specification part which may be either
* a function name (SubpNode), or an
expression specifying
* a function name ((addr SubpNode),
etc.).
*
@param pActualParamList: actual parameter list (made by hirList).
*
@return function expression node having operation code opCall.
**/
public
FunctionExp
functionExp(
Exp pFunctionSpec, IrList pActualParamList );
/**
callStmt:
*
Build a subprogram call statement.
*
Parameters are the same as those of functionExp.
*
@param pSubpSpec: subprogram specification part which may be either
* a subprogram name (SubpNode), or an
expression specifying
* a subprogram name ((addr SubpNode),
etc.).
*
@param pActualParamList: actual parameter list (made by hirList).
*
@return function expression node having operation code opCall.
**/
public
ExpStmt
callStmt(
Exp pSubpSpec, IrList pActualParamList );
/**
assignStmt:
*
Build an assignemnt statement.
*
@param pLeft: left hand side (l-value) expression to which
* the value of expression is to be
assigned.
*
@param pRight: expression (subtree) that is to be assigned
* to pLeftSide.
*
@return the subtree of the built statement
* with statement body operator
assignCode.
**/
public
AssignStmt
assignStmt(
Exp pLeft, Exp pRight );
/**
ifStmt:
*
Build an if-statement with then-part (pThenPart) and
*
else-part (pElsePart).
*
Internal labels (then-label and else-label) are generated
*
to be attached to the then-part and else-part.
*
If pThenPart or pElsePart is null, a LabeledStmt with null
*
statement body is generated as then-part or else-part.
*
(null else-part can be deleted by deleteUselessLabeledStmtOfHir()
*
of coins.flow.DeleteUnusedLabels1.)
*
@param pCondition: conditional expression subtree.
*
@param pThenPart: then-part statement that is executed when
* pCondition is true.
*
@param pElsePart: else-part statement that is executed when
* pCondition is false.
*
@return the subtree of the built statement
* with statement body operator OP_IF;
* If else-part is not given, it is
treated as null.
**/
public
IfStmt
ifStmt(
Exp pCondition, Stmt pThenPart, Stmt pElsePart );
/*
whileStmt (simple):
* Build while-loop statement.
* If it contains break or continue
statement, use getLoopSteplabel()
* or getLoopEndLabel() of LoopStmt
interface to get the label
* to be used in the jump statement
corresponding to the continue
* or break statement. User may also use the general
* whileStmt method that has
pLoopStepLabel and pLoopEndLabel.
* @param pCondition: Loop start
condition expression.
* @param pLoopBody: Loop body to be
repetitively executed.
* @return WhileStmt subtree.
**/
public
WhileStmt
whileStmt(
Exp pCondition, Stmt pLoopBody );
/*
whileStmt (general):
* Build while-loop statement.
* If user want to make a jump statement
corresponding to break or
* continue statement, generate
pLoopStepLabel and pLoopEndLabel by
*
symRoot.symTableCurrent.generateLabel() and use the labels in
* the jump statement.
* @param pLoopBacklabel: Label to be
attached to the
* loop body.
* @param pCondition: Loop start
condition expression.
* @param pLoopBody: Loop body to be
repetitively executed.
* @param pLoopStepLabel: Label to which
continue statement should jump.
* @param pLoopEndLabel: Label to whicjh
break statement should jump.
* @return WhileStmt subtree.
**/
public
WhileStmt
whileStmt(
Label pLoopBackLabel, Exp pCondition, Stmt pLoopBody,
Label pLoopStepLabel,
Label pLoopEndLabel );
/* forStmt
(simple):
* Build for-loop statement.
* If it contains break or continue
statement, use getLoopSteplabel()
* or getLoopEndLabel() of LoopStmt
interface to get the label
* to be used in the jump statement
corresponding to the continue
* or break statement. User may also use the general
* forStmt method that has pLoopStepLabel
and pLoopEndLabel.
* @param pInitStmt: Loop initiation
statement that is executed
* before testing the loop start condition.
* @param pCondition: Loop start
condition expression.
* @param pLoopBody: Loop body to be
repetitively executed.
* @param pStepPart: Step part statement
that is executed
* at the first of the next iteration.
* @return forStmt subtree.
**/
public
ForStmt
forStmt(
Stmt pInitStmt, Exp pCondition,
Stmt pLoopBody, Stmt pStepPart );
/* forStmt
(general):
* Build for-loop statement.
* @param pInitStmt: Loop initiation
statement that is executed
* before testing the loop start condition.
* @param pLoopBacklabel: Label to be
attached to the
* loop body.
* @param pCondition: Loop start
condition expression.
* @param pLoopBody: Loop body to be
repetitively executed.
* @param pLoopStepLabel: Label to which
break statement should jump.
* @param pStepPart: Step part statement
that is executed
* at the first of the next iteration.
* @param pLoopEndLabel: Label to whicjh
break statement should jump.
* @return forStmt subtree.
**/
public
ForStmt
forStmt(
Stmt pInitStmt, Label pLoopBackLabel, Exp pCondition,
Stmt pLoopBody, Label pLoopStepLabel, Stmt pStepPart,
Label pLoopEndLabel );
/*
untilStmt (simple):
* Build until-loop statement.
* If it contains break or continue
statement, use getLoopSteplabel()
* or getLoopEndLabel() of LoopStmt
interface to get the label
* to be used in the jump statement
corresponding to the continue
* or break statement. User may also use the general
* untilStmt method that has pLoopStepLabel
and pLoopEndLabel.
* @param pLoopBody: Loop body to be
repetitively executed.
* @param pCondition: Loop end condition
expression.
* @return untilStmt subtree.
**/
public
UntilStmt
untilStmt(
Stmt pLoopBody, Exp pCondition );
/* untilStmt
(general):
* Build until-loop statement.
* @param pLoopBacklabel: Label to be
attached to the
* loop body.
* @param pLoopBody: Loop body to be
repetitively executed.
* @param pLoopStepLabel: Label to which
break statement should jump.
* @param pCondition: Loop end condition
expression.
* @param pLoopEndLabel: Label to whicjh
break statement should jump.
* @return untilStmt subtree.
**/
public
UntilStmt
untilStmt(
Label pLoopBackLabel, Stmt pLoopBody, Label pLoopStepLabel,
Exp
pCondition, Label pLoopEndLabel );
/*
indexedLoopStmt: //##21
* Build simple indexed-loop
(Fortran-type loop) statement.
* @param pLoopIndex: Simple variable
that is incremented
* by pStepValue at each repetition of the loop
* starting from pStartValue toward pEndValue while
not exceeding
* pEndvalue; Usually it is an integer variable but
* floating variable is also permitted.
* @param pStartValue: Start value of the
loop index.
* @param pEndValue: End limit of the loop
index.
* @param pStepValue: Step value to be
used to increment
* the loop index; It should represent
positive number.
* @param pLoopBody: Loop body to be
repetitively executed.
* @return IndexedLoopStmt subtree.
* @see IndexedLoopStmt.
**/
public
IndexedLoopStmt //##21
indexedLoopStmt(
Var pLoopIndex, Exp pStartValue,
Exp pEndValue, Exp pStepValue, Stmt
pLoopBody );
/*
indexedLoopStmt: //##21
* Build general indexed-loop
(Fortran-type loop) statement.
* @param pLoopIndex: Simple variable
that is incremented or
* decremented by pStepValue at each repetition of
the loop
* starting from pStartValue toward pEndValue while
not crossinging
* pEndvalue; Usually it is an integer variable but
* floating variable is also permitted.
* @param pStartValue: Start value of the
loop index.
* @param pEndValue: End limit of the
loop index.
* @param pStepValue: Step value to be
used to increment
* the loop index; It should represent
positive number.
* @pUpward: true if the loop index is
incremented upward,
* false if it is decremented downward; If
false,
* pEndValue is expected to be less or equal
to pStartValue.
* @param pLoopBody: Loop body to be
repetitively executed.
* @return IndexedLoopStmt subtree.
* @see IndexedLoopStmt.
**/
public
IndexedLoopStmt //##21
indexedLoopStmt(
Var pLoopIndex, Exp pStartValue,
Exp pEndValue, Exp pStepValue, boolean
pUpward, Stmt pLoopBody );
/**
labeledStmt:
*
Build labeled statement using pLabel as its label and
*
pStmt as its statement body.
*
It is recommended to use attachLabel of Stmt
*
except in HIR access methods to make a labeled statement.
*
If you want to use labeledStmt, give null as pStmt parameter.
*
Relations between pStmt and others (such as previousStmt,
*
nextStmt, parentNode) are not kept. If it is necessary to
*
transfer such relations to this LabeledStmt, apply
*
attachLabel method to pStmt instead of calling labeledStmt.
**/
public
LabeledStmt
labeledStmt(
Label pLabel, Stmt pStmt );
/**
blockStmt:
*
Make an instance of block statement that may contain a sequence of
*
statements.
*
It is recommended to make an empty block statement by
*
blockStmt(null) and then add statements by successively calling
*
addLastStmt method of BlockStmt.
*
@param pStmtSequence: statement to be included in BlockStmt.
*
@return the resultant BlockStmt.
**/
public
BlockStmt
blockStmt(
Stmt pStmtSequence );
/**
returnStmt:
*
Build return statement that terminates the execution of
* current subprogram under
construction.
*
@param pReturnValue: return value of function subprogram.
* If the subprogram has no return
value, it is null.
*
@return the subtree of the built statement
* with statement body operator OP_RETURN.
**/
public
ReturnStmt
returnStmt(
Exp pReturnValue );
/**
returnStmt:
*
Build return statement that terminates the execution of
*
current subprogram under construction.
*
It has no return value.
* @return the subtree of the built statement
* with statement body operator
OP_RETURN.
**/
public
ReturnStmt
returnStmt();
/**
jumpStmt:
*
Create a jump statement and increment reference count of pLabelSym.
*
@param pLabelSym: jump target label.
*
@return the created jump statement.
**/
public
JumpStmt
jumpStmt(
Label pLabelSym );
/**
switchStmt:
*
Make a SwitchStmt instance.
*
The jump list pJumpList is a list of pairs of case constant
*
and case label. Following sequence may create a jump list:
* created an empty list by irList() of HIR;
* generate a case-label and attach it to the
statement
* corresponding to the
case-constant;
* add hir.hirSeq(case-constant node,
case-label node) to the list;
* repeat the generation of case-label and
addition to the jump list;
*
@param pSelectExp: Expression to select case statement.
*
@param pJumpList: Jump list that correlate case constant
* and case label.
*
@param pDefaultLabel: label to be attached to default statement part.
*
@param pSwitchBody: Switch statement body that contains statements
* with case-label.
*
@param pEndLabel: Label as the target of jump corresponding to break.
*
@return the resultant SwitchStmt.
**/
public
SwitchStmt
switchStmt(
Exp pSelectExp, IrList pJumpList, Label pDefaultLabel,
Stmt pSwitchBody, Label pEndLabel );
/**
expStmt:
*
Create a statement treating pExp as a statement.
*
ExpStmt appears as loop-condition, call statement, etc.
*
The loop-condition is an expression but it has label, and so,
*
it should be ExpStmt. The call statement is a function call
*
expression treated as a stand alone statement, and so,
*
it should be ExpStmt.
*
@param pExp: expression to be treated as a statement.
*
@return the resultant ExpStmt.
**/
public
ExpStmt
expStmt(
Exp pExp );
/**
nullStmt:
*
Make a statement having NullNode as its statement body.
*
@return the null statement.
**/
public
Stmt
nullStmt();
/**
phiExp:
*
Make a phi expression used in SSA.
*
@param pVar: variable to be selected.
*
@param pLabel: label attached to a basic block from which
* control tranfers.
*
@return PhiExp.
**/
public
PhiExp
phiExp(
Var pVar, Label pLabel );
/**
hirSeq: Make an HirSeq node that have some definite number of
*
children.
*
@param pChild1: Child 1 HIR node.
*
@return HirSeq with one child.
**/
public
HirSeq
hirSeq(
HIR pChild1 );
/**
hirSeq: Make an HirSeq node that have some definite number of
*
children.
*
@param pChild1: Child 1 HIR node.
*
@param pChild2: Child 2 HIR node.
*
@return HirSeq with 2 children.
**/
public
HirSeq
hirSeq(
HIR pChild1, HIR pChild2 );
/**
hirSeq: Make an HirSeq node that have some definite number of
*
children.
*
@param pChild1: Child 1 HIR node.
*
@param pChild2: Child 2 HIR node.
*
@param pChild3: Child 3 HIR node.
*
@return HirSeq with 3 children.
**/
public
HirSeq
hirSeq(
HIR pChild1, HIR pChild2, HIR pChild3 );
/**
hirSeq: Make an HirSeq node that have some definite number of
*
children.
*
@param pChild1: Child 1 HIR node.
*
@param pChild2: Child 2 HIR node.
*
@param pChild3: Child 3 HIR node.
*
@param pChild4: Child 4 HIR node.
*
@return HirSeq with 4 children.
**/
public
HirSeq
hirSeq(
HIR pChild1, HIR pChild2, HIR pChild3, HIR pChild4 );
/**
hirSeq: Make an HirSeq node that have some definite number of
*
children.
*
@param pChild1: Child 1 HIR node.
*
@param pChild2: Child 2 HIR node.
*
@param pChild3: Child 3 HIR node.
*
@param pChild4: Child 4 HIR node.
*
@param pChild5: Child 5 HIR node.
*
@return HirSeq with 5 children.
**/
public
HirSeq
hirSeq(
HIR pChild1, HIR pChild2, HIR pChild3, HIR pChild4, HIR pChild5 );
/**
hirSeq: Make an HirSeq node that have some definite number of
*
children.
*
@param pChild1: Child 1 IR node.
*
@return HirSeq with one IR child.
**/
public
HirSeq
hirSeq( IR
pChild1 );
/**
hirSeq: Make an HirSeq node that have some definite number of
*
children.
*
@param pChild1: Child 1 IR node.
*
@param pChild2: Child 2 IR node.
*
@return HirSeq with 2 IR children.
**/
public
HirSeq
hirSeq( IR
pChild1, IR pChild2 );
//====
Primitive methods to make HIR node ====//
// Not recommmended to be used
except in HIR factory methods.
/**
hirNode:
*
make an HIR node with no operand.
*
hirNode methods are not recommmended to be used except in
*
HIR factory methods.
*
@param pOperator: Operator constant of HIR.
*
@return the HIR node.
**/
public HIR
hirNode(
int pOperator );
public HIR
hirNode(
int pOperator, HIR pOperand1 );
public HIR
hirNode(
int pOperator, HIR pOperand1, HIR pOperand2 );
public HIR
hirNode(
int pOperator, HIR pOperand1, HIR pOperand2,
HIR pOperand3 );
public HIR
hirNode(
int pOperator, HIR pOperand1, HIR pOperand2,
HIR pOperand3, HIR pOperand4 );
/**
hirNodeWithN_sources:
*
Create an HIR node having pOperator as its operator
*
and n null source operands.
*
This method is not recommmended to be used except in
*
HIR factory methods.
*
@param pOperator: operation code of the node to be created.
*
@param pSourceNumber: number of null source operands to be
* attached to the created node.
*
@return the created node having pOperator as its operator and
* null source operands counting up to
pSourceNumber.
**/
public HIR
NodeWithN_sources(
int pOperator, int pSourceNumber );
//====
Methods to link children to HIR node ====//
// Not recommmended to be used
except in HIR factory methods.
public
void setChildren( IR p1, IR p2 );
public
void setChildren( IR p1, IR p2, IR p3 );
public
void setChildren( IR p1, IR p2, IR p3, IR p4 );
public
void setChildren( IR p1, IR p2, IR p3, IR p4, IR p5 );
//======
Methods for manipulating HIR nodes ======//
/**
copyWithOperands:
*
Make a subtree that is the same to this subtree.
*
(Labels are not renamed.)
*
In general, a subtree represents the computation of
*
an operation and also the computation of its operands.
*
Flow information is invalid as for copied subtree and
*
should be computed again if required.
*
If the subtree contains labels, it is recommended to use
*
copyWithOperandsChangingLabels. Note that, IfStmt, LoopStmt
*
(for, while, until, etc.), SwitchStmt
*
contain internal labels and it is recommended to use
*
copyWithOperandsChangingLabels to the subtree that may contain
*
these statements.
*
"this" should be the root node of a subtree contained
*
in a subprogram body. Subprogram body itself should not be copied.
*
@return the subtree made by the copy operation.
**/
HIR
copyWithOperands();
/**
copyWithOperandsChangingLabels:
*
Make a new subtree that is the same to this subtree.
*
If this subtree contains a label definition, then
*
the label is renamed to avoid conflict.
*
Flow information is invalid as for copied subtree and
*
should be computed again if required.
*
"this" should be the root node of a subtree contained
*
in a subprogram body. Subprogram body should not be copied.
*
@param pLabelCorrespondence: label correspondence list;
* It is usually null; If label
correspondence is to be
* specified, it should be of the form
* (IrList (IrList of
original labels) (IrList of new labels) )
* "this" subtree should not
contain labels listed
* in (IrList of new labels) so as
escape from infinite
* replacement loop; This restriction
is satisfied when
* pLabelCorrespondence is null;
* If this parameter is null, it is
computed in this method
* and passed to HirModify subclass
after calling copyWithOperands
* (without changing label).
*
@return the copied subtree with labels changed.
**/
public HIR
copyWithOperandsChangingLabels(
IrList pLabelCorrespondence );
/**
replaceResultOperand:
*
Replace result operand (variable) of "this" node by pOperand.
*
"this" should be a node that can have
*
result operand, that is, "this" should be HIR assign node or
*
LIR store node.
*
If "this" is HIR assign node, its child 1 representing left
*
hand side variable is replaced by pOperand.
*
If "this" is LIR store node, the result variable is replaced
*
by pOperand which may be a simple variable or a register
*
or some other expression representing address of variable. (##2)
*
(This method is moved to IR interface.) //##20
*
@param pOperand: node that takes place of result variable;
* If "this" is HIR node then
it should be HIR node,
* if "this" is LIR node then
it should be LIR node.
**/
// void
//
replaceResultOperand( IR pOperand );
/**
replaceResultVar: //##20 To be DELETED. Use replaceResultOperand
*
Replace result variable of "this" node by pOperand.
*
"this" should be a node that can have variable as its
*
result operand, that is, "this" should be HIR assign node or
*
LIR store node.
*
If "this" is HIR assign node, its child 1 representing left
*
hand side variable is replaced by pOperand.
*
If "this" is LIR store node, the result variable is replaced
*
by pOperand which may be a simple variable or a register
*
or some other expression representing address of variable. (##2)
*
@param pOperand: node that takes place of result variable;
* If "this" is HIR node then
it should be HIR node,
* if "this" is LIR node then
it should be LIR node.
**/
void
replaceResultVar(
IR pOperand ); //##20 To be DELETED. Use replaceResultOperand
/**
replaceOperator: //##20 To be DELETED
*
Replace the operator of "this" node by pOperator.
*
The operator should have the same number and type of operands.
*
It is not recommended to use this method.
*
@param pOperator: operation code for replacement.
**/
void
replaceOperator(
int pOperator ); //##20 To be DELETED.
/**
getClone: //##20
*
Make the clone of this node to get a clone in the situation
*
where clone() can not be used directly.
*
@return the clone of this node.
**/
// public
IR //##20
//
getClone()throws CloneNotSupportedException;
/**
hirClone: //##20
*
Make the clone of this node to get a clone in the situation
*
where clone() can not be used directly.
*
@return the clone of this node.
*/
public HIR
hirClone()throws
CloneNotSupportedException;
/**
isTree: //##16
*
Test if this does not violates tree structure, that is,
*
detect node adherence in branches and
*
handshake miss in parent-child relation.
*
Issues message if some node is encountered twice in
*
the process of traversing this subtree.
*
@return true if this a tree else return false.
**/
public
boolean
isTree(); //##16
/**
isTree: //##20
*
Test if this does not violates tree structure, that is,
* detect node adherence in branches and
*
handshake miss in parent-child relation.
*
Issues message if some node is encountered twice in
*
the process of traversing this subtree.
*
@param pVisitedNodes: Give null in usual case;
* Set of visited nodes is given
when isTree is
* invoked recursively by isTree.
*
@return true if this a tree else return false.
**/
public
boolean
isTree(java.util.Set
pVisitedNodes ); //##20
//====
Iterators to traverse HIR ====//
/**
subpIterator:
*
Make an iterator that traverses all subprogram definitions
*
in the current compile unit.
*
Sequence of SubpDefinition will be get by using next()
*
of the iterator successively.
*
@return the iterator to traverse subprogram definitions.
**/
public
Iterator
subpIterator();
/**
hirIterator:
<PRE>
*
Get an iterator to traverse all nodes or statements under
*
pSubtree. YOu can traverse the subtree by following methods
*
of HirIterator:
* next(): traverse all nodes.
* getNextStmt(): traverse all statements.
* getNextExecutableNode(): traverse
executable nodes only.
*
See HirIterator interface.
*
@param pSubtree: root of the subtree to be traversed.
*
@return teh resultant HirIterator.
</PRE>
**/
public
HirIterator
hirIterator(
IR pSubtree );
//##
public Iterator
//##
lirIterator( IR pSubtree );
//====
Visitor/Acceptor to process HIR ====//
/**
public
void visitHir( HIR pHir);
public
void visitChildren( HIR pHir );
**/
/** accept:
*
Acceptor used in HIR visitor.
*
See HirVisitor, HirVisitorModel1, HirVisitormodel2.
*
@param pVisitor: HirVisitor
**/
public
void
accept(
HirVisitor pVisitor );
//====
Methods to print HIR node ====//
/**
toStringShort
*
Get text string of this node showing node name and index only.
**/
public
String toStringShort();
/**
toStringDetail
*
Get text string of this node showing detail information.
**/
public
String toStringDetail();
/** print:
*
Print this subtree in text format traversing all children
*
of this node.
*
"this" may be any subtree (it may be a leaf node).
*
@param pIndent: number of heading spaces for indentation.
*
@param pDetail: true if print all main attributes,
* false if some detail
attributes are to be omitted.
**/
public
void print( int pIndent, boolean pDetail );
/**
getIndentSace:
*
Get a sequence of spaces specified by pIndent.
*
@param pIndent: number of spaces to be generated.
*
@return a string of spaces.
**/
public
String getIndentSpace( int pIndent );
/**
setIndexNumberToAllNodes:
*
Set sequencial index number to all nodes traversing the subtree
*
rooted by this node.
*
@param pStartNumber: starting value of the index.
*
@return (the last index number) + 1.
**/
public int
setIndexNumberToAllNodes(
int pStartNumber );
//======
Constants available in HIR classes ======//
/**
Operator number
**/
public static final int
OP_PROG = 1, // Program
OP_SUBP_DEF = 2, // SubpDefinition
OP_LABEL_DEF = 3, // LabelDef node
OP_INF = 4, // Information node
OP_CONST
= 5, // ConstNode
OP_SYM = 6, // SymNode
OP_VAR = 7, // VarNode
OP_PARAM
= 8, // VarNode
OP_SUBP = 9, // SubpNode
OP_TYPE = 10, // TypeNode
OP_LABEL
= 11, // LabelNode
OP_ELEM = 12, // ElemNode
// OP_FIELD = 13,
//
OP_CONST - OP_FIELD has a symbol attached
// and it is get bey getSym().
OP_LIST = 14, // List of CompilerObjects
// such as IR nodes and symbols
OP_SEQ = 15, // Sequence of HIR objects //##10
OP_ENCLOSE =
16, // Enclose subexpression
//##9
OP_SUBS = 17, // subscripted variable
OP_INDEX
= 18, // index
modification of subscripted var
OP_QUAL = 19, // struct/union qualification
OP_ARROW
= 20, // pointer
reference
OP_STMT = 21, // Statement code lower. Stmt is
// an abstract class and there is
// no instance having OP_STMT.
OP_LABELED_STMT = 21, // Use the same number as Stmt
// because Stmt is an abstract class.
OP_ASSIGN =
22, // AssignStmt