C-Breeze
C Compiler Infrastructure

[ Project home page]

Dismantle Class Reference

main dismantler method More...

#include <dismantle.h>

Inheritance diagram for Dismantle:

Changer List of all members.

Public Types

enum  Order { Preorder, Postorder, Both }
enum  Depth { Subtree, NodeOnly }

Public Member Functions

virtual Node * at_unit (unitNode *, Order)
virtual Node * at_proc (procNode *, Order)
Accessors
Methods to get and set fields in the class.

Order order () const
 Return the order in which Nodes of an AST should be visited.
Depth depth () const
 Return which Nodes of an AST should be visited.
bool delete_old () const
 Return whether this Changer deletes Nodes which are removed from the AST by "at_" methods.
Accessors
Methods to get and set fields in the class.

Order order () const
 Return the order in which Nodes of an AST should be visited.
Depth depth () const
 Return which Nodes of an AST should be visited.
bool delete_old () const
 Return whether this Changer deletes Nodes which are removed from the AST by "at_" methods.
"at_" methods
These methods define the functions that should be performed when different classes of Nodes are encountered in the AST. The most specific "at_" method that matches a given Node's class will be called.

virtual Node * at_node (Node *the_node, Order ord)
virtual Node * at_def (defNode *the_def, Order ord)
virtual Node * at_decl (declNode *the_decl, Order ord)
virtual Node * at_subdecl (subdeclNode *the_subdecl, Order ord)
virtual Node * at_type (typeNode *the_type, Order ord)
virtual Node * at_prim (primNode *the_prim, Order ord)
virtual Node * at_tdef (tdefNode *the_tdef, Order ord)
virtual Node * at_ptr (ptrNode *the_ptr, Order ord)
virtual Node * at_array (arrayNode *the_array, Order ord)
virtual Node * at_func (funcNode *the_func, Order ord)
virtual Node * at_sue (sueNode *the_sue, Order ord)
virtual Node * at_struct (structNode *the_struct, Order ord)
virtual Node * at_union (unionNode *the_union, Order ord)
virtual Node * at_enum (enumNode *the_enum, Order ord)
virtual Node * at_suespec (suespecNode *the_suespec, Order ord)
virtual Node * at_expr (exprNode *the_expr, Order ord)
virtual Node * at_index (indexNode *the_index, Order ord)
virtual Node * at_const (constNode *the_const, Order ord)
virtual Node * at_id (idNode *the_id, Order ord)
virtual Node * at_binary (binaryNode *the_binary, Order ord)
virtual Node * at_unary (unaryNode *the_unary, Order ord)
virtual Node * at_cast (castNode *the_cast, Order ord)
virtual Node * at_comma (commaNode *the_comma, Order ord)
virtual Node * at_ternary (ternaryNode *the_ternary, Order ord)
virtual Node * at_call (callNode *the_call, Order ord)
virtual Node * at_initializer (initializerNode *the_initializer, Order ord)
virtual Node * at_stmt (stmtNode *the_stmt, Order ord)
virtual Node * at_block (blockNode *the_block, Order ord)
virtual Node * at_basicblock (basicblockNode *the_basicblock, Order ord)
virtual Node * at_exprstmt (exprstmtNode *the_exprstmt, Order ord)
virtual Node * at_target (targetNode *the_target, Order ord)
virtual Node * at_label (labelNode *the_label, Order ord)
virtual Node * at_case (caseNode *the_case, Order ord)
virtual Node * at_selection (selectionNode *the_selection, Order ord)
virtual Node * at_if (ifNode *the_if, Order ord)
virtual Node * at_switch (switchNode *the_switch, Order ord)
virtual Node * at_loop (loopNode *the_loop, Order ord)
virtual Node * at_while (whileNode *the_while, Order ord)
virtual Node * at_do (doNode *the_do, Order ord)
virtual Node * at_for (forNode *the_for, Order ord)
virtual Node * at_jump (jumpNode *the_jump, Order ord)
virtual Node * at_goto (gotoNode *the_goto, Order ord)
virtual Node * at_continue (continueNode *the_continue, Order ord)
virtual Node * at_break (breakNode *the_break, Order ord)
virtual Node * at_return (returnNode *the_return, Order ord)
virtual Node * at_attrib (attribNode *the_attrib, Order ord)
virtual Node * at_operand (operandNode *the_oper, Order ord)
virtual Node * at_conditiongoto (conditiongotoNode *the_condgoto, Order ord)
virtual Node * at_threeAddr (threeAddrNode *the_3addr, Order ord)
virtual Node * at_text (textNode *the_text, Order ord)

Static Public Member Functions

static void dismantle_control (unitNode *)
static void dismantle (unitNode *)

Static Public Attributes

static const int DISMANTLE_CONTROL = 1 << 0
static const int DISMANTLE_EXPRS = 1 << 1

Private Member Functions

 Dismantle (int flags)

Private Attributes

int _flags

Detailed Description

main dismantler method

The dismantler provides two distinct levels of dismantled output. At all levels of dismantling, some common transformations are applied to the input AST. First, static block variables are made into top-level (global) variables. Second, initialization of automatic variables is removed from the declaration and made into an assignment statement at the beginning of the relevant block. These changes to initializers only apply to scalar values (ints, floats & pointers); however the implicit zero values in an aggregate types initial value are explicitly added. Third, all labelNodes are modified so that the stmt field contains a blockNode containing only an empty statement (exprstmtNode with a NULL expression). Last, after dismantling has occurred, the resulting AST is flattened to remove unnecessary nesting of blocks, and all variable declarations are moved up to the procNode level.

The first level of dismantling transforms complex control flow constructs. During this phase, all loops (whileNode, doNode, forNode), if statements (ifNode), and switch statements (switchNode) are replaced with equivalent conditiongotoNodes, gotoNodes, and labelNodes. Additionally, the ternary operator (ternaryNode) and short-circuit conditional operators (&&, ||) are transformed into equivalent ifNodes, which are subsequently transformed as mentioned above.

The final dismantling level transforms any complex expression into a simple expression or a series of simple expressions with intermediate results. A complex expression is any expression that does not conform to the guidelines of Section prin:close-to-hardware. An expression may be complex for several reasons. Obviously, if the expression contains more than one operation (binary or unary), it is complex. For assignments, one of the source operands may not be addressable by a single load instruction; conversely, the destination operand may not be addressable by a single store instruction.

Definition at line 112 of file dismantle.h.


Member Enumeration Documentation

enum Changer::Depth [inherited]
 

Enumeration values:
Subtree 
NodeOnly 

Definition at line 148 of file changer.h.

enum Changer::Order [inherited]
 

Enumeration values:
Preorder 
Postorder 
Both 

Definition at line 147 of file changer.h.


Constructor & Destructor Documentation

Dismantle::Dismantle (  int  flags  )  [private]
 


Member Function Documentation

virtual Node* Changer::at_array (  arrayNode *  the_array,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 253 of file changer.h.

References Changer::at_type().

virtual Node* Changer::at_attrib (  attribNode *  the_attrib,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 364 of file changer.h.

References Changer::at_stmt().

virtual Node* Changer::at_basicblock (  basicblockNode *  the_basicblock,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in constantFoldingChanger.

Definition at line 313 of file changer.h.

References Changer::at_block().

virtual Node* Changer::at_binary (  binaryNode *  the_binary,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in SelectionDismantle, ArrowDismantle, and ExpressionDismantle.

Definition at line 286 of file changer.h.

References Changer::at_expr().

virtual Node* Changer::at_block (  blockNode *  the_block,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in StaticToGlobalDismantle, and InitializerDismantle.

Definition at line 310 of file changer.h.

References Changer::at_stmt().

Referenced by Changer::at_basicblock().

virtual Node* Changer::at_break (  breakNode *  the_break,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in BreakContinueChanger.

Definition at line 358 of file changer.h.

References Changer::at_jump().

virtual Node* Changer::at_call (  callNode *  the_call,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in ExpressionDismantle.

Definition at line 301 of file changer.h.

References Changer::at_expr().

virtual Node* Changer::at_case (  caseNode *  the_case,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 325 of file changer.h.

References Changer::at_target().

virtual Node* Changer::at_cast (  castNode *  the_cast,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in ExpressionDismantle.

Definition at line 292 of file changer.h.

References Changer::at_expr().

virtual Node* Changer::at_comma (  commaNode *  the_comma,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in ExpressionDismantle.

Definition at line 295 of file changer.h.

References Changer::at_expr().

virtual Node* Changer::at_conditiongoto (  conditiongotoNode *  the_condgoto,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in constantPropChanger, constantFoldingChanger, and constantsChanger.

Definition at line 370 of file changer.h.

References Changer::at_goto().

virtual Node* Changer::at_const (  constNode *  the_const,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 280 of file changer.h.

References Changer::at_index().

virtual Node* Changer::at_continue (  continueNode *  the_continue,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in BreakContinueChanger.

Definition at line 355 of file changer.h.

References Changer::at_jump().

virtual Node* Changer::at_decl (  declNode *  the_decl,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in StaticToGlobalDismantle, InitializerDismantle, FlattenDismantle, and ref_clone_changer.

Definition at line 232 of file changer.h.

References Changer::at_def().

Referenced by Changer::at_subdecl().

virtual Node* Changer::at_def (  defNode *  the_def,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 229 of file changer.h.

References Changer::at_node().

Referenced by Changer::at_decl(), and Changer::at_proc().

virtual Node* Changer::at_do (  doNode *  the_do,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in LoopDismantle.

Definition at line 343 of file changer.h.

References Changer::at_loop().

virtual Node* Changer::at_enum (  enumNode *  the_enum,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 268 of file changer.h.

References Changer::at_sue().

virtual Node* Changer::at_expr (  exprNode *  the_expr,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 274 of file changer.h.

References Changer::at_node().

Referenced by Changer::at_binary(), Changer::at_call(), Changer::at_cast(), Changer::at_comma(), Changer::at_index(), Changer::at_initializer(), Changer::at_operand(), Changer::at_ternary(), and Changer::at_unary().

virtual Node* Changer::at_exprstmt (  exprstmtNode *  the_exprstmt,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in SelectionDismantle, ExpressionDismantle, and FlattenDismantle.

Definition at line 316 of file changer.h.

References Changer::at_stmt().

virtual Node* Changer::at_for (  forNode *  the_for,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in LoopDismantle.

Definition at line 346 of file changer.h.

References Changer::at_loop().

virtual Node* Changer::at_func (  funcNode *  the_func,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 256 of file changer.h.

References Changer::at_type().

virtual Node* Changer::at_goto (  gotoNode *  the_goto,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in FlattenDismantle.

Definition at line 352 of file changer.h.

References Changer::at_jump().

Referenced by Changer::at_conditiongoto().

virtual Node* Changer::at_id (  idNode *  the_id,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in UnusedDeclarationCleanupChanger, and constantsChanger.

Definition at line 283 of file changer.h.

References Changer::at_index().

virtual Node* Changer::at_if (  ifNode *  the_if,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in SelectionDismantle.

Definition at line 331 of file changer.h.

References Changer::at_selection().

virtual Node* Changer::at_index (  indexNode *  the_index,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 277 of file changer.h.

References Changer::at_expr().

Referenced by Changer::at_const(), and Changer::at_id().

virtual Node* Changer::at_initializer (  initializerNode *  the_initializer,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 304 of file changer.h.

References Changer::at_expr().

virtual Node* Changer::at_jump (  jumpNode *  the_jump,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 349 of file changer.h.

References Changer::at_stmt().

Referenced by Changer::at_break(), Changer::at_continue(), Changer::at_goto(), and Changer::at_return().

virtual Node* Changer::at_label (  labelNode *  the_label,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in LabelDismantle, FlattenDismantle, and ref_clone_changer.

Definition at line 322 of file changer.h.

References Changer::at_target().

virtual Node* Changer::at_loop (  loopNode *  the_loop,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 337 of file changer.h.

References Changer::at_stmt().

Referenced by Changer::at_do(), Changer::at_for(), and Changer::at_while().

virtual Node* Changer::at_node (  Node *  the_node,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in ref_clone_changer.

Definition at line 223 of file changer.h.

Referenced by Changer::at_def(), Changer::at_expr(), Changer::at_stmt(), Changer::at_text(), Changer::at_type(), and Changer::at_unit().

virtual Node* Changer::at_operand (  operandNode *  the_oper,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 367 of file changer.h.

References Changer::at_expr().

virtual Node* Changer::at_prim (  primNode *  the_prim,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 244 of file changer.h.

References Changer::at_type().

virtual Node* Dismantle::at_proc (  procNode *  ,
Order 
)  [virtual]
 

Reimplemented from Changer.

virtual Node* Changer::at_ptr (  ptrNode *  the_ptr,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 250 of file changer.h.

References Changer::at_type().

virtual Node* Changer::at_return (  returnNode *  the_return,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in SelectionDismantle, ReturnDismantle, FlattenDismantle, and constantPropChanger.

Definition at line 361 of file changer.h.

References Changer::at_jump().

virtual Node* Changer::at_selection (  selectionNode *  the_selection,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 328 of file changer.h.

References Changer::at_stmt().

Referenced by Changer::at_if(), and Changer::at_switch().

virtual Node* Changer::at_stmt (  stmtNode *  the_stmt,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in TernaryDismantle, and SelectionDismantle.

Definition at line 307 of file changer.h.

References Changer::at_node().

Referenced by Changer::at_attrib(), Changer::at_block(), Changer::at_exprstmt(), Changer::at_jump(), Changer::at_loop(), Changer::at_selection(), Changer::at_target(), and Changer::at_threeAddr().

virtual Node* Changer::at_struct (  structNode *  the_struct,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 262 of file changer.h.

References Changer::at_sue().

virtual Node* Changer::at_subdecl (  subdeclNode *  the_subdecl,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 235 of file changer.h.

References Changer::at_decl().

virtual Node* Changer::at_sue (  sueNode *  the_sue,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 259 of file changer.h.

References Changer::at_type().

Referenced by Changer::at_enum(), Changer::at_struct(), and Changer::at_union().

virtual Node* Changer::at_suespec (  suespecNode *  the_suespec,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 271 of file changer.h.

References Changer::at_type().

virtual Node* Changer::at_switch (  switchNode *  the_switch,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in SelectionDismantle, and ref_clone_changer.

Definition at line 334 of file changer.h.

References Changer::at_selection().

virtual Node* Changer::at_target (  targetNode *  the_target,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 319 of file changer.h.

References Changer::at_stmt().

Referenced by Changer::at_case(), and Changer::at_label().

virtual Node* Changer::at_tdef (  tdefNode *  the_tdef,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 247 of file changer.h.

References Changer::at_type().

virtual Node* Changer::at_ternary (  ternaryNode *  the_ternary,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in TernaryDismantle.

Definition at line 298 of file changer.h.

References Changer::at_expr().

virtual Node* Changer::at_text (  textNode *  the_text,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 376 of file changer.h.

References Changer::at_node().

virtual Node* Changer::at_threeAddr (  threeAddrNode *  the_3addr,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in FlattenDismantle, function_inline, constantPropChanger, constantFoldingChanger, deadCodeEliminationChanger, constantsChanger, and deadcodeChanger.

Definition at line 373 of file changer.h.

References Changer::at_stmt().

virtual Node* Changer::at_type (  typeNode *  the_type,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in TernaryDismantle, and ExpressionDismantle.

Definition at line 241 of file changer.h.

References Changer::at_node().

Referenced by Changer::at_array(), Changer::at_func(), Changer::at_prim(), Changer::at_ptr(), Changer::at_sue(), Changer::at_suespec(), and Changer::at_tdef().

virtual Node* Changer::at_unary (  unaryNode *  the_unary,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in ExpressionDismantle.

Definition at line 289 of file changer.h.

References Changer::at_expr().

virtual Node* Changer::at_union (  unionNode *  the_union,
Order  ord
)  [inline, virtual, inherited]
 

Definition at line 265 of file changer.h.

References Changer::at_sue().

virtual Node* Dismantle::at_unit (  unitNode *  ,
Order 
)  [virtual]
 

Reimplemented from Changer.

virtual Node* Changer::at_while (  whileNode *  the_while,
Order  ord
)  [inline, virtual, inherited]
 

Reimplemented in LoopDismantle.

Definition at line 340 of file changer.h.

References Changer::at_loop().

bool Changer::delete_old (   )  const [inline, inherited]
 

Return whether this Changer deletes Nodes which are removed from the AST by "at_" methods.

Definition at line 209 of file changer.h.

References Changer::_delete_old.

Referenced by change_list().

Depth Changer::depth (   )  const [inline, inherited]
 

Return which Nodes of an AST should be visited.

A value of SubTree specifies that the entire AST should be traversed. A value of NodeOnly specifies that only the root Node in the AST should be visited.

Definition at line 204 of file changer.h.

References Changer::_depth.

static void Dismantle::dismantle (  unitNode *   )  [static]
 

static void Dismantle::dismantle_control (  unitNode *   )  [static]
 

Order Changer::order (   )  const [inline, inherited]
 

Return the order in which Nodes of an AST should be visited.

Nodes can be visited before their children (Preorder), after their children (Postorder), or both (Both).

Definition at line 196 of file changer.h.

References Changer::_order.


Member Data Documentation

int Dismantle::_flags [private]
 

Definition at line 114 of file dismantle.h.

const int Dismantle::DISMANTLE_CONTROL = 1 << 0 [static]
 

Definition at line 118 of file dismantle.h.

const int Dismantle::DISMANTLE_EXPRS = 1 << 1 [static]
 

Definition at line 119 of file dismantle.h.


The documentation for this class was generated from the following file:

Generated on February 1, 2006
Back to the C-Breeze home page