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.
Tested on x86_64-pc-linux-gnu, committed on trunk
2019-07-08 Olivier Hainque <hain...@adacore.com>
gcc/ada/
* gcc-interface/trans.c (Compilation_Unit_to_gnu): Don't request
DECL_ARTIFICIAL_P on elab proc declarations.
--- gcc/ada/gcc-interface/trans.c
+++ gcc/ada/gcc-interface/trans.c
@@ -6276,13 +6276,17 @@ Compilation_Unit_to_gnu (Node_Id gnat_node)
Node_Id gnat_pragma;
/* Make the decl for the elaboration procedure. Emit debug info for it, so
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,
- but no subprogram description in debug info. */
+ don't consider it as a definition so that we have a line map for its
+ 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
= create_subprog_decl
(create_concat_name (gnat_unit_entity, body_p ? "elabb" : "elabs"),
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;
vec_safe_push (gnu_elab_proc_stack, gnu_elab_proc_decl);