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 <ebotca...@adacore.com>
* toplev.c (output_stack_usage): Be prepared for suffixes created by
the compiler in the function names.
2013-09-06 Eric Botcazou <ebotca...@adacore.com>
* gnat.dg/stack_usage2.adb: New test.
--
Eric Botcazou
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]);
}
-- { dg-do compile }
-- { dg-options "-O2 -fstack-usage" }
with System;
procedure Stack_Usage2 is
Sink : System.Address;
pragma Import (Ada, Sink);
procedure Transmit_Data (Branch : Integer) is
pragma No_Inline (Transmit_Data);
X : Integer;
begin
case Branch is
when 1 => Sink := X'Address;
when others => null;
end case;
end;
begin
Transmit_Data (Branch => 1);
end;
-- { dg-final { scan-stack-usage-not ":Constprop" } }
-- { dg-final { cleanup-stack-usage } }