gprofng: fix bug 29392 - Unexpected line format in summary file

gprofng/Changelog:
2022-07-22  Ruud van der Pas  <ruud.vanderpas@oracle.com>

	PR gprofng/29392
	* gp-display-html/gp-display-html.in: modified a regex, plus the
	code to handle the results; renamed a variable to improve the
	consistency in naming.
This commit is contained in:
Ruud van der Pas
2022-07-22 05:59:17 -07:00
committed by Vladimir Mezentsev
parent 408520bcaa
commit c69c2b6033
+78 -21
View File
@@ -7494,11 +7494,16 @@ sub get_function_info
my ($FSUMMARY_FILE) = @_;
my @function_info = ();
my %functions_address_and_index = ();
my %LINUX_vDSO = ();
my %function_view_structure = ();
my %addressobjtextm = ();
#------------------------------------------------------------------------------
# The regex section.
#------------------------------------------------------------------------------
my $white_space_regex = '\s*';
my @function_info = ();
my %function_address_and_index = ();
my %LINUX_vDSO = ();
my %function_view_structure = ();
my %addressobjtextm = ();
#------------------------------------------------------------------------------
# TBD: This structure is no longer used and most likely can be removed.
#------------------------------------------------------------------------------
@@ -7697,14 +7702,53 @@ sub get_function_info
# or:
# Source File: <absolute_path>/name_of_source_file
#------------------------------------------------------------------------------
if ( not ($line =~ /^(\s*)(.*):(\s+)([^\s]+|(.*))/))
$line =~ s/^\s+//;
my @input_fields = split (":", $line);
my $no_of_elements = scalar (@input_fields);
gp_message ("debugXL", $subr_name, "#input_fields = $#input_fields");
gp_message ("debugXL", $subr_name, "no_of_elements = $no_of_elements");
gp_message ("debugXL", $subr_name, "input_fields[0] = $input_fields[0]");
if ($no_of_elements == 1)
{
my $msg = "unexpected line format in summary file $FSUMMARY_FILE line = $line";
$whatever = $input_fields[0];
$value = "";
}
elsif ($no_of_elements == 2)
{
#------------------------------------------------------------------------------
# Note that value may consist of multiple fields (e.g. 1.651 ( 95.4%)).
#------------------------------------------------------------------------------
$whatever = $input_fields[0];
$value = $input_fields[1];
}
elsif ($no_of_elements == 3)
{
#------------------------------------------------------------------------------
# Assumption: must be an address field. Restore the second colon.
#------------------------------------------------------------------------------
$whatever = $input_fields[0];
$value = $input_fields[1] . ":" . $input_fields[2];
}
else
{
my $msg = "unexpected: number of fields = " . $no_of_elements;
gp_message ("assertion", $subr_name, $msg);
}
$whatever = $2;
$value = $4;
#------------------------------------------------------------------------------
# Remove any leading whitespace characters.
#------------------------------------------------------------------------------
$value =~ s/$white_space_regex//;
gp_message ("debugXL", $subr_name, "whatever = $whatever value = $value");
$function_info[$i]{$whatever} = $value;
#------------------------------------------------------------------------------
# TBD: Seems to be not used anymore and can most likely be removed. Check this.
#------------------------------------------------------------------------------
if ($whatever =~ /Source File/)
{
if (!exists ($source_files{$value}))
@@ -7742,9 +7786,13 @@ sub get_function_info
$function_info[$i]{"addressobjtext"} = $full_address_field;
$addressobjtextm{$full_address_field} = $i; # $RI
}
if (not exists ($functions_address_and_index{$routine}{$value}))
if (not exists ($function_address_and_index{$routine}{$value}))
{
$functions_address_and_index{$routine}{$value} = $i;
$function_address_and_index{$routine}{$value} = $i;
my $msg = "function_address_and_index{$routine}{$value} = " .
$function_address_and_index{$routine}{$value};
gp_message ("debugXL", $subr_name, $msg);
}
else
{
@@ -7973,13 +8021,13 @@ sub get_function_info
}
}
#------------------------------------------------------------------------------
# Print the data structure %functions_address_and_index. This is a nested hash.
# Print the data structure %function_address_and_index. This is a nested hash.
#------------------------------------------------------------------------------
for my $F (keys %functions_address_and_index)
for my $F (keys %function_address_and_index)
{
for my $fields (sort keys %{ $functions_address_and_index{$F} })
for my $fields (sort keys %{ $function_address_and_index{$F} })
{
gp_message ("debug", $subr_name, "on return: functions_address_and_index{$F}{$fields} = $functions_address_and_index{$F}{$fields}");
gp_message ("debug", $subr_name, "on return: function_address_and_index{$F}{$fields} = $function_address_and_index{$F}{$fields}");
}
}
#------------------------------------------------------------------------------
@@ -8050,10 +8098,10 @@ sub get_function_info
$multi_occurrences;
gp_message ("debug", $subr_name, $msg);
return (\@function_info, \%functions_address_and_index, \%addressobjtextm, \%LINUX_vDSO, \%function_view_structure);
return (\@function_info, \%function_address_and_index, \%addressobjtextm,
\%LINUX_vDSO, \%function_view_structure);
} #-- End of subroutine get_function_info
#------------------------------------------------------------------------------
# TBD
#------------------------------------------------------------------------------
@@ -9881,12 +9929,12 @@ sub parse_dis_files
my $subr_name = get_my_name ();
my ($number_of_metrics_ref, $function_info_ref,
$functions_address_and_index_ref, $input_string_ref,
$function_address_and_index_ref, $input_string_ref,
$addressobj_index_ref) = @_;
#------------------------------------------------------------------------------
# Note that $functions_address_and_index_ref are is not used,
# but we need to pass in the address into generate_dis_html.
# Note that $function_address_and_index_ref is not used, but we need to pass
# in the address into generate_dis_html.
#------------------------------------------------------------------------------
my $number_of_metrics = ${ $number_of_metrics_ref };
my @function_info = @{ $function_info_ref };
@@ -9950,7 +9998,7 @@ sub parse_dis_files
\$target_function,
\$number_of_metrics,
$function_info_ref,
$functions_address_and_index_ref,
$function_address_and_index_ref,
\$outputdir,
\$filename,
\@source_line,
@@ -11039,6 +11087,15 @@ sub process_function_files
{
$PCA = $function_address_info{$metric}[$INDEX]{"PC Address"};
if (not exists ($functions_per_metric_first_index{$metric}{$routine}{$PCA}))
{
gp_message ("debugXL", $subr_name, "not exists: functions_per_metric_first_index{$metric}{$routine}{$PCA}");
}
if (not exists ($function_address_and_index{$routine}{$PCA}))
{
gp_message ("debugXL", $subr_name, "not exists: function_address_and_index{$routine}{$PCA}");
}
if (exists ($functions_per_metric_first_index{$metric}{$routine}{$PCA}) and
exists ($function_address_and_index{$routine}{$PCA}))
{