tree.c (free_lang_data_in_binfo): Do not free BINFO_OFFSET and BINFO_VPTR_FIELD.
authorRichard Guenther <rguenther@suse.de>
Tue, 15 Dec 2009 16:30:22 +0000 (16:30 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 15 Dec 2009 16:30:22 +0000 (16:30 +0000)
2009-12-15  Richard Guenther  <rguenther@suse.de>

* tree.c (free_lang_data_in_binfo): Do not free BINFO_OFFSET
and BINFO_VPTR_FIELD.
(free_lang_data_in_type): Do not free TYPE_STUB_DECL if we
generate debug information.
(free_lang_data_in_decl): Do not free DECL_SIZE_UNIT,
DECL_SIZE, DECL_FIELD_OFFSET and DECL_FCONTEXT.
(free_lang_data): Do not disable debuginfo.
* lto-streamer-out.c (write_symbol_vec): Deal with
non-constant DECL_SIZE.
(pack_ts_base_value_fields): Write types with false
TREE_ASM_WRITTEN.
(lto_output_ts_type_tree_pointers): Stream TYPE_STUB_DECL.
* lto-streamer-in.c (lto_input_ts_type_tree_pointers): Stream
TYPE_STUB_DECL.
* dwarf2out.c (add_pure_or_virtual_attribute): Check for
DECL_CONTEXT.
(gen_type_die_for_member): Test for TYPE_STUB_DECL.
* opts.c (decode_options): Do not disable var-tracking for lto.
* doc/invoke.texi (-flto): Document -flto vs. -g experimental
status.
(-fwhopr): Document experimental status.

lto/
* lto.c (lto_fixup_field_decl): Fixup DECL_FIELD_OFFSET.
(lto_post_options): Do not disable debuginfo.

From-SVN: r155259

gcc/ChangeLog
gcc/doc/invoke.texi
gcc/dwarf2out.c
gcc/lto-streamer-in.c
gcc/lto-streamer-out.c
gcc/lto/ChangeLog
gcc/lto/lto-lang.c
gcc/lto/lto.c
gcc/opts.c
gcc/tree.c

index 62594155d93f28c7c36df08c765ae8136ee31537..b205823a4181a8f1253b4a16471e3cf31b0ea26a 100644 (file)
@@ -1,3 +1,27 @@
+2009-12-15  Richard Guenther  <rguenther@suse.de>
+
+       * tree.c (free_lang_data_in_binfo): Do not free BINFO_OFFSET
+       and BINFO_VPTR_FIELD.
+       (free_lang_data_in_type): Do not free TYPE_STUB_DECL if we
+       generate debug information.
+       (free_lang_data_in_decl): Do not free DECL_SIZE_UNIT,
+       DECL_SIZE, DECL_FIELD_OFFSET and DECL_FCONTEXT.
+       (free_lang_data): Do not disable debuginfo.
+       * lto-streamer-out.c (write_symbol_vec): Deal with
+       non-constant DECL_SIZE.
+       (pack_ts_base_value_fields): Write types with false
+       TREE_ASM_WRITTEN.
+       (lto_output_ts_type_tree_pointers): Stream TYPE_STUB_DECL.
+       * lto-streamer-in.c (lto_input_ts_type_tree_pointers): Stream
+       TYPE_STUB_DECL.
+       * dwarf2out.c (add_pure_or_virtual_attribute): Check for
+       DECL_CONTEXT.
+       (gen_type_die_for_member): Test for TYPE_STUB_DECL.
+       * opts.c (decode_options): Do not disable var-tracking for lto.
+       * doc/invoke.texi (-flto): Document -flto vs. -g experimental
+       status.
+       (-fwhopr): Document experimental status.
+
 2009-12-15  Aldy Hernandez  <aldyh@redhat.com>
 
        PR graphite/42185
index 3a484945182cdc2c2b3e224370ced4ee3dc3e150..b548d0c1ca1281dd8f0b13634ec995a736e56f16 100644 (file)
@@ -7321,6 +7321,10 @@ types of hosts.  The bytecode files are versioned and there is a
 strict version check, so bytecode files generated in one version of
 GCC will not work with an older/newer version of GCC.
 
+Link time optimization does not play well with generating debugging
+information.  Combining @option{-flto} or @option{-fwhopr} with
+@option{-g} is experimental.
+
 This option is disabled by default.
 
 @item -fwhopr
@@ -7337,6 +7341,8 @@ that otherwise would not fit in memory.  This option enables
 
 Disabled by default.
 
+This option is experimental.
+
 @item -fwpa
 @opindex fwpa
 This is an internal option used by GCC when compiling with
index b3aa5a5cbc1a7c9217b5592cead8b4f47d1c6996..c366ee52c8a1ba903fb159f46e0e691b7bc9b9ec 100644 (file)
@@ -16473,7 +16473,8 @@ add_pure_or_virtual_attribute (dw_die_ref die, tree func_decl)
                                   0));
 
       /* GNU extension: Record what type this method came from originally.  */
-      if (debug_info_level > DINFO_LEVEL_TERSE)
+      if (debug_info_level > DINFO_LEVEL_TERSE
+         && DECL_CONTEXT (func_decl))
        add_AT_die_ref (die, DW_AT_containing_type,
                        lookup_type_die (DECL_CONTEXT (func_decl)));
     }
@@ -17393,7 +17394,8 @@ gen_type_die_for_member (tree type, tree member, dw_die_ref context_die)
 
   /* If we're trying to avoid duplicate debug info, we may not have
      emitted the member decl for this function.  Emit it now.  */
-  if (TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type))
+  if (TYPE_STUB_DECL (type)
+      && TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type))
       && ! lookup_decl_die (member))
     {
       dw_die_ref type_die;
index ea657e1acdf3656cd7196cf33720ebe149cb0929..c390f272b086c982bfea1c5f8da539c351033e25 100644 (file)
@@ -2162,6 +2162,7 @@ lto_input_ts_type_tree_pointers (struct lto_input_block *ib,
     TYPE_BINFO (expr) = lto_input_tree (ib, data_in);
   TYPE_CONTEXT (expr) = lto_input_tree (ib, data_in);
   TYPE_CANONICAL (expr) = lto_input_tree (ib, data_in);
+  TYPE_STUB_DECL (expr) = lto_input_tree (ib, data_in);
 }
 
 
index 920cd2708650df79392cac900915a581f06a7bb1..c489e429011bf6e29c75f7e238c400d362e45d4a 100644 (file)
@@ -342,7 +342,8 @@ pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
     bp_pack_value (bp, DECL_UNSIGNED (expr), 1);
   else if (TYPE_P (expr))
     bp_pack_value (bp, TYPE_UNSIGNED (expr), 1);
-  bp_pack_value (bp, TREE_ASM_WRITTEN (expr), 1);
+  /* We write debug info two times, do not confuse the second one.  */
+  bp_pack_value (bp, TYPE_P (expr) ? 0 : TREE_ASM_WRITTEN (expr), 1);
   bp_pack_value (bp, TREE_NO_WARNING (expr), 1);
   bp_pack_value (bp, TREE_USED (expr), 1);
   bp_pack_value (bp, TREE_NOTHROW (expr), 1);
@@ -966,6 +967,7 @@ lto_output_ts_type_tree_pointers (struct output_block *ob, tree expr,
     lto_output_tree_or_ref (ob, TYPE_BINFO (expr), ref_p);
   lto_output_tree_or_ref (ob, TYPE_CONTEXT (expr), ref_p);
   lto_output_tree_or_ref (ob, TYPE_CANONICAL (expr), ref_p);
+  lto_output_tree_or_ref (ob, TYPE_STUB_DECL (expr), ref_p);
 }
 
 
@@ -2335,7 +2337,9 @@ write_symbol_vec (struct lto_streamer_cache_d *cache,
          break;
        }
 
-      if (kind == GCCPK_COMMON && DECL_SIZE (t))
+      if (kind == GCCPK_COMMON
+         && DECL_SIZE (t)
+         && TREE_CODE (DECL_SIZE (t)) == INTEGER_CST)
        size = (((uint64_t) TREE_INT_CST_HIGH (DECL_SIZE (t))) << 32)
          | TREE_INT_CST_LOW (DECL_SIZE (t));
       else
index f6760172331a0c0f261c3c2252f0982013373180..04807e300262564b5d068ef84ad5a5c00b735c27 100644 (file)
@@ -1,3 +1,8 @@
+2009-12-15  Richard Guenther  <rguenther@suse.de>
+
+       * lto.c (lto_fixup_field_decl): Fixup DECL_FIELD_OFFSET.
+       (lto_post_options): Do not disable debuginfo.
+
 2009-12-14  Dmitry Gorbachev  <d.g.gorbachev@gmail.com>
 
        * Make-lang.in ($(LTO_EXE)): Use $(LINKER).
index 4c187b5091e794c759c9f855eb81f06861df81a0..970265c2a74e4244ef99d69d3c739018412debc4 100644 (file)
@@ -646,16 +646,6 @@ lto_handle_option (size_t scode, const char *arg, int value ATTRIBUTE_UNUSED)
 static bool
 lto_post_options (const char **pfilename ATTRIBUTE_UNUSED)
 {
-  /* FIXME lto: We have stripped enough type and other
-     debugging information out of the IR that it may
-     appear ill-formed to dwarf2out, etc.  We must not
-     attempt to generate debug info in lto1.  A more
-     graceful solution would disable the option flags
-     rather than ignoring them, but we'd also have to
-     worry about default debugging options.  */
-  write_symbols = NO_DEBUG;
-  debug_info_level = DINFO_LEVEL_NONE;
-
   /* -fltrans and -fwpa are mutually exclusive.  Check for that here.  */
   if (flag_wpa && flag_ltrans)
     error ("-fwpa and -fltrans are mutually exclusive");
index c7ac7c32e1534d84a2c4f595588de5d9758d219e..e62bc02fe488e7a0cc446f4291ca1976656fea59 100644 (file)
@@ -1376,7 +1376,7 @@ static void
 lto_fixup_field_decl (tree t, void *data)
 {
   lto_fixup_decl_common (t, data);
-  gcc_assert (no_fixup_p (DECL_FIELD_OFFSET (t)));
+  LTO_FIXUP_SUBTREE (DECL_FIELD_OFFSET (t));
   LTO_FIXUP_SUBTREE (DECL_BIT_FIELD_TYPE (t));
   LTO_FIXUP_SUBTREE (DECL_QUALIFIER (t));
   gcc_assert (no_fixup_p (DECL_FIELD_BIT_OFFSET (t)));
index 7660bd894fd88a8f4d98ec3c13b2ea1a473a763c..540752769bf6a711d462b10e47c2d5d9a0d7892a 100644 (file)
@@ -1129,10 +1129,6 @@ decode_options (unsigned int argc, const char **argv)
         Otherwise, symbols will be privatized too early, causing link
         errors later.  */
       flag_whole_program = 0;
-
-      /* FIXME lto.  Disable var-tracking until debug information
-        is properly handled in free_lang_data.  */
-      flag_var_tracking = 0;
 #else
       error ("LTO support has not been enabled in this configuration");
 #endif
index 769b332e2444f3f624fa07975ddb685430c6e969..7fa7649d2f91dacf6fea319cffff41e538719a9f 100644 (file)
@@ -4152,13 +4152,10 @@ free_lang_data_in_binfo (tree binfo)
 
   gcc_assert (TREE_CODE (binfo) == TREE_BINFO);
 
-  BINFO_OFFSET (binfo) = NULL_TREE;
   BINFO_VTABLE (binfo) = NULL_TREE;
-  BINFO_VPTR_FIELD (binfo) = NULL_TREE;
   BINFO_BASE_ACCESSES (binfo) = NULL;
   BINFO_INHERITANCE_CHAIN (binfo) = NULL_TREE;
   BINFO_SUBVTT_INDEX (binfo) = NULL_TREE;
-  BINFO_VPTR_FIELD (binfo) = NULL_TREE;
 
   for (i = 0; VEC_iterate (tree, BINFO_BASE_BINFOS (binfo), i, t); i++)
     free_lang_data_in_binfo (t);
@@ -4253,7 +4250,8 @@ free_lang_data_in_type (tree type)
     }
 
   TYPE_CONTEXT (type) = NULL_TREE;
-  TYPE_STUB_DECL (type) = NULL_TREE;
+  if (debug_info_level < DINFO_LEVEL_TERSE)
+    TYPE_STUB_DECL (type) = NULL_TREE;
 }
 
 
@@ -4380,29 +4378,16 @@ free_lang_data_in_decl (tree decl)
        }
    }
 
-  if (TREE_CODE (decl) == PARM_DECL
-      || TREE_CODE (decl) == FIELD_DECL
-      || TREE_CODE (decl) == RESULT_DECL)
-    {
-      tree unit_size = DECL_SIZE_UNIT (decl);
-      tree size = DECL_SIZE (decl);
-      if ((unit_size && TREE_CODE (unit_size) != INTEGER_CST)
-         || (size && TREE_CODE (size) != INTEGER_CST))
-       {
-         DECL_SIZE_UNIT (decl) = NULL_TREE;
-         DECL_SIZE (decl) = NULL_TREE;
-       }
+ /* ???  We could free non-constant DECL_SIZE, DECL_SIZE_UNIT
+    and DECL_FIELD_OFFSET.  But it's cheap enough to not do
+    that and refrain from adding workarounds to dwarf2out.c  */
 
-      if (TREE_CODE (decl) == FIELD_DECL
-         && DECL_FIELD_OFFSET (decl)
-         && TREE_CODE (DECL_FIELD_OFFSET (decl)) != INTEGER_CST)
-       DECL_FIELD_OFFSET (decl) = NULL_TREE;
+ /* DECL_FCONTEXT is only used for debug info generation.  */
+ if (TREE_CODE (decl) == FIELD_DECL
+     && debug_info_level < DINFO_LEVEL_TERSE)
+   DECL_FCONTEXT (decl) = NULL_TREE;
 
-      /* DECL_FCONTEXT is only used for debug info generation.  */
-      if (TREE_CODE (decl) == FIELD_DECL)
-       DECL_FCONTEXT (decl) = NULL_TREE;
-    }
-  else if (TREE_CODE (decl) == FUNCTION_DECL)
+ if (TREE_CODE (decl) == FUNCTION_DECL)
     {
       if (gimple_has_body_p (decl))
        {
@@ -4977,13 +4962,6 @@ free_lang_data (void)
   diagnostic_finalizer (global_dc) = default_diagnostic_finalizer;
   diagnostic_format_decoder (global_dc) = default_tree_printer;
 
-  /* FIXME. We remove sufficient language data that the debug
-     info writer gets completely confused.  Disable debug information
-     for now.  */
-  debug_info_level = DINFO_LEVEL_NONE;
-  write_symbols = NO_DEBUG;
-  debug_hooks = &do_nothing_debug_hooks;
-
   return 0;
 }