void pushlevel (void) { struct binding_level *newlevel = ggc_alloc_binding_level (); *newlevel = clear_binding_level; /* Add this level to the front of the chain (stack) of levels that are active. */ newlevel->level_chain = current_binding_level; current_binding_level = newlevel; }
static void push_binding (enum binding_kind kind) { struct binding_level *res; /* Get a binding level (old ones are recycled). */ if (old_binding_levels == NULL) res = ggc_alloc_binding_level (); else { res = old_binding_levels; old_binding_levels = res->prev; } /* Init. */ res->first_decl = NULL_TREE; res->last_decl = NULL_TREE; res->first_block = NULL_TREE; res->last_block = NULL_TREE; res->save_stack = 0; switch (kind) { case GLOBAL_BINDING: res->bind = NULL_TREE; res->block = NULL_TREE; res->prev = NULL; res->prev_stmts = NULL; break; case FUNCTION_BINDING: case LOCAL_BINDING: res->block = make_node (BLOCK); TREE_USED (res->block) = true; res->bind = build3 (BIND_EXPR, void_type_node, NULL_TREE, NULL_TREE, res->block); TREE_SIDE_EFFECTS (res->bind) = true; res->prev_stmts = cur_stmts; cur_stmts = alloc_stmt_list (); break; } switch (kind) { case GLOBAL_BINDING: /* No supercontext for the global binding. */ break; case FUNCTION_BINDING: /* No containing block. */ BLOCK_SUPERCONTEXT (res->block) = current_function_decl; break; case LOCAL_BINDING: /* Append the block created. */ if (cur_binding_level->first_block == NULL) cur_binding_level->first_block = res->block; else BLOCK_CHAIN (cur_binding_level->last_block) = res->block; cur_binding_level->last_block = res->block; BLOCK_SUPERCONTEXT (res->block) = cur_binding_level->block; break; } /* Chain previous binding, set current binding. */ res->prev = cur_binding_level; cur_binding_level = res; }