Exemple #1
0
static void
finish_cdtor (tree body)
{
  tree scope;
  tree block;

  scope = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
  block = poplevel (0, 0, 0);
  SCOPE_STMT_BLOCK (TREE_PURPOSE (scope)) = block;
  SCOPE_STMT_BLOCK (TREE_VALUE (scope)) = block;

  RECHAIN_STMTS (body, COMPOUND_BODY (body));

  finish_function ();
}
Exemple #2
0
void
genrtl_scope_stmt (tree t)
{
    tree block = SCOPE_STMT_BLOCK (t);

    if (!SCOPE_NO_CLEANUPS_P (t))
    {
        if (SCOPE_BEGIN_P (t))
            expand_start_bindings_and_block (2 * SCOPE_NULLIFIED_P (t), block);
        else if (SCOPE_END_P (t))
            expand_end_bindings (NULL_TREE, !SCOPE_NULLIFIED_P (t), 0);
    }
    else if (!SCOPE_NULLIFIED_P (t))
    {
        rtx note = emit_note (SCOPE_BEGIN_P (t)
                              ? NOTE_INSN_BLOCK_BEG : NOTE_INSN_BLOCK_END);
        NOTE_BLOCK (note) = block;
    }

    /* If we're at the end of a scope that contains inlined nested
       functions, we have to decide whether or not to write them out.  */
    if (block && SCOPE_END_P (t))
    {
        tree fn;

        for (fn = BLOCK_VARS (block); fn; fn = TREE_CHAIN (fn))
        {
            if (TREE_CODE (fn) == FUNCTION_DECL
                    && DECL_CONTEXT (fn) == current_function_decl
                    && DECL_SAVED_INSNS (fn)
                    && DECL_SAVED_INSNS (fn)->saved_for_inline
                    && !TREE_ASM_WRITTEN (fn)
                    && TREE_ADDRESSABLE (fn))
            {
                push_function_context ();
                output_inline_function (fn);
                pop_function_context ();
            }
        }
    }
}