Commit 19d9ce46 by Olivier Hainque Committed by Pierre-Marie de Rodat

[Ada] Arrange not to set DECL_ARTIFICIAL on elab procs

Unlike, say, clones created internally by the compiler, elab procs
materialize specific user code and flagging them artificial now takes
elab code away from gcov's analysis, a regression compared to previous
releases.

On the testcase below:

package Gcov_Q is
   function F (X : Integer) return Integer is (X + 1);
end;

with Gcov_Q;
package Gcov_P is
   Y : Integer := Gcov_Q.F (X => 1);
end;

with Gcov_P;
procedure Gcov_Test is
begin
   if Gcov_P.Y /= 2 then
      raise Program_Error;
   end if;
end;

After compiling with:

  gnatmake -f -g gcov_test.adb \
    -cargs -ftest-coverage -fprofile-arcs \
    -largs -fprofile-generate

and executing with

  ./gcov_test

We expect

   gcov gcov_p

to produce a gcov_p.ads.gcov report.

2019-07-08  Olivier Hainque  <hainque@adacore.com>

gcc/ada/

	* gcc-interface/trans.c (Compilation_Unit_to_gnu): Don't request
	DECL_ARTIFICIAL_P on elab proc declarations.

From-SVN: r273207
parent abbc4546
2019-07-08 Olivier Hainque <hainque@adacore.com>
* gcc-interface/trans.c (Compilation_Unit_to_gnu): Don't request
DECL_ARTIFICIAL_P on elab proc declarations.
2019-07-08 Eric Botcazou <ebotcazou@adacore.com> 2019-07-08 Eric Botcazou <ebotcazou@adacore.com>
* repinfo.adb (List_Record_Info): Declare Incomplete_Layout and * repinfo.adb (List_Record_Info): Declare Incomplete_Layout and
......
...@@ -6276,13 +6276,17 @@ Compilation_Unit_to_gnu (Node_Id gnat_node) ...@@ -6276,13 +6276,17 @@ Compilation_Unit_to_gnu (Node_Id gnat_node)
Node_Id gnat_pragma; Node_Id gnat_pragma;
/* Make the decl for the elaboration procedure. Emit debug info for it, so /* Make the decl for the elaboration procedure. Emit debug info for it, so
that users can break into their elaboration code in debuggers. Kludge: that users can break into their elaboration code in debuggers. Kludge:
don't consider it as a definition so that we have a line map for its body, don't consider it as a definition so that we have a line map for its
but no subprogram description in debug info. */ body, but no subprogram description in debug info. In addition, don't
qualify it as artificial, even though it is not a user subprogram per se,
in particular for specs. Unlike, say, clones created internally by the
compiler, this subprogram materializes specific user code and flagging it
artificial would take elab code away from gcov's analysis. */
tree gnu_elab_proc_decl tree gnu_elab_proc_decl
= create_subprog_decl = create_subprog_decl
(create_concat_name (gnat_unit_entity, body_p ? "elabb" : "elabs"), (create_concat_name (gnat_unit_entity, body_p ? "elabb" : "elabs"),
NULL_TREE, void_ftype, NULL_TREE, NULL_TREE, void_ftype, NULL_TREE,
is_default, true, false, true, true, false, NULL, gnat_unit); is_default, true, false, false, true, false, NULL, gnat_unit);
struct elab_info *info; struct elab_info *info;
vec_safe_push (gnu_elab_proc_stack, gnu_elab_proc_decl); vec_safe_push (gnu_elab_proc_stack, gnu_elab_proc_decl);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment