From d84b344a6c22cb816af1f204ff782b9f2e5166b5 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 20 Sep 2008 08:41:55 +0000 Subject: [PATCH] re PR ada/37585 (undefined references at -O for ACATS c650001) PR ada/37585 * gcc-interface/utils.c (create_subprog_decl): Disable inlining for inlined external functions if they contain a nested function not declared inline. From-SVN: r140511 --- gcc/ada/ChangeLog | 7 +++++++ gcc/ada/gcc-interface/utils.c | 18 ++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 5d6ecc8..186a594 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2008-09-20 Eric Botcazou + + PR ada/37585 + * gcc-interface/utils.c (create_subprog_decl): Disable inlining for + inlined external functions if they contain a nested function not + declared inline. + 2008-09-18 Jan Hubicka * gcc-interface/utils.c (create_subprog_decl): Use DECL_DECLARED_INLINE_P. diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 608f6ec..7f1bc7b 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -1973,12 +1973,16 @@ create_subprog_decl (tree subprog_name, tree asm_name, tree return_type = TREE_TYPE (subprog_type); tree subprog_decl = build_decl (FUNCTION_DECL, subprog_name, subprog_type); - /* If this is a function nested inside an inlined external function, it - means we aren't going to compile the outer function unless it is - actually inlined, so do the same for us. */ - if (current_function_decl && DECL_DECLARED_INLINE_P (current_function_decl) + /* If this is a non-inline function nested inside an inlined external + function, we cannot honor both requests without cloning the nested + function in the current unit since it is private to the other unit. + We could inline the nested function as well but it's probably better + to err on the side of too little inlining. */ + if (!inline_flag + && current_function_decl + && DECL_DECLARED_INLINE_P (current_function_decl) && DECL_EXTERNAL (current_function_decl)) - extern_flag = true; + DECL_DECLARED_INLINE_P (current_function_decl) = 0; DECL_EXTERNAL (subprog_decl) = extern_flag; TREE_PUBLIC (subprog_decl) = public_flag; @@ -1986,6 +1990,7 @@ create_subprog_decl (tree subprog_name, tree asm_name, TREE_READONLY (subprog_decl) = TYPE_READONLY (subprog_type); TREE_THIS_VOLATILE (subprog_decl) = TYPE_VOLATILE (subprog_type); TREE_SIDE_EFFECTS (subprog_decl) = TYPE_VOLATILE (subprog_type); + DECL_DECLARED_INLINE_P (subprog_decl) = inline_flag; DECL_ARGUMENTS (subprog_decl) = param_decl_list; DECL_RESULT (subprog_decl) = build_decl (RESULT_DECL, 0, return_type); DECL_ARTIFICIAL (DECL_RESULT (subprog_decl)) = 1; @@ -2004,9 +2009,6 @@ create_subprog_decl (tree subprog_name, tree asm_name, DECL_BY_REFERENCE (result_decl) = 1; } - if (inline_flag) - DECL_DECLARED_INLINE_P (subprog_decl) = 1; - if (asm_name) { SET_DECL_ASSEMBLER_NAME (subprog_decl, asm_name); -- 2.7.4