On 03/02/2012 03:29 PM, Eric Botcazou wrote:
I notice that D.7 seems to suggest that if the nested function is not
inlinable and shared between all instances of the containing function
that we put a normal (non-abstract/concrete) instance of the nested
function inside the abstract function for the containing function. But
I agree that it's cleaner your way: put an abstract instance there
instead so that the abstract instance of the containing function is all
abstract.
+ /* Emit an abstract instance of nested functions within an abstract instance
+ of their parent. */
+ int declaration = ((decl != current_function_decl
+ && !(DECL_INITIAL (decl) != NULL_TREE
+ && DECL_ABSTRACT (decl)
+ && current_function_decl
+ && DECL_ABSTRACT (current_function_decl)))
|| class_or_namespace_scope_p (context_die));
Hmm, why isn't current_function_decl == decl when we're trying to emit
the abstract instance of a nested function?
+ /* Do not emit concrete instances of abstracted nested functions without
+ actual instances. */
+ else if (TREE_CODE (decl_or_origin) == FUNCTION_DECL
+ && die
+ && get_AT (die, DW_AT_inline))
+ ;
Should "without actual instances" be something like "within concrete
instances of containing functions"?
- if (origin && origin->die_parent)
+ if (origin
+ && origin->die_parent
+ /* Skip an abtract parent instance. */
+ && !(origin->die_parent->die_tag == DW_TAG_subprogram
+ && get_AT (origin->die_parent, DW_AT_inline)))
add_child_die (origin->die_parent, die);
What if the immediate parent is a DW_TAG_lexical_block or some other
thing nested inside an abstract subprogram?
and you suggested to iterate over DECL_CONTEXT instead of die_parent to find an
appropriate parent in order to attach the DIE on the limbo list to.
In my earlier comments I seem to have been wrong about the behavior of
gen_subprogram_die; now I see that if there is an abstract instance the
concrete out-of-line instance is not associated with the decl number.
So I guess your earlier limbo handling code was fine apart from the
lexical_block issue above.
Jason