diff --git a/Jamfile.jam b/Jamfile.jam
index 15a0e63a6d328c87cadce59ae26943b4949d04fb..df8d5be3688446ddbad00e8ce03b80acd2419239 100644
--- a/Jamfile.jam
+++ b/Jamfile.jam
@@ -43,7 +43,15 @@ if ( $(toolset:I=^mingw) || $(toolset:I=^gcc) )
 {
 	CCFLAGS = -fprofile-arcs -ftest-coverage ;
 	LDFLAGS = -fprofile-arcs ;
-	GCOVFLAGS = -n ;
+
+	if $(fullcoverage)
+	{
+		GCOVFLAGS = --branch-probabilities --function-summaries ;
+	}
+	else
+	{
+		GCOVFLAGS = --no-output ;
+	}
 }
 
 # build folder
diff --git a/tests/gcov-filter.pl b/tests/gcov-filter.pl
index c68aa1f7f4697de18f0c61fbfce35e705338e8d2..f0d201972c3c2835b6fb635e95a02cd4ed2211fa 100644
--- a/tests/gcov-filter.pl
+++ b/tests/gcov-filter.pl
@@ -1,10 +1,33 @@
 #!/usr/bin/perl
 
+sub funcinfo
+{
+	my ($name, $info) = @_;
+
+	return if ($info =~ /No executable lines/);
+
+	my $lines = ($info =~ /Lines executed:([^%]+)%/) ? $1 : 100;
+	my $calls = ($info =~ /Calls executed:([^%]+)%/) ? $1 : 100;
+	my $branches = ($info =~ /Branches executed:([^%]+)%/) ? $1 : 100;
+	my $taken = ($info =~ /Taken at least once:([^%]+)%/) ? $1 : 100;
+
+	return if ($lines == 100 && $calls == 100 && $branches == 100 && $taken == 100);
+
+	return "Function $name: L $lines, C $calls, B $branches, BT $taken\n";
+}
+
 $prefix = join(' ', @ARGV);
 $prefix .= ' ' if ($prefix ne '');
 
 $lines = join('', <STDIN>);
+
+# merge file information
 $lines =~ s/File (.+)\nLines (.+)\n(.+\n)*\n/$1 $2\n/g;
+
+# merge function information
+$lines =~ s/Function (.+)\n((.+\n)*)\n/funcinfo($1, $2)/eg;
+
+# remove include information
 $lines =~ s/.+include\/c\+\+.+\n//g;
 
 foreach $line (split /\n/, $lines)