Patchwork Fix glitch in -fstack-usage output

login
register
mail settings
Submitter Eric Botcazou
Date Sept. 6, 2013, 3:28 p.m.
Message ID <91903026.KsWM6CpAjA@polaris>
Download mbox | patch
Permalink /patch/273224/
State New
Headers show

Comments

Eric Botcazou - Sept. 6, 2013, 3:28 p.m.
The output of -fstack-usage doesn't use fully qualified names of functions 
(because they can be quite long in Ada) so the code attempts to strip the 
scope prefix.  But this isn't robust enough in presence of suffixes created by 
the compiler, for example by the cloning machinery.

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


2013-09-06  Eric Botcazou  <ebotcazou@adacore.com>

	* toplev.c (output_stack_usage): Be prepared for suffixes created by
	the compiler in the function names.


2013-09-06  Eric Botcazou  <ebotcazou@adacore.com>

	* gnat.dg/stack_usage2.adb: New test.

Patch

Index: toplev.c
===================================================================
--- toplev.c	(revision 202160)
+++ toplev.c	(working copy)
@@ -1017,22 +1017,35 @@  output_stack_usage (void)
     {
       expanded_location loc
 	= expand_location (DECL_SOURCE_LOCATION (current_function_decl));
-      const char *raw_id, *id;
-
-      /* Strip the scope prefix if any.  */
-      raw_id = lang_hooks.decl_printable_name (current_function_decl, 2);
-      id = strrchr (raw_id, '.');
-      if (id)
-	id++;
+      /* We don't want to print the full qualified name because it can be long,
+	 so we strip the scope prefix, but we may need to deal with the suffix
+	 created by the compiler.  */
+      const char *suffix
+	= strchr (IDENTIFIER_POINTER (DECL_NAME (current_function_decl)), '.');
+      const char *name
+	= lang_hooks.decl_printable_name (current_function_decl, 2);
+      if (suffix)
+	{
+	  const char *dot = strchr (name, '.');
+	  while (dot && strcasecmp (dot, suffix) != 0)
+	    {
+	      name = dot + 1;
+	      dot = strchr (name, '.');
+	    }
+	}
       else
-	id = raw_id;
+	{
+	  const char *dot = strrchr (name, '.');
+	  if (dot)
+	    name = dot + 1;
+	}
 
       fprintf (stack_usage_file,
 	       "%s:%d:%d:%s\t"HOST_WIDE_INT_PRINT_DEC"\t%s\n",
 	       lbasename (loc.file),
 	       loc.line,
 	       loc.column,
-	       id,
+	       name,
 	       stack_usage,
 	       stack_usage_kind_str[stack_usage_kind]);
     }