[Bug bootstrap/85020] [8 Regression] gcc fails to bootstrap with profiledbootstrap and --with-build-config=bootstrap-lto

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Mar 22 12:02:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85020

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
So the following is a better fix, the comment already explains how this is
wrong to do early.

Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c     (revision 258720)
+++ gcc/dwarf2out.c     (working copy)
@@ -19878,6 +19878,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
       && VAR_P (decl)
       && !DECL_EXTERNAL (decl)
       && TREE_STATIC (decl)

note for the specific case in the testcase this ends up without a location
because the context of the "location" is the TU (and current_function_decl
is NULL) so we fail

        rtl = rtl_for_decl_location (loc);
        if (rtl == NULL_RTX)
          {
            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
                && (GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (TREE_TYPE (loc)))
                    <= DWARF2_ADDR_SIZE))
              {

I guess the intent of the check was

    (!decl_function_context (loc)
     || decl_function_context (loc) == current_function_decl)

so with additionally having

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))
              {

I get a location for this.

At this point it's probably better to instead guard with
!(early_dwarf && (flag_generate_lto || flag_generate_offload))
to not risk debug degradation for others.  The 2nd change is optional
(preserve some debug), not sure if we should do that right now.


More information about the Gcc-bugs mailing list