GENERIC
Kai
• The purpose of GENERIC is simply to provide a
language-independent way of representing an
entire function in trees.
• A statement is defined as any expression whose
value is ignored.
• A statement will always have TREE_SIDE_EFFECTS
set
• You can tell what kind of node a particular tree is
by using the TREE_CODE macro.
• All GENERIC trees have two fields in common.
• TREE_CHAIN
• a pointer be used as a singly-linked list
• TREE_TYPE
code & flags
tree type
tree chain
struct tree_base
struct tree_typed
struct tree_common
typedef union tree_node *tree
typedef const union tree_node *const_tree
union tree_node
IDENTIFIER_NODE
• There are never two distinct IDENTIFIER_NODEs
representing the same identifier.
• IDENTIFIER_POINTER
• IDENTIFIER_LENGTH
Container
• Two kinds of container
• TREE_LIST
• TREE_PURPOSE
• TREE_VALUE
• The next node is found by following the TREE_CHAIN
• TREE_VEC
• TREE_VEC_LENGTH
• TREE_VEC_ELT
code & flags
tree type
tree chain
struct tree_base
struct tree_typed
struct tree_common
tree_list
purposetree
valuetree
code & flags
tree type
tree chain
purpose
value
tree_list
NULL_TREE
code & flags
tree type
tree chain
struct tree_base
struct tree_typed
struct tree_common
tree_vec
a[1]tree
TYPE
• INTEGER_TYPE
• REAL_TYPE
• FIXED_POINT_TYPE
• COMPLEX_TYPE
• ENUMERAL_TYPE
• BOOLEAN_TYPE
• POINTER_TYPE
• REFERENCE_TYPE
• FUNCTION_TYPE
• METHOD_TYPE
• ARRAY_TYPE
• RECORD_TYPE
• UNION_TYPE
• QUAL_UNION_TYPE
• LANG_TYPE
• OFFSET_TYPE
Declarations
• LABEL_DECL
• CONST_DECL
• enumeration constants
• RESULT_DECL
• the value returned by a function
• TYPE_DECL
• typedef declarations
• VAR_DECL
• variables with namespace or block scope
• static data members
• PARM_DECL
• a parameter to a function
• DEBUG_EXPR_DECL
• FIELD_DECL
• non-static data members
• NAMESPACE_DECL
VAR_DECL
• DECL_SIZE
• DECL_ALIGN
• DECL_THIS_STATIC
• static variable
• DECL_THIS_EXTERN
• extern variable
• DECL_INITIAL
• an expression for the initialiser
PARM_DECL
• DECL_ARGUMENTS
• DECL_ARG_TYPE
• the type that will actually be used when a value is
passed to this function
Attributes
• TREE_LIST
• TREE_PURPOSE
• the name of the attribute
• TREE_VALUE
• TREE_LIST of the arguments of the attribute
• TREE_CHAIN
• next attribute
• DECL_ATTRIBUTES (tree decl)
• DECL_ATTRIBUTES (tree type)
Statements
• ASM_EXPR
• inline assembly
• DECL_EXPR
• a local declaration
• LABEL_EXPR
• GOTO_EXPR
• goto statement
• RETURN_EXPR
• return statement
• LOOP_EXPR
• infinite loop
• EXIT_EXPR
• conditional exit from the nearest LOOP_EXPR
• SWITCH_EXPR
• switch statement
• CASE_LABEL_EXPR
• a case label
Blocks
• BIND_EXPR
• BIND_EXPR_VARS
• variables in a block
Statement Sequences
• STATEMENT_LIST
FUNCTION_DECL
BIND_EXPR
saved_tree
gimplify_stmt
int test_gimple(int param_a, char param_b, float param_c)
{
int local;
local = param_a + param_b;
local = (int)((float)local * param_c);
return local;
}
locus
VOID_TYPE
type
VAR_DECL
operands[0]
INTEGER_TYPE
type
BLOCK
operands[2]
STATEMENT_LIST
operands[1]
DECL_EXPR
head
VAR_DECL
operands[0]
INTEGER_TYPE
type
MODIFY_EXPR
VAR_DECL PLUS_EXPR
operands[0] operands[1]
INTEGER_TYPE
type
NOP_EXPR PARM_DECL
operands[0] operands[1]
PARM_DECL
operands[0]
Functions
• A function is represented by a FUNCTION_DECL node.
• DECL_NAME
• DECL_ASSEMBLER_NAME
• DECL_ARGUMENTS
• PARM_DECL for the first argument
• Subsequent PARM_DECL nodes can be obtained by following the TREE_CHAIN links.
• DECL_RESULT
• RESULT_DECL
• DECL_SAVED_TREE
• the complete body of the function
• TREE_TYPE
• FUNCTION_TYPE
• METHOD_TYPE
FUNCTION_DECL
FUNCTION_TYPE
PARM_DECL RESULT_DECL
INTEGER_TYPEPARM_DECL
PARM_DECL
type
type arguments result
chain
chain
vec<tree> fnargs
INTEGER_TYPE
initial
gimplify_parameters
INTEGER_TYPE
size_unit
REAL_TYPE
type
REAL_TYPE
initial
int test_gimple(int param_a, char param_b, float param_c)
{
int local;
local = param_a + param_b;
local = (int)((float)local * param_c);
return local;
}

GCC GENERIC

  • 1.
  • 2.
    • The purposeof GENERIC is simply to provide a language-independent way of representing an entire function in trees. • A statement is defined as any expression whose value is ignored. • A statement will always have TREE_SIDE_EFFECTS set
  • 3.
    • You cantell what kind of node a particular tree is by using the TREE_CODE macro. • All GENERIC trees have two fields in common. • TREE_CHAIN • a pointer be used as a singly-linked list • TREE_TYPE
  • 4.
    code & flags treetype tree chain struct tree_base struct tree_typed struct tree_common typedef union tree_node *tree typedef const union tree_node *const_tree union tree_node
  • 5.
    IDENTIFIER_NODE • There arenever two distinct IDENTIFIER_NODEs representing the same identifier. • IDENTIFIER_POINTER • IDENTIFIER_LENGTH
  • 6.
    Container • Two kindsof container • TREE_LIST • TREE_PURPOSE • TREE_VALUE • The next node is found by following the TREE_CHAIN • TREE_VEC • TREE_VEC_LENGTH • TREE_VEC_ELT
  • 7.
    code & flags treetype tree chain struct tree_base struct tree_typed struct tree_common tree_list purposetree valuetree code & flags tree type tree chain purpose value tree_list NULL_TREE
  • 8.
    code & flags treetype tree chain struct tree_base struct tree_typed struct tree_common tree_vec a[1]tree
  • 9.
    TYPE • INTEGER_TYPE • REAL_TYPE •FIXED_POINT_TYPE • COMPLEX_TYPE • ENUMERAL_TYPE • BOOLEAN_TYPE • POINTER_TYPE • REFERENCE_TYPE • FUNCTION_TYPE • METHOD_TYPE • ARRAY_TYPE • RECORD_TYPE • UNION_TYPE • QUAL_UNION_TYPE • LANG_TYPE • OFFSET_TYPE
  • 10.
    Declarations • LABEL_DECL • CONST_DECL •enumeration constants • RESULT_DECL • the value returned by a function • TYPE_DECL • typedef declarations • VAR_DECL • variables with namespace or block scope • static data members • PARM_DECL • a parameter to a function • DEBUG_EXPR_DECL • FIELD_DECL • non-static data members • NAMESPACE_DECL
  • 11.
    VAR_DECL • DECL_SIZE • DECL_ALIGN •DECL_THIS_STATIC • static variable • DECL_THIS_EXTERN • extern variable • DECL_INITIAL • an expression for the initialiser
  • 12.
    PARM_DECL • DECL_ARGUMENTS • DECL_ARG_TYPE •the type that will actually be used when a value is passed to this function
  • 13.
    Attributes • TREE_LIST • TREE_PURPOSE •the name of the attribute • TREE_VALUE • TREE_LIST of the arguments of the attribute • TREE_CHAIN • next attribute • DECL_ATTRIBUTES (tree decl) • DECL_ATTRIBUTES (tree type)
  • 14.
    Statements • ASM_EXPR • inlineassembly • DECL_EXPR • a local declaration • LABEL_EXPR • GOTO_EXPR • goto statement • RETURN_EXPR • return statement • LOOP_EXPR • infinite loop • EXIT_EXPR • conditional exit from the nearest LOOP_EXPR • SWITCH_EXPR • switch statement • CASE_LABEL_EXPR • a case label
  • 15.
  • 16.
  • 17.
    FUNCTION_DECL BIND_EXPR saved_tree gimplify_stmt int test_gimple(int param_a,char param_b, float param_c) { int local; local = param_a + param_b; local = (int)((float)local * param_c); return local; } locus VOID_TYPE type VAR_DECL operands[0] INTEGER_TYPE type BLOCK operands[2] STATEMENT_LIST operands[1] DECL_EXPR head VAR_DECL operands[0] INTEGER_TYPE type MODIFY_EXPR VAR_DECL PLUS_EXPR operands[0] operands[1] INTEGER_TYPE type NOP_EXPR PARM_DECL operands[0] operands[1] PARM_DECL operands[0]
  • 18.
    Functions • A functionis represented by a FUNCTION_DECL node. • DECL_NAME • DECL_ASSEMBLER_NAME • DECL_ARGUMENTS • PARM_DECL for the first argument • Subsequent PARM_DECL nodes can be obtained by following the TREE_CHAIN links. • DECL_RESULT • RESULT_DECL • DECL_SAVED_TREE • the complete body of the function • TREE_TYPE • FUNCTION_TYPE • METHOD_TYPE
  • 19.
    FUNCTION_DECL FUNCTION_TYPE PARM_DECL RESULT_DECL INTEGER_TYPEPARM_DECL PARM_DECL type type argumentsresult chain chain vec<tree> fnargs INTEGER_TYPE initial gimplify_parameters INTEGER_TYPE size_unit REAL_TYPE type REAL_TYPE initial int test_gimple(int param_a, char param_b, float param_c) { int local; local = param_a + param_b; local = (int)((float)local * param_c); return local; }