On 9/25/18 8:48 AM, Martin Liška wrote: > Hi. > > One more tested patch. > > Martin >
One more tested patch. Martin
>From d5ac07522f558372f13e95ea05593adae36e5dfa Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Wed, 3 Oct 2018 10:39:16 +0200 Subject: [PATCH] Backport r264806 gcc/ChangeLog: 2018-10-03 Martin Liska <mli...@suse.cz> PR gcov-profile/86109 * coverage.c (coverage_begin_function): Do not mark lambdas as artificial. * tree-core.h (struct GTY): Remove tm_clone_flag and introduce new lambda_function. * tree.h (DECL_LAMBDA_FUNCTION): New macro. gcc/cp/ChangeLog: 2018-10-03 Martin Liska <mli...@suse.cz> PR gcov-profile/86109 * parser.c (cp_parser_lambda_declarator_opt): Set DECL_LAMBDA_FUNCTION for lambdas. gcc/testsuite/ChangeLog: 2018-10-03 Martin Liska <mli...@suse.cz> PR gcov-profile/86109 * g++.dg/gcov/pr86109.C: New test. --- gcc/coverage.c | 3 ++- gcc/cp/parser.c | 1 + gcc/testsuite/g++.dg/gcov/pr86109.C | 16 ++++++++++++++++ gcc/tree-core.h | 2 +- gcc/tree.h | 4 ++++ 5 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/gcov/pr86109.C diff --git a/gcc/coverage.c b/gcc/coverage.c index 32ef298a11f..bae3d507638 100644 --- a/gcc/coverage.c +++ b/gcc/coverage.c @@ -663,7 +663,8 @@ coverage_begin_function (unsigned lineno_checksum, unsigned cfg_checksum) gcov_write_unsigned (cfg_checksum); gcov_write_string (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (current_function_decl))); - gcov_write_unsigned (DECL_ARTIFICIAL (current_function_decl)); + gcov_write_unsigned (DECL_ARTIFICIAL (current_function_decl) + && !DECL_LAMBDA_FUNCTION (current_function_decl)); gcov_write_filename (xloc.file); gcov_write_unsigned (xloc.line); gcov_write_unsigned (xloc.column); diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index bbf1a71d415..b40bee6d33b 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -10620,6 +10620,7 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr) DECL_ARTIFICIAL (fco) = 1; /* Give the object parameter a different name. */ DECL_NAME (DECL_ARGUMENTS (fco)) = get_identifier ("__closure"); + DECL_LAMBDA_FUNCTION (fco) = 1; if (return_type) TYPE_HAS_LATE_RETURN_TYPE (TREE_TYPE (fco)) = 1; } diff --git a/gcc/testsuite/g++.dg/gcov/pr86109.C b/gcc/testsuite/g++.dg/gcov/pr86109.C new file mode 100644 index 00000000000..9052d2e5a04 --- /dev/null +++ b/gcc/testsuite/g++.dg/gcov/pr86109.C @@ -0,0 +1,16 @@ + +/* { dg-options "-fprofile-arcs -ftest-coverage -std=c++11" } */ +/* { dg-do run { target native } } */ + +int main() +{ + auto partially_uncovered_lambda = [](int i) { /* count(1) */ + if (i > 10) /* count(1) */ + return 0; /* count(1) */ + return 1; /* count(#####) */ + }; + + return partially_uncovered_lambda(20); /* count(1) */ +} + +/* { dg-final { run-gcov pr86109.C } } */ diff --git a/gcc/tree-core.h b/gcc/tree-core.h index 478c631998c..356330a5b0e 100644 --- a/gcc/tree-core.h +++ b/gcc/tree-core.h @@ -1796,8 +1796,8 @@ struct GTY(()) tree_function_decl { unsigned pure_flag : 1; unsigned looping_const_or_pure_flag : 1; unsigned has_debug_args_flag : 1; - unsigned tm_clone_flag : 1; unsigned versioned_function : 1; + unsigned lambda_function: 1; /* No bits left. */ }; diff --git a/gcc/tree.h b/gcc/tree.h index 1e14d9f5866..8e703140811 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -3061,6 +3061,10 @@ extern vec<tree, va_gc> **decl_debug_args_insert (tree); #define DECL_CXX_DESTRUCTOR_P(NODE)\ (FUNCTION_DECL_CHECK (NODE)->decl_with_vis.cxx_destructor) +/* In FUNCTION_DECL, this is set if this function is a lambda function. */ +#define DECL_LAMBDA_FUNCTION(NODE) \ + (FUNCTION_DECL_CHECK (NODE)->function_decl.lambda_function) + /* In FUNCTION_DECL that represent an virtual method this is set when the method is final. */ #define DECL_FINAL_P(NODE)\ -- 2.19.0