Fix small glitch with -fdump-ada-spec

Message ID 2989632.ZzrmmeCWlY@polaris
State New
Headers show
Series
  • Fix small glitch with -fdump-ada-spec
Related show

Commit Message

Eric Botcazou Dec. 20, 2019, 5:42 p.m.
This fixes the following discrepancy: when a C or C++ file contains no 
translation unit but only preprocessor macro definitions, -fdump-ada-spec 
outputs nothing but -fdump-ada-spec-slim does.  This changes the former to 
behaving as the latter in this case.

Tested on x86_64-suse-linux, applied on the mainline.


2019-12-20  Eric Botcazou  <ebotcazou@adacore.com>

c-family/
	* c-ada-spec.h (decl_sloc): Delete.
	* c-ada-spec.c (decl_sloc): Make static.
c/
	* c-decl.c (collect_source_ref_cb): Delete.
	(for_each_global_decl): Rename into...
	(collect_source_refs): ...this.  Call collect_source_ref directly.
	(c_parse_final_cleanups): Always call collect_source_ref on the main
	input filename.
cp/
	* decl2.c (c_parse_final_cleanups): Always call collect_source_ref on
	the main input filename.

-- 
Eric Botcazou

Patch

Index: c/c-decl.c
===================================================================
--- c/c-decl.c	(revision 279540)
+++ c/c-decl.c	(working copy)
@@ -11787,15 +11787,6 @@  c_write_global_declarations_1 (tree glob
   while (reconsider);
 }
 
-/* Callback to collect a source_ref from a DECL.  */
-
-static void
-collect_source_ref_cb (tree decl)
-{
-  if (!DECL_IS_BUILTIN (decl))
-    collect_source_ref (LOCATION_FILE (decl_sloc (decl, false)));
-}
-
 /* Preserve the external declarations scope across a garbage collect.  */
 static GTY(()) tree ext_block;
 
@@ -11813,10 +11804,10 @@  collect_all_refs (const char *source_fil
   collect_ada_nodes (BLOCK_VARS (ext_block), source_file);
 }
 
-/* Iterate over all global declarations and call CALLBACK.  */
+/* Collect source file references at global level.  */
 
 static void
-for_each_global_decl (void (*callback) (tree decl))
+collect_source_refs (void)
 {
   tree t;
   tree decls;
@@ -11827,11 +11818,13 @@  for_each_global_decl (void (*callback) (
     { 
       decls = DECL_INITIAL (t);
       for (decl = BLOCK_VARS (decls); decl; decl = TREE_CHAIN (decl))
-	callback (decl);
+	if (!DECL_IS_BUILTIN (decl))
+	  collect_source_ref (DECL_SOURCE_FILE (decl));
     }
 
   for (decl = BLOCK_VARS (ext_block); decl; decl = TREE_CHAIN (decl))
-    callback (decl);
+    if (!DECL_IS_BUILTIN (decl))
+      collect_source_ref (DECL_SOURCE_FILE (decl));
 }
 
 /* Perform any final parser cleanups and generate initial debugging
@@ -11865,10 +11858,9 @@  c_parse_final_cleanups (void)
   if (flag_dump_ada_spec || flag_dump_ada_spec_slim)
     {
       /* Build a table of files to generate specs for */
-      if (flag_dump_ada_spec_slim)
-	collect_source_ref (main_input_filename);
-      else
-	for_each_global_decl (collect_source_ref_cb);
+      collect_source_ref (main_input_filename);
+      if (!flag_dump_ada_spec_slim)
+	collect_source_refs ();
 
       dump_ada_specs (collect_all_refs, NULL);
     }
Index: c-family/c-ada-spec.c
===================================================================
--- c-family/c-ada-spec.c	(revision 279540)
+++ c-family/c-ada-spec.c	(working copy)
@@ -630,7 +630,7 @@  static const char *current_source_file;
 
 /* Return sloc of DECL, using sloc of last field if LAST is true.  */
 
-location_t
+static location_t
 decl_sloc (const_tree decl, bool last)
 {
   tree field;
Index: c-family/c-ada-spec.h
===================================================================
--- c-family/c-ada-spec.h	(revision 279540)
+++ c-family/c-ada-spec.h	(working copy)
@@ -36,7 +36,6 @@  enum cpp_operation {
   IS_TRIVIAL
 };
 
-extern location_t decl_sloc (const_tree, bool);
 extern void collect_ada_nodes (tree, const char *);
 extern void collect_source_ref (const char *);
 extern void dump_ada_specs (void (*)(const char *),
Index: cp/decl2.c
===================================================================
--- cp/decl2.c	(revision 279540)
+++ cp/decl2.c	(working copy)
@@ -4815,9 +4815,8 @@  c_parse_final_cleanups (void)
   /* Handle -fdump-ada-spec[-slim] */
   if (flag_dump_ada_spec || flag_dump_ada_spec_slim)
     {
-      if (flag_dump_ada_spec_slim)
-	collect_source_ref (main_input_filename);
-      else
+      collect_source_ref (main_input_filename);
+      if (!flag_dump_ada_spec_slim)
 	collect_source_refs (global_namespace);
 
       dump_ada_specs (collect_all_refs, cpp_check);