public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [patch 3/10] debug-early merge: C++ front-end
@ 2015-05-08  0:34 Aldy Hernandez
  2015-05-08 11:57 ` Richard Biener
  0 siblings, 1 reply; 9+ messages in thread
From: Aldy Hernandez @ 2015-05-08  0:34 UTC (permalink / raw)
  To: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 0 bytes --]



[-- Attachment #2: dearly-cxx.patch --]
[-- Type: text/x-patch, Size: 17837 bytes --]

gcc/cp/

	* cp-objcp-common.c: Adjust comment for
	cxx_warn_unused_global_decl.
	* cp-objcp-common.h (LANG_HOOKS_WRITE_GLOBALS): Remove
	(LANG_HOOKS_POST_COMPILATION_PARSING_CLEANUPS): New.
	* cp-tree.h (note_mangling_alias): Protoize.
	(cp_write_global_declarations): Remove.
	(cxx_post_compilation_parsing_cleanups): Protoize.
	* decl.c (wrapup_globals_for_namespace): Remove use of DATA
	argument.
	* decl2.c (mangling_aliases): New global.
	(build_java_method_aliases): New.  Adapted from
	collect_candidates_for_java_method_aliases.
	(collect_candidates_for_java_method_aliases): Remove.
	(build_java_method_aliases): Remove.
	(generate_mangling_aliases): New.
	(note_mangling_alias): New.  Moved from mangle_decl.
	(locus_at_end_of_parsing): New global.
	(c_parse_final_cleanups): Rename from
	cp_write_global_declarations.
	Use locus_at_end_of_parsing.
	Call generate_mangling_aliases.
	Rename call to collect_candidates_for_java_method_aliases into
	build_java_method_aliases.
	Remove call to finalize_compilation_unit.
	Move vtable handling into cxx_post_compilation_parsing_cleanups.
	Do not call check_global_declarations or
	emit_debug_global_declarations.
	(cxx_post_compilation_parsing_cleanups): New.
	* mangle.c (mangle_decl): Move code to note_mangling_alias.
	* name-lookup.c (do_namespace_alias): Call early_global_decl.

diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c
index dd8e7c5..40b13ef 100644
--- a/gcc/cp/cp-objcp-common.c
+++ b/gcc/cp/cp-objcp-common.c
@@ -60,7 +60,7 @@ cxx_get_alias_set (tree t)
   return c_common_get_alias_set (t);
 }
 
-/* Called from check_global_declarations.  */
+/* Called from check_global_declaration.  */
 
 bool
 cxx_warn_unused_global_decl (const_tree decl)
diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h
index 8a36e7f..c8572a7 100644
--- a/gcc/cp/cp-objcp-common.h
+++ b/gcc/cp/cp-objcp-common.h
@@ -84,8 +84,8 @@ extern void cp_common_init_ts (void);
 #define LANG_HOOKS_PRINT_ERROR_FUNCTION	cxx_print_error_function
 #undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL
 #define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL cxx_warn_unused_global_decl
-#undef LANG_HOOKS_WRITE_GLOBALS
-#define LANG_HOOKS_WRITE_GLOBALS cp_write_global_declarations
+#undef LANG_HOOKS_POST_COMPILATION_PARSING_CLEANUPS
+#define LANG_HOOKS_POST_COMPILATION_PARSING_CLEANUPS cxx_post_compilation_parsing_cleanups
 #undef  LANG_HOOKS_BUILTIN_FUNCTION
 #define LANG_HOOKS_BUILTIN_FUNCTION cxx_builtin_function
 #undef  LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index e0fbf5e..1998992 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -5447,6 +5447,7 @@ extern tree finish_case_label			(location_t, tree, tree);
 extern tree cxx_maybe_build_cleanup		(tree, tsubst_flags_t);
 
 /* in decl2.c */
+extern void note_mangling_alias			(tree, tree);
 extern bool check_java_method			(tree);
 extern tree build_memfn_type			(tree, tree, cp_cv_quals, cp_ref_qualifier);
 extern tree build_pointer_ptrmemfn_type	(tree);
@@ -5468,7 +5469,7 @@ extern tree cp_reconstruct_complex_type		(tree, tree);
 extern bool attributes_naming_typedef_ok	(tree);
 extern void cplus_decl_attributes		(tree *, tree, int);
 extern void finish_anon_union			(tree);
-extern void cp_write_global_declarations	(void);
+extern void cxx_post_compilation_parsing_cleanups (void);
 extern tree coerce_new_type			(tree);
 extern tree coerce_delete_type			(tree);
 extern void comdat_linkage			(tree);
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 6ec1579..dedf995 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -892,30 +892,19 @@ walk_namespaces (walk_namespaces_fn f, void* data)
   return walk_namespaces_r (global_namespace, f, data);
 }
 
-/* Call wrapup_globals_declarations for the globals in NAMESPACE.  If
-   DATA is non-NULL, this is the last time we will call
-   wrapup_global_declarations for this NAMESPACE.  */
+/* Call wrapup_globals_declarations for the globals in NAMESPACE.  */
 
 int
-wrapup_globals_for_namespace (tree name_space, void* data)
+wrapup_globals_for_namespace (tree name_space, void* data ATTRIBUTE_UNUSED)
 {
   cp_binding_level *level = NAMESPACE_LEVEL (name_space);
   vec<tree, va_gc> *statics = level->static_decls;
   tree *vec = statics->address ();
   int len = statics->length ();
-  int last_time = (data != 0);
-
-  if (last_time)
-    {
-      check_global_declarations (vec, len);
-      emit_debug_global_declarations (vec, len);
-      return 0;
-    }
 
   /* Write out any globals that need to be output.  */
   return wrapup_global_declarations (vec, len);
 }
-
 \f
 /* In C++, you don't have to write `struct S' to refer to `S'; you
    can just use `S'.  We accomplish this by creating a TYPE_DECL as
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index b2251d8..737db8c 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -118,6 +118,10 @@ static GTY(()) vec<tree, va_gc> *deferred_fns;
    sure are defined.  */
 static GTY(()) vec<tree, va_gc> *no_linkage_decls;
 
+/* A vector of alternating decls and identifiers, where the latter
+   is to be an alias for the former if the former is defined.  */
+static GTY(()) vec<tree, va_gc> *mangling_aliases;
+
 /* Nonzero if we're done parsing and into end-of-file activities.  */
 
 int at_eof;
@@ -3987,20 +3991,17 @@ generate_ctor_and_dtor_functions_for_priority (splay_tree_node n, void * data)
 }
 
 /* Java requires that we be able to reference a local address for a
-   method, and not be confused by PLT entries.  If hidden aliases are
-   supported, collect and return all the functions for which we should
-   emit a hidden alias.  */
+   method, and not be confused by PLT entries.  If supported, create a
+   hidden alias for all such methods.  */
 
-static hash_set<tree> *
-collect_candidates_for_java_method_aliases (void)
+static void
+build_java_method_aliases (void)
 {
-  struct cgraph_node *node;
-  hash_set<tree> *candidates = NULL;
-
 #ifndef HAVE_GAS_HIDDEN
-  return candidates;
+  return;
 #endif
 
+  struct cgraph_node *node;
   FOR_EACH_FUNCTION (node)
     {
       tree fndecl = node->decl;
@@ -4009,55 +4010,18 @@ collect_candidates_for_java_method_aliases (void)
 	  && TYPE_FOR_JAVA (DECL_CONTEXT (fndecl))
 	  && TARGET_USE_LOCAL_THUNK_ALIAS_P (fndecl))
 	{
-	  if (candidates == NULL)
-	    candidates = new hash_set<tree>;
-	  candidates->add (fndecl);
-	}
-    }
-
-  return candidates;
-}
-
-
-/* Java requires that we be able to reference a local address for a
-   method, and not be confused by PLT entries.  If hidden aliases are
-   supported, emit one for each java function that we've emitted.
-   CANDIDATES is the set of FUNCTION_DECLs that were gathered
-   by collect_candidates_for_java_method_aliases.  */
-
-static void
-build_java_method_aliases (hash_set<tree> *candidates)
-{
-  struct cgraph_node *node;
-
-#ifndef HAVE_GAS_HIDDEN
-  return;
-#endif
-
-  FOR_EACH_FUNCTION (node)
-    {
-      tree fndecl = node->decl;
-
-      if (TREE_ASM_WRITTEN (fndecl)
-	  && candidates->contains (fndecl))
-	{
 	  /* Mangle the name in a predictable way; we need to reference
 	     this from a java compiled object file.  */
-	  tree oid, nid, alias;
-	  const char *oname;
-	  char *nname;
-
-	  oid = DECL_ASSEMBLER_NAME (fndecl);
-	  oname = IDENTIFIER_POINTER (oid);
+	  tree oid = DECL_ASSEMBLER_NAME (fndecl);
+	  const char *oname = IDENTIFIER_POINTER (oid);
 	  gcc_assert (oname[0] == '_' && oname[1] == 'Z');
-	  nname = ACONCAT (("_ZGA", oname+2, NULL));
-	  nid = get_identifier (nname);
+	  char *nname = ACONCAT (("_ZGA", oname + 2, NULL));
 
-	  alias = make_alias_for (fndecl, nid);
+	  tree alias = make_alias_for (fndecl, get_identifier (nname));
 	  TREE_PUBLIC (alias) = 1;
 	  DECL_VISIBILITY (alias) = VISIBILITY_HIDDEN;
 
-	  assemble_alias (alias, oid);
+	  cgraph_node::create_same_body_alias (alias, fndecl);
 	}
     }
 }
@@ -4318,6 +4282,66 @@ handle_tls_init (void)
   expand_or_defer_fn (finish_function (0));
 }
 
+/* We're at the end of compilation, so generate any mangling aliases that
+   we've been saving up, if DECL is going to be output and ID2 isn't
+   already taken by another declaration.  */
+
+static void
+generate_mangling_alias (tree decl, tree id2)
+{
+  /* If there's a declaration already using this mangled name,
+     don't create a compatibility alias that conflicts.  */
+  if (IDENTIFIER_GLOBAL_VALUE (id2))
+    return;
+
+  struct cgraph_node *n = NULL;
+  if (TREE_CODE (decl) == FUNCTION_DECL
+      && !(n = cgraph_node::get (decl)))
+    /* Don't create an alias to an unreferenced function.  */
+    return;
+
+  tree alias = make_alias_for (decl, id2);
+  SET_IDENTIFIER_GLOBAL_VALUE (id2, alias);
+  DECL_IGNORED_P (alias) = 1;
+  TREE_PUBLIC (alias) = TREE_PUBLIC (decl);
+  DECL_VISIBILITY (alias) = DECL_VISIBILITY (decl);
+  if (vague_linkage_p (decl))
+    DECL_WEAK (alias) = 1;
+  if (TREE_CODE (decl) == FUNCTION_DECL)
+    n->create_same_body_alias (alias, decl);
+  else
+    varpool_node::create_extra_name_alias (alias, decl);
+}
+
+/* Note that we might want to emit an alias with the symbol ID2 for DECL at
+   the end of translation, for compatibility across bugs in the mangling
+   implementation.  */
+
+void
+note_mangling_alias (tree decl, tree id2)
+{
+#ifdef ASM_OUTPUT_DEF
+  if (at_eof)
+    generate_mangling_alias (decl, id2);
+  else
+    {
+      vec_safe_push (mangling_aliases, decl);
+      vec_safe_push (mangling_aliases, id2);
+    }
+#endif
+}
+
+static void
+generate_mangling_aliases ()
+{
+  while (!vec_safe_is_empty (mangling_aliases))
+    {
+      tree id2 = mangling_aliases->pop();
+      tree decl = mangling_aliases->pop();
+      generate_mangling_alias (decl, id2);
+    }
+}
+
 /* The entire file is now complete.  If requested, dump everything
    to a file.  */
 
@@ -4334,6 +4358,8 @@ dump_tu (void)
     }
 }
 
+static location_t locus_at_end_of_parsing;
+
 /* Check the deallocation functions for CODE to see if we want to warn that
    only one was defined.  */
 
@@ -4381,18 +4407,16 @@ maybe_warn_sized_delete ()
    first, since that way we only need to reverse the decls once.  */
 
 void
-cp_write_global_declarations (void)
+c_parse_final_cleanups (void)
 {
   tree vars;
   bool reconsider;
   size_t i;
-  location_t locus;
   unsigned ssdf_count = 0;
   int retries = 0;
   tree decl;
-  hash_set<tree> *candidates;
 
-  locus = input_location;
+  locus_at_end_of_parsing = input_location;
   at_eof = 1;
 
   /* Bad parse errors.  Just forget about it.  */
@@ -4424,6 +4448,7 @@ cp_write_global_declarations (void)
 
   /* FIXME - huh?  was  input_line -= 1;*/
 
+  timevar_stop (TV_PHASE_PARSING);
   timevar_start (TV_PHASE_DEFERRED);
 
   /* We now have to write out all the stuff we put off writing out.
@@ -4521,7 +4546,7 @@ cp_write_global_declarations (void)
 
 	  /* Set the line and file, so that it is obviously not from
 	     the source file.  */
-	  input_location = locus;
+	  input_location = locus_at_end_of_parsing;
 	  ssdf_body = start_static_storage_duration_function (ssdf_count);
 
 	  /* Make sure the back end knows about all the variables.  */
@@ -4547,7 +4572,7 @@ cp_write_global_declarations (void)
 
 	  /* Finish up the static storage duration function for this
 	     round.  */
-	  input_location = locus;
+	  input_location = locus_at_end_of_parsing;
 	  finish_static_storage_duration_function (ssdf_body);
 
 	  /* All those initializations and finalizations might cause
@@ -4555,7 +4580,7 @@ cp_write_global_declarations (void)
 	     instantiations, etc.  */
 	  reconsider = true;
 	  ssdf_count++;
-	  /* ??? was:  locus.line++; */
+	  /* ??? was:  locus_at_end_of_parsing.line++; */
 	}
 
       /* Now do the same for thread_local variables.  */
@@ -4679,6 +4704,8 @@ cp_write_global_declarations (void)
     }
   while (reconsider);
 
+  generate_mangling_aliases ();
+
   /* All used inline functions must have a definition at this point.  */
   FOR_EACH_VEC_SAFE_ELT (deferred_fns, i, decl)
     {
@@ -4696,7 +4723,7 @@ cp_write_global_declarations (void)
 				(template_for_substitution (decl)))))
 	{
 	  warning (0, "inline function %q+D used but never defined", decl);
-	  /* Avoid a duplicate warning from check_global_declaration_1.  */
+	  /* Avoid a duplicate warning from check_global_declaration.  */
 	  TREE_NO_WARNING (decl) = 1;
 	}
     }
@@ -4723,12 +4750,13 @@ cp_write_global_declarations (void)
   if (priority_info_map)
     splay_tree_foreach (priority_info_map,
 			generate_ctor_and_dtor_functions_for_priority,
-			/*data=*/&locus);
+			/*data=*/&locus_at_end_of_parsing);
   else if (c_dialect_objc () && objc_static_init_needed_p ())
     /* If this is obj-c++ and we need a static init, call
        generate_ctor_or_dtor_function.  */
     generate_ctor_or_dtor_function (/*constructor_p=*/true,
-				    DEFAULT_INIT_PRIORITY, &locus);
+				    DEFAULT_INIT_PRIORITY,
+				    &locus_at_end_of_parsing);
 
   /* We're done with the splay-tree now.  */
   if (priority_info_map)
@@ -4741,11 +4769,11 @@ cp_write_global_declarations (void)
      linkage now.  */
   pop_lang_context ();
 
-  /* Collect candidates for Java hidden aliases.  */
-  candidates = collect_candidates_for_java_method_aliases ();
+  /* Generate Java hidden aliases.  */
+  build_java_method_aliases ();
 
   timevar_stop (TV_PHASE_DEFERRED);
-  timevar_start (TV_PHASE_OPT_GEN);
+  timevar_start (TV_PHASE_PARSING);
 
   if (flag_vtable_verify)
     {
@@ -4754,41 +4782,13 @@ cp_write_global_declarations (void)
       vtv_build_vtable_verify_fndecl ();
     }
 
-  symtab->finalize_compilation_unit ();
-
-  if (flag_vtable_verify)
-    {
-      /* Generate the special constructor initialization function that
-         calls __VLTRegisterPairs, and give it a very high
-         initialization priority.  This must be done after
-         finalize_compilation_unit so that we have accurate
-         information about which vtable will actually be emitted.  */
-      vtv_generate_init_routine ();
-    }
-
-  timevar_stop (TV_PHASE_OPT_GEN);
-  timevar_start (TV_PHASE_CHECK_DBGINFO);
-
-  /* Now, issue warnings about static, but not defined, functions,
-     etc., and emit debugging information.  */
-  walk_namespaces (wrapup_globals_for_namespace, /*data=*/&reconsider);
-  if (vec_safe_length (pending_statics) != 0)
-    {
-      check_global_declarations (pending_statics->address (),
-				 pending_statics->length ());
-      emit_debug_global_declarations (pending_statics->address (),
-				      pending_statics->length ());
-    }
+  /* Issue warnings about static, but not defined, functions, etc, and
+     generate initial debug information.  */
+  timevar_stop (TV_PHASE_PARSING);
+  timevar_start (TV_PHASE_DBGINFO);
 
   perform_deferred_noexcept_checks ();
 
-  /* Generate hidden aliases for Java.  */
-  if (candidates)
-    {
-      build_java_method_aliases (candidates);
-      delete candidates;
-    }
-
   finish_repo ();
 
   /* The entire file is now complete.  If requested, dump everything
@@ -4800,13 +4800,37 @@ cp_write_global_declarations (void)
       dump_tree_statistics ();
       dump_time_statistics ();
     }
-  input_location = locus;
+
+  timevar_stop (TV_PHASE_DBGINFO);
+  timevar_start (TV_PHASE_PARSING);
+}
+
+/* Perform any post compilation-proper cleanups for the C++ front-end.
+   This should really go away.  No front-end should need to do
+   anything past the compilation process.  */
+
+void
+cxx_post_compilation_parsing_cleanups (void)
+{
+  timevar_start (TV_PHASE_LATE_PARSING_CLEANUPS);
+
+  if (flag_vtable_verify)
+    {
+      /* Generate the special constructor initialization function that
+         calls __VLTRegisterPairs, and give it a very high
+         initialization priority.  This must be done after
+         finalize_compilation_unit so that we have accurate
+         information about which vtable will actually be emitted.  */
+      vtv_generate_init_routine ();
+    }
+
+  input_location = locus_at_end_of_parsing;
 
 #ifdef ENABLE_CHECKING
   validate_conversion_obstack ();
 #endif /* ENABLE_CHECKING */
 
-  timevar_stop (TV_PHASE_CHECK_DBGINFO);
+  timevar_stop (TV_PHASE_LATE_PARSING_CLEANUPS);
 }
 
 /* FN is an OFFSET_REF, DOTSTAR_EXPR or MEMBER_REF indicating the
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index b0f72d1..647ec70 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -3554,30 +3554,7 @@ mangle_decl (const tree decl)
 		     flag_abi_compat_version, id2);
 	}
 
-#ifdef ASM_OUTPUT_DEF
-      /* If there's a declaration already using this mangled name,
-	 don't create a compatibility alias that conflicts.  */
-      if (IDENTIFIER_GLOBAL_VALUE (id2))
-	return;
-
-      struct cgraph_node *n = NULL;
-      if (TREE_CODE (decl) == FUNCTION_DECL
-	  && !(n = cgraph_node::get (decl)))
-	/* Don't create an alias to an unreferenced function.  */
-	return;
-
-      tree alias = make_alias_for (decl, id2);
-      SET_IDENTIFIER_GLOBAL_VALUE (id2, alias);
-      DECL_IGNORED_P (alias) = 1;
-      TREE_PUBLIC (alias) = TREE_PUBLIC (decl);
-      DECL_VISIBILITY (alias) = DECL_VISIBILITY (decl);
-      if (vague_linkage_p (decl))
-	DECL_WEAK (alias) = 1;
-      if (TREE_CODE (decl) == FUNCTION_DECL)
-	n->create_same_body_alias (alias, decl);
-      else
-	varpool_node::create_extra_name_alias (alias, decl);
-#endif
+      note_mangling_alias (decl, id2);
     }
 }
 
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 9e4e0e3..ebeb479 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -3899,7 +3899,7 @@ do_namespace_alias (tree alias, tree name_space)
 
   /* Emit debug info for namespace alias.  */
   if (!building_stmt_list_p ())
-    (*debug_hooks->global_decl) (alias);
+    (*debug_hooks->early_global_decl) (alias);
 }
 
 /* Like pushdecl, only it places X in the current namespace,

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch 3/10] debug-early merge: C++ front-end
  2015-05-08  0:34 [patch 3/10] debug-early merge: C++ front-end Aldy Hernandez
@ 2015-05-08 11:57 ` Richard Biener
  2015-05-08 18:48   ` Aldy Hernandez
  0 siblings, 1 reply; 9+ messages in thread
From: Richard Biener @ 2015-05-08 11:57 UTC (permalink / raw)
  To: Aldy Hernandez; +Cc: gcc-patches

On Fri, May 8, 2015 at 2:34 AM, Aldy Hernandez <aldyh@redhat.com> wrote:
>

Maybe you can split out the Java aliases stuff (that annoyed me multiple times
when trying to refactor the FE - middle-end interface).  It looks
unrelated enough.

Thanks,
Richard.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch 3/10] debug-early merge: C++ front-end
  2015-05-08 11:57 ` Richard Biener
@ 2015-05-08 18:48   ` Aldy Hernandez
  2015-05-08 19:20     ` Richard Biener
  0 siblings, 1 reply; 9+ messages in thread
From: Aldy Hernandez @ 2015-05-08 18:48 UTC (permalink / raw)
  To: Richard Biener; +Cc: gcc-patches, jason merrill

On 05/08/2015 04:57 AM, Richard Biener wrote:
> On Fri, May 8, 2015 at 2:34 AM, Aldy Hernandez <aldyh@redhat.com> wrote:
>>
>
> Maybe you can split out the Java aliases stuff (that annoyed me multiple times
> when trying to refactor the FE - middle-end interface).  It looks
> unrelated enough.
>
> Thanks,
> Richard.
>

Jason already reviewed that part going into the branch (and most of my 
changes actually).  I'd rather concentrate on the other bits, while I'm 
under fire here :).  But if Jason also wants it split up, I'll oblige.

Aldy

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch 3/10] debug-early merge: C++ front-end
  2015-05-08 18:48   ` Aldy Hernandez
@ 2015-05-08 19:20     ` Richard Biener
  2015-05-09  1:14       ` Aldy Hernandez
  0 siblings, 1 reply; 9+ messages in thread
From: Richard Biener @ 2015-05-08 19:20 UTC (permalink / raw)
  To: Aldy Hernandez; +Cc: gcc-patches, jason merrill

On May 8, 2015 8:48:26 PM GMT+02:00, Aldy Hernandez <aldyh@redhat.com> wrote:
>On 05/08/2015 04:57 AM, Richard Biener wrote:
>> On Fri, May 8, 2015 at 2:34 AM, Aldy Hernandez <aldyh@redhat.com>
>wrote:
>>>
>>
>> Maybe you can split out the Java aliases stuff (that annoyed me
>multiple times
>> when trying to refactor the FE - middle-end interface).  It looks
>> unrelated enough.
>>
>> Thanks,
>> Richard.
>>
>
>Jason already reviewed that part going into the branch (and most of my 
>changes actually).  I'd rather concentrate on the other bits, while I'm
>
>under fire here :).  But if Jason also wants it split up, I'll oblige.

Just meant that it's making the changes smaller if those bits can be checked in independently. If that's just a hassle...

Richard.

>Aldy


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch 3/10] debug-early merge: C++ front-end
  2015-05-08 19:20     ` Richard Biener
@ 2015-05-09  1:14       ` Aldy Hernandez
  2015-05-20 19:45         ` Jason Merrill
  0 siblings, 1 reply; 9+ messages in thread
From: Aldy Hernandez @ 2015-05-09  1:14 UTC (permalink / raw)
  To: Richard Biener; +Cc: gcc-patches, jason merrill

[-- Attachment #1: Type: text/plain, Size: 559 bytes --]

On 05/08/2015 12:20 PM, Richard Biener wrote:

> Just meant that it's making the changes smaller if those bits can be checked in independently. If that's just a hassle...

Well, who am I to look a gift horse in the mouth?  Especially when 
you've volunteered to review most of this, and hopefully finish the LTO 
streaming work? :-)))))))

That being said... here is the latest C++ patch bereft of C++ mangling 
and Java aliases.  Indeed it looks mighty clean.  I'm tempted to commit 
it as obvious... :).

The rest of the patches remain as is.

Thanks.
Aldy

[-- Attachment #2: curr --]
[-- Type: text/plain, Size: 11464 bytes --]

commit 73357de442ca317e478cfcb6c0f9da630d142775
Author: Aldy Hernandez <aldyh@redhat.com>
Date:   Fri May 8 17:26:32 2015 -0700

    	* cp-objcp-common.c: Update comment for
    	cxx_warn_unused_global_decl.
    	* cp-objcp-common.h (LANG_HOOKS_WRITE_GLOBALS): Remove.
    	(LANG_HOOKS_POST_COMPILATION_PARSING_CLEANUPS): New.
    	* cp-tree.h (cp_write_global_declarations): Remove.
    	(cxx_post_compilation_parsing_cleanups): New.
    	(wrapup_globals_for_namespace): Add argument.
    	* decl.c (wrapup_globals_for_namespace): Tag unused argument with
    	ATTRIBUTE_UNUSED.
    	* decl2.c (locus_at_end_of_parsing): New global.
    	(c_parse_final_cleanups): Rename from
    	cp_write_global_declarations.  Use locus_at_end_of_parsing.
    	Start correct TV_PHASE_* timers.
    	Remove code calling finalize_compilation_unit.
    	Move vtable verify code into its own function...
    	(cxx_post_compilation_parsing_cleanups): ...here.
    	* name-lookup.c (do_namespace_alias): Rename global_decl to
    	early_global_decl.

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4b27f5d..245a23e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,24 @@
+2015-05-08  Aldy Hernandez  <aldyh@redhat.com>
+
+	* cp-objcp-common.c: Update comment for
+	cxx_warn_unused_global_decl.
+	* cp-objcp-common.h (LANG_HOOKS_WRITE_GLOBALS): Remove.
+	(LANG_HOOKS_POST_COMPILATION_PARSING_CLEANUPS): New.
+	* cp-tree.h (cp_write_global_declarations): Remove.
+	(cxx_post_compilation_parsing_cleanups): New.
+	(wrapup_globals_for_namespace): Add argument.
+	* decl.c (wrapup_globals_for_namespace): Tag unused argument with
+	ATTRIBUTE_UNUSED.
+	* decl2.c (locus_at_end_of_parsing): New global.
+	(c_parse_final_cleanups): Rename from
+	cp_write_global_declarations.  Use locus_at_end_of_parsing.
+	Start correct TV_PHASE_* timers.
+	Remove code calling finalize_compilation_unit.
+	Move vtable verify code into its own function...
+	(cxx_post_compilation_parsing_cleanups): ...here.
+	* name-lookup.c (do_namespace_alias): Rename global_decl to
+	early_global_decl.
+
 2015-05-08  Jason Merrill  <jason@redhat.com>
 
 	* decl2.c (mangling_aliases): New variable.
diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c
index dd8e7c5..40b13ef 100644
--- a/gcc/cp/cp-objcp-common.c
+++ b/gcc/cp/cp-objcp-common.c
@@ -60,7 +60,7 @@ cxx_get_alias_set (tree t)
   return c_common_get_alias_set (t);
 }
 
-/* Called from check_global_declarations.  */
+/* Called from check_global_declaration.  */
 
 bool
 cxx_warn_unused_global_decl (const_tree decl)
diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h
index 8a36e7f..c8572a7 100644
--- a/gcc/cp/cp-objcp-common.h
+++ b/gcc/cp/cp-objcp-common.h
@@ -84,8 +84,8 @@ extern void cp_common_init_ts (void);
 #define LANG_HOOKS_PRINT_ERROR_FUNCTION	cxx_print_error_function
 #undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL
 #define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL cxx_warn_unused_global_decl
-#undef LANG_HOOKS_WRITE_GLOBALS
-#define LANG_HOOKS_WRITE_GLOBALS cp_write_global_declarations
+#undef LANG_HOOKS_POST_COMPILATION_PARSING_CLEANUPS
+#define LANG_HOOKS_POST_COMPILATION_PARSING_CLEANUPS cxx_post_compilation_parsing_cleanups
 #undef  LANG_HOOKS_BUILTIN_FUNCTION
 #define LANG_HOOKS_BUILTIN_FUNCTION cxx_builtin_function
 #undef  LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 4136d98..1998992 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -5469,7 +5469,7 @@ extern tree cp_reconstruct_complex_type		(tree, tree);
 extern bool attributes_naming_typedef_ok	(tree);
 extern void cplus_decl_attributes		(tree *, tree, int);
 extern void finish_anon_union			(tree);
-extern void cp_write_global_declarations	(void);
+extern void cxx_post_compilation_parsing_cleanups (void);
 extern tree coerce_new_type			(tree);
 extern tree coerce_delete_type			(tree);
 extern void comdat_linkage			(tree);
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 6ec1579..4a4cadf 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -892,30 +892,19 @@ walk_namespaces (walk_namespaces_fn f, void* data)
   return walk_namespaces_r (global_namespace, f, data);
 }
 
-/* Call wrapup_globals_declarations for the globals in NAMESPACE.  If
-   DATA is non-NULL, this is the last time we will call
-   wrapup_global_declarations for this NAMESPACE.  */
+/* Call wrapup_globals_declarations for the globals in NAMESPACE.  */
 
 int
-wrapup_globals_for_namespace (tree name_space, void* data)
+wrapup_globals_for_namespace (tree name_space, void *data ATTRIBUTE_UNUSED)
 {
   cp_binding_level *level = NAMESPACE_LEVEL (name_space);
   vec<tree, va_gc> *statics = level->static_decls;
   tree *vec = statics->address ();
   int len = statics->length ();
-  int last_time = (data != 0);
-
-  if (last_time)
-    {
-      check_global_declarations (vec, len);
-      emit_debug_global_declarations (vec, len);
-      return 0;
-    }
 
   /* Write out any globals that need to be output.  */
   return wrapup_global_declarations (vec, len);
 }
-
 \f
 /* In C++, you don't have to write `struct S' to refer to `S'; you
    can just use `S'.  We accomplish this by creating a TYPE_DECL as
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index d435af2..737db8c 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -4358,6 +4358,8 @@ dump_tu (void)
     }
 }
 
+static location_t locus_at_end_of_parsing;
+
 /* Check the deallocation functions for CODE to see if we want to warn that
    only one was defined.  */
 
@@ -4405,17 +4407,16 @@ maybe_warn_sized_delete ()
    first, since that way we only need to reverse the decls once.  */
 
 void
-cp_write_global_declarations (void)
+c_parse_final_cleanups (void)
 {
   tree vars;
   bool reconsider;
   size_t i;
-  location_t locus;
   unsigned ssdf_count = 0;
   int retries = 0;
   tree decl;
 
-  locus = input_location;
+  locus_at_end_of_parsing = input_location;
   at_eof = 1;
 
   /* Bad parse errors.  Just forget about it.  */
@@ -4447,6 +4448,7 @@ cp_write_global_declarations (void)
 
   /* FIXME - huh?  was  input_line -= 1;*/
 
+  timevar_stop (TV_PHASE_PARSING);
   timevar_start (TV_PHASE_DEFERRED);
 
   /* We now have to write out all the stuff we put off writing out.
@@ -4544,7 +4546,7 @@ cp_write_global_declarations (void)
 
 	  /* Set the line and file, so that it is obviously not from
 	     the source file.  */
-	  input_location = locus;
+	  input_location = locus_at_end_of_parsing;
 	  ssdf_body = start_static_storage_duration_function (ssdf_count);
 
 	  /* Make sure the back end knows about all the variables.  */
@@ -4570,7 +4572,7 @@ cp_write_global_declarations (void)
 
 	  /* Finish up the static storage duration function for this
 	     round.  */
-	  input_location = locus;
+	  input_location = locus_at_end_of_parsing;
 	  finish_static_storage_duration_function (ssdf_body);
 
 	  /* All those initializations and finalizations might cause
@@ -4578,7 +4580,7 @@ cp_write_global_declarations (void)
 	     instantiations, etc.  */
 	  reconsider = true;
 	  ssdf_count++;
-	  /* ??? was:  locus.line++; */
+	  /* ??? was:  locus_at_end_of_parsing.line++; */
 	}
 
       /* Now do the same for thread_local variables.  */
@@ -4721,7 +4723,7 @@ cp_write_global_declarations (void)
 				(template_for_substitution (decl)))))
 	{
 	  warning (0, "inline function %q+D used but never defined", decl);
-	  /* Avoid a duplicate warning from check_global_declaration_1.  */
+	  /* Avoid a duplicate warning from check_global_declaration.  */
 	  TREE_NO_WARNING (decl) = 1;
 	}
     }
@@ -4748,12 +4750,13 @@ cp_write_global_declarations (void)
   if (priority_info_map)
     splay_tree_foreach (priority_info_map,
 			generate_ctor_and_dtor_functions_for_priority,
-			/*data=*/&locus);
+			/*data=*/&locus_at_end_of_parsing);
   else if (c_dialect_objc () && objc_static_init_needed_p ())
     /* If this is obj-c++ and we need a static init, call
        generate_ctor_or_dtor_function.  */
     generate_ctor_or_dtor_function (/*constructor_p=*/true,
-				    DEFAULT_INIT_PRIORITY, &locus);
+				    DEFAULT_INIT_PRIORITY,
+				    &locus_at_end_of_parsing);
 
   /* We're done with the splay-tree now.  */
   if (priority_info_map)
@@ -4770,7 +4773,7 @@ cp_write_global_declarations (void)
   build_java_method_aliases ();
 
   timevar_stop (TV_PHASE_DEFERRED);
-  timevar_start (TV_PHASE_OPT_GEN);
+  timevar_start (TV_PHASE_PARSING);
 
   if (flag_vtable_verify)
     {
@@ -4779,31 +4782,10 @@ cp_write_global_declarations (void)
       vtv_build_vtable_verify_fndecl ();
     }
 
-  symtab->finalize_compilation_unit ();
-
-  if (flag_vtable_verify)
-    {
-      /* Generate the special constructor initialization function that
-         calls __VLTRegisterPairs, and give it a very high
-         initialization priority.  This must be done after
-         finalize_compilation_unit so that we have accurate
-         information about which vtable will actually be emitted.  */
-      vtv_generate_init_routine ();
-    }
-
-  timevar_stop (TV_PHASE_OPT_GEN);
-  timevar_start (TV_PHASE_CHECK_DBGINFO);
-
-  /* Now, issue warnings about static, but not defined, functions,
-     etc., and emit debugging information.  */
-  walk_namespaces (wrapup_globals_for_namespace, /*data=*/&reconsider);
-  if (vec_safe_length (pending_statics) != 0)
-    {
-      check_global_declarations (pending_statics->address (),
-				 pending_statics->length ());
-      emit_debug_global_declarations (pending_statics->address (),
-				      pending_statics->length ());
-    }
+  /* Issue warnings about static, but not defined, functions, etc, and
+     generate initial debug information.  */
+  timevar_stop (TV_PHASE_PARSING);
+  timevar_start (TV_PHASE_DBGINFO);
 
   perform_deferred_noexcept_checks ();
 
@@ -4818,13 +4800,37 @@ cp_write_global_declarations (void)
       dump_tree_statistics ();
       dump_time_statistics ();
     }
-  input_location = locus;
+
+  timevar_stop (TV_PHASE_DBGINFO);
+  timevar_start (TV_PHASE_PARSING);
+}
+
+/* Perform any post compilation-proper cleanups for the C++ front-end.
+   This should really go away.  No front-end should need to do
+   anything past the compilation process.  */
+
+void
+cxx_post_compilation_parsing_cleanups (void)
+{
+  timevar_start (TV_PHASE_LATE_PARSING_CLEANUPS);
+
+  if (flag_vtable_verify)
+    {
+      /* Generate the special constructor initialization function that
+         calls __VLTRegisterPairs, and give it a very high
+         initialization priority.  This must be done after
+         finalize_compilation_unit so that we have accurate
+         information about which vtable will actually be emitted.  */
+      vtv_generate_init_routine ();
+    }
+
+  input_location = locus_at_end_of_parsing;
 
 #ifdef ENABLE_CHECKING
   validate_conversion_obstack ();
 #endif /* ENABLE_CHECKING */
 
-  timevar_stop (TV_PHASE_CHECK_DBGINFO);
+  timevar_stop (TV_PHASE_LATE_PARSING_CLEANUPS);
 }
 
 /* FN is an OFFSET_REF, DOTSTAR_EXPR or MEMBER_REF indicating the
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 9e4e0e3..ebeb479 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -3899,7 +3899,7 @@ do_namespace_alias (tree alias, tree name_space)
 
   /* Emit debug info for namespace alias.  */
   if (!building_stmt_list_p ())
-    (*debug_hooks->global_decl) (alias);
+    (*debug_hooks->early_global_decl) (alias);
 }
 
 /* Like pushdecl, only it places X in the current namespace,

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch 3/10] debug-early merge: C++ front-end
  2015-05-09  1:14       ` Aldy Hernandez
@ 2015-05-20 19:45         ` Jason Merrill
  2015-05-20 19:47           ` Jason Merrill
  2015-05-20 21:45           ` Aldy Hernandez
  0 siblings, 2 replies; 9+ messages in thread
From: Jason Merrill @ 2015-05-20 19:45 UTC (permalink / raw)
  To: Aldy Hernandez, Richard Biener; +Cc: gcc-patches

On 05/08/2015 09:14 PM, Aldy Hernandez wrote:
> +  if (!flag_syntax_only)
> +    c_parse_final_cleanups ();

The condition is a significant change of behavior for the C++ front end; 
doing final instantiation and such even with -fsyntax-only was a 
deliberate choice.  Can we drop the condition?

> +  timevar_stop (TV_PHASE_PARSING);
> +  timevar_start (TV_PHASE_DBGINFO);
>
>    perform_deferred_noexcept_checks ();

The only debug info stuff that was here has been removed, so there's no 
longer any need to switch to a debug timevar.  I think we should stay in 
DEFERRED for the whole function.

Jason

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch 3/10] debug-early merge: C++ front-end
  2015-05-20 19:45         ` Jason Merrill
@ 2015-05-20 19:47           ` Jason Merrill
  2015-05-20 21:45           ` Aldy Hernandez
  1 sibling, 0 replies; 9+ messages in thread
From: Jason Merrill @ 2015-05-20 19:47 UTC (permalink / raw)
  To: gcc-patches; +Cc: gcc-patches

On 05/08/2015 09:14 PM, Aldy Hernandez wrote:
> +  if (!flag_syntax_only)
> +    c_parse_final_cleanups ();

The condition is a significant change of behavior for the C++ front end; 
doing final instantiation and such even with -fsyntax-only was a 
deliberate choice.  Can we drop the condition?

> +  timevar_stop (TV_PHASE_PARSING);
> +  timevar_start (TV_PHASE_DBGINFO);
>
>    perform_deferred_noexcept_checks ();

The only debug info stuff that was here has been removed, so there's no 
longer any need to switch to a debug timevar.  I think we should stay in 
DEFERRED for the whole function.

Jason


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch 3/10] debug-early merge: C++ front-end
  2015-05-20 19:45         ` Jason Merrill
  2015-05-20 19:47           ` Jason Merrill
@ 2015-05-20 21:45           ` Aldy Hernandez
  2015-05-21  2:04             ` Jason Merrill
  1 sibling, 1 reply; 9+ messages in thread
From: Aldy Hernandez @ 2015-05-20 21:45 UTC (permalink / raw)
  To: Jason Merrill, Richard Biener; +Cc: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 873 bytes --]

On 05/20/2015 03:18 PM, Jason Merrill wrote:
> On 05/08/2015 09:14 PM, Aldy Hernandez wrote:
>> +  if (!flag_syntax_only)
>> +    c_parse_final_cleanups ();
>
> The condition is a significant change of behavior for the C++ front end;
> doing final instantiation and such even with -fsyntax-only was a
> deliberate choice.  Can we drop the condition?

Sure.  Done.  Will repost this as part of the C front-end which has the 
c-family/ bits where this appeared.

>> +  timevar_stop (TV_PHASE_PARSING);
>> +  timevar_start (TV_PHASE_DBGINFO);
>>
>>    perform_deferred_noexcept_checks ();
>
> The only debug info stuff that was here has been removed, so there's no
> longer any need to switch to a debug timevar.  I think we should stay in
> DEFERRED for the whole function.

Fixed.

How does this look?

Bootstrapped and retested on x86-64 for --enable-languages=all.

Aldy


[-- Attachment #2: dearly-cxx.patch --]
[-- Type: text/x-patch, Size: 10730 bytes --]

gcc/cp/

	* cp-objcp-common.c: Adjust comment for
	cxx_warn_unused_global_decl.
	* cp-objcp-common.h (LANG_HOOKS_WRITE_GLOBALS): Remove
	(LANG_HOOKS_POST_COMPILATION_PARSING_CLEANUPS): New.
	* cp-tree.h (note_mangling_alias): Protoize.
	(cp_write_global_declarations): Remove.
	(cxx_post_compilation_parsing_cleanups): Protoize.
	* decl.c (wrapup_globals_for_namespace): Remove use of DATA
	argument.
	* decl2.c (mangling_aliases): New global.
	(build_java_method_aliases): New.  Adapted from
	collect_candidates_for_java_method_aliases.
	(collect_candidates_for_java_method_aliases): Remove.
	(build_java_method_aliases): Remove.
	(generate_mangling_aliases): New.
	(note_mangling_alias): New.  Moved from mangle_decl.
	(locus_at_end_of_parsing): New global.
	(c_parse_final_cleanups): Rename from
	cp_write_global_declarations.
	Use locus_at_end_of_parsing.
	Call generate_mangling_aliases.
	Rename call to collect_candidates_for_java_method_aliases into
	build_java_method_aliases.
	Remove call to finalize_compilation_unit.
	Move vtable handling into cxx_post_compilation_parsing_cleanups.
	Do not call check_global_declarations or
	emit_debug_global_declarations.
	(cxx_post_compilation_parsing_cleanups): New.
	* mangle.c (mangle_decl): Move code to note_mangling_alias.
	* name-lookup.c (do_namespace_alias): Call early_global_decl.

diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c
index dd8e7c5..40b13ef 100644
--- a/gcc/cp/cp-objcp-common.c
+++ b/gcc/cp/cp-objcp-common.c
@@ -60,7 +60,7 @@ cxx_get_alias_set (tree t)
   return c_common_get_alias_set (t);
 }
 
-/* Called from check_global_declarations.  */
+/* Called from check_global_declaration.  */
 
 bool
 cxx_warn_unused_global_decl (const_tree decl)
diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h
index 8a36e7f..c8572a7 100644
--- a/gcc/cp/cp-objcp-common.h
+++ b/gcc/cp/cp-objcp-common.h
@@ -84,8 +84,8 @@ extern void cp_common_init_ts (void);
 #define LANG_HOOKS_PRINT_ERROR_FUNCTION	cxx_print_error_function
 #undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL
 #define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL cxx_warn_unused_global_decl
-#undef LANG_HOOKS_WRITE_GLOBALS
-#define LANG_HOOKS_WRITE_GLOBALS cp_write_global_declarations
+#undef LANG_HOOKS_POST_COMPILATION_PARSING_CLEANUPS
+#define LANG_HOOKS_POST_COMPILATION_PARSING_CLEANUPS cxx_post_compilation_parsing_cleanups
 #undef  LANG_HOOKS_BUILTIN_FUNCTION
 #define LANG_HOOKS_BUILTIN_FUNCTION cxx_builtin_function
 #undef  LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 4136d98..1998992 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -5469,7 +5469,7 @@ extern tree cp_reconstruct_complex_type		(tree, tree);
 extern bool attributes_naming_typedef_ok	(tree);
 extern void cplus_decl_attributes		(tree *, tree, int);
 extern void finish_anon_union			(tree);
-extern void cp_write_global_declarations	(void);
+extern void cxx_post_compilation_parsing_cleanups (void);
 extern tree coerce_new_type			(tree);
 extern tree coerce_delete_type			(tree);
 extern void comdat_linkage			(tree);
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 261a12d..8dadb39 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -892,30 +892,19 @@ walk_namespaces (walk_namespaces_fn f, void* data)
   return walk_namespaces_r (global_namespace, f, data);
 }
 
-/* Call wrapup_globals_declarations for the globals in NAMESPACE.  If
-   DATA is non-NULL, this is the last time we will call
-   wrapup_global_declarations for this NAMESPACE.  */
+/* Call wrapup_globals_declarations for the globals in NAMESPACE.  */
 
 int
-wrapup_globals_for_namespace (tree name_space, void* data)
+wrapup_globals_for_namespace (tree name_space, void* data ATTRIBUTE_UNUSED)
 {
   cp_binding_level *level = NAMESPACE_LEVEL (name_space);
   vec<tree, va_gc> *statics = level->static_decls;
   tree *vec = statics->address ();
   int len = statics->length ();
-  int last_time = (data != 0);
-
-  if (last_time)
-    {
-      check_global_declarations (vec, len);
-      emit_debug_global_declarations (vec, len);
-      return 0;
-    }
 
   /* Write out any globals that need to be output.  */
   return wrapup_global_declarations (vec, len);
 }
-
 \f
 /* In C++, you don't have to write `struct S' to refer to `S'; you
    can just use `S'.  We accomplish this by creating a TYPE_DECL as
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 27bacab..dc384e4 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -4367,6 +4367,8 @@ dump_tu (void)
     }
 }
 
+static location_t locus_at_end_of_parsing;
+
 /* Check the deallocation functions for CODE to see if we want to warn that
    only one was defined.  */
 
@@ -4414,17 +4416,16 @@ maybe_warn_sized_delete ()
    first, since that way we only need to reverse the decls once.  */
 
 void
-cp_write_global_declarations (void)
+c_parse_final_cleanups (void)
 {
   tree vars;
   bool reconsider;
   size_t i;
-  location_t locus;
   unsigned ssdf_count = 0;
   int retries = 0;
   tree decl;
 
-  locus = input_location;
+  locus_at_end_of_parsing = input_location;
   at_eof = 1;
 
   /* Bad parse errors.  Just forget about it.  */
@@ -4441,6 +4442,9 @@ cp_write_global_declarations (void)
       return;
     }
 
+  timevar_stop (TV_PHASE_PARSING);
+  timevar_start (TV_PHASE_DEFERRED);
+
   symtab->process_same_body_aliases ();
 
   /* Handle -fdump-ada-spec[-slim] */
@@ -4456,8 +4460,6 @@ cp_write_global_declarations (void)
 
   /* FIXME - huh?  was  input_line -= 1;*/
 
-  timevar_start (TV_PHASE_DEFERRED);
-
   /* We now have to write out all the stuff we put off writing out.
      These include:
 
@@ -4553,7 +4555,7 @@ cp_write_global_declarations (void)
 
 	  /* Set the line and file, so that it is obviously not from
 	     the source file.  */
-	  input_location = locus;
+	  input_location = locus_at_end_of_parsing;
 	  ssdf_body = start_static_storage_duration_function (ssdf_count);
 
 	  /* Make sure the back end knows about all the variables.  */
@@ -4579,7 +4581,7 @@ cp_write_global_declarations (void)
 
 	  /* Finish up the static storage duration function for this
 	     round.  */
-	  input_location = locus;
+	  input_location = locus_at_end_of_parsing;
 	  finish_static_storage_duration_function (ssdf_body);
 
 	  /* All those initializations and finalizations might cause
@@ -4587,7 +4589,7 @@ cp_write_global_declarations (void)
 	     instantiations, etc.  */
 	  reconsider = true;
 	  ssdf_count++;
-	  /* ??? was:  locus.line++; */
+	  /* ??? was:  locus_at_end_of_parsing.line++; */
 	}
 
       /* Now do the same for thread_local variables.  */
@@ -4730,7 +4732,7 @@ cp_write_global_declarations (void)
 				(template_for_substitution (decl)))))
 	{
 	  warning (0, "inline function %q+D used but never defined", decl);
-	  /* Avoid a duplicate warning from check_global_declaration_1.  */
+	  /* Avoid a duplicate warning from check_global_declaration.  */
 	  TREE_NO_WARNING (decl) = 1;
 	}
     }
@@ -4757,12 +4759,13 @@ cp_write_global_declarations (void)
   if (priority_info_map)
     splay_tree_foreach (priority_info_map,
 			generate_ctor_and_dtor_functions_for_priority,
-			/*data=*/&locus);
+			/*data=*/&locus_at_end_of_parsing);
   else if (c_dialect_objc () && objc_static_init_needed_p ())
     /* If this is obj-c++ and we need a static init, call
        generate_ctor_or_dtor_function.  */
     generate_ctor_or_dtor_function (/*constructor_p=*/true,
-				    DEFAULT_INIT_PRIORITY, &locus);
+				    DEFAULT_INIT_PRIORITY,
+				    &locus_at_end_of_parsing);
 
   /* We're done with the splay-tree now.  */
   if (priority_info_map)
@@ -4778,9 +4781,6 @@ cp_write_global_declarations (void)
   /* Generate Java hidden aliases.  */
   build_java_method_aliases ();
 
-  timevar_stop (TV_PHASE_DEFERRED);
-  timevar_start (TV_PHASE_OPT_GEN);
-
   if (flag_vtable_verify)
     {
       vtv_recover_class_info ();
@@ -4788,32 +4788,6 @@ cp_write_global_declarations (void)
       vtv_build_vtable_verify_fndecl ();
     }
 
-  symtab->finalize_compilation_unit ();
-
-  if (flag_vtable_verify)
-    {
-      /* Generate the special constructor initialization function that
-         calls __VLTRegisterPairs, and give it a very high
-         initialization priority.  This must be done after
-         finalize_compilation_unit so that we have accurate
-         information about which vtable will actually be emitted.  */
-      vtv_generate_init_routine ();
-    }
-
-  timevar_stop (TV_PHASE_OPT_GEN);
-  timevar_start (TV_PHASE_CHECK_DBGINFO);
-
-  /* Now, issue warnings about static, but not defined, functions,
-     etc., and emit debugging information.  */
-  walk_namespaces (wrapup_globals_for_namespace, /*data=*/&reconsider);
-  if (vec_safe_length (pending_statics) != 0)
-    {
-      check_global_declarations (pending_statics->address (),
-				 pending_statics->length ());
-      emit_debug_global_declarations (pending_statics->address (),
-				      pending_statics->length ());
-    }
-
   perform_deferred_noexcept_checks ();
 
   finish_repo ();
@@ -4827,13 +4801,37 @@ cp_write_global_declarations (void)
       dump_tree_statistics ();
       dump_time_statistics ();
     }
-  input_location = locus;
+
+  timevar_stop (TV_PHASE_DEFERRED);
+  timevar_start (TV_PHASE_PARSING);
+}
+
+/* Perform any post compilation-proper cleanups for the C++ front-end.
+   This should really go away.  No front-end should need to do
+   anything past the compilation process.  */
+
+void
+cxx_post_compilation_parsing_cleanups (void)
+{
+  timevar_start (TV_PHASE_LATE_PARSING_CLEANUPS);
+
+  if (flag_vtable_verify)
+    {
+      /* Generate the special constructor initialization function that
+         calls __VLTRegisterPairs, and give it a very high
+         initialization priority.  This must be done after
+         finalize_compilation_unit so that we have accurate
+         information about which vtable will actually be emitted.  */
+      vtv_generate_init_routine ();
+    }
+
+  input_location = locus_at_end_of_parsing;
 
 #ifdef ENABLE_CHECKING
   validate_conversion_obstack ();
 #endif /* ENABLE_CHECKING */
 
-  timevar_stop (TV_PHASE_CHECK_DBGINFO);
+  timevar_stop (TV_PHASE_LATE_PARSING_CLEANUPS);
 }
 
 /* FN is an OFFSET_REF, DOTSTAR_EXPR or MEMBER_REF indicating the
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 9e4e0e3..ebeb479 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -3899,7 +3899,7 @@ do_namespace_alias (tree alias, tree name_space)
 
   /* Emit debug info for namespace alias.  */
   if (!building_stmt_list_p ())
-    (*debug_hooks->global_decl) (alias);
+    (*debug_hooks->early_global_decl) (alias);
 }
 
 /* Like pushdecl, only it places X in the current namespace,

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch 3/10] debug-early merge: C++ front-end
  2015-05-20 21:45           ` Aldy Hernandez
@ 2015-05-21  2:04             ` Jason Merrill
  0 siblings, 0 replies; 9+ messages in thread
From: Jason Merrill @ 2015-05-21  2:04 UTC (permalink / raw)
  To: Aldy Hernandez, Richard Biener; +Cc: gcc-patches

OK.

Jason

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2015-05-20 23:35 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-05-08  0:34 [patch 3/10] debug-early merge: C++ front-end Aldy Hernandez
2015-05-08 11:57 ` Richard Biener
2015-05-08 18:48   ` Aldy Hernandez
2015-05-08 19:20     ` Richard Biener
2015-05-09  1:14       ` Aldy Hernandez
2015-05-20 19:45         ` Jason Merrill
2015-05-20 19:47           ` Jason Merrill
2015-05-20 21:45           ` Aldy Hernandez
2015-05-21  2:04             ` Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).