The following fixes profiledbootstrap with LTO for Ada where we end up with references to later optimized out decls in the early debug parts.
The fix is to avoid running into /* Try harder to get a rtl. If this symbol ends up not being emitted in the current CU, resolve_addr will remove the expression referencing it. */ if (rtl == NULL_RTX ... rtl = make_decl_rtl_for_debug (decl); in rtl_for_decl_location as the comment already says the symbol can end up not being emitted which is fatal for early debug. For now this is conditionalized on LTO emission. This should then trigger the use of DW_OP_GNU_variable_value but for the Ada ACATS testcase I was looking at to debug the issue (c330001, resp. c330001_0-c330001_1.ads) this doesn't work because the constraints are not met (we're in global context and the upper bound decl is global as well). Jakub, do you remember a reason for having any constraints here? I've reworked the constraints to allow the globals (eventually using decl_function_context on this may also allow other not-quite-local cases? But it already allowed local statics). Maybe we can simply drop the restriction alltogether? Bootstrap and regtest running on x86_64-unknown-linux-gnu, profiledbootstrap with LTO on x86_64-unknown-linux-gnu. Eric, can you generate a gnat.dg LTO testcase from (reduced) c330001? OK for trunk? Thanks, Richard. 2018-03-22 Richard Biener <rguent...@suse.de> PR debug/85020 * dwarf2out.c (loc_list_from_tree_1): Relax restriction on what decls we refer to via DW_OP_GNU_variable_value, respective allow globals from global context. (rtl_for_decl_location): Do not generate RTL early when we are going to emit early debug for LTO. Index: gcc/dwarf2out.c =================================================================== --- gcc/dwarf2out.c (revision 258720) +++ gcc/dwarf2out.c (working copy) @@ -18204,14 +18204,15 @@ loc_list_from_tree_1 (tree loc, int want rtl = rtl_for_decl_location (loc); if (rtl == NULL_RTX) { + tree fn_ctx; if (TREE_CODE (loc) != FUNCTION_DECL && early_dwarf - && current_function_decl && want_address != 1 && ! DECL_IGNORED_P (loc) && (INTEGRAL_TYPE_P (TREE_TYPE (loc)) || POINTER_TYPE_P (TREE_TYPE (loc))) - && DECL_CONTEXT (loc) == current_function_decl + && (!(fn_ctx = decl_function_context (loc)) + || fn_ctx == current_function_decl) && (GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (TREE_TYPE (loc))) <= DWARF2_ADDR_SIZE)) { @@ -19878,6 +19879,7 @@ rtl_for_decl_location (tree decl) in the current CU, resolve_addr will remove the expression referencing it. */ if (rtl == NULL_RTX + && !(early_dwarf && (flag_generate_lto || flag_generate_offload)) && VAR_P (decl) && !DECL_EXTERNAL (decl) && TREE_STATIC (decl)