@@ -35,7 +35,8 @@ our @EXPORT_OK = qw($tool_name $tool_dir $lcov_version $lcov_url
35
35
@file_subst_patterns subst_file_name
36
36
37
37
$br_coverage $func_coverage
38
- $cpp_demangle $cpp_demangle_tool $cpp_demangle_params do_mangle_check
38
+ @cpp_demangle do_mangle_check $demangle_cpp_cmd
39
+ $cpp_demangle_tool $cpp_demangle_params
39
40
40
41
$FILTER_BRANCH_NO_COND $FILTER_FUNCTION_ALIAS
41
42
$FILTER_EXCLUDE_REGION $FILTER_EXCLUDE_BRANCH $FILTER_LINE
@@ -147,9 +148,12 @@ our $opt_no_external;
147
148
our @file_subst_patterns ;
148
149
149
150
# C++ demangling
150
- our $cpp_demangle ;
151
- our $cpp_demangle_tool = " c++filt" ; # Default demangler for C++ function names
152
- our $cpp_demangle_params = " " ; # Extra parameters for demangling
151
+ our @cpp_demangle ; # the options passed in
152
+ our $demangle_cpp_cmd ; # the computed command string
153
+ # deprecated: demangler for C++ function names is c++filt
154
+ our $cpp_demangle_tool ;
155
+ # Deprecated: prefer -Xlinker approach with @cpp_dmangle_tool
156
+ our $cpp_demangle_params ;
153
157
154
158
our @extractVersionScript ; # script/callback to find version ID of file
155
159
our $verify_checksum ; # compute and/or check MD5 sum of source code lines
@@ -653,22 +657,41 @@ sub set_c_extensions
653
657
654
658
sub do_mangle_check
655
659
{
656
- return unless $lcovutil::cpp_demangle ;
657
- $lcovutil::cpp_demangle = $lcovutil::cpp_demangle_tool ;
658
- $lcovutil::cpp_demangle .= ' ' . $lcovutil::cpp_demangle_params
659
- if ' ' ne $lcovutil::cpp_demangle_params ;
660
- $lcovutil::cpp_demangle =~ s / ^\s *(\S +)\s *$/ $1 / ;
661
-
662
- my @params = split (" " , $lcovutil::cpp_demangle );
663
- my $tool = $params [0];
664
- die (" ERROR: could not find $tool tool needed for --demangle-cpp" )
665
- if (lcovutil::system_no_output(3, " echo \"\" | $tool " ));
660
+ return unless @lcovutil::cpp_demangle ;
666
661
662
+ if (1 == scalar (@lcovutil::cpp_demangle )) {
663
+ if (' ' eq $lcovutil::cpp_demangle [0]) {
664
+ # no demangler specified - use c++filt by default
665
+ if (defined ($lcovutil::cpp_demangle_tool )) {
666
+ $lcovutil::cpp_demangle [0] = $lcovutil::cpp_demangle_tool ;
667
+ } else {
668
+ $lcovutil::cpp_demangle [0] = ' c++filt' ;
669
+ }
670
+ }
671
+ } elsif (1 < scalar (@lcovutil::cpp_demangle )) {
672
+ die (" unsupported usage: --demangle-cpp with genhtml_demangle_cpp_tool" )
673
+ if (defined ($lcovutil::cpp_demangle_tool ));
674
+ die (
675
+ " unsupported usage: --demangle-cpp with genhtml_demangle_cpp_params" )
676
+ if (defined ($lcovutil::cpp_demangle_params ));
677
+ }
678
+ if ($lcovutil::cpp_demangle_params ) {
679
+ # deprecated usage
680
+ push (@lcovutil::cpp_demangle ,
681
+ split (' ' , $lcovutil::cpp_demangle_params ));
682
+ }
667
683
# Extra flag necessary on OS X so that symbols listed by gcov get demangled
668
684
# properly.
669
- $lcovutil::cpp_demangle .= " --no-strip-underscores"
670
- if (scalar (@params ) == 1 &&
671
- $^ eq " darwin" );
685
+ push (@lcovutil::cpp_demangle , ' --no-strip-underscores' )
686
+ if ($^ eq " darwin" );
687
+
688
+ $lcovutil::demangle_cpp_cmd = ' ' ;
689
+ foreach my $e (@lcovutil::cpp_demangle ) {
690
+ $lcovutil::demangle_cpp_cmd .= (($e =~ / \s / ) ? " '$e '" : $e ) . ' ' ;
691
+ }
692
+ my $tool = $lcovutil::cpp_demangle [0];
693
+ die (" ERROR: could not find $tool tool needed for --demangle-cpp" )
694
+ if (lcovutil::system_no_output(3, " echo \"\" | '$tool '" ));
672
695
}
673
696
674
697
#
@@ -805,7 +828,10 @@ our @opt_config_files;
805
828
our @opt_ignore_errors ;
806
829
our @opt_filter ;
807
830
808
- my %deprecated_rc = (" geninfo_checksum" => " checksum" ,
831
+ my %deprecated_rc = (" genhtml_demangle_cpp" => " demangle_cpp" ,
832
+ " genhtml_demangle_cpp_tool" => " demangle_cpp" ,
833
+ " genhtml_demangle_cpp_params" => " demangle_cpp" ,
834
+ " geninfo_checksum" => " checksum" ,
809
835
" geninfo_no_exception_branch" => " no_exception_branch" ,
810
836
" lcov_branch_coverage" => " branch_coverage" ,
811
837
" lcov_function_coverage" => " function_coverage" ,
@@ -856,9 +882,7 @@ my %rc_common = (
856
882
" forget_testcase_names" => \$TraceFile::ignore_testcase_name ,
857
883
" split_char" => \$lcovutil::split_char ,
858
884
859
- " genhtml_demangle_cpp" => \$lcovutil::cpp_demangle ,
860
- " genhtml_demangle_cpp_tool" => \$lcovutil::cpp_demangle_tool ,
861
- " genhtml_demangle_cpp_params" => \$lcovutil::cpp_demangle_params ,
885
+ " demangle_cpp" => \@lcovutil::cpp_demangle ,
862
886
863
887
);
864
888
@@ -878,7 +902,7 @@ our %argCommon = ("tempdir=s" => \$tempdirname,
878
902
" no-branch-coverage" => \$rc_no_branch_coverage ,
879
903
880
904
" filter=s" => \@opt_filter ,
881
- " demangle-cpp" => \$ lcovutil::cpp_demangle ,
905
+ " demangle-cpp:s " => \@ lcovutil::cpp_demangle ,
882
906
" ignore-errors=s" => \@opt_ignore_errors ,
883
907
" keep-going" => \$keepGoing ,
884
908
" config-file=s" => \@unsupported_config ,
@@ -1805,14 +1829,14 @@ sub out
1805
1829
if (!defined ($f ) ||
1806
1830
' -' eq $f ) {
1807
1831
if ($demangle ) {
1808
- open (HANDLE, ' |-' , $lcovutil::cpp_demangle ) or
1832
+ open (HANDLE, ' |-' , $lcovutil::demangle_cpp_cmd ) or
1809
1833
die (" Error: unable to demangle: $! \n " );
1810
1834
$self -> [0] = \*HANDLE;
1811
1835
} else {
1812
1836
$self -> [0] = \*STDOUT ;
1813
1837
}
1814
1838
} else {
1815
- my $cmd = $demangle ? " $lcovutil::cpp_demangle " : ' ' ;
1839
+ my $cmd = $demangle ? " $lcovutil::demangle_cpp_cmd " : ' ' ;
1816
1840
if ($f =~ / \. gz$ / ) {
1817
1841
checkGzip()
1818
1842
unless defined ($checkedGzipAvail );
@@ -1862,14 +1886,14 @@ sub in
1862
1886
1863
1887
# Open compressed file
1864
1888
my $cmd = " gzip -cd '$f '" ;
1865
- $cmd .= " | " . $lcovutil::cpp_demangle
1889
+ $cmd .= " | " . $lcovutil::demangle_cpp_cmd
1866
1890
if ($demangle );
1867
1891
open (HANDLE, " -|" , $cmd ) or
1868
1892
die (" ERROR: cannot start gunzip to decompress file $f : $! \n " );
1869
1893
1870
1894
} elsif ($demangle &&
1871
- defined ($lcovutil::cpp_demangle )) {
1872
- open (HANDLE, " -|" , " cat '$f ' | $lcovutil::cpp_demangle " ) or
1895
+ defined ($lcovutil::demangle_cpp_cmd )) {
1896
+ open (HANDLE, " -|" , " cat '$f ' | $lcovutil::demangle_cpp_cmd " ) or
1873
1897
die (" ERROR: cannot start demangler for file $f : $! \n " );
1874
1898
} else {
1875
1899
# Open decompressed file
@@ -4385,7 +4409,7 @@ sub _read_info
4385
4409
}
4386
4410
4387
4411
# Check for .gz extension
4388
- my $inFile = InOutFile-> in($tracefile , $lcovutil::cpp_demangle );
4412
+ my $inFile = InOutFile-> in($tracefile , $lcovutil::demangle_cpp_cmd );
4389
4413
my $infoHdl = $inFile -> hdl();
4390
4414
4391
4415
$testname = " " ;
0 commit comments