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