On Tue, 2009-06-16 at 14:43 +0200, Richard Guenther wrote:
> BIND_EXPRs are containers for local variables in the GENERIC
> function body (they persist until GIMPLE is lowered).  BLOCKs
> represent the scope tree of the function (which also refers to
> local variables).  The BLOCK tree is kept live throughout the
> compilation and is used to generate proper debug information
> for example.

So let me see if I understand with an example from C.  If we have the
following C function:

void foo() {
  int a;
  { int b; }
  { int c; }
}


then starting with FUNCTION_DECL, we should have pseudocode for the
GENERIC something like the following?


tree foo = FUNCTION_DECL

tree int_a = VAR_DECL
tree int_b = VAR_DECL
tree int_c = VAR_DECL

tree scope_b = BIND_EXPR
BIND_EXPR_VARS(scope_b) = int_b
BIND_EXPR_BODY(scope_b) = int_b

tree scope_c = BIND_EXPR
BIND_EXPR_VARS(scope_c) = int_b
BIND_EXPR_BODY(scope_c) = int_b

tree foo_body = STATEMENT_LIST
// I know this is actually a tree-iterator
foo_body = { int_a, scope_b, scope_c }

tree scope_foo = BIND_EXPR
BIND_EXPR_VARS(scope_foo) = int_a
BIND_EXPR_BODY(scope_foo) = foo_body

DECL_SAVED_FUNCTION(foo) = scope_foo

tree block_foo = BLOCK
tree block_b = BLOCK
tree block_c = BLOCK

BLOCK_VARS(block_b) = int_b
BLOCK_SUPERCONTEXT(block_b) = block_foo
BLOCK_CHAIN(block_b) = block_c

BLOCK_VARS(block_c) = int_c
BLOCK_SUPERCONTEXT(block_c) = block_foo
BLOCK_CHAIN(block_c) = null

BLOCK_VARS(block_foo) = int_a
BLOCK_SUPERCONTEXT(block_foo) = foo
BLOCK_CHAIN(block_foo) = null
BLOCK_SUBBLOCKS(block_foo) = block_b, block_c


DECL_INITIAL(foo) = block_foo




Thanks for taking the time to clarify things for me,
Jerry








Reply via email to