]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gprofng: support GNU option syntax in gp-display-html, plus various fixes
authorVladimir Mezentsev <vladimir.mezentsev@oracle.com>
Tue, 28 Nov 2023 20:05:15 +0000 (12:05 -0800)
committerVladimir Mezentsev <vladimir.mezentsev@oracle.com>
Wed, 29 Nov 2023 18:18:35 +0000 (10:18 -0800)
This is a major update of gp-display-html.  The option handling has been
modified to support the GNU style long option syntax.  Compatibility with
the previous syntax has been preserved. If still used, a warning is issued.
Through the --nowarnings option, this can be suppressed.
In addition to this, various lay-out changes have been implemented.  In
particular to reduce the number of lines that extend beyond column 79.
Several bugs have been fixed, for example in the handling of directory names.

gprofng/ChangeLog
2023-11-28  Ruud van der Pas  <ruud.vanderpas@oracle.com>

* gp-display-html/gp-display-html.in: Change option syntax plus fixes.

gprofng/gp-display-html/gp-display-html.in

index dc310f836af4e55872dd2d7bc38370ea5944cae4..4973297db2a7cc7529b4bab862b96dd24004a4ec 100644 (file)
 #   along with this program; if not, write to the Free Software
 #   Foundation, 51 Franklin Street - Fifth Floor, Boston,
 #   MA 02110-1301, USA.
+
 use strict;
 use warnings;
-use feature qw (state);
+
+# Disable before release
+# use Perl::Critic;
+
+use bignum;
+use List::Util qw (max);
+use Cwd qw (abs_path cwd);
+use File::Basename;
 use File::stat;
+use feature qw (state);
+use POSIX;
+use Getopt::Long qw (Configure);
 
 #------------------------------------------------------------------------------
 # Check as early as possible if the version of Perl used is supported.
@@ -64,14 +74,14 @@ my $g_max_length_first_metric;
 #------------------------------------------------------------------------------
 my $g_path_to_tools;
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Code debugging flag
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 my $g_test_code = $FALSE;
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # GPROFNG commands and files used.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 my $GP_DISPLAY_TEXT = "gp-display-text";
 
 my $g_gp_output_file   = $GP_DISPLAY_TEXT.".stdout.log";
@@ -91,6 +101,11 @@ my $g_addressing_mode = "64 bit";
   my $g_html_less_than_regex = '&lt;';
   my $g_endbr_inst_regex     = 'endbr[32|64]';
 
+#------------------------------------------------------------------------------
+# For consistency, use a global variable.
+#------------------------------------------------------------------------------
+  my $g_html_new_line = "<br>";
+
 #------------------------------------------------------------------------------
 # These are the regex's used.
 #------------------------------------------------------------------------------
@@ -99,18 +114,10 @@ my $g_addressing_mode = "64 bit";
 #------------------------------------------------------------------------------
   my $g_branch_regex = '\.*([0-9a-fA-F]*):\s+(j).*\s*0x([0-9a-fA-F]+)';
   my $g_endbr_regex  = '\.*([0-9a-fA-F]*):\s+(endbr[32|64])';
-  my $g_function_call_v2_regex = '(.*)\s+([0-9a-fA-F]*):\s+(call)\s*0x([0-9a-fA-F]+)\s*';
-
-#------------------------------------------------------------------------------
-# Convenience.  These map the on/off value to $TRUE/$FALSE to make the code
-# easier to read.  For example: "if ($g_verbose)" as opposed to the following:
-# "if ($verbose_setting eq "on").
-#------------------------------------------------------------------------------
-my $g_verbose;
-my $g_warnings;
-my $g_quiet;
+  my $g_function_call_v2_regex =
+               '(.*)\s+([0-9a-fA-F]*):\s+(call)\s*0x([0-9a-fA-F]+)\s*';
 
-my $g_first_metric; 
+my $g_first_metric;
 
 my $binutils_version;
 my $driver_cmd;
@@ -120,10 +127,23 @@ my $version_info;
 my %g_mapped_cmds = ();
 
 #------------------------------------------------------------------------------
-# TBD All warning messages are collected and are accessible through the main
-# page.
+# Variables dealing with warnings and errors.  Since a message may span
+# multiple lines (for readability reasons), the number of entries in the
+# array may not reflect the total number of messages.  This is why we use
+# separate variables for the counts.
+#------------------------------------------------------------------------------
+my @g_error_msgs   = ();
+my @g_warning_msgs = ();
+my $g_total_error_count = 0;
 #------------------------------------------------------------------------------
-my @g_warning_messages = ();
+# This count is used in the html_create_warnings_page HTML page to show how
+# many warning messages there are.  Warnings are printed through gp_message(),
+# but since one warning may span multiple lines, we update a separate counter
+# that contains the total number of warning messages issued so far.
+#------------------------------------------------------------------------------
+my $g_total_warning_count = 0;
+my $g_options_printed     = $FALSE;
+my $g_abort_msg = "cannot recover from the error(s)";
 
 #------------------------------------------------------------------------------
 # Contains the names that have already been tagged.  This is a global
@@ -140,12 +160,10 @@ my $g_context = 5; # Defines the range of scan
 my $g_default_setting_lang = "en-US.UTF-8";
 my %g_exp_dir_meta_data;
 
-my @g_user_input_errors = ();
-
 my $g_html_credits_line;
 
-my $g_warn_keyword  = "Input warning: ";
-my $g_error_keyword = "Input error:   ";
+my $g_warn_keyword  = "[Warning]";
+my $g_error_keyword = "[Error]";
 
 my %g_function_occurrences = ();
 my %g_map_function_to_index = ();
@@ -155,49 +173,128 @@ my @g_full_function_view_table = ();
 
 my @g_html_experiment_stats = ();
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # These structures contain the information printed in the function views.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 my $g_header_lines;
 
 my @g_html_function_name = ();
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # TBD: This variable may not be needed and replaced by tp_value
 my $thresh = 0;
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Define the driver command, tool name and version number.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 $driver_cmd       = "gprofng display html";
 $tool_name        = "gp-display-html";
 #$binutils_version = "2.38.50";
 $binutils_version = "BINUTILS_VERSION";
 $version_info     = $tool_name . " GNU binutils version " . $binutils_version;
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Define several key data structures.
-#-------------------------------------------------------------------------------
-my %g_user_settings = 
+#------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# This table has the settings of the variables the user may set.
+#------------------------------------------------------------------------------
+my %g_user_settings =
   (
-    output           => { option => "-o" , no_of_arguments => 1, data_type => "path"    , current_value => undef, defined => $FALSE},
-    overwrite        => { option => "-O" , no_of_arguments => 1, data_type => "path"    , current_value => undef, defined => $FALSE},
-    calltree         => { option => "-ct", no_of_arguments => 1, data_type => "onoff"   , current_value => "off"      , defined => $FALSE},
-    func_limit       => { option => "-fl", no_of_arguments => 1, data_type => "pinteger", current_value => 500        , defined => $FALSE},
-    highlight_percentage => { option => "-hp", no_of_arguments => 1, data_type => "pfloat"  , current_value => 90.0       , defined => $FALSE},
-    threshold_percentage => { option => "-tp", no_of_arguments => 1, data_type => "pfloat"  , current_value => 100.0      , defined => $FALSE},
-    default_metrics  => { option => "-dm", no_of_arguments => 1, data_type => "onoff"   , current_value => "off"      , defined => $FALSE},
-    ignore_metrics   => { option => "-im", no_of_arguments => 1, data_type => "metric_names", current_value => undef, defined => $FALSE},
-    verbose          => { option => "--verbose" , no_of_arguments => 1, data_type => "onoff"  , current_value => "off" , defined => $FALSE},
-    warnings         => { option => "--warnings" , no_of_arguments => 1, data_type => "onoff"  , current_value => "on" , defined => $FALSE},
-    debug            => { option => "--debug" , no_of_arguments => 1, data_type => "size"  , current_value => "off" , defined => $FALSE},
-    quiet            => { option => "--quiet" , no_of_arguments => 1, data_type => "onoff"   , current_value => "off"      , defined => $FALSE},
+    verbose              => { option => "--verbose",
+                             no_of_arguments => 1,
+                             data_type => "onoff",
+                             current_value => "off",  defined => $FALSE},
+
+    debug                => { option => "--debug",
+                             no_of_arguments => 1,
+                             data_type => "size",
+                             current_value => "off",  defined => $FALSE},
+
+    warnings             => { option => "--warnings",
+                             no_of_arguments => 1,
+                             data_type => "onoff" ,
+                             current_value => "off",  defined => $FALSE},
+
+    nowarnings           => { option => "--nowarnings",
+                             no_of_arguments => 1,
+                             data_type => "onoff",
+                             current_value => "off",  defined => $FALSE},
+
+    quiet                => { option => "--quiet",
+                             no_of_arguments => 1,
+                             data_type => "onoff",
+                             current_value => "off",  defined => $FALSE},
+
+    output               => { option => "-o",
+                             no_of_arguments => 1,
+                             data_type => "path",
+                             current_value => undef,  defined => $FALSE},
+
+    overwrite            => { option => "-O",
+                             no_of_arguments => 1,
+                             data_type => "path",
+                             current_value => undef,  defined => $FALSE},
+
+    calltree             => { option => "-ct",
+                             no_of_arguments => 1,
+                             data_type => "onoff",
+                             current_value => "off",  defined => $FALSE},
+
+    func_limit           => { option => "-fl",
+                             no_of_arguments => 1,
+                             data_type => "pinteger",
+                             current_value => 500,    defined => $FALSE},
+
+    highlight_percentage => { option => "--highlight-percentage",
+                             no_of_arguments => 1,
+                             data_type => "pfloat",
+                             current_value   => 90.0, defined => $FALSE},
+
+    hp                   => { option => "-hp",
+                             no_of_arguments => 1,
+                             data_type => "pfloat",
+                             current_value => 90.0,   defined => $FALSE},
+
+    threshold_percentage => { option => "-tp",
+                             no_of_arguments => 1,
+                             data_type => "pfloat",
+                             current_value => 100.0,  defined => $FALSE},
+
+    default_metrics      => { option => "-dm",
+                             no_of_arguments => 1,
+                             data_type => "onoff",
+                             current_value => "off",  defined => $FALSE},
+
+    ignore_metrics       => { option => "-im",
+                             no_of_arguments => 1,
+                             data_type => "metric_names",
+                             current_value => undef,  defined => $FALSE},
   );
 
-my %g_debug_size = 
+#------------------------------------------------------------------------------
+# Convenience.  These map the on/off value to $TRUE/$FALSE to make the code
+# easier to read.  For example: "if ($g_verbose)" as opposed to the following:
+# "if ($verbose_setting eq "on").
+#------------------------------------------------------------------------------
+my $g_verbose  = $FALSE;
+my $g_debug    = $FALSE;
+my $g_warnings = $TRUE;
+my $g_quiet    = $FALSE;
+
+#------------------------------------------------------------------------------
+# Since ARGV is modified when parsing the options, a clean copy is used to
+# print the original ARGV values in case of a warning, or error.
+#------------------------------------------------------------------------------
+my @CopyOfARGV = ();
+
+my %g_debug_size =
   (
     "on"  => $FALSE,
     "s"   => $FALSE,
@@ -219,7 +316,10 @@ my %local_system_config =
     hostname_current  => "undefined",
   );
 
-# Note that we use single quotes here, because regular expressions wreak havoc otherwise.
+#------------------------------------------------------------------------------
+# Note that we use single quotes here, because regular expressions wreak
+# havoc otherwise.
+#------------------------------------------------------------------------------
 
 my %g_arch_specific_settings =
   (
@@ -269,7 +369,7 @@ my %g_html_base_file_name = (
 );
 
 #------------------------------------------------------------------------------
-# This is cosmetic, but helps with the scoping of variables.
+# Introducing main() is cosmetic, but helps with the scoping of variables.
 #------------------------------------------------------------------------------
   main ();
 
@@ -282,6 +382,8 @@ sub main
 {
   my $subr_name = get_my_name ();
 
+  @CopyOfARGV = @ARGV;
+
 #------------------------------------------------------------------------------
 # The name of the configuration file.
 #------------------------------------------------------------------------------
@@ -289,9 +391,12 @@ sub main
 
 #------------------------------------------------------------------------------
 # OS commands executed and search paths.
+#
+# TBD: check if elfdump should be here too (most likely not though)
 #------------------------------------------------------------------------------
-  my @selected_os_cmds = qw (rm mv cat hostname locale which printenv ls
-                             uname readelf mkdir);
+  my @selected_os_cmds = qw (rm cat hostname locale which printenv uname
+                            readelf mkdir);
+
   my @search_paths_os_cmds = qw (
     /usr/bin
     /bin
@@ -310,11 +415,11 @@ sub main
 #------------------------------------------------------------------------------
 # Local structures (hashes and arrays).
 #------------------------------------------------------------------------------
-  my @exp_dir_list; # List with experiment directories
+  my @exp_dir_list = ();
   my @metrics_data;
 
   my %function_address_info = ();
-  my $function_address_info_ref; 
+  my $function_address_info_ref;
 
   my @function_info = ();
   my $function_info_ref;
@@ -340,22 +445,19 @@ sub main
 #------------------------------------------------------------------------------
 # Local variables.
 #------------------------------------------------------------------------------
-  my $abs_path_outputdir; 
+  my $abs_path_outputdir;
   my $archive_dir_not_empty;
-  my $base_va_executable; 
+  my $base_va_executable;
   my $executable_name;
-  my $exp_dir_list_ref;
   my $found_exp_dir;
   my $ignore_value;
-  my $message;
+  my $msg;
   my $number_of_metrics;
   my $va_executable_in_hex;
 
-  my $failed_command_mappings; 
-  my $option_errors;
-  my $total_user_errors;
+  my $failed_command_mappings;
 
-  my $script_pc_metrics; 
+  my $script_pc_metrics;
   my $dir_check_errors;
   my $consistency_errors;
   my $outputdir;
@@ -367,7 +469,7 @@ sub main
   my $elf_arch;
   my $elf_support;
   my $home_dir;
-  my $elf_loadobjects_found; 
+  my $elf_loadobjects_found;
 
   my $rc_file_paths_ref;
   my @rc_file_paths = ();
@@ -380,9 +482,15 @@ sub main
   my $system_metrics;
   my $wall_metrics;
   my $detail_metrics;
-  my $detail_metrics_system; 
+  my $detail_metrics_system;
+
+  my $html_test;
+  my @experiment_data;
+  my $exp_info_file;
+  my $exp_info_ref;
+  my @exp_info;
 
-  my $pretty_dir_list; 
+  my $pretty_dir_list;
 
   my %metric_value       = ();
   my %metric_description = ();
@@ -416,12 +524,12 @@ sub main
 #------------------------------------------------------------------------------
   if ($#ARGV == -1)
     {
-      $ignore_value = print_help_info (); 
+      $ignore_value = print_help_info ();
       return (0);
     }
 
 #------------------------------------------------------------------------------
-# This part is like a preamble.  Before we continue we need to figure out some 
+# This part is like a preamble.  Before we continue we need to figure out some
 # things that are needed later on.
 #------------------------------------------------------------------------------
 
@@ -431,214 +539,157 @@ sub main
   my $location_gp_command = $0;
 
 #------------------------------------------------------------------------------
-# The very first thing to do is to quickly determine if the user has enabled 
-# one of the following options and take action accordingly:
-# --version, --verbose, --debug, --quiet
+# Get the ball rolling. Parse and interpret the options.  Some first checks
+# are performed.
 #
-# This avoids that there is a gap between the start of the execution and the
-# moment the options are parsed, checked, and interpreted.
+# Instead of bailing out on the first user error, we capture all warnings and
+# errors.  The warnings, if any, will be printed once the command line has
+# been parsed and verified.  Execution continues.
 #
-# When parsing the full command line, these options will be more extensively
-# checked and also updated in %g_user_settings
-
-# Note that a confirmation message, if any, is printed here and not when the 
-# options are parsed and processed.
-#------------------------------------------------------------------------------
-
-  $g_verbose  = $g_user_settings{"verbose"}{"current_value"} eq "on" ? $TRUE : $FALSE;
-  $g_warnings = $g_user_settings{"warnings"}{"current_value"} eq "on" ? $TRUE : $FALSE;
-  $g_quiet    = $g_user_settings{"quiet"}{"current_value"} eq "on" ? $TRUE : $FALSE;
-
-  $ignore_value = early_scan_specific_options ();
-
-#------------------------------------------------------------------------------
-# The next subroutine is executed early to ensure the OS commands we need are 
-# available.
+# Any error(s) accumulated in this phase will be printed after the command
+# line has been parsed and verified.  Execution is then terminated.
 #
-# This subroutine stores the commands and the full path names as an associative
-# array called "g_mapped_cmds".  The command is the key and the value is the full 
-# path.  For example: ("uname", /usr/bin/uname).
+# In the remainder, any error encountered will immediately terminate the
+# execution because we can't guarantee the remaining code will work up to
+# some point.
 #------------------------------------------------------------------------------
-  $failed_command_mappings = check_and_define_cmds (\@selected_os_cmds, \@search_paths_os_cmds);
+  my ($found_exp_dir_ref, $exp_dir_list_ref) = parse_and_check_user_options ();
 
-  if ($failed_command_mappings == 0)
+  $found_exp_dir = ${ $found_exp_dir_ref };
+
+  if ($found_exp_dir)
     {
-      gp_message ("debug", $subr_name, "verified the OS commands");
+      @exp_dir_list = @{ $exp_dir_list_ref };
     }
   else
     {
-      my $msg = "failure in the verification of the OS commands";
-      gp_message ("assertion", $subr_name, $msg);
+      $msg = "the list with experiments is either missing, or incorrect";
+      gp_message ("debug", $subr_name, $msg);
     }
 
 #------------------------------------------------------------------------------
-# Get the home directory and the locations for the configuration file on the 
-# current system.
-#------------------------------------------------------------------------------
-  ($home_dir, $rc_file_paths_ref) = get_home_dir_and_rc_path ($rc_file_name);
-
-  @rc_file_paths = @{ $rc_file_paths_ref };
-  gp_message ("debug", $subr_name, "the home directory is $home_dir");
-  gp_message ("debugXL", $subr_name, "the search path for the rc file is @rc_file_paths");
-
-  $pretty_dir_list = build_pretty_dir_list (\@rc_file_paths);
-
-#------------------------------------------------------------------------------
-# Get the ball rolling.  Parse and interpret the configuration file (if any)
-# and the command line options.
-#
-# If either $rc_file_errors or $total_user_errors, or both, are non-zero it
-# means a fatal error has occured. In this case, all error messages are 
-# printed and execution is terminated.
-#
-# Note that the verbose, debug, and quiet options can be set in this file.
-# It is a deliberate choice to ignore these for now.  The assumption is that
-# the user will not be happy if we ignore the command line settings for a
-# while.
+# The final settings for verbose, debug, warnings and quiet are known and the
+# gp_message() subroutine is aware of these.
 #------------------------------------------------------------------------------
-
-  gp_message ("debugXL", $subr_name, "processing of the rc file disabled for now");
-
-# Temporarily disabled  print_table_user_settings ("debugXL", "before function process_rc_file");
-# Temporarily disabled
-# Temporarily disabled  $rc_file_errors = process_rc_file ($rc_file_name, $rc_file_paths_ref);
-# Temporarily disabled  
-# Temporarily disabled  if ($rc_file_errors != 0)
-# Temporarily disabled    {
-# Temporarily disabled      $message = "fatal errors in file $rc_file_name encountered";
-# Temporarily disabled      gp_message ("debugXL", $subr_name, $message);
-# Temporarily disabled    }
-# Temporarily disabled
-# Temporarily disabled  print_table_user_settings ("debugXL", "after function process_rc_file");
+  $msg = "parsing of the user options completed";
+  gp_message ("verbose", $subr_name, $msg);
 
 #------------------------------------------------------------------------------
-# Get the ball rolling. Parse and interpret the options.  Some first checks
-# are performed.
-#
-# Instead of bailing out on the first user error, we capture all errors, print
-# messages and then bail out. This is more user friendly.
+# The user options have been taken in.  Check for validity and consistency.
 #------------------------------------------------------------------------------
-  gp_message ("verbose", $subr_name, "Parse the user options");
+  $msg = "process user options";
+  gp_message ("verbose", $subr_name, $msg);
 
-  $total_user_errors = 0;
+  ($ignored_metrics_ref, $outputdir,
+   $time_percentage_multiplier, $process_all_functions, $exp_dir_list_ref) =
+                                       process_user_options (\@exp_dir_list);
 
-  ($option_errors, $found_exp_dir, $exp_dir_list_ref) = parse_and_check_user_options (
-                                                          \$#ARGV, 
-                                                          \@ARGV);
-  $total_user_errors += $option_errors;
+  @exp_dir_list    = @{ $exp_dir_list_ref };
+  %ignored_metrics = %{$ignored_metrics_ref};
 
 #------------------------------------------------------------------------------
-# Dynamically load the modules needed.  If a module is not available, print 
-# an error message and bail out.
-#
-# This call replaces the following:
-#
-# use feature qw (state);
-# use List::Util qw (min max);
-# use Cwd;
-# use File::Basename;
-# use File::stat;
-# use POSIX;
-# use bignum;
+# The next subroutine is executed early to ensure the OS commands we need are
+# available.
 #
-# Note that this check cannot be done earlier, because in case of a missing 
-# module, the man page would not be generated if the code ends prematurely
-# in case the --help and --version options are used..
+# This subroutine stores the commands and the full path names as an
+# associative array called "g_mapped_cmds".  The command is the key and the
+# value is the full path.  For example: ("uname", /usr/bin/uname).
 #------------------------------------------------------------------------------
-  my ($module_errors_ref, $missing_modules_ref) = handle_module_availability ();
-  my $module_errors = ${ $module_errors_ref };
+  gp_message ("debug", $subr_name, "verify the OS commands");
+  $failed_command_mappings = check_and_define_cmds (\@selected_os_cmds,
+                                                   \@search_paths_os_cmds);
 
-  if ($module_errors > 0)
+  if ($failed_command_mappings == 0)
     {
-      my $msg;
-
-      my $plural_or_single = ($module_errors > 1) ? "modules are" : "module is";
-      my @missing_modules = @{ $missing_modules_ref };
-
-      for my $i (0 .. $#missing_modules)
-        {
-          $msg = "module $missing_modules[$i] is missing";
-          gp_message ("error", $subr_name, $msg);
-        }
-      
-      $msg = $module_errors . " " . $plural_or_single  .
-             "missing - execution is terminated";
-      gp_message ("abort", $subr_name, $msg);
+      $msg = "successfully verified the OS commands";
+      gp_message ("debug", $subr_name, $msg);
     }
 
 #------------------------------------------------------------------------------
-# The user options have been taken in.  Check for validity and consistency.
 #------------------------------------------------------------------------------
-  gp_message ("verbose", $subr_name, "Process user options");
-
-  ($option_errors, $ignored_metrics_ref, $outputdir, 
-   $time_percentage_multiplier, $process_all_functions,
-   $exp_dir_list_ref) = process_user_options ($exp_dir_list_ref);
-
-  @exp_dir_list = @{ $exp_dir_list_ref };
-  %ignored_metrics = %{$ignored_metrics_ref};
-
-  $total_user_errors += $option_errors;
-
+# Time to check if any warnings and/or errors have been generated.
 #------------------------------------------------------------------------------
-# If no option is given for the output directory, pick a default.  Otherwise,
-# if the output directory exists, wipe it clean in case the -O option is used.
-# If not, flag an error because the -o option does not overwrite an existing
-# directory.
 #------------------------------------------------------------------------------
-  if ($total_user_errors == 0)
-    {
-      ($option_errors, $outputdir) = set_up_output_directory ();
-      $abs_path_outputdir = cwd () . "/" . $outputdir;
-      $total_user_errors += $option_errors;
-    }
 
-  if ($total_user_errors == 0)
-    {
-      gp_message ("debug", $subr_name, "the output directory is $outputdir");
-    }
-  else
-    {
 #------------------------------------------------------------------------------
-# All command line errors and warnings are printed here.
+# We have completed all the upfront checks.  Print any warnings and errors.
+# If there are already any errors, execution is terminated.  As execution
+# continues, errors may occur and they are typically fatal.
 #------------------------------------------------------------------------------
-      my $plural_or_single = ($total_user_errors > 1) ? "errors have" : "error has";
-      $message  =  $g_error_keyword;
-      $message .=  $total_user_errors;
-      if ($rc_file_errors > 0)
-        {
-          $message .=  " additional";
-        }
-      $message .=  " fatal input $plural_or_single been detected:";
-      gp_message ("error", $subr_name, $message);
-      for my $key (keys @g_user_input_errors)
-        {
-          gp_message ("error", $subr_name, "$g_error_keyword  $g_user_input_errors[$key]");
-        }
+  if ($g_debug)
+    {
+      $msg = "internal settings after option processing";
+      $ignore_value = print_table_user_settings ("diag", $msg);
     }
 
 #------------------------------------------------------------------------------
-# Bail out in case fatal errors have occurred.
+# Terminate execution in case fatal errors have occurred.
 #------------------------------------------------------------------------------
-  if ( ($rc_file_errors + $total_user_errors) > 0)
+  if ( $g_total_error_count > 0)
     {
       my $msg = "the current values for the user controllable settings";
       print_user_settings ("debug", $msg);
 
-      gp_message ("abort", $subr_name, "execution terminated");
+      gp_message ("abort", $subr_name, $g_abort_msg);
     }
   else
     {
       my $msg = "after parsing the user options, the final values are";
       print_user_settings ("debug", $msg);
+    }
+
+#------------------------------------------------------------------------------
+# If no option is given for the output directory, pick a default.  Otherwise,
+# if the output directory exists, wipe it clean in case the -O option is used.
+# If not, raise an error because the -o option does not overwrite an existing
+# directory.
+# Also in case of other errors, the execution is terminated.
+#------------------------------------------------------------------------------
+  $outputdir = set_up_output_directory ();
+  $abs_path_outputdir = Cwd::cwd () . "/" . $outputdir;
+
+  $msg = "the output directory is $outputdir";
+  gp_message ("debug", $subr_name, $msg);
 
 #------------------------------------------------------------------------------
-# TBD: Enable once all planned features have been implemented and tested.
+# Get the home directory and the locations for the configuration file on the
+# current system.
 #------------------------------------------------------------------------------
-# Temporarily disabled      $msg = "the final values for the user controllable settings";
-# Temporarily disabled      print_table_user_settings ("verbose", $msg);
-    }
+  ($home_dir, $rc_file_paths_ref) = get_home_dir_and_rc_path ($rc_file_name);
+
+  @rc_file_paths = @{ $rc_file_paths_ref };
+
+  $msg = "the home directory is $home_dir";
+  gp_message ("debug", $subr_name, $msg);
+
+#------------------------------------------------------------------------------
+# TBD: de-activated until this feature has been fully implemented.
+#------------------------------------------------------------------------------
+##  $msg =  "the search path for the rc file is @rc_file_paths";
+##  gp_message ("debug", $subr_name, $msg);
+##  $pretty_dir_list = build_pretty_dir_list (\@rc_file_paths);
+
+#------------------------------------------------------------------------------
+# Get the ball rolling.  Parse and interpret the configuration file (if any)
+# and the command line options.
+#
+# Note that the verbose, debug, and quiet options can be set in this file.
+# It is a deliberate choice to ignore these for now.  The assumption is that
+# the user will not be happy if we ignore the command line settings for a
+# while.
+#------------------------------------------------------------------------------
+  $msg = "processing of the rc file has been disabled for now";
+  gp_message ("debugXL", $subr_name, $msg);
+
+# Temporarily disabled
+# print_table_user_settings ("debugXL", "before function process_rc_file");
+# $rc_file_errors = process_rc_file ($rc_file_name, $rc_file_paths_ref);
+# if ($rc_file_errors != 0)
+# {
+#   $message = "fatal errors in file $rc_file_name encountered";
+#   gp_message ("debugXL", $subr_name, $message);
+# }
+# print_table_user_settings ("debugXL", "after function process_rc_file");
 
 #------------------------------------------------------------------------------
 # Print a list with the experiment directory names
@@ -647,7 +698,8 @@ sub main
 
   my $plural = ($#exp_dir_list > 0) ? "directories are" : "directory is";
 
-  gp_message ("verbose", $subr_name, "The experiment " . $plural . ":");
+  $msg = "the experiment " . $plural . ":";
+  gp_message ("verbose", $subr_name, $msg);
   gp_message ("verbose", $subr_name, $pretty_dir_list);
 
 #------------------------------------------------------------------------------
@@ -657,73 +709,77 @@ sub main
   for my $exp_dir (@exp_dir_list)
     {
      my ($filename, $directory_path, $ignore_suffix) = fileparse ($exp_dir);
-     gp_message ("debug", $subr_name, "exp_dir = $exp_dir"); 
-     gp_message ("debug", $subr_name, "filename = $filename"); 
-     gp_message ("debug", $subr_name, "directory_path = $directory_path"); 
-     $g_exp_dir_meta_data{$filename}{"directory_path"} = $directory_path; 
+     gp_message ("debug", $subr_name, "exp_dir = $exp_dir");
+     gp_message ("debug", $subr_name, "filename = $filename");
+     gp_message ("debug", $subr_name, "directory_path = $directory_path");
+     $g_exp_dir_meta_data{$filename}{"directory_path"} = $directory_path;
     }
 
 #------------------------------------------------------------------------------
-# Check whether the experiment directories are valid.  If not, it is a fatal
-# error.
-# Upon successful return, one directory has been selected to be used in the
-# remainder.  This is not always the correct thing to do, but is the same as
-# the original code.  In due time this should be addressed though.
+# TBD:
+# This subroutine may be overkill.  See what is really needed here and remove
+# everything else.
+#
+# Upon return, one directory has been selected to be used in the remainder.
+# This is not always the correct thing to do, but is the same as the original
+# code.  In due time this should be addressed though.
 #------------------------------------------------------------------------------
-  ($dir_check_errors, $archive_dir_not_empty, $selected_archive, 
-   $elf_rats_ref) = check_validity_exp_dirs ($exp_dir_list_ref);
-
-  if ($dir_check_errors)
-    {
-      gp_message ("abort", $subr_name, "execution terminated");
-    }
-  else
-    {
-      gp_message ("verbose", $subr_name, "The experiment directories have been verified and are valid");
-    }
+  ($archive_dir_not_empty, $selected_archive, $elf_rats_ref) =
+                               check_validity_exp_dirs (\@exp_dir_list);
 
   %elf_rats = %{$elf_rats_ref};
 
-#-------------------------------------------------------------------------------
+  $msg = "the experiment directories have been verified and are valid";
+  gp_message ("verbose", $subr_name, $msg);
+
+#------------------------------------------------------------------------------
 # Now that we know the map.xml file(s) are present, we can scan these and get
 # the required information.  This includes setting the base virtual address.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   $ignore_value = determine_base_virtual_address ($exp_dir_list_ref);
 
 #------------------------------------------------------------------------------
 # Check whether the experiment directories are consistent.
 #------------------------------------------------------------------------------
-  ($consistency_errors, $executable_name) = verify_consistency_experiments ($exp_dir_list_ref);
+  ($consistency_errors, $executable_name) =
+                       verify_consistency_experiments ($exp_dir_list_ref);
 
   if ($consistency_errors == 0)
     {
-      gp_message ("verbose", $subr_name, "The experiment directories are consistent");
+      $msg = "the experiment directories are consistent";
+      gp_message ("verbose", $subr_name, $msg);
     }
   else
     {
-      gp_message ("abort", $subr_name, "number of consistency errors detected: $consistency_errors"); 
+      $msg  = "the number of consistency errors detected: $consistency_errors";
+      gp_message ("abort", $subr_name, $msg);
     }
 
 #------------------------------------------------------------------------------
 # The directories are consistent.  We can now set the base virtual address of
 # the executable.
 #------------------------------------------------------------------------------
-  $base_va_executable = $g_exp_dir_meta_data{$selected_archive}{"va_base_in_hex"}; 
+  $base_va_executable =
+               $g_exp_dir_meta_data{$selected_archive}{"va_base_in_hex"};
 
-  gp_message ("debug", $subr_name, "executable_name    = $executable_name");
-  gp_message ("debug", $subr_name, "selected_archive = $selected_archive");
-  gp_message ("debug", $subr_name, "base_va_executable = $base_va_executable");
+  $msg = "executable_name    = " . $executable_name;
+  gp_message ("debug", $subr_name, $msg);
+  $msg = "selected_archive   = " . $selected_archive;
+  gp_message ("debug", $subr_name, $msg);
+  $msg = "base_va_executable = " . $base_va_executable;
+  gp_message ("debug", $subr_name, $msg);
 
 #------------------------------------------------------------------------------
-# The $GP_DISPLAY_TEXT tool is critical and has to be available in order 
-# to proceed.
-# This subroutine only returns a value if the tool can be found."
+# The $GP_DISPLAY_TEXT tool is critical and has to be available in order to
+# proceed.
+# This subroutine only returns a value if the tool can be found.
 #------------------------------------------------------------------------------
   $g_path_to_tools = ${ check_availability_tool (\$location_gp_command)};
 
   $GP_DISPLAY_TEXT = $g_path_to_tools . $GP_DISPLAY_TEXT;
 
-  gp_message ("debug", $subr_name, "updated GP_DISPLAY_TEXT = $GP_DISPLAY_TEXT");
+  $msg = "updated GP_DISPLAY_TEXT = $GP_DISPLAY_TEXT";
+  gp_message ("debug", $subr_name, $msg);
 
 #------------------------------------------------------------------------------
 # Check if $GP_DISPLAY_TEXT is executable for user, group, and other.
@@ -732,35 +788,38 @@ sub main
 #------------------------------------------------------------------------------
   if (not is_file_executable ($GP_DISPLAY_TEXT))
     {
-      my $msg = "file $GP_DISPLAY_TEXT is not executable for user, group, and other";
+      $msg  = "file $GP_DISPLAY_TEXT is not executable for user, group, and";
+      $msg .= " other";
       gp_message ("warning", $subr_name, $msg);
     }
 
 #------------------------------------------------------------------------------
 # Find out what the decimal separator is, as set by the user.
 #------------------------------------------------------------------------------
-  ($return_code, $decimal_separator, $convert_to_dot) = 
+  ($return_code, $decimal_separator, $convert_to_dot) =
                                                 determine_decimal_separator ();
 
   if ($return_code == 0)
     {
-      my $txt  = "decimal separator is $decimal_separator " . 
-                 "(conversion to dot is " .
-                 ($convert_to_dot == $TRUE ? "enabled" : "disabled").")";
-      gp_message ("debugXL", $subr_name, $txt);
+      $msg  = "decimal separator is $decimal_separator";
+      $msg .= " (conversion to dot is ";
+      $msg .= ($convert_to_dot == $TRUE ? "enabled" : "disabled") . ")";
+      gp_message ("debugXL", $subr_name, $msg);
     }
   else
     {
-      my $msg = "the decimal separator cannot be determined - set to $decimal_separator";
+      $msg  = "the decimal separator cannot be determined -";
+      $msg .= " set to $decimal_separator";
       gp_message ("warning", $subr_name, $msg);
     }
 
 #------------------------------------------------------------------------------
 # Collect and store the system information.
 #------------------------------------------------------------------------------
-  gp_message ("verbose", $subr_name, "Collect system information and adapt settings");
+  $msg = "collect system information and adapt settings";
+  gp_message ("verbose", $subr_name, $msg);
 
-  $return_code = get_system_config_info (); 
+  $return_code = get_system_config_info ();
 
 #------------------------------------------------------------------------------
 # The 3 variables below are used in the remainder.
@@ -775,20 +834,25 @@ sub main
   gp_message ("debug", $subr_name, "set arch_uname_s     = $arch_uname_s");
   gp_message ("debug", $subr_name, "set arch_uname       = $arch_uname");
 
-#-------------------------------------------------------------------------------
-# This function also sets the values in "g_arch_specific_settings".  This 
+#------------------------------------------------------------------------------
+# This function also sets the values in "g_arch_specific_settings".  This
 # includes several definitions of regular expressions.
-#-------------------------------------------------------------------------------
-  ($architecture_supported, $elf_arch, $elf_support) = 
-                     set_system_specific_variables ($arch_uname, $arch_uname_s);
+#------------------------------------------------------------------------------
+  ($architecture_supported, $elf_arch, $elf_support) =
+               set_system_specific_variables ($arch_uname, $arch_uname_s);
 
-  gp_message ("debug", $subr_name, "architecture_supported = $architecture_supported");
-  gp_message ("debug", $subr_name, "elf_arch               = $elf_arch");
-  gp_message ("debug", $subr_name, "elf_support            = ".($elf_arch ? "TRUE" : "FALSE"));
+  $msg = "architecture_supported = $architecture_supported";
+  gp_message ("debug", $subr_name, $msg);
+  $msg = "elf_arch               = $elf_arch";
+  gp_message ("debug", $subr_name, $msg);
+  $msg = "elf_support            = ".($elf_arch ? "TRUE" : "FALSE");
+  gp_message ("debug", $subr_name, $msg);
 
   for my $feature (sort keys %g_arch_specific_settings)
     {
-      gp_message ("debug", $subr_name, "g_arch_specific_settings{$feature} = $g_arch_specific_settings{$feature}");
+      $msg  = "g_arch_specific_settings{$feature} = ";
+      $msg .= $g_arch_specific_settings{$feature};
+      gp_message ("debug", $subr_name, $msg);
     }
 
   $arch       = $g_arch_specific_settings{"arch"};
@@ -797,7 +861,8 @@ sub main
 
   $g_locale_settings{"LANG"} =  get_LANG_setting ();
 
-  gp_message ("debugXL", $subr_name, "after get_LANG_setting: LANG = $g_locale_settings{'LANG'}");
+  $msg = "after get_LANG_setting: LANG = $g_locale_settings{'LANG'}";
+  gp_message ("debugXL", $subr_name, $msg);
 
 #------------------------------------------------------------------------------
 # Temporarily reset selected settings since these are not yet implemented.
@@ -808,19 +873,28 @@ sub main
 # TBD: Revisit. Is this really necessary?
 #------------------------------------------------------------------------------
 
-  ($executable_name, $va_executable_in_hex) = check_loadobjects_are_elf ($selected_archive);
+  ($executable_name, $va_executable_in_hex) =
+                               check_loadobjects_are_elf ($selected_archive);
   $elf_loadobjects_found = $TRUE;
 
 # TBD: Hack and those ARCHIVES_ names can be eliminated
   $ARCHIVES_MAP_NAME  = $executable_name;
   $ARCHIVES_MAP_VADDR = $va_executable_in_hex;
-  gp_message ("debugXL", $subr_name, "hack ARCHIVES_MAP_NAME  = $ARCHIVES_MAP_NAME");
-  gp_message ("debugXL", $subr_name, "hack ARCHIVES_MAP_VADDR = $ARCHIVES_MAP_VADDR");
 
-  gp_message ("debugXL", $subr_name, "after call to check_loadobjects_are_elf forced elf_loadobjects_found = $elf_loadobjects_found");
-  
+  $msg = "hack ARCHIVES_MAP_NAME  = $ARCHIVES_MAP_NAME";
+  gp_message ("debugXL", $subr_name, $msg);
+  $msg = "hack ARCHIVES_MAP_VADDR = $ARCHIVES_MAP_VADDR";
+  gp_message ("debugXL", $subr_name, $msg);
+
+  $msg  = "after call to check_loadobjects_are_elf forced";
+  $msg .= " elf_loadobjects_found = $elf_loadobjects_found";
+  gp_message ("debugXL", $subr_name, $msg);
+
   $g_html_credits_line = ${ create_html_credits () };
-  gp_message ("debugXL", $subr_name, "g_html_credits_line = $g_html_credits_line");
+
+  $msg = "g_html_credits_line = $g_html_credits_line";
+  gp_message ("debugXL", $subr_name, $msg);
+
 #------------------------------------------------------------------------------
 # Add a "/" to simplify the construction of path names in the remainder.
 #
@@ -841,7 +915,7 @@ sub main
   $detail_metrics_system = 'e.totalcpu:e.system';
   $call_metrics          = 'a.totalcpu';
 
-  my $cmd_options; 
+  my $cmd_options;
   my $metrics_cmd;
 
   my $outfile1      = $outputdir   ."metrics";
@@ -853,9 +927,11 @@ sub main
 # to get all the output in files $outfile1 and $outfile2.  These are then
 # parsed.
 #------------------------------------------------------------------------------
-  gp_message ("verbose", $subr_name, "Gather the metrics data from the experiments");
+  $msg = "gather the metrics data from the experiments";
+  gp_message ("verbose", $subr_name, $msg);
 
-  $return_code = get_metrics_data (\@exp_dir_list, $outputdir, $outfile1, $outfile2, $gp_error_file);
+  $return_code = get_metrics_data (\@exp_dir_list, $outputdir, $outfile1,
+                                  $outfile2, $gp_error_file);
 
   if ($return_code != 0)
     {
@@ -865,8 +941,11 @@ sub main
 #------------------------------------------------------------------------------
 # TBD: Test this code
 #------------------------------------------------------------------------------
-  open (METRICS, "<", $outfile1) 
-    or die ("$subr_name - unable to open metric value data file $outfile1 for reading: '$!'");
+  $msg = "unable to open metric value data file $outfile1 for reading:";
+  open (METRICS, "<", $outfile1)
+    or die ($subr_name . " - " . $msg . " " . $!);
+
+  $msg = "opened file $outfile1 for reading";
   gp_message ("debug", $subr_name, "opened file $outfile1 for reading");
 
   chomp (@metrics_data = <METRICS>);
@@ -874,7 +953,8 @@ sub main
 
   for my $i (keys @metrics_data)
     {
-      gp_message ("debugXL", $subr_name, "metrics_data[$i] = $metrics_data[$i]");
+      $msg = "metrics_data[$i] = " . $metrics_data[$i];
+      gp_message ("debugXL", $subr_name, $msg);
     }
 
 #------------------------------------------------------------------------------
@@ -888,7 +968,7 @@ sub main
     {
       gp_message ("verbose", $subr_name, "Process the metrics data");
 
-      ($metric_value_ref, $metric_description_ref, $metric_found_ref, 
+      ($metric_value_ref, $metric_description_ref, $metric_found_ref,
        $user_metrics, $system_metrics, $wall_metrics,
        $summary_metrics, $detail_metrics, $detail_metrics_system, $call_metrics
        ) = process_metrics_data ($outfile1, $outfile2, \%ignored_metrics);
@@ -898,14 +978,19 @@ sub main
       %metric_found                = %{ $metric_found_ref };
       %metric_description_reversed = reverse %metric_description;
 
-      gp_message ("debugXL", $subr_name, "after the call to process_metrics_data");
+      $msg = "after the call to process_metrics_data";
+      gp_message ("debugXL", $subr_name, $msg);
+
       for my $metric (sort keys %metric_value)
         {
-          gp_message ("debugXL", $subr_name, "metric_value{$metric} = $metric_value{$metric}");
+          $msg = "metric_value{$metric} = " . $metric_value{$metric};
+          gp_message ("debugXL", $subr_name, $msg);
         }
       for my $metric (sort keys %metric_description)
         {
-          gp_message ("debugXL", $subr_name, "metric_description{$metric} = $metric_description{$metric}");
+          $msg  = "metric_description{$metric} =";
+          $msg .= " " . $metric_description{$metric};
+          gp_message ("debugXL", $subr_name, $msg);
         }
       gp_message ("debugXL", $subr_name, "user_metrics   = $user_metrics");
       gp_message ("debugXL", $subr_name, "system_metrics = $system_metrics");
@@ -918,9 +1003,10 @@ sub main
 #
 # TBD: These should be OS dependent.
 #------------------------------------------------------------------------------
-      gp_message ("verbose", $subr_name, "Select the set of default metrics"); 
+      $msg = "select the set of default metrics";
+      gp_message ("verbose", $subr_name, $msg);
 
-      ($metric_description_ref, $metric_found_ref, $summary_metrics, 
+      ($metric_description_ref, $metric_found_ref, $summary_metrics,
        $detail_metrics, $detail_metrics_system, $call_metrics
        ) = set_default_metrics ($outfile1, \%ignored_metrics);
 
@@ -929,51 +1015,54 @@ sub main
       %metric_found                = %{ $metric_found_ref };
       %metric_description_reversed = reverse %metric_description;
 
-      gp_message ("debug", $subr_name, "after the call to set_default_metrics");
+      $msg = "after the call to set_default_metrics";
+      gp_message ("debug", $subr_name, $msg);
 
     }
 
   $number_of_metrics = split (":", $summary_metrics);
 
-  gp_message ("debugXL", $subr_name, "summary_metrics       = $summary_metrics");
-  gp_message ("debugXL", $subr_name, "detail_metrics        = $detail_metrics");
-  gp_message ("debugXL", $subr_name, "detail_metrics_system = $detail_metrics_system");
-  gp_message ("debugXL", $subr_name, "call_metrics          = $call_metrics");
-  gp_message ("debugXL", $subr_name, "number_of_metrics = $number_of_metrics");
+  $msg = "summary_metrics       = " . $summary_metrics;
+  gp_message ("debugXL", $subr_name, $msg);
+  $msg = "detail_metrics        = " . $detail_metrics;
+  gp_message ("debugXL", $subr_name, $msg);
+  $msg = "detail_metrics_system = " . $detail_metrics_system;
+  gp_message ("debugXL", $subr_name, $msg);
+  $msg = "call_metrics          = " . $call_metrics;
+  gp_message ("debugXL", $subr_name, $msg);
+  $msg = "number_of_metrics     = " . $number_of_metrics;
+  gp_message ("debugXL", $subr_name, $msg);
 
 #------------------------------------------------------------------------------
 # TBD Find a way to better handle this situation:
 #------------------------------------------------------------------------------
   for my $im (keys %metric_found)
     {
-      gp_message ("debugXL", $subr_name, "metric_found{$im} = $metric_found{$im}");
+      $msg = "metric_found{$im} = " . $metric_found{$im};
+      gp_message ("debugXL", $subr_name, $msg);
     }
   for my $im (keys %ignored_metrics)
     {
       if (not exists ($metric_found{$im}))
         {
-          gp_message ("debugXL", $subr_name, "user requested ignored metric (-im) $im does not exist in collected metrics");
+          $msg  = "user requested ignored metric (-im) $im does not exist in";
+          $msg .= " collected metrics";
+          gp_message ("debugXL", $subr_name, $msg);
         }
     }
 
 #------------------------------------------------------------------------------
 # Get the information on the experiments.
 #------------------------------------------------------------------------------
-  gp_message ("verbose", $subr_name, "Generate the experiment information");
-  
-  my $exp_info_file_ref;
-  my $exp_info_file;
-  my $exp_info_ref;
-  my @exp_info;
-
-  my $experiment_data_ref;
+  $msg = "generate the experiment information";
+  gp_message ("verbose", $subr_name, $msg);
 
-  $experiment_data_ref = get_experiment_info (\$outputdir, \@exp_dir_list);
-  my @experiment_data = @{ $experiment_data_ref };
+  my $experiment_data_ref = get_experiment_info (\$outputdir, \@exp_dir_list);
+  @experiment_data = @{ $experiment_data_ref };
 
   for my $i (sort keys @experiment_data)
     {
-      my $msg = "i = $i " . $experiment_data[$i]{"exp_id"} . " => " . 
+      my $msg = "i = $i " . $experiment_data[$i]{"exp_id"} . " => " .
                 $experiment_data[$i]{"exp_name_full"};
       gp_message ("debugM", $subr_name, $msg);
     }
@@ -991,21 +1080,21 @@ sub main
         }
     }
 
-  @g_html_experiment_stats = @{ create_exp_info (
-                                  \@exp_dir_list,
-                                  \@experiment_data) };
+  @g_html_experiment_stats = @{ create_exp_info (\@exp_dir_list,
+                                                \@experiment_data) };
 
-  $table_execution_stats_ref = html_generate_exp_summary (
-                                 \$outputdir, 
-                                 \@experiment_data);
+  $table_execution_stats_ref = html_generate_exp_summary (\$outputdir,
+                                                         \@experiment_data);
   @table_execution_stats = @{ $table_execution_stats_ref };
 
 #------------------------------------------------------------------------------
 # Get the function overview.
 #------------------------------------------------------------------------------
-  gp_message ("verbose", $subr_name, "Generate the list with functions executed");
+  $msg = "generate the list with functions executed";
+  gp_message ("verbose", $subr_name, $msg);
 
-  my ($outfile, $sort_fields_ref) = get_hot_functions (\@exp_dir_list, $summary_metrics, $outputdir);
+  my ($outfile, $sort_fields_ref) =
+             get_hot_functions (\@exp_dir_list, $summary_metrics, $outputdir);
 
   @sort_fields = @{$sort_fields_ref};
 
@@ -1013,11 +1102,12 @@ sub main
 # Parse the output from the fsummary command and store the relevant data for
 # all the functions listed there.
 #------------------------------------------------------------------------------
+  $msg = "analyze and store the relevant function information";
+  gp_message ("verbose", $subr_name, $msg);
 
-  gp_message ("verbose", $subr_name, "Analyze and store the relevant function information");
-
-  ($function_info_ref, $function_address_and_index_ref, $addressobjtextm_ref, 
-   $LINUX_vDSO_ref, $function_view_structure_ref) = get_function_info ($outfile);
+  ($function_info_ref, $function_address_and_index_ref, $addressobjtextm_ref,
+   $LINUX_vDSO_ref, $function_view_structure_ref) =
+                                               get_function_info ($outfile);
 
   @function_info              = @{ $function_info_ref };
   %function_address_and_index = %{ $function_address_and_index_ref };
@@ -1029,194 +1119,215 @@ sub main
     {
       for my $fields (keys %{$function_info[$keys]})
         {
-          gp_message ("debugXL", $subr_name,"$keys $fields $function_info[$keys]{$fields}");
+          $msg = "$keys $fields $function_info[$keys]{$fields}";
+          gp_message ("debugXL", $subr_name, $msg);
         }
     }
 
   for my $i (keys %addressobjtextm)
     {
-      gp_message ("debugXL", $subr_name,"addressobjtextm{$i} = $addressobjtextm{$i}");
+      $msg = "addressobjtextm{$i} = " . $addressobjtextm{$i};
+      gp_message ("debugXL", $subr_name, $msg);
     }
 
-  gp_message ("verbose", $subr_name, "Generate the files with function overviews and the callers-callees information"); 
+  $msg  = "generate the files with function overviews and the";
+  $msg .= " callers-callees information";
+  gp_message ("verbose", $subr_name, $msg);
 
-  $script_pc_metrics = generate_function_level_info (\@exp_dir_list, 
-                                                     $call_metrics, 
-                                                     $summary_metrics, 
-                                                     $outputdir, 
+  $script_pc_metrics = generate_function_level_info (\@exp_dir_list,
+                                                     $call_metrics,
+                                                     $summary_metrics,
+                                                     $outputdir,
                                                      $sort_fields_ref);
 
-  gp_message ("verbose", $subr_name, "Preprocess the files with the function level information");
+  $msg = "preprocess the files with the function level information";
+  gp_message ("verbose", $subr_name, $msg);
 
   $ignore_value = preprocess_function_files (
-                    $metric_description_ref, 
-                    $script_pc_metrics, 
-                    $outputdir, 
+                    $metric_description_ref,
+                    $script_pc_metrics,
+                    $outputdir,
                     \@sort_fields);
 
-  gp_message ("verbose", $subr_name, "For each function, generate a set of files");
-
-  ($function_info_ref, $function_address_info_ref, $addressobj_index_ref) = process_function_files (
-                                                                            \@exp_dir_list,
-                                                                            $executable_name,
-                                                                            $time_percentage_multiplier,
-                                                                            $summary_metrics,
-                                                                            $process_all_functions,
-                                                                            $elf_loadobjects_found, 
-                                                                            $outputdir, 
-                                                                            \@sort_fields, 
-                                                                            \@function_info, 
-                                                                            \%function_address_and_index,
-                                                                            \%LINUX_vDSO,
-                                                                            \%metric_description,
-                                                                            $elf_arch,
-                                                                            $base_va_executable,
-                                                                            $ARCHIVES_MAP_NAME, $ARCHIVES_MAP_VADDR, \%elf_rats);
+  $msg = "for each function, generate a set of files";
+  gp_message ("verbose", $subr_name, $msg);
+
+  ($function_info_ref, $function_address_info_ref, $addressobj_index_ref) =
+                       process_function_files (\@exp_dir_list,
+                                               $executable_name,
+                                               $time_percentage_multiplier,
+                                               $summary_metrics,
+                                               $process_all_functions,
+                                               $elf_loadobjects_found,
+                                               $outputdir,
+                                               \@sort_fields,
+                                               \@function_info,
+                                               \%function_address_and_index,
+                                               \%LINUX_vDSO,
+                                               \%metric_description,
+                                               $elf_arch,
+                                               $base_va_executable,
+                                               $ARCHIVES_MAP_NAME,
+                                               $ARCHIVES_MAP_VADDR,
+                                               \%elf_rats);
 
   @function_info         = @{ $function_info_ref };
   %function_address_info = %{ $function_address_info_ref };
   %addressobj_index      = %{ $addressobj_index_ref };
 
-#-------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Parse the disassembly information and generate the html files.
-#-------------------------------------------------------------------------------------
-  gp_message ("verbose", $subr_name, "Parse the disassembly files and generate the html files");
+#------------------------------------------------------------------------------
+  $msg = "parse the disassembly files and generate the html files";
+  gp_message ("verbose", $subr_name, $msg);
 
-  $ignore_value = parse_dis_files (\$number_of_metrics, \@function_info, 
-                   \%function_address_and_index,
-                   \$outputdir, \%addressobj_index);
+  $ignore_value = parse_dis_files (\$number_of_metrics,
+                                 \@function_info,
+                                 \%function_address_and_index,
+                                 \$outputdir,
+                                 \%addressobj_index);
 
-#-------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Parse the source information and generate the html files.
-#-------------------------------------------------------------------------------------
-  gp_message ("verbose", $subr_name, "Parse the source files and generate the html files");
+#------------------------------------------------------------------------------
+  $msg = "parse the source files and generate the html files";
+  gp_message ("verbose", $subr_name, $msg);
 
   parse_source_files (\$number_of_metrics, \@function_info, \$outputdir);
 
-#-------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Parse the caller-callee information and generate the html files.
-#-------------------------------------------------------------------------------------
-  gp_message ("verbose", $subr_name, "Process the caller-callee information and generate the html file");
+#------------------------------------------------------------------------------
+  $msg = "process the caller-callee information and generate the html file";
+  gp_message ("verbose", $subr_name, $msg);
 
-#-------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Generate the caller-callee information.
-#-------------------------------------------------------------------------------------
-  $ignore_value = generate_caller_callee (
-                    \$number_of_metrics, 
-                    \@function_info, 
-                    \%function_view_structure,
-                    \%function_address_info, 
-                    \%addressobjtextm, 
-                    \$outputdir);
-
-#-------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+  $ignore_value = generate_caller_callee (\$number_of_metrics,
+                                         \@function_info,
+                                         \%function_view_structure,
+                                         \%function_address_info,
+                                         \%addressobjtextm,
+                                         \$outputdir);
+
+#------------------------------------------------------------------------------
 # Parse the calltree information and generate the html files.
-#-------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   if ($g_user_settings{"calltree"}{"current_value"} eq "on")
     {
-      my $msg = "Process the call tree information and generate the html file";
+      $msg = "process the call tree information and generate the html file";
       gp_message ("verbose", $subr_name, $msg);
 
-      $ignore_value = process_calltree (
-                        \@function_info, 
-                        \%function_address_info, 
-                        \%addressobjtextm, 
-                        $outputdir);
+      $ignore_value = process_calltree (\@function_info,
+                                       \%function_address_info,
+                                       \%addressobjtextm,
+                                       $outputdir);
     }
 
-#-------------------------------------------------------------------------------------
-# TBD
-#-------------------------------------------------------------------------------------
-  gp_message ("verbose", $subr_name, "Generate the html file with the metrics information");
+#------------------------------------------------------------------------------
+# Process the metric values.
+#------------------------------------------------------------------------------
+  $msg = "generate the html file with the metrics information";
+  gp_message ("verbose", $subr_name, $msg);
 
-  $ignore_value = process_metrics (
-                    $outputdir, 
-                    \@sort_fields, 
-                    \%metric_description, 
-                    \%ignored_metrics);
+  $ignore_value = process_metrics ($outputdir,
+                                  \@sort_fields,
+                                  \%metric_description,
+                                  \%ignored_metrics);
 
-#-------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Generate the function view html files.
-#-------------------------------------------------------------------------------------
-  gp_message ("verbose", $subr_name, "Generate the function view html files");
+#------------------------------------------------------------------------------
+  $msg = "generate the function view html files";
+  gp_message ("verbose", $subr_name, $msg);
 
   $html_first_metric_file_ref = generate_function_view (
-                                  \$outputdir, 
-                                  \$summary_metrics, 
-                                  \$number_of_metrics, 
-                                  \@function_info, 
-                                  \%function_view_structure,
-                                  \%function_address_info, 
-                                  \@sort_fields, 
-                                  \@exp_dir_list, 
-                                  \%addressobjtextm);
+                                               \$outputdir,
+                                               \$summary_metrics,
+                                               \$number_of_metrics,
+                                               \@function_info,
+                                               \%function_view_structure,
+                                               \%function_address_info,
+                                               \@sort_fields,
+                                               \@exp_dir_list,
+                                               \%addressobjtextm);
 
   $html_first_metric_file = ${ $html_first_metric_file_ref };
 
-  gp_message ("debugXL", $subr_name, "html_first_metric_file = $html_first_metric_file");
+  $msg = "html_first_metric_file = " . $html_first_metric_file;
+  gp_message ("debugXL", $subr_name, $msg);
 
-  my $html_test = ${ generate_home_link ("left") };
-  gp_message ("debugXL", $subr_name, "html_test = $html_test");
+  $html_test = ${ generate_home_link ("left") };
+  $msg = "html_test = " . $html_test;
+  gp_message ("debugXL", $subr_name, $msg);
 
-  my $number_of_warnings_ref = create_html_warnings_page (\$outputdir);
+#------------------------------------------------------------------------------
+# Unconditionnaly generate the page with the warnings.
+#------------------------------------------------------------------------------
+  $ignore_value = html_create_warnings_page (\$outputdir);
 
-#-------------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Generate the index.html file.
-#-------------------------------------------------------------------------------------
-  gp_message ("verbose", $subr_name, "Generate the index.html file");
-
-  $ignore_value = generate_index (\$outputdir, 
-                                  \$html_first_metric_file,
-                                  \$summary_metrics, 
-                                  \$number_of_metrics, 
-                                  \@function_info, 
-                                  \%function_address_info, 
-                                  \@sort_fields, 
-                                  \@exp_dir_list, 
-                                  \%addressobjtextm, 
-                                  \%metric_description_reversed,
-                                  $number_of_warnings_ref,
-                                  \@table_execution_stats);
-
-#-------------------------------------------------------------------------------------
-# We're done.  In debug mode, print the meta data for the experiment directories.
-#-------------------------------------------------------------------------------------
-  $ignore_value = print_meta_data_experiments ("debug");
-
-  my $results_file = $abs_path_outputdir . "/index.html";
-  my $prologue_text = "Processing completed - view file $results_file in a browser";
-  gp_message ("diag", $subr_name, $prologue_text);
-
-  return (0);
+#------------------------------------------------------------------------------
+  $msg = "generate the index.html file";
+  gp_message ("verbose", $subr_name, $msg);
 
-} #-- End of subroutine main
+  $ignore_value = html_generate_index (\$outputdir,
+                                      \$html_first_metric_file,
+                                      \$summary_metrics,
+                                      \$number_of_metrics,
+                                      \@function_info,
+                                      \%function_address_info,
+                                      \@sort_fields,
+                                      \@exp_dir_list,
+                                      \%addressobjtextm,
+                                      \%metric_description_reversed,
+                                      \@table_execution_stats);
 
 #------------------------------------------------------------------------------
-# Print a message after a failure in $GP_DISPLAY_TEXT.
+# We're done.  In debug mode, print the meta data for the experiment
+# directories.
 #------------------------------------------------------------------------------
-sub msg_display_text_failure
-{
-  my $subr_name = get_my_name ();
-
-  my ($gp_display_text_cmd, $error_code, $error_file) = @_;
-
-  my $msg;
+  $ignore_value = print_meta_data_experiments ("debug");
 
-  $msg = "error code = $error_code - failure executing the following command:";
-  gp_message ("error", $subr_name, $msg);
+#------------------------------------------------------------------------------
+# Before the execution completes, print the warning(s) on the screen.
+#
+# Note that this assumes that no additional warnings have been created since
+# the call to html_create_warnings_page.  Otherwise there will be a discrepancy
+# between what is printed on the screen and shown in the warnings.html page.
+#------------------------------------------------------------------------------
+  if (($g_total_warning_count > 0) and ($g_warnings))
+    {
+      $ignore_value = print_warnings_buffer ();
+      @g_warning_msgs = ();
+    }
 
-  gp_message ("error", $subr_name, $gp_display_text_cmd);
+#------------------------------------------------------------------------------
+# This is not supposed to happen, but in case there are any fatal errors that
+# have not caused the execution to terminate, print them here.
+#------------------------------------------------------------------------------
+  if (@g_error_msgs)
+    {
+      $ignore_value = print_errors_buffer (\$g_error_keyword);
+    }
 
-  $msg = "check file $error_file for more details";
-  gp_message ("error", $subr_name, $msg);
+#------------------------------------------------------------------------------
+# One line message to show where the results can be found.
+#------------------------------------------------------------------------------
+  my $results_file = $abs_path_outputdir . "/index.html";
+  my $prologue_text = "Processing completed - view file $results_file" .
+                      " in a browser";
+  gp_message ("diag", $subr_name, $prologue_text);
 
   return (0);
 
-} #-- End of subroutine msg_display_text_failure
+} #-- End of subroutine main
 
 #------------------------------------------------------------------------------
 # If it is not present, add a "/" to the name of the argument.  This is
-# intended to be used for the name of the output directory and makes it 
+# intended to be used for the name of the output directory and makes it
 # easier to construct pathnames.
 #------------------------------------------------------------------------------
 sub append_forward_slash
@@ -1228,7 +1339,7 @@ sub append_forward_slash
   my $length_of_string = length ($input_string);
   my $return_string    = $input_string;
 
-  if (rindex ($input_string, "/") != $length_of_string-1) 
+  if (rindex ($input_string, "/") != $length_of_string-1)
     {
       $return_string .= "/";
     }
@@ -1255,7 +1366,7 @@ sub build_pretty_dir_list
 } #-- End of subroutine build_pretty_dir_list
 
 #------------------------------------------------------------------------------
-# Calculate the target address in hex by adding the instruction to the 
+# Calculate the target address in hex by adding the instruction to the
 # instruction address.
 #------------------------------------------------------------------------------
 sub calculate_target_hex_address
@@ -1264,14 +1375,15 @@ sub calculate_target_hex_address
 
   my ($instruction_address, $instruction_offset) = @_;
 
-  my $dec_branch_target; 
+  my $dec_branch_target;
   my $d1;
   my $d2;
   my $first_char;
   my $length_of_string;
   my $mask;
+  my $msg;
   my $number_of_fields;
-  my $raw_hex_branch_target; 
+  my $raw_hex_branch_target;
   my $result;
 
   if ($g_addressing_mode eq "64 bit")
@@ -1281,10 +1393,11 @@ sub calculate_target_hex_address
     }
   else
     {
-      gp_message ("abort", $subr_name, "g_addressing_mode = $g_addressing_mode not supported\n");
+      $msg = "g_addressing_mode = $g_addressing_mode not supported";
+      gp_message ("abort", $subr_name, $msg);
     }
-  
-  $length_of_string = length ($instruction_offset); 
+
+  $length_of_string = length ($instruction_offset);
   $first_char       = lcfirst (substr ($instruction_offset,0,1));
   $d1               = bigint::hex ($instruction_offset);
   $d2               = bigint::hex ($mask);
@@ -1315,11 +1428,15 @@ sub calculate_target_hex_address
 } #-- End of subroutine calculate_target_hex_address
 
 #------------------------------------------------------------------------------
-# Sets the absolute path to all commands in array @cmds.  The commands and 
-# their respective paths are stored in hash "g_mapped_cmds".
+# Sets the absolute path to all commands in array @cmds.
+#
+# First, it is checked if the command is in the search path, built-in, or an
+# alias.  If this is not the case, search for it in a couple of locations.
+#
+# If this all fails, warning messages are printed, but this is not a hard
+# error. Yet. Most likely, things will go bad later on.
 #
-# If no such mapping is found, a warning is issued, but execution continues.
-# The warning(s) may help with troubleshooting, should a failure occur later.
+# The commands and their respective paths are stored in hash "g_mapped_cmds".
 #------------------------------------------------------------------------------
 sub check_and_define_cmds
 {
@@ -1333,37 +1450,129 @@ sub check_and_define_cmds
   my @cmds        = @{$cmds_ref};
   my @search_path = @{$search_path_ref};
 
-  my $found_match;
-  my $target_cmd; 
-  my $failed_cmd; 
-  my $no_of_failed_mappings; 
+  my @the_fields = ();
+
+  my $cmd;
+  my $cmd_found;
+  my $error_code;
+  my $failed_cmd;
   my $failed_cmds;
+  my $found_match;
+  my $mapped;
+  my $msg;
+  my $no_of_failed_mappings;
+  my $no_of_fields;
+  my $output_cmd;
+  my $target_cmd;
+  my $failed_mapping = $FALSE;
+  my $full_path_cmd;
 
-  gp_message ("debug", $subr_name, "\@cmds = @cmds");
-  gp_message ("debug", $subr_name, "\@search_path = @search_path");
+  gp_message ("debugXL", $subr_name, "\@cmds = @cmds");
+  gp_message ("debugXL", $subr_name, "\@search_path = @search_path");
 
 #------------------------------------------------------------------------------
-# Search for the command to be in the search path given.  In case no such path
+# Search for the command and record the absolute path.  In case no such path
 # can be found, the entry in $g_mapped_cmds is assigned a special value that
 # will be checked for in the next block.
 #------------------------------------------------------------------------------
-  for my $cmd (@cmds)
+  for $cmd (@cmds)
     {
-      $found_match = $FALSE;
-      for my $path (@search_path)
+      $target_cmd = "(command -v $cmd; echo \$\?)";
+
+      ($error_code, $output_cmd) = execute_system_cmd ($target_cmd);
+
+      if ($error_code != 0)
+#------------------------------------------------------------------------------
+# This is unlikely to happen, since it means the command executed failed.
+#------------------------------------------------------------------------------
+        {
+          $msg = "error executing this command: " . $target_cmd;
+          gp_message ("warning", $subr_name, $msg);
+          $msg = "execution continues, but may fail later on";
+          gp_message ("warning", $subr_name, $msg);
+
+          $g_total_warning_count++;
+        }
+      else
+#------------------------------------------------------------------------------
+# So far, all is well, but is the target command available?
+#------------------------------------------------------------------------------
         {
-          $target_cmd = $path . "/" . $cmd; 
-          if (-x $target_cmd)
+#------------------------------------------------------------------------------
+# The output from the $target_cmd command should contain 2 lines in case the
+# command has been found.  The first line shows the command with the full
+# path, while the second line has the exit code.
+#
+# If the exit code is not zero, the command has not been found.
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# Split the output at the \n character and check the number of lines as
+# well as the return code.
+#------------------------------------------------------------------------------
+          @the_fields   = split ("\n", $output_cmd);
+          $no_of_fields = scalar (@the_fields);
+          $cmd_found    = ($the_fields[$no_of_fields-1] == 0 ? $TRUE : $FALSE);
+
+#------------------------------------------------------------------------------
+# This is unexpected.  Throw an assertion error and bail out.
+#------------------------------------------------------------------------------
+          if ($no_of_fields > 2)
             {
-              $found_match = $TRUE;
-              $g_mapped_cmds{$cmd} = $target_cmd;
-              last;
+              gp_message ("error", $subr_name, "output from $target_cmd:");
+              gp_message ("error", $subr_name, $output_cmd);
+
+              $msg = "the output from $target_cmd has more than 2 lines";
+              gp_message ("assertion", $subr_name, $msg);
             }
-        }
 
-      if (not $found_match)
-        {
-          $g_mapped_cmds{$cmd} = "road_to_nowhere";
+          if ($cmd_found)
+            {
+              $full_path_cmd = $the_fields[0];
+#------------------------------------------------------------------------------
+# The command is in the search path.  Store the full path to the command.
+#------------------------------------------------------------------------------
+              $msg = "the $cmd command is in the search path";
+              gp_message ("debug", $subr_name, $msg);
+
+              $g_mapped_cmds{$cmd} = $full_path_cmd;
+            }
+          else
+#------------------------------------------------------------------------------
+# A best effort to locate the command elsewhere.  If found, store the command
+# with the absolute path included.  Otherwise print a warning, but continue.
+#------------------------------------------------------------------------------
+            {
+              $msg = "the $cmd command is not in the search path";
+              $msg .= " - start a best effort search to find it";
+              gp_message ("debug", $subr_name, $msg);
+
+              $found_match = $FALSE;
+              for my $path (@search_path)
+                {
+                  $target_cmd = $path . "/" . $cmd;
+                  if (-x $target_cmd)
+                    {
+                      $msg = "found the command in $path";
+                      gp_message ("debug", $subr_name, $msg);
+
+                      $found_match = $TRUE;
+                      $g_mapped_cmds{$cmd} = $target_cmd;
+                      last;
+                    }
+                  else
+                    {
+                      $msg = "failure to find the $cmd command in $path";
+                      gp_message ("debug", $subr_name, $msg);
+                    }
+                }
+
+              if (not $found_match)
+                {
+                  $g_mapped_cmds{$cmd} = "road to nowhere";
+                  $failed_mapping = $TRUE;
+                }
+            }
         }
     }
 
@@ -1372,26 +1581,50 @@ sub check_and_define_cmds
 #------------------------------------------------------------------------------
   $no_of_failed_mappings = 0;
   $failed_cmds           = "";
-  while ( my ($cmd, $mapped) = each %g_mapped_cmds)
+
+#------------------------------------------------------------------------------
+# Print a warning message before showing the results, that at least one search
+# has failed.
+#------------------------------------------------------------------------------
+  if ($failed_mapping)
+    {
+      $msg  = "<br>" . "failure in the verification of the OS commands:";
+      gp_message ("warning", $subr_name, $msg);
+    }
+
+  while ( ($cmd, $mapped) = each %g_mapped_cmds)
     {
-      if ($mapped eq "road_to_nowhere")
+      if ($mapped eq "road to nowhere")
         {
-          my $msg = "cannot find a path for command $cmd - " .
-                    "assume this will still work without a path";
+          $msg  = "cannot find a path for command $cmd";
           gp_message ("warning", $subr_name, $msg);
-          $no_of_failed_mappings++; 
-          $failed_cmds .= $cmd; 
+          gp_message ("debug", $subr_name, $msg);
+
+          $no_of_failed_mappings++;
+          $failed_cmds .= $cmd;
           $g_mapped_cmds{$cmd} = $cmd;
         }
       else
        {
-          gp_message ("debug", $subr_name, "path for the $cmd command is $mapped");
+          $msg = "path for the $cmd command is $mapped";
+          gp_message ("debug", $subr_name, $msg);
        }
     }
   if ($no_of_failed_mappings != 0)
     {
-      gp_message ("debug", $subr_name, "failed to find a mapping for $failed_cmds");
-      gp_message ("debug", $subr_name, "a total of $no_of_failed_mappings mapping failures");
+      my $plural_1 = ($no_of_failed_mappings > 1) ? "failures"   : "failure";
+      my $plural_2 = ($no_of_failed_mappings > 1) ? "commands" : "command";
+
+      $msg  = "encountered $no_of_failed_mappings $plural_1 to locate";
+      $msg .= " selected " . $plural_2;
+      gp_message ("warning", $subr_name, $msg);
+      gp_message ("debug", $subr_name, $msg);
+
+      $msg  = "execution continues, but may fail later on";
+      gp_message ("warning", $subr_name, $msg);
+      gp_message ("debug", $subr_name, $msg);
+
+      $g_total_warning_count++;
     }
 
   return ($no_of_failed_mappings);
@@ -1423,7 +1656,7 @@ sub check_and_proc_dis_branches
   my $msg;
   my $raw_hex_branch_target;
 
-  if (   ($input_line =~ /$g_branch_regex/) 
+  if (   ($input_line =~ /$g_branch_regex/)
       or ($input_line =~ /$g_endbr_regex/))
     {
       if (defined ($3))
@@ -1451,12 +1684,13 @@ sub check_and_proc_dis_branches
 #------------------------------------------------------------------------------
               $instruction_offset  = $3;
               $raw_hex_branch_target = calculate_target_hex_address (
-                                        $instruction_address, 
-                                        $instruction_offset); 
+                                        $instruction_address,
+                                        $instruction_offset);
 
               $hex_branch_target = "0x" . $raw_hex_branch_target;
               $branch_target{$hex_branch_target} = 1;
-              $extended_branch_target{$instruction_address} = $raw_hex_branch_target;
+              $extended_branch_target{$instruction_address} =
+                                                       $raw_hex_branch_target;
             }
           if (defined ($2) and (not defined ($3)))
             {
@@ -1482,7 +1716,8 @@ sub check_and_proc_dis_branches
 # TBD: Perhaps this should be an assertion or alike.
 #------------------------------------------------------------------------------
           $branch_target{"0x0000"} = $FALSE;
-          gp_message ("debug", $subr_name, "cannot determine branch target");
+          $msg = "cannot determine branch target";
+          gp_message ("debug", $subr_name, $msg);
         }
     }
   else
@@ -1512,11 +1747,11 @@ sub check_and_proc_dis_func_call
   my %extended_branch_target = %{ $extended_branch_target_ref };
 
   my $found_it = $TRUE;
-  my $hex_branch_target; 
+  my $hex_branch_target;
   my $instruction_address;
   my $instruction_offset;
   my $msg;
-  my $raw_hex_branch_target; 
+  my $raw_hex_branch_target;
 
   if ( $input_line =~ /$g_function_call_v2_regex/ )
     {
@@ -1558,8 +1793,8 @@ sub check_and_proc_dis_func_call
 # address.
 #------------------------------------------------------------------------------
                   $raw_hex_branch_target = calculate_target_hex_address (
-                                            $instruction_address, 
-                                            $instruction_offset); 
+                                            $instruction_address,
+                                            $instruction_offset);
                   $hex_branch_target     = "0x" . $raw_hex_branch_target;
 
                   $msg = "calculated hex_branch_target = " .
@@ -1567,12 +1802,13 @@ sub check_and_proc_dis_func_call
                   gp_message ("debugXL", $subr_name, $msg);
 
                   $branch_target{$hex_branch_target} = 1;
-                  $extended_branch_target{$instruction_address} = $raw_hex_branch_target;
+                  $extended_branch_target{$instruction_address} =
+                                                       $raw_hex_branch_target;
 
                   $msg = "set branch_target{$hex_branch_target} to 1";
                   gp_message ("debugXL", $subr_name, $msg);
-                  $msg  = "added extended_branch_target{$instruction_address}" .
-                          " = $extended_branch_target{$instruction_address}";
+                  $msg  = "added extended_branch_target{$instruction_address}";
+                  $msg .= " = $extended_branch_target{$instruction_address}";
                   gp_message ("debugXL", $subr_name, $msg);
                 }
               else
@@ -1593,11 +1829,77 @@ sub check_and_proc_dis_func_call
 } #-- End of subroutine check_and_proc_dis_func_call
 
 #------------------------------------------------------------------------------
-# Check for the $GP_DISPLAY_TEXT tool to be available.  This is a critical tool 
-# needed to provide the information.  If it can not be found, execution is 
+# Check if the value for the user option given is valid.
+#
+# In case the value is valid, the g_user_settings table is updated with the
+# (new) value.
+#
+# Otherwise an error message is pushed into the g_error_msgs buffer.
+#
+# The return value is TRUE/FALSE.
+#------------------------------------------------------------------------------
+sub check_and_set_user_option
+{
+  my $subr_name = get_my_name ();
+
+  my ($internal_opt_name, $value) = @_;
+
+  my $msg;
+  my $valid;
+  my $option_value_missing;
+
+  my $option     = $g_user_settings{$internal_opt_name}{"option"};
+  my $data_type  = $g_user_settings{$internal_opt_name}{"data_type"};
+  my $no_of_args = $g_user_settings{$internal_opt_name}{"no_of_arguments"};
+  if (($no_of_args >= 1) and
+      ((not defined ($value)) or (length ($value) == 0)))
+#------------------------------------------------------------------------------
+# If there was no value given, but it is required, flag an error.
+# There could also be a value, but it might be the empty string.
+#
+# Note that that there are currently no options with multiple values.  Should
+# these be introduced, the current check may need to be refined.
+#------------------------------------------------------------------------------
+    {
+      $valid                = $FALSE;
+      $option_value_missing = $TRUE;
+    }
+  elsif ($no_of_args >= 1)
+    {
+      $option_value_missing = $FALSE;
+#------------------------------------------------------------------------------
+# There is an input value.  Check if it is valid and if so, store it.
+#
+# Note that we allow the options to be case insensitive.
+#------------------------------------------------------------------------------
+      $valid = verify_if_input_is_valid ($value, $data_type);
+
+      if ($valid)
+        {
+          if (($data_type eq "onoff") or ($data_type eq "size"))
+            {
+              $g_user_settings{$internal_opt_name}{"current_value"} =
+                                                               lc ($value);
+            }
+          else
+            {
+              $g_user_settings{$internal_opt_name}{"current_value"} = $value;
+            }
+          $g_user_settings{$internal_opt_name}{"defined"} = $TRUE;
+        }
+    }
+
+  return (\$valid, \$option_value_missing);
+
+} #-- End of subroutine check_and_set_user_option
+
+#------------------------------------------------------------------------------
+# Check for the $GP_DISPLAY_TEXT tool to be available.  This is a critical tool
+# needed to provide the information.  If it can not be found, execution is
 # terminated.
 #
-# We first search foe this tool in the current execution directory.  If it
+# We first search for this tool in the current execution directory.  If it
 # cannot be found there, use $PATH to try to locate it.
 #------------------------------------------------------------------------------
 sub check_availability_tool
@@ -1608,6 +1910,7 @@ sub check_availability_tool
 
   my $error_code;
   my $error_occurred;
+  my $gp_path;
   my $msg;
   my $output_which_gp_display_text;
   my $return_value;
@@ -1616,23 +1919,24 @@ sub check_availability_tool
 #------------------------------------------------------------------------------
 # Get the path to gp-display-text.
 #------------------------------------------------------------------------------
-  my ($error_occurred_ref, $return_value_ref) = find_path_to_gp_display_text (
-                                                       $location_gp_command_ref
-                                                        );
-  $error_occurred = ${ $error_occurred_ref};   
+  my ($error_occurred_ref, $gp_path_ref, $return_value_ref) =
+                      find_path_to_gp_display_text ($location_gp_command_ref);
+
+  $error_occurred = ${ $error_occurred_ref};
+  $gp_path        = ${ $gp_path_ref };
   $return_value   = ${ $return_value_ref};
 
   $msg = "error_occurred = $error_occurred return_value = $return_value";
   gp_message ("debugXL", $subr_name, $msg);
 
-  if (not $error_occurred) 
+  if (not $error_occurred)
 #------------------------------------------------------------------------------
 # All is well and gp-display-text has been located.
 #------------------------------------------------------------------------------
     {
       $g_path_to_tools = $return_value;
 
-      $msg = "located $GP_DISPLAY_TEXT in execution directory";
+      $msg = "located $GP_DISPLAY_TEXT in the execution directory";
       gp_message ("debug", $subr_name, $msg);
       $msg = "g_path_to_tools = $g_path_to_tools";
       gp_message ("debug", $subr_name, $msg);
@@ -1643,42 +1947,49 @@ sub check_availability_tool
 # $GP_DISPLAY_TEXT through the search path.
 #------------------------------------------------------------------------------
     {
-      $msg = "error accessing $GP_DISPLAY_TEXT: $return_value - " .
-             "run time behaviour may be undefined";
+      $msg  = $g_html_new_line;
+      $msg .= "could not find $GP_DISPLAY_TEXT in directory $gp_path :";
+      $msg .= " $return_value";
       gp_message ("warning", $subr_name, $msg);
-  
+
 #------------------------------------------------------------------------------
 # Check if we can find $GP_DISPLAY_TEXT in the search path.
 #------------------------------------------------------------------------------
-      $msg = "check for $GP_DISPLAY_TEXT in search path";
+      $msg = "check for $GP_DISPLAY_TEXT to be in the search path";
       gp_message ("debug", $subr_name, $msg);
 
+      gp_message ("warning", $subr_name, $msg);
+      $g_total_warning_count++;
+
       $target_cmd = $g_mapped_cmds{"which"} . " $GP_DISPLAY_TEXT 2>&1";
 
-      ($error_code, $output_which_gp_display_text) = 
-                                               execute_system_cmd ($target_cmd);
-   
+      ($error_code, $output_which_gp_display_text) =
+                                             execute_system_cmd ($target_cmd);
+
       if ($error_code == 0)
         {
-          my ($gp_file_name, $gp_path, $suffix_not_used) = 
+          my ($gp_file_name, $gp_path, $suffix_not_used) =
                                      fileparse ($output_which_gp_display_text);
           $g_path_to_tools = $gp_path;
 
-          $msg = "using $GP_DISPLAY_TEXT in $g_path_to_tools instead";
+          $msg  = "located $GP_DISPLAY_TEXT in $g_path_to_tools";
+          gp_message ("warning", $subr_name, $msg);
+          $msg = "this is the version that will be used";
           gp_message ("warning", $subr_name, $msg);
 
           $msg = "the $GP_DISPLAY_TEXT tool is in the search path";
           gp_message ("debug", $subr_name, $msg);
           $msg = "g_path_to_tools = $g_path_to_tools";
           gp_message ("debug", $subr_name, $msg);
-        } 
+        }
       else
         {
           $msg = "failure to find $GP_DISPLAY_TEXT in the search path";
-          gp_message ("debug", $subr_name, $msg);
+          gp_message ("error", $subr_name, $msg);
 
-          $msg = "fatal error executing command $target_cmd";
-          gp_message ("abort", $subr_name, $msg);
+          $g_total_error_count++;
+
+          gp_message ("abort", $subr_name, $g_abort_msg);
         }
      }
 
@@ -1690,7 +2001,7 @@ sub check_availability_tool
 # This function determines whether load objects are in ELF format.
 #
 # Compared to the original code, any input value other than 2 or 3 is rejected
-# upfront.  This not only reduces the nesting level, but also eliminates a 
+# upfront.  This not only reduces the nesting level, but also eliminates a
 # possible bug.
 #
 # Also, by isolating the tests for the input files, another nesting level could
@@ -1702,17 +2013,23 @@ sub check_loadobjects_are_elf
 
   my ($selected_archive) = @_;
 
+  my $event_kind_map_regex;
+  $event_kind_map_regex  = '^<event kind="map"\s.*vaddr=';
+  $event_kind_map_regex .= '"0x([0-9a-fA-F]+)"\s+.*foffset=';
+  $event_kind_map_regex .= '"\+*0x([0-9a-fA-F]+)"\s.*modes=';
+  $event_kind_map_regex .= '"0x([0-9]+)"\s.*name="(.*)".*>$';
+
   my $hostname_current = $local_system_config{"hostname_current"};
   my $arch             = $local_system_config{"processor"};
   my $arch_uname_s     = $local_system_config{"kernel_name"};
 
-  my $extracted_information; 
+  my $extracted_information;
 
   my $elf_magic_number;
 
   my $executable_name;
   my $va_executable_in_hex;
+
   my $arch_exp;
   my $hostname_exp;
   my $os_exp;
@@ -1722,19 +2039,21 @@ sub check_loadobjects_are_elf
   my $rc_b;
   my $file;
   my $line;
+  my $msg;
   my $name;
   my $name_path;
   my $foffset;
   my $vaddr;
   my $modes;
 
-  my $path_to_map_file; 
+  my $path_to_map_file;
   my $path_to_log_file;
 
 #------------------------------------------------------------------------------
 # TBD: Parameterize and should be the first experiment directory from the list.
 #------------------------------------------------------------------------------
-  $path_to_log_file  = $g_exp_dir_meta_data{$selected_archive}{"directory_path"}; 
+  $path_to_log_file  =
+               $g_exp_dir_meta_data{$selected_archive}{"directory_path"};
   $path_to_log_file .= $selected_archive;
   $path_to_log_file .= "/log.xml";
 
@@ -1748,34 +2067,40 @@ sub check_loadobjects_are_elf
 # This check can probably be removed since the presence of the log.xml file is
 # checked for in an earlier phase.
 #------------------------------------------------------------------------------
+  $msg  = " - unable to open file $path_to_log_file for reading:";
   open (LOG_XML, "<", $path_to_log_file)
-    or die ("$subr_name - unable to open file $path_to_log_file for reading: '$!'");
-  gp_message ("debug", $subr_name, "opened file $path_to_log_file for reading");
-    
+    or die ($subr_name . $msg . " " . $!);
+
+  $msg = "opened file $path_to_log_file for reading";
+  gp_message ("debug", $subr_name, $msg);
+
   while (<LOG_XML>)
     {
       $line = $_;
       chomp ($line);
-      gp_message ("debug", $subr_name, "read line: $line");
+      gp_message ("debugM", $subr_name, "read line: $line");
 #------------------------------------------------------------------------------
 # Search for the first line starting with "<system".  Bail out if found and
 # parsed. These are two examples:
-# <system hostname="ruud-vm" arch="x86_64" os="Linux 4.14.35-2025.400.8.el7uek.x86_64" pagesz="4096" npages="30871514">
-# <system hostname="sca-m88-092-pd0" arch="sun4v" os="SunOS 5.11" pagesz="8192" npages="602963968">
+# <system hostname="ruud-vm" arch="x86_64" \
+# os="Linux 4.14.35-2025.400.8.el7uek.x86_64" pagesz="4096" npages="30871514">
 #------------------------------------------------------------------------------
       if ($line =~ /^\s*<system\s+/)
         {
-          gp_message ("debug", $subr_name, "selected the following line from the log.xml file:");
-          gp_message ("debug", $subr_name, "$line");
+          $msg = "selected the following line from the log.xml file:";
+          gp_message ("debugM", $subr_name, $msg);
+          gp_message ("debugM", $subr_name, "$line");
           if ($line =~ /.*\s+hostname="([^"]+)/)
             {
               $hostname_exp = $1;
-              gp_message ("debug", $subr_name, "extracted hostname_exp = $hostname_exp");
+              $msg = "extracted hostname_exp = " . $hostname_exp;
+              gp_message ("debugM", $subr_name, $msg);
             }
           if ($line =~ /.*\s+arch="([^"]+)/)
             {
               $arch_exp = $1;
-              gp_message ("debug", $subr_name, "extracted arch_exp = $arch_exp");
+              $msg = "extracted arch_exp = " . $arch_exp;
+              gp_message ("debugM", $subr_name, $msg);
             }
           if ($line =~ /.*\s+os="([^"]+)/)
             {
@@ -1787,7 +2112,8 @@ sub check_loadobjects_are_elf
                 {
                   $os_exp = $1;
                 }
-              gp_message ("debug", $subr_name, "extracted os_exp = $os_exp");
+              $msg = "extracted os_exp = " . $os_exp;
+              gp_message ("debugM", $subr_name, $msg);
             }
           last;
         }
@@ -1810,76 +2136,105 @@ sub check_loadobjects_are_elf
 #TBD: THIS DOES NOT CHECK IF ELF IS FOUND!
 
   if (($hostname_current eq $hostname_exp) and
-      ($arch             eq $arch_exp)     and 
+      ($arch             eq $arch_exp)     and
       ($arch_uname_s     eq $os_exp))
         {
-          gp_message ("debug", $subr_name, "early return: the hostname, architecture and OS match the current system");
-  gp_message ("debug", $subr_name, "FAKE THIS IS NOT THE CASE AND CONTINUE");
+          $msg  = "early return: the hostname, architecture and OS match";
+          $msg .= " the current system";
+          gp_message ("debug", $subr_name, $msg);
+          $msg = "FAKE THIS IS NOT THE CASE AND CONTINUE";
+          gp_message ("debug", $subr_name, $msg);
 # FAKE          return ($TRUE);
         }
 
   if (not $g_exp_dir_meta_data{$selected_archive}{"archive_is_empty"})
     {
-      gp_message ("debug", $subr_name, "selected_archive = $selected_archive");
-      for my $i (sort keys %{$g_exp_dir_meta_data{$selected_archive}{"archive_files"}})
+      $msg = "selected_archive = " . $selected_archive;
+      gp_message ("debug", $subr_name, $msg);
+      for my $i (sort keys
+                  %{$g_exp_dir_meta_data{$selected_archive}{"archive_files"}})
         {
-          gp_message ("debug", $subr_name, "stored loadobject $i $g_exp_dir_meta_data{$selected_archive}{'archive_files'}{$i}");
+          $msg  = "stored loadobject " . $i . " ";
+          $msg .= $g_exp_dir_meta_data{$selected_archive}{"archive_files"}{$i};
+          gp_message ("debug", $subr_name, $msg);
         }
     }
 
 #------------------------------------------------------------------------------
 # Check if the selected experiment directory has archived files in ELF format.
-# If not, use the information in map.xml to get the name of the executable 
+# If not, use the information in map.xml to get the name of the executable
 # and the virtual address.
 #------------------------------------------------------------------------------
 
   if ($g_exp_dir_meta_data{$selected_archive}{"archive_in_elf_format"})
     {
-      gp_message ("debug", $subr_name, "the files in directory $selected_archive/archives are in ELF format");
-      gp_message ("debug", $subr_name, "IGNORE THIS AND USE MAP.XML");
+      $msg  = "the files in directory $selected_archive/archives are in";
+      $msg .= " ELF format";
+      gp_message ("debugM", $subr_name, $msg);
+      $msg = "IGNORE THIS AND USE MAP.XML";
+      gp_message ("debugM", $subr_name, $msg);
 ##      return ($TRUE);
     }
 
-      gp_message ("debug", $subr_name, "the files in directory $selected_archive/archives are not in ELF format");
+  $msg  = "the files in directory $selected_archive/archives are not in";
+  $msg .= " ELF format";
+  gp_message ("debug", $subr_name, $msg);
 
-      $path_to_map_file  = $g_exp_dir_meta_data{$selected_archive}{"directory_path"}; 
-      $path_to_map_file .= $selected_archive;
-      $path_to_map_file .= "/map.xml";
+  $path_to_map_file  =
+               $g_exp_dir_meta_data{$selected_archive}{"directory_path"};
+  $path_to_map_file .= $selected_archive;
+  $path_to_map_file .= "/map.xml";
 
-      open (MAP_XML, "<", $path_to_map_file)
-        or die ($subr_name, "unable to open file $path_to_map_file for reading: $!");
-      gp_message ("debug", $subr_name, "opened file $path_to_map_file for reading");
+  $msg  = " - unable to open file $path_to_map_file for reading:";
+  open (MAP_XML, "<", $path_to_map_file)
+    or die ($subr_name . $msg . " " . $!);
+  $msg = "opened file $path_to_map_file for reading";
+  gp_message ("debug", $subr_name, $msg);
 
 #------------------------------------------------------------------------------
 # Scan the map.xml file.  We need to find the name of the executable with the
 # mode set to 0x005.  For this entry we have to capture the virtual address.
 #------------------------------------------------------------------------------
-    $extracted_information = $FALSE;
-    while (<MAP_XML>)
+  $extracted_information = $FALSE;
+  while (<MAP_XML>)
     {
       $line = $_;
       chomp ($line);
-      gp_message ("debug", $subr_name, "MAP_XML read line = $line");
-##      if ($line =~ /^<event kind="map"\s.*vaddr="0x([0-9a-fA-F]+)"\s+                                 .*modes="0x([0-9]+)"\s.*name="(.*)".*>$/)
-      if ($line =~   /^<event kind="map"\s.*vaddr="0x([0-9a-fA-F]+)"\s+.*foffset="\+*0x([0-9a-fA-F]+)"\s.*modes="0x([0-9]+)"\s.*name="(.*)".*>$/)
+      gp_message ("debugM", $subr_name, "MAP_XML read line = $line");
+#------------------------------------------------------------------------------
+# Replaces this way too long line:
+#     if ($line =~   /^<event kind="map"\s.*vaddr="0x([0-9a-fA-F]+)"\s+.
+#     *foffset="\+*0x([0-9a-fA-F]+)"\s.*modes="0x([0-9]+)"\s.*
+#     name="(.*)".*>$/)
+#------------------------------------------------------------------------------
+      if ($line =~ /$event_kind_map_regex/)
         {
-          gp_message ("debug", $subr_name, "target line = $line");
+          gp_message ("debugM", $subr_name, "target line = $line");
           $vaddr     = $1;
           $foffset   = $2;
           $modes     = $3;
           $name_path = $4;
           $name      = get_basename ($name_path);
-          gp_message ("debug", $subr_name, "extracted vaddr     = $vaddr foffset = $foffset modes = $modes");
-          gp_message ("debug", $subr_name, "extracted name_path = $name_path name = $name");
+          $msg  = "extracted vaddr     = $vaddr foffset = $foffset";
+          $msg .= " modes = $modes";
+          gp_message ("debugM", $subr_name, $msg);
+          $msg = "extracted name_path = $name_path name = $name";
+          gp_message ("debugM", $subr_name, $msg);
 #              $error_extracting_information = $TRUE;
           $executable_name  = $name;
           my $result_VA = bigint::hex ($vaddr) - bigint::hex ($foffset);
           my $hex_VA = sprintf ("0x%016x", $result_VA);
           $va_executable_in_hex = $hex_VA;
-          gp_message ("debug", $subr_name, "set executable_name  = $executable_name");
-          gp_message ("debug", $subr_name, "set va_executable_in_hex = $va_executable_in_hex");
-          gp_message ("debug", $subr_name, "result_VA = $result_VA"); 
-          gp_message ("debug", $subr_name, "hex_VA    = $hex_VA"); 
+
+          $msg = "set executable_name      = " . $executable_name;
+          gp_message ("debugM", $subr_name, $msg);
+          $msg = "set va_executable_in_hex = " . $va_executable_in_hex;
+          gp_message ("debugM", $subr_name, $msg);
+          $msg = "result_VA                = " . $result_VA;
+          gp_message ("debugM", $subr_name, $msg);
+          $msg = "hex_VA                   = " . $hex_VA;
+          gp_message ("debugM", $subr_name, $msg);
+
           if ($modes eq "005")
             {
               $extracted_information = $TRUE;
@@ -1887,9 +2242,13 @@ sub check_loadobjects_are_elf
             }
         }
     }
+
+  close (MAP_XML);
+
   if (not $extracted_information)
     {
-      my $msg = "cannot find the necessary information in the $path_to_map_file file";
+      $msg  = "cannot find the necessary information in";
+      $msg .= " the $path_to_map_file file";
       gp_message ("assertion", $subr_name, $msg);
     }
 
@@ -1917,26 +2276,42 @@ sub check_metric_values
   my $current_value;
   my $hp_value = $g_user_settings{"highlight_percentage"}{"current_value"};
   my $max_value;
+  my $msg;
   my $relative_distance;
 
-  @current_metrics = split (" ", $metric_values);
+  @current_metrics   = split (" ", $metric_values);
   $colour_coded_line = $FALSE;
+
   for my $metric (0 .. $#current_metrics)
     {
       $current_value = $current_metrics[$metric];
       if (exists ($max_metric_values[$metric]))
         {
           $max_value     = $max_metric_values[$metric];
-          gp_message ("debugXL", $subr_name, "metric = $metric current_value = $current_value max_value = $max_value");
-          if ( ($max_value > 0) and ($current_value > 0) and ($current_value != $max_value) )
+
+          $msg  = "metric = $metric current_value = $current_value";
+          $msg .= " max_value = $max_value";
+          gp_message ("debugXL", $subr_name, $msg);
+
+          if ( ($max_value > 0) and ($current_value > 0) and
+              ($current_value != $max_value) )
             {
 # TBD: abs needed?
-              gp_message ("debugXL", $subr_name, "metric = $metric current_value = $current_value max_value = $max_value");
-              $relative_distance = 1.00 - abs ( ($max_value - $current_value)/$max_value );
-              gp_message ("debugXL", $subr_name, "relative_distance = $relative_distance");
+              $msg  = "metric = $metric current_value = $current_value";
+              $msg .= " max_value = $max_value";
+              gp_message ("debugXL", $subr_name, $msg);
+
+              $relative_distance = 1.00 - abs (
+                               ($max_value - $current_value)/$max_value );
+
+              $msg = "relative_distance = $relative_distance";
+              gp_message ("debugXL", $subr_name, $msg);
+
               if ($relative_distance >= $hp_value/100.0)
                 {
-                  gp_message ("debugXL", $subr_name, "metric $metric is within the relative_distance");
+                  $msg = "metric $metric is within the relative_distance";
+                  gp_message ("debugXL", $subr_name, $msg);
+
                   $colour_coded_line = $TRUE;
                   last;
                 }
@@ -1974,80 +2349,218 @@ sub check_support_for_processor
 } #-- End of subroutine check_support_for_processor
 
 #------------------------------------------------------------------------------
-# Check if the value for the user option given is valid.
+# Check the command line options for the occurrence of experiments and make
+# sure that this list is contigious.  No other names are allowed in this list.
 #
-# In case the value is valid, the g_user_settings table is updated.
-# Otherwise an error message is printed.
+# Terminate execution in case of an error.  Otherwise remove the experiment
+# names for ARGV (to make the subsequent parsing easier), and return an array
+# with the experiment names.
 #
-# The return value is TRUE/FALSE.
+# The following patterns are supposed to be detected:
+#
+# <expdir_1> some other word(s) <expdir_2>
+# <expdir> some other word(s)
 #------------------------------------------------------------------------------
-sub check_user_option
+sub check_the_experiment_list
 {
   my $subr_name = get_my_name ();
 
-  my ($internal_option_name, $value) = @_;
-
-  my $message;
-  my $return_value;
+#------------------------------------------------------------------------------
+# The name of an experiment directory can contain any non-whitespace
+# character(s), but has to end with .er, or optionally .er/.  Multiple
+# forward slashes are allowed.
+#------------------------------------------------------------------------------
+  my $exp_dir_regex = '^(\S+)(\.er)\/*$';
+  my $forward_slash_regex = '\/*$';
 
-  my $option          = $g_user_settings{$internal_option_name}{"option"};
-  my $data_type       = $g_user_settings{$internal_option_name}{"data_type"};
-  my $no_of_arguments = $g_user_settings{$internal_option_name}{"no_of_arguments"};
+  my $current_value;
+  my @exp_dir_list = ();
+  my $found_experiment = $FALSE;
+  my $found_non_exp = $FALSE;
+  my $msg;
+  my $name_non_exp_dir = "";
+  my $no_of_experiments = 0;
+  my $no_of_invalid_dirs = 0;
+  my $opt_remainder;
+  my $valid = $TRUE;
 
-  if (($no_of_arguments >= 1) and 
-      ((not defined ($value)) or (length ($value) == 0)))
+  for my $i (keys @ARGV)
     {
+      $current_value = $ARGV[$i];
+      if ($current_value =~ /$exp_dir_regex/)
 #------------------------------------------------------------------------------
-# If there was no value given, but it is required, flag an error.
-# There could also be a value, but it might be the empty string.
-#
-# Note that that there are currently no options with multiple values.  Should
-# these be introduced, the current check may need to be refined.
+# The current value is an experiment.  Remove any trailing forward slashes,
+# Increment the count, push the value into the array and set the
+# found_experiment flag to TRUE.
 #------------------------------------------------------------------------------
+        {
+          $no_of_experiments += 1;
 
-      $message = "the $option option requires a value";
-      push (@g_user_input_errors, $message);
-      $return_value = $FALSE;
-    }
-  elsif ($no_of_arguments >= 1)
-    {
+          $current_value =~ s/$forward_slash_regex//;
+          push (@exp_dir_list, $current_value);
+
+          if (not $found_experiment)
 #------------------------------------------------------------------------------
-# There is an input value.  Check if it is valid and if so, store it.
-#
-# Note that we allow the options to be case insensitive.
+# Start checking for the next field(s).
 #------------------------------------------------------------------------------
-      my $valid = verify_if_input_is_valid ($value, $data_type);
-
-      if ($valid)
-        {
-          if (($data_type eq "onoff") or ($data_type eq "size"))
             {
-              $g_user_settings{$internal_option_name}{"current_value"} = lc ($value);
+              $found_experiment = $TRUE;
             }
-          else
-            {
-              $g_user_settings{$internal_option_name}{"current_value"} = $value;
+#------------------------------------------------------------------------------
+# We had found non-experiment names and now see another experiment.  Time to
+# bail out of the loop.
+#------------------------------------------------------------------------------
+          if ($found_non_exp)
+            {
+              last;
+            }
+        }
+      else
+        {
+          if ($found_experiment)
+#------------------------------------------------------------------------------
+# The current value is not an experiment, but the value of found_experiment
+# indicates at least one experiment has been seen already.  This means that
+# the list of experiment names is not contiguous and that is a fatal error.
+#------------------------------------------------------------------------------
+            {
+              $name_non_exp_dir .= $current_value . " ";
+              $found_non_exp = $TRUE;
+            }
+        }
+
+    }
+
+#------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+# Error handling.
+#------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+
+  if ($found_non_exp)
+#------------------------------------------------------------------------------
+# The experiment list is not contiguous.
+#------------------------------------------------------------------------------
+    {
+      $valid = $FALSE;
+      $msg = "the list with the experiments is not contiguous:";
+      gp_message ("error", $subr_name, $msg);
+
+      $msg = "\"" . $name_non_exp_dir. "\"". " is not an experiment, but" .
+             " appears in a list where experiments are expected";
+      gp_message ("error", $subr_name, $msg);
+
+      $g_total_error_count++;
+    }
+
+  if ($no_of_experiments == 0)
+#------------------------------------------------------------------------------
+# The experiment list is empty.
+#------------------------------------------------------------------------------
+    {
+      $valid = $FALSE;
+      $msg = "the experiment list is missing from the options";
+      gp_message ("error", $subr_name, $msg);
+
+      $g_total_error_count++;
+    }
+
+  if (not $valid)
+#------------------------------------------------------------------------------
+# If an error has occurred, print the error(s) and terminate execution.
+#------------------------------------------------------------------------------
+    {
+      gp_message ("abort", $subr_name, $g_abort_msg);
+    }
+
+#------------------------------------------------------------------------------
+# We now have a list with experiments, but we still need to verify whether they
+# exist, and if so, are these valid experiments?
+#------------------------------------------------------------------------------
+  for my $exp_dir (@exp_dir_list)
+    {
+      $msg = "checking experiment directory $exp_dir";
+      gp_message ("debug", $subr_name, $msg);
+
+      if (-d $exp_dir)
+        {
+          $msg = "directory $exp_dir found";
+          gp_message ("debug", $subr_name, $msg);
+#------------------------------------------------------------------------------
+# Files log.xml and map.xml have to be there.
+#------------------------------------------------------------------------------
+          if ((-e $exp_dir."/log.xml") and (-e $exp_dir."/map.xml"))
+            {
+              $msg  = "directory $exp_dir appears to be a valid experiment";
+              $msg .= " directory";
+              gp_message ("debug", $subr_name, $msg);
+            }
+          else
+            {
+              $no_of_invalid_dirs++;
+              $msg  = "file " . $exp_dir . "/log.xml and/or " . $exp_dir;
+              $msg .= "/map.xml missing";
+              gp_message ("debug", $subr_name, $msg);
+
+              $msg  = "directory " . get_basename($exp_dir) . " does not";
+              $msg .= " appear to be a valid experiment directory";
+              gp_message ("error", $subr_name, $msg);
+
+              $g_total_error_count++;
             }
-          $g_user_settings{$internal_option_name}{"defined"}       = $TRUE;
-          $return_value = $TRUE;
         }
       else
         {
-          $message = "incorrect value for $option option: $value";
-          push (@g_user_input_errors, $message);
+          $no_of_invalid_dirs++;
+          $msg  = "directory " . get_basename($exp_dir) . " does not exist";
+          gp_message ("error", $subr_name, $msg);
 
-          $return_value = $FALSE;
+          $g_total_error_count++;
         }
     }
 
-  return ($return_value);
+  if ($no_of_invalid_dirs > 0)
+#------------------------------------------------------------------------------
+# This is a fatal error, but for now, we can continue to check for more errors.
+# Even if none more are found, execution is terminated before the data is
+# generated and processed.  In this way we can catch as many errors as
+# possible.
+#------------------------------------------------------------------------------
+    {
+      my $plural_or_single = ($no_of_invalid_dirs == 1) ?
+               "one experiment is" : $no_of_invalid_dirs . " experiments are";
+
+      $msg = $plural_or_single . " not valid";
+##      gp_message ("abort", $subr_name, $msg);
 
-} #-- End of subroutine check_user_option
+##      $g_total_error_count++;
+    }
+
+#------------------------------------------------------------------------------
+# Remove the experiments from ARGV and return the array with the experiment
+# names.  Note that these may, or may not be valid, but if invalid, execution
+# terminates before they are used.
+#------------------------------------------------------------------------------
+  for my $i (1 .. $no_of_experiments)
+    {
+      my $poppy = pop (@ARGV);
+
+      $msg = "popped $poppy from ARGV";
+      gp_message ("debug", $subr_name, $msg);
+
+      $msg = "ARGV after update = " . join (" ", @ARGV);
+      gp_message ("debug", $subr_name, $msg);
+    }
+
+  return (\@exp_dir_list);
+
+} #-- End of subroutine check_the_experiment_list
 
-#-------------------------------------------------------------------------------
-# This subroutine performs multiple checks on the experiment directories. One 
-# or more failures are fatal.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+# Perform multiple checks on the experiment directories.
+#
+# TBD: It needs to be investigated whether all of this is really neccesary.
+#------------------------------------------------------------------------------
 sub check_validity_exp_dirs
 {
   my $subr_name = get_my_name ();
@@ -2055,117 +2568,85 @@ sub check_validity_exp_dirs
   my ($exp_dir_list_ref) = @_;
 
   my @exp_dir_list = @{ $exp_dir_list_ref };
+
   my %elf_rats = ();
 
   my $dir_not_found    = $FALSE;
-  my $invalid_dir      = $FALSE;
-  my $dir_check_errors = $FALSE;
   my $missing_dirs     = 0;
   my $invalid_dirs     = 0;
-   
+
   my $archive_dir_not_empty;
-  my $elf_magic_number; 
+  my $archives_dir;
   my $archives_file;
-  my $archives_dir; 
-  my $first_line;
   my $count_exp_dir_not_elf;
+  my $elf_magic_number;
+  my $first_line;
+  my $msg;
+
   my $first_time;
   my $filename;
 
   my $comment;
 
-  my $selected_archive_has_elf_format; 
+  my $selected_archive_has_elf_format;
 
   my $selected_archive;
   my $archive_dir_selected;
   my $no_of_files_in_selected_archive;
 
-#-------------------------------------------------------------------------------
-# Check if the experiment directories exist and are valid.
-#-------------------------------------------------------------------------------
-  for my $exp_dir (@exp_dir_list)
-    {
-      if (not -d $exp_dir)
-        {
-          $dir_not_found = $TRUE;
-          $missing_dirs++;
-          gp_message ("error", $subr_name, "directory $exp_dir not found");
-          $dir_check_errors = $TRUE;
-        }
-      else
-        {
-#-------------------------------------------------------------------------------
-# Files log.xml and map.xml have to be there.
-#-------------------------------------------------------------------------------
-          gp_message ("debug", $subr_name, "directory $exp_dir found");
-          if ((-e $exp_dir."/log.xml") and (-e $exp_dir."/map.xml"))
-            {
-              gp_message ("debug", $subr_name, "directory $exp_dir appears to be a valid experiment directory");
-            }
-          else
-            {
-              $invalid_dir = $TRUE;
-              $invalid_dirs++; 
-              gp_message ("debug", $subr_name, "file ".$exp_dir."/log.xml and/or ".$exp_dir."/map.xml missing");
-              gp_message ("error"  , $subr_name, "directory $exp_dir does not appear to be a valid experiment directory");
-              $dir_check_errors = $TRUE;
-            }
-        }
-    }
-  if ($dir_not_found)
-    {
-      gp_message ("error", $subr_name, "a total of $missing_dirs directories not found");
-    }
-  if ($invalid_dir)
-    {
-      gp_message ("abort", $subr_name, "a total of $invalid_dirs directories are not valid");
-    }
-
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Initialize ELF status to FALSE.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 ##  for my $exp_dir (@exp_dir_list)
   for my $exp_dir (keys %g_exp_dir_meta_data)
     {
-      $g_exp_dir_meta_data{$exp_dir}{"elf_format"} = $FALSE; 
-      $g_exp_dir_meta_data{$exp_dir}{"archive_in_elf_format"} = $FALSE; 
+      $g_exp_dir_meta_data{$exp_dir}{"elf_format"} = $FALSE;
+      $g_exp_dir_meta_data{$exp_dir}{"archive_in_elf_format"} = $FALSE;
     }
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Check if the load objects are in ELF format.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   for my $exp_dir (keys %g_exp_dir_meta_data)
     {
-      $archives_dir = $g_exp_dir_meta_data{$exp_dir}{"directory_path"} .  $exp_dir . "/archives";
+      $archives_dir  = $g_exp_dir_meta_data{$exp_dir}{"directory_path"};
+      $archives_dir .= $exp_dir . "/archives";
       $archive_dir_not_empty = $FALSE;
       $first_time            = $TRUE;
       $g_exp_dir_meta_data{$exp_dir}{"archive_is_empty"} = $TRUE;
       $g_exp_dir_meta_data{$exp_dir}{"no_of_files_in_archive"} = 0;
 
-      gp_message ("debug", $subr_name, "g_exp_dir_meta_data{$exp_dir}{'archive_is_empty'} = $g_exp_dir_meta_data{$exp_dir}{'archive_is_empty'}");
-      gp_message ("debug", $subr_name, "checking $archives_dir");
+      $msg = "g_exp_dir_meta_data{$exp_dir}{'archive_is_empty'} = ";
+      $msg .= $g_exp_dir_meta_data{$exp_dir}{'archive_is_empty'};
+      gp_message ("debug", $subr_name, $msg);
+
+      $msg = "checking $archives_dir";
+      gp_message ("debug", $subr_name, $msg);
 
       while (glob ("$archives_dir/*"))
         {
           $filename = get_basename ($_);
-          gp_message ("debug", $subr_name, "processing file: $filename");
+
+          $msg = "processing file: $filename";
+          gp_message ("debug", $subr_name, $msg);
 
           $g_exp_dir_meta_data{$exp_dir}{"archive_files"}{$filename} = $TRUE;
           $g_exp_dir_meta_data{$exp_dir}{"no_of_files_in_archive"}++;
 
           $archive_dir_not_empty = $TRUE;
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Replaces the ELF_RATS part in elf_phdr.
 #
 # Challenge:  splittable_mrg.c_I0txnOW_Wn5
 #
 # TBD: Store this for each relevant experiment directory.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
           my $last_dot              = rindex ($filename,".");
           my $underscore_before_dot = $TRUE;
           my $first_underscore      = -1;
-          gp_message ("debugXL", $subr_name, "last_dot = $last_dot");
+
+          $msg = "last_dot = $last_dot";
+          gp_message ("debugXL", $subr_name, $msg);
+
           while ($underscore_before_dot)
             {
               $first_underscore = index ($filename, "_", $first_underscore+1);
@@ -2175,27 +2656,33 @@ sub check_validity_exp_dirs
                 }
             }
           my $original_name  = substr ($filename, 0, $first_underscore);
-          gp_message ("debug", $subr_name, "stripped archive name: $original_name");
+          $msg = "stripped archive name: " . $original_name;
+          gp_message ("debug", $subr_name, $msg);
           if (not exists ($elf_rats{$original_name}))
             {
               $elf_rats{$original_name} = [$filename, $exp_dir];
             }
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # We only need to detect the presence of an object once.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
           if ($first_time)
             {
               $first_time = $FALSE;
               $g_exp_dir_meta_data{$exp_dir}{"archive_is_empty"} = $FALSE;
-              gp_message ("debugXL", $subr_name, "g_exp_dir_meta_data{$exp_dir}{'archive_is_empty'} = $g_exp_dir_meta_data{$exp_dir}{'archive_is_empty'}");
+              $msg  = "g_exp_dir_meta_data{$exp_dir}{'archive_is_empty'} = ";
+              $msg .= $g_exp_dir_meta_data{$exp_dir}{"archive_is_empty"};
+
+              gp_message ("debugXL", $subr_name, $msg);
             }
         }
     } #-- End of loop over experiment directories
 
   for my $exp_dir (sort keys %g_exp_dir_meta_data)
     {
-      my $empty = $g_exp_dir_meta_data{$exp_dir}{"archive_is_empty"}; 
-      gp_message ("debug", $subr_name, "archive directory $exp_dir/archives is ".($empty ? "empty" : "not empty"));
+      my $empty = $g_exp_dir_meta_data{$exp_dir}{"archive_is_empty"};
+      $msg  = "archive directory " . $exp_dir . "/archives is";
+      $msg .= " " . ($empty ? "empty" : "not empty");
+      gp_message ("debug", $subr_name, $msg);
     }
 
 #------------------------------------------------------------------------------
@@ -2203,21 +2690,26 @@ sub check_validity_exp_dirs
 #------------------------------------------------------------------------------
   for my $exp_dir (sort keys %g_exp_dir_meta_data)
     {
-      $g_exp_dir_meta_data{$exp_dir}{"archive_in_elf_format"} = $FALSE; 
+      $g_exp_dir_meta_data{$exp_dir}{"archive_in_elf_format"} = $FALSE;
       if (not $g_exp_dir_meta_data{$exp_dir}{"archive_is_empty"})
         {
-          $archives_dir = $g_exp_dir_meta_data{$exp_dir}{"directory_path"} .  $exp_dir . "/archives";
-          gp_message ("debug", $subr_name, "exp_dir = $exp_dir archives_dir = $archives_dir");
+          $archives_dir  = $g_exp_dir_meta_data{$exp_dir}{"directory_path"};
+          $archives_dir .= $exp_dir . "/archives";
+          $msg = "exp_dir = " . $exp_dir . " archives_dir = " . $archives_dir;
+          gp_message ("debug", $subr_name, $msg);
 #------------------------------------------------------------------------------
 # Check if any of the loadobjects is of type ELF.  Bail out on the first one
 # found.  The assumption is that all other loadobjects must be of type ELF too
 # then.
 #------------------------------------------------------------------------------
-          for my $aname (sort keys %{$g_exp_dir_meta_data{$exp_dir}{"archive_files"}})
+          for my $aname (sort keys
+                       %{$g_exp_dir_meta_data{$exp_dir}{"archive_files"}})
             {
-              $filename = $g_exp_dir_meta_data{$exp_dir}{"directory_path"} . $exp_dir . "/archives/" . $aname;
+              $filename  = $g_exp_dir_meta_data{$exp_dir}{"directory_path"};
+              $filename .=  $exp_dir . "/archives/" . $aname;
+              $msg  = " - unable to open file $filename for reading:";
               open (ARCF,"<", $filename)
-                or die ("unable to open file $filename for reading - '$!'");
+                or die ($subr_name . $msg . " " . $!);
 
               $first_line = <ARCF>;
               close (ARCF);
@@ -2230,10 +2722,10 @@ sub check_validity_exp_dirs
 #              if ($first_line =~ /^\177ELF.*/)
 
               $elf_magic_number = unpack ('H8', $first_line);
-#              gp_message ("debug", $subr_name, "elf_magic_number = $elf_magic_number");
               if ($elf_magic_number eq "7f454c46")
                 {
-                  $g_exp_dir_meta_data{$exp_dir}{"archive_in_elf_format"} = $TRUE; 
+                  $g_exp_dir_meta_data{$exp_dir}{"archive_in_elf_format"} =
+                                                                       $TRUE;
                   $g_exp_dir_meta_data{$exp_dir}{"elf_format"} = $TRUE;
                   last;
                 }
@@ -2243,22 +2735,24 @@ sub check_validity_exp_dirs
 
   for my $exp_dir (sort keys %g_exp_dir_meta_data)
     {
-      $comment = "the loadobjects in the archive in $exp_dir are ";
-      $comment .= ($g_exp_dir_meta_data{$exp_dir}{"archive_in_elf_format"}) ? "in " : "not in ";
-      $comment .= "ELF format";
-      gp_message ("debug", $subr_name, $comment);
+      $msg = "the loadobjects in the archive in $exp_dir are";
+      $msg .= ($g_exp_dir_meta_data{$exp_dir}{"archive_in_elf_format"}) ?
+                                                       " in" : " not in";
+      $msg .= " ELF format";
+      gp_message ("debug", $subr_name, $msg);
     }
   for my $exp_dir (sort keys %g_exp_dir_meta_data)
     {
       if ($g_exp_dir_meta_data{$exp_dir}{"archive_is_empty"})
         {
-          gp_message ("debug", $subr_name, "there are no archived files in $exp_dir");
+          $msg = "there are no archived files in " . $exp_dir;
+          gp_message ("debug", $subr_name, $msg);
         }
     }
 
 #------------------------------------------------------------------------------
-# If there are archived files and they are not in ELF format, a debug is
-# issued.
+# If there are archived files and they are not in ELF format, a debug message
+# is issued.
 #
 # TBD: Bail out?
 #------------------------------------------------------------------------------
@@ -2267,12 +2761,14 @@ sub check_validity_exp_dirs
     {
       if (not $g_exp_dir_meta_data{$exp_dir}{"archive_in_elf_format"})
         {
-          $count_exp_dir_not_elf++; 
+          $count_exp_dir_not_elf++;
         }
     }
   if ($count_exp_dir_not_elf != 0)
     {
-      gp_message ("debug", $subr_name, "there are $count_exp_dir_not_elf experiments with non-ELF load objects");
+      $msg  = "there are $count_exp_dir_not_elf experiments with non-ELF";
+      $msg .= " load objects";
+      gp_message ("debug", $subr_name, $msg);
     }
 
 #------------------------------------------------------------------------------
@@ -2290,19 +2786,24 @@ sub check_validity_exp_dirs
 ##  for my $exp_dir (sort @exp_dir_list)
   for my $exp_dir (sort keys %g_exp_dir_meta_data)
     {
-      gp_message ("debugXL", $subr_name, "exp_dir = $exp_dir");
-      gp_message ("debugXL", $subr_name, "g_exp_dir_meta_data{$exp_dir}{'archive_is_empty'}");
+      $msg = "exp_dir = " . $exp_dir;
+      gp_message ("debugXL", $subr_name, $msg);
+      $msg  = "g_exp_dir_meta_data{$exp_dir}{'archive_is_empty'}";
+      $msg .= " = " . $g_exp_dir_meta_data{$exp_dir}{"archive_is_empty"};
+      gp_message ("debugXL", $subr_name, $msg);
 
       if (not $g_exp_dir_meta_data{$exp_dir}{"archive_is_empty"})
         {
           $selected_archive      = $exp_dir;
           $archive_dir_not_empty = $TRUE;
           $archive_dir_selected  = $TRUE;
-          $selected_archive_has_elf_format = ($g_exp_dir_meta_data{$exp_dir}{"archive_in_elf_format"}) ? $TRUE : $FALSE;
+          $selected_archive_has_elf_format =
+               ($g_exp_dir_meta_data{$exp_dir}{"archive_in_elf_format"}) ?
+                                                               $TRUE : $FALSE;
           last;
         }
     }
-  if (not $archive_dir_selected) 
+  if (not $archive_dir_selected)
 #------------------------------------------------------------------------------
 # None are found and pick the first one without archived files.
 #------------------------------------------------------------------------------
@@ -2319,35 +2820,52 @@ sub check_validity_exp_dirs
             }
         }
     }
-  gp_message ("debug", $subr_name, "experiment $selected_archive has been selected for archive analysis");
-  gp_message ("debug", $subr_name, "this archive is ". (($archive_dir_not_empty) ? "not empty" : "empty"));
-  gp_message ("debug", $subr_name, "this archive is ". (($selected_archive_has_elf_format) ? "in" : "not in")." ELF format");
+
+  $msg  = "experiment $selected_archive has been selected for";
+  $msg .= " archive analysis";
+  gp_message ("debug", $subr_name, $msg);
+  $msg  = "this archive is";
+  $msg .= $archive_dir_not_empty ? " not empty" : " empty";
+  gp_message ("debug", $subr_name, $msg);
+  $msg  = "this archive is";
+  $msg .= $selected_archive_has_elf_format ? " in" : " not in";
+  $msg .= " ELF format";
+  gp_message ("debug", $subr_name, $msg);
 #------------------------------------------------------------------------------
 # Get the size of the hash that contains the archived files.
 #------------------------------------------------------------------------------
 ##  $NO_OF_FILES_IN_ARCHIVE = scalar (keys %ARCHIVES_FILES);
 
-  $no_of_files_in_selected_archive = $g_exp_dir_meta_data{$selected_archive}{"no_of_files_in_archive"};
-  gp_message ("debug", $subr_name, "number of files in archive $selected_archive is $no_of_files_in_selected_archive");
+  $no_of_files_in_selected_archive =
+            $g_exp_dir_meta_data{$selected_archive}{"no_of_files_in_archive"};
 
+  $msg  = "number of files in archive $selected_archive is";
+  $msg .= " " . $no_of_files_in_selected_archive;
+  gp_message ("debug", $subr_name, $msg);
 
   for my $exp_dir (sort keys %g_exp_dir_meta_data)
     {
       my $is_empty = $g_exp_dir_meta_data{$exp_dir}{"archive_is_empty"};
-      gp_message ("debug", $subr_name, "archive directory $exp_dir/archives is ".($is_empty ? "empty" : "not empty"));
+      $msg  = "archive directory $exp_dir/archives is";
+      $msg .= $is_empty ? " empty" : " not empty";
+      gp_message ("debug", $subr_name, $msg);
     }
   for my $exp_dir (sort keys %g_exp_dir_meta_data)
     {
       if (not $g_exp_dir_meta_data{$exp_dir}{"archive_is_empty"})
         {
-          for my $object (sort keys %{$g_exp_dir_meta_data{$exp_dir}{"archive_files"}})
+          for my $object (sort keys
+                       %{$g_exp_dir_meta_data{$exp_dir}{"archive_files"}})
             {
-              gp_message ("debug", $subr_name, "$exp_dir $object $g_exp_dir_meta_data{$exp_dir}{'archive_files'}{$object}");
+              $msg  = $exp_dir . " " . $object . " ";
+              $msg .=
+               $g_exp_dir_meta_data{$exp_dir}{'archive_files'}{$object};
+              gp_message ("debug", $subr_name, $msg);
             }
         }
     }
 
-  return ($dir_check_errors, $archive_dir_not_empty, $selected_archive, \%elf_rats);
+  return ($archive_dir_not_empty, $selected_archive, \%elf_rats);
 
 } #-- End of subroutine check_validity_exp_dirs
 
@@ -2378,7 +2896,7 @@ sub color_string
     {
       $colored_string .= "</b>";
     }
-  $colored_string .= "</font>"; 
+  $colored_string .= "</font>";
 
   return ($colored_string);
 
@@ -2397,25 +2915,29 @@ sub create_exp_info
   my @experiment_data     = @{ $experiment_data_ref };
 
   my @experiment_stats_html = ();
-  my $experiment_stats_line; 
+  my $experiment_stats_line;
+  my $msg;
   my $plural;
 
   $plural = ($#experiment_dir_list > 0) ? "s:" : ":";
 
   $experiment_stats_line  = "<h3>\n";
-  $experiment_stats_line .= "Full pathnames to the input experiment" . $plural . "\n";
+  $experiment_stats_line .= "Full pathnames to the input experiment";
+  $experiment_stats_line .= $plural . "\n";
   $experiment_stats_line .= "</h3>\n";
   $experiment_stats_line .= "<pre>\n";
 
   for my $i (0 .. $#experiment_dir_list)
     {
-      $experiment_stats_line .= $experiment_dir_list[$i] . " (" . $experiment_data[$i]{"start_date"} . ")\n";
+      $experiment_stats_line .= $experiment_dir_list[$i] . " (" ;
+      $experiment_stats_line .= $experiment_data[$i]{"start_date"} . ")\n";
     }
   $experiment_stats_line .= "</pre>\n";
 
   push (@experiment_stats_html, $experiment_stats_line);
 
-  gp_message ("debugXL", $subr_name, "experiment_stats_line = $experiment_stats_line --");
+  $msg = "experiment_stats_line = " . $experiment_stats_line;
+  gp_message ("debugXL", $subr_name, $msg);
 
   return (\@experiment_stats_html);
 
@@ -2448,9 +2970,11 @@ sub create_html_credits
   my $msg;
   my $the_date;
 
-  my @months = qw (January February March April May June July August September October November December); 
+  my @months = qw (January February March April May June July
+                  August September October November December);
 
-  my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime ();
+  my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) =
+                                                               localtime ();
 
   $year += 1900;
 
@@ -2484,17 +3008,18 @@ sub create_html_header
    my $title = ${ $title_ref };
 
   my $LANG = $g_locale_settings{"LANG"};
-  my $background_color = $g_html_color_scheme{"background_color_page"}; 
+  my $background_color = $g_html_color_scheme{"background_color_page"};
 
-  my $html_header; 
+  my $html_header;
 
   $html_header  = "<!DOCTYPE html public \"-//w3c//dtd html 3.2//en\">\n";
   $html_header .= "<html lang=\"$LANG\">\n";
   $html_header .= "<head>\n";
-  $html_header .= "<meta http-equiv=\"content-type\" content=\"text/html; charset=iso-8859-1\">\n";
+  $html_header .= "<meta http-equiv=\"content-type\"";
+  $html_header .= " content=\"text/html; charset=iso-8859-1\">\n";
   $html_header .= "<title>" . $title . "</title>\n";
   $html_header .= "</head>\n";
-  $html_header .= "<body lang=\"$LANG\" bgcolor=". $background_color . ">\n"; 
+  $html_header .= "<body lang=\"$LANG\" bgcolor=". $background_color . ">\n";
   $html_header .= "<style>\n";
   $html_header .= "div.left {\n";
   $html_header .= "text-align: left;\n";
@@ -2515,113 +3040,14 @@ sub create_html_header
 } #-- End of subroutine create_html_header
 
 #------------------------------------------------------------------------------
-# Create an HTML page with the warnings.  If there are no warnings, include
-# line to this extent.  The alternative is to supporess the entire page, but
-# that breaks the consistency in the output.
-#------------------------------------------------------------------------------
-sub create_html_warnings_page
-{
-  my $subr_name = get_my_name ();
-
-  my ($outputdir_ref) = @_;
-
-  my $outputdir = ${ $outputdir_ref };
-
-  my $file_title;
-  my $html_acknowledgement;
-  my $html_end;
-  my $html_header;
-  my $html_home_left;
-  my $html_home_right;
-  my $html_title_header;
-  my $msg_no_warnings = "There are no warning messages issued.";
-  my $page_title;
-  my $position_text;
-  my $size_text;
-  my $outfile = $outputdir . $g_html_base_file_name{"warnings"} . ".html";
-
-  gp_message ("debug", $subr_name, "outfile = $outfile");
-
-  open (WARNINGS_OUT, ">", $outfile)
-    or die ("unable to open $outfile for writing - '$!'");
-  gp_message ("debug", $subr_name, "opened file $outfile for writing");
-
-  gp_message ("debug", $subr_name, "building warning file $outfile");
-
-#------------------------------------------------------------------------------
-# Get the number of warnings and in debug mode, print the list. 
-#------------------------------------------------------------------------------
-  my $number_of_warnings = scalar (@g_warning_messages);
-  gp_message ("debug", $subr_name, "number_of_warnings = $number_of_warnings");
-  
-  if ($number_of_warnings > 0)
-    {
-      for my $i (0 .. $#g_warning_messages)
-        {
-          print "$g_warning_messages[$i]\n";
-          my $msg = "g_warning_messages[$i] = $g_warning_messages[$i]";
-          gp_message ("debug", $subr_name, $msg);
-        }
-    }
-
-#------------------------------------------------------------------------------
-# Generate some of the structures used in the HTML output.
-#------------------------------------------------------------------------------
-  $file_title  = "Warning messages";
-  $html_header = ${ create_html_header (\$file_title) };
-  $html_home_right   = ${ generate_home_link ("right") };
-
-  $page_title    = "Warning Messages";
-  $size_text     = "h2"; 
-  $position_text = "center";
-  $html_title_header = ${ generate_a_header (\$page_title, \$size_text, \$position_text) };
-  
-#-------------------------------------------------------------------------------
-# Get the acknowledgement, return to main link, and final html statements.
-#-------------------------------------------------------------------------------
-  $html_home_left       = ${ generate_home_link ("left") };
-  $html_acknowledgement = ${ create_html_credits () };
-  $html_end             = ${ terminate_html_document () };
-
-#-------------------------------------------------------------------------------
-# Generate the HTML file.
-#-------------------------------------------------------------------------------
-  print WARNINGS_OUT $html_header;
-  print WARNINGS_OUT $html_home_right;
-  print WARNINGS_OUT $html_title_header;
-
-  if ($number_of_warnings > 0)
-    {
-      print WARNINGS_OUT "<pre>\n";
-      print WARNINGS_OUT "$_\n" for @g_warning_messages;
-      print WARNINGS_OUT "</pre>\n";
-    }
-  else
-    {
-      print WARNINGS_OUT $msg_no_warnings;
-    }
-
-  print WARNINGS_OUT $html_home_left;
-  print WARNINGS_OUT "<br>\n";
-  print WARNINGS_OUT $html_acknowledgement;
-  print WARNINGS_OUT $html_end;
-
-  close (WARNINGS_OUT);
-
-  return (\$number_of_warnings);
-
-} #-- End of subroutine create_html_warnings_page
-
-#-------------------------------------------------------------------------------
 # Create a complete table.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub create_table
 {
   my $subr_name = get_my_name ();
 
   my ($experiment_data_ref, $table_definition_ref) = @_;
+
   my @experiment_data  = @{ $experiment_data_ref };
   my @table_definition = @{ $table_definition_ref };
 
@@ -2636,8 +3062,10 @@ sub create_table
 
   for my $i (sort keys @table_definition)
     {
-      $html_table_line = ${ create_table_entry_exp (\$table_definition[$i]{"name"}, 
-                              \$table_definition[$i]{"key"}, \@experiment_data) };
+      $html_table_line = ${
+               create_table_entry_exp (\$table_definition[$i]{"name"},
+                                       \$table_definition[$i]{"key"},
+                                       \@experiment_data) };
       push (@html_exp_table_data, $html_table_line);
 
       my $msg = "i = $i html_table_line = $html_table_line";
@@ -2651,9 +3079,9 @@ sub create_table
 
 } #-- End of subroutine create_table
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Create one row for the table with experiment info.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub create_table_entry_exp
 {
   my $subr_name = get_my_name ();
@@ -2664,11 +3092,13 @@ sub create_table_entry_exp
   my $key              = ${ $key_ref };
   my @experiment_data  = @{ $experiment_data_ref };
 
-  gp_message ("debugXL", $subr_name, "entry_name = $entry_name key = $key");
-
   my $html_line;
+  my $msg;
+
+  $msg = "entry_name = $entry_name key = $key";
+  gp_message ("debugXL", $subr_name, $msg);
 
-  $html_line  = "<tr><div class=\"left\"><td><b>&nbsp; ";
+##  $html_line  = "<tr><div class=\"left\"><td><b>&nbsp; ";
   $html_line  = "<tr><div class=\"right\"><td><b>&nbsp; ";
   $html_line .= $entry_name;
   $html_line .= " &nbsp;</b></td>";
@@ -2676,12 +3106,15 @@ sub create_table_entry_exp
     {
       if (exists ($experiment_data[$i]{$key}))
         {
-          $html_line .= "<td>&nbsp; " . $experiment_data[$i]{$key} . " &nbsp;</td>";
+          $html_line .= "<td>&nbsp; " . $experiment_data[$i]{$key};
+          $html_line .= " &nbsp;</td>";
         }
       else
         {
-##          gp_message ("assertion", $subr_name, "experiment_data[$i]{$key} does not exist");
-          gp_message ("warning", $subr_name, "experiment_data[$i]{$key} does not exist");
+          $msg = "experiment_data[$i]{$key} does not exist";
+##          gp_message ("assertion", $subr_name, $msg);
+# TBD: warning or error?
+          gp_message ("warning", $subr_name, $msg);
         }
     }
   $html_line .= "</div></tr>\n";
@@ -2692,9 +3125,9 @@ sub create_table_entry_exp
 
 } #-- End of subroutine create_table_entry_exp
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Create the table header for the experiment info.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub create_table_header_exp
 {
   my $subr_name = get_my_name ();
@@ -2703,6 +3136,7 @@ sub create_table_header_exp
 
   my @experiment_data = @{ $experiment_data_ref };
   my $html_header_line;
+  my $msg;
 
   $html_header_line  = "<style>\n";
   $html_header_line .= "table, th, td {\n";
@@ -2716,54 +3150,62 @@ sub create_table_header_exp
 
   for my $i (sort keys @experiment_data)
     {
-      $html_header_line .= "<th>&nbsp; Experiment ID " . $experiment_data[$i]{"exp_id"} . "&nbsp;</th>";
+      $html_header_line .= "<th>&nbsp; Experiment ID ";
+      $html_header_line .= $experiment_data[$i]{"exp_id"} . "&nbsp;</th>";
     }
   $html_header_line .= "</div></tr>\n";
 
-  gp_message ("debugXL", $subr_name, "html_header_line = $html_header_line");
+  $msg = "html_header_line = " . $html_header_line;
+  gp_message ("debugXL", $subr_name, $msg);
 
   return (\$html_header_line);
 
 } #-- End of subroutine create_table_header_exp
 
-#-------------------------------------------------------------------------------
-# Handle where the output should go. If needed, a directory is created where 
+#------------------------------------------------------------------------------
+# Handle where the output should go. If needed, a directory is created where
 # the results will go.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub define_the_output_directory
 {
   my $subr_name = get_my_name ();
 
   my ($define_new_output_dir, $overwrite_output_dir) = @_;
 
+  my $msg;
   my $outputdir;
 
-#-------------------------------------------------------------------------------
-# If neither -o or -O are set, find the next number to be used in the name for 
+#------------------------------------------------------------------------------
+# If neither -o or -O are set, find the next number to be used in the name for
 # the default output directory.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   if ((not $define_new_output_dir) and (not $overwrite_output_dir))
     {
       my $dir_id = 1;
-      while (-d "er.".$dir_id.".html") 
+      while (-d "er.".$dir_id.".html")
         { $dir_id++; }
       $outputdir = "er.".$dir_id.".html";
     }
 
   if (-d $outputdir)
     {
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # The -o option is used, but the directory already exists.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
       if ($define_new_output_dir)
         {
-          gp_message ("error", $subr_name, "directory $outputdir already exists");
-          gp_message ("abort", $subr_name, "use the -O option to overwrite an existing directory");
+          $msg = "directory $outputdir already exists";
+          gp_message ("error", $subr_name, $msg);
+          $g_total_error_count++;
+
+          $msg  =  "use the -O/--overwrite option to overwrite an existing";
+          $msg .= " directory";
+          gp_message ("abort", $subr_name, $msg);
         }
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # This is a bit risky, so we proceed with caution. The output directory exists,
 # but it is okay to overwrite it. It is removed here and created again below.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
       elsif ($overwrite_output_dir)
         {
           my $target_cmd = $g_mapped_cmds{"rm"};
@@ -2772,25 +3214,29 @@ sub define_the_output_directory
           if ($error_code != 0)
             {
               gp_message ("error", $subr_name, $rm_output);
-              gp_message ("abort", $subr_name, "fatal error when trying to remove $outputdir");
+              $msg = "fatal error when trying to remove " . $outputdir;
+              gp_message ("abort", $subr_name, $msg);
             }
           else
             {
-              gp_message ("debug", $subr_name, "directory $outputdir has been removed");
+              $msg = "directory $outputdir has been removed";
+              gp_message ("debug", $subr_name, $msg);
             }
         }
     }
-#-------------------------------------------------------------------------------
-# When we get here, the fatal scenarios have been cleared and the name for 
+#------------------------------------------------------------------------------
+# When we get here, the fatal scenarios have been cleared and the name for
 # $outputdir is known. Time to create it.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   if (mkdir ($outputdir, 0777))
     {
-      gp_message ("debug", $subr_name, "created output directory $outputdir");
+      $msg = "created output directory " . $outputdir;
+      gp_message ("debug", $subr_name, $msg);
     }
-  else 
+  else
     {
-      gp_message ("abort", $subr_name, "a fatal problem occurred when creating directory $outputdir");
+      $msg = "a fatal problem occurred when creating directory " . $outputdir;
+      gp_message ("abort", $subr_name, $msg);
     }
 
   return ($outputdir);
@@ -2810,20 +3256,24 @@ sub determine_base_va_address
 
   my ($executable_name, $base_va_executable, $loadobj, $routine) = @_;
 
+  my $msg;
   my $name_loadobject;
   my $base_va_address;
 
-  gp_message ("debugXL", $subr_name, "base_va_executable = $base_va_executable"); 
-  gp_message ("debugXL", $subr_name, "loadobj = $loadobj"); 
-  gp_message ("debugXL", $subr_name, "routine = $routine");
-
-#------------------------------------------------------------------------------
+  $msg = "base_va_executable = " . $base_va_executable;
+  gp_message ("debugXL", $subr_name, $msg);
+  $msg = "loadobj            = " . $loadobj;
+  gp_message ("debugXL", $subr_name, $msg);
+  $msg = "routine            = " . $routine;
+  gp_message ("debugXL", $subr_name, $msg);
+
+#------------------------------------------------------------------------------
 # Strip the pathname from the load object name.
 #------------------------------------------------------------------------------
   $name_loadobject = get_basename ($loadobj);
 
 #------------------------------------------------------------------------------
-# If the load object is the executable, return the base address determined 
+# If the load object is the executable, return the base address determined
 # earlier.  Otherwise return 0x0.  Note that I am not sure if this is always
 # the right thing to do, but for .so files it seems to work out fine.
 #------------------------------------------------------------------------------
@@ -2835,18 +3285,21 @@ sub determine_base_va_address
     {
       $base_va_address = "0x0";
     }
-   
+
   my $decimal_address = bigint::hex ($base_va_address);
-  gp_message ("debugXL", $subr_name, "return base_va_address = $base_va_address (decimal: $decimal_address)");
+
+  $msg  = "return base_va_address = $base_va_address";
+  $msg .= " (decimal: $decimal_address)";
+  gp_message ("debugXL", $subr_name, $msg);
 
   return ($base_va_address);
 
 } #-- End of subroutine determine_base_va_address
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Now that we know the map.xml file(s) are present, we can scan these and get
 # the required information.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub determine_base_virtual_address
 {
   my $subr_name = get_my_name ();
@@ -2855,28 +3308,33 @@ sub determine_base_virtual_address
 
   my @exp_dir_list   = @{ $exp_dir_list_ref };
 
-  my $full_path_exec;
   my $executable_name;
+  my $full_path_exec;
+  my $msg;
+  my $path_to_map_file;
   my $va_executable_in_hex;
 
-  my $path_to_map_file; 
-
   for my $exp_dir (keys %g_exp_dir_meta_data)
     {
-      $path_to_map_file  = $g_exp_dir_meta_data{$exp_dir}{"directory_path"}; 
+      $path_to_map_file  = $g_exp_dir_meta_data{$exp_dir}{"directory_path"};
       $path_to_map_file .= $exp_dir;
       $path_to_map_file .= "/map.xml";
 
-      ($full_path_exec, $executable_name, $va_executable_in_hex) = extract_info_from_map_xml ($path_to_map_file);
+      ($full_path_exec, $executable_name, $va_executable_in_hex) =
+                               extract_info_from_map_xml ($path_to_map_file);
 
       $g_exp_dir_meta_data{$exp_dir}{"full_path_exec"} = $full_path_exec;
       $g_exp_dir_meta_data{$exp_dir}{"exec_name"}      = $executable_name;
       $g_exp_dir_meta_data{$exp_dir}{"va_base_in_hex"} = $va_executable_in_hex;
 
-      gp_message ("debug", $subr_name, "exp_dir              = $exp_dir");
-      gp_message ("debug", $subr_name, "full_path_exece      = $full_path_exec");
-      gp_message ("debug", $subr_name, "executable_name      = $executable_name");
-      gp_message ("debug", $subr_name, "va_executable_in_hex = $va_executable_in_hex");
+      $msg = "exp_dir              = " . $exp_dir;
+      gp_message ("debug", $subr_name, $msg);
+      $msg = "full_path_exece      = " . $full_path_exec;
+      gp_message ("debug", $subr_name, $msg);
+      $msg = "executable_name      = " . $executable_name;
+      gp_message ("debug", $subr_name, $msg);
+      $msg = "va_executable_in_hex = " . $va_executable_in_hex;
+      gp_message ("debug", $subr_name, $msg);
     }
 
   return (0);
@@ -2890,114 +3348,143 @@ sub determine_decimal_separator
 {
   my $subr_name = get_my_name ();
 
-  my $ignore_count;
-  my $decimal_separator;
+  my $cmd_output;
   my $convert_to_dot;
-  my $field;
-  my $target_found; 
+  my $decimal_separator;
   my $error_code;
-  my $cmd_output;
+  my $field;
+  my $ignore_count;
+  my @locale_info = ();
+  my $msg;
   my $target_cmd;
-  my @locale_info;
+  my $target_found;
 
   my $default_decimal_separator = "\\.";
 
   $target_cmd  = $g_mapped_cmds{locale} . " -k LC_NUMERIC";
   ($error_code, $cmd_output) = execute_system_cmd ($target_cmd);
-   
+
   if ($error_code != 0)
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # This is unlikely to happen, but you never know.  To reduce the nesting level,
 # return right here in case of an error.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
     {
-      gp_message ("error", $subr_name, "failure to execute the command $target_cmd");
-      
+      $msg = "failure to execute the command " . $target_cmd;
+      gp_message ("error", $subr_name, $msg);
+
+      $g_total_error_count++;
+
       $convert_to_dot = $TRUE;
 
       return ($error_code, $default_decimal_separator, $convert_to_dot);
     }
 
-#-------------------------------------------------------------------------------
-# Scan the locale info and search for the target line of the form 
+#------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+# Scan the locale info and search for the target line of the form
 # decimal_point="<target>" where <target> is either a dot, or a comma.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Split the output into the different lines and scan for the line we need.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   @locale_info  = split ("\n", $cmd_output);
   $target_found = $FALSE;
-  for my $line (@locale_info) 
+  for my $line (@locale_info)
     {
       chomp ($line);
-      gp_message ("debug", $subr_name, "line from locale_info = $line");
-      if ($line =~ /decimal_point=/) 
+      $msg = "line from locale_info = " . $line;
+      gp_message ("debug", $subr_name, $msg);
+
+      if ($line =~ /decimal_point=/)
         {
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Found the target line. Split this line to get the value field.
-#-------------------------------------------------------------------------------
-          my @split_line = split ("=", $line); 
+#------------------------------------------------------------------------------
+          my @split_line = split ("=", $line);
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # There should be 2 fields. If not, something went wrong.
-#-------------------------------------------------------------------------------
-          if (scalar @split_line != 2) 
+#------------------------------------------------------------------------------
+          if (scalar @split_line != 2)
             {
 #     if (scalar @split_line == 2) {
 #        $target_found    = $FALSE;
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Remove the newline before printing the variables.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
               $ignore_count = chomp ($line);
               $ignore_count = chomp (@split_line);
-              gp_message ("debug", $subr_name, "warning - line $line matches the search, but the decimal separator has the wrong format");
-              gp_message ("debug", $subr_name, "warning - the splitted line is [@split_line] and does not contain 2 fields");
-              gp_message ("debug", $subr_name, "warning - the default decimal separator will be used");
+
+              $msg  = "line $line matches the search, but the decimal";
+              $msg .= " separator has the wrong format";
+              gp_message ("warning", $subr_name, $msg);
+              $msg  = "the splitted line is [@split_line] and does not";
+              $msg .= " contain 2 fields";
+              gp_message ("warning", $subr_name, $msg);
+              $msg  = "the default decimal separator will be used";
+              gp_message ("warning", $subr_name, $msg);
+
+              $g_total_warning_count++;
             }
           else
             {
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # We know there are 2 fields and the second one has the decimal point.
-#-------------------------------------------------------------------------------
-              gp_message ("debug", $subr_name, "split_line[1] = $split_line[1]");
+#------------------------------------------------------------------------------
+              $msg = "split_line[1] = " . $split_line[1];
+              gp_message ("debug", $subr_name, $msg);
 
               chomp ($split_line[1]);
               $field = $split_line[1];
 
               if (length ($field) != 3)
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # The field still includes the quotes.  Check if the string has length 3, which
 # should be the case, but if not, we flag an error.  The error code is set such
 # that the callee will know a problem has occurred.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
                 {
-                  gp_message ("error", $subr_name, "unexpected output from the $target_cmd command: $field");
+                  $msg  = "unexpected output from the $target_cmd command:";
+                  $msg .= " " . $field;
+                  gp_message ("error", $subr_name, $msg);
+
+                  $g_total_error_count++;
+
                   $error_code = 1;
                   last;
                 }
 
-              gp_message ("debug", $subr_name, "field = ->$field<-");
+              $msg = "field = ->$field<-";
+              gp_message ("debug", $subr_name, $msg);
 
               if (($field eq "\".\"") or ($field eq "\",\""))
-#-------------------------------------------------------------------------------
-# Found the separator.  Capture the character between the quotes. 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+# Found the separator.  Capture the character between the quotes.
+#------------------------------------------------------------------------------
                 {
                   $target_found      = $TRUE;
                   $decimal_separator = substr ($field,1,1);
-                  gp_message ("debug", $subr_name, "decimal_separator = $decimal_separator--end skip loop");
+                  $msg  = "decimal_separator = $decimal_separator--end";
+                  $msg .= " skip remainder of loop";
+                  gp_message ("debug", $subr_name, $msg);
                   last;
                 }
             }
         }
     }
-  if (not $target_found) 
+  if (not $target_found)
     {
       $decimal_separator = $default_decimal_separator;
-      gp_message ("warning", $subr_name, "cannot determine the decimal separator - use the default $decimal_separator");
-    } 
+      $msg  = "cannot determine the decimal separator";
+      $msg .= " - use the default " . $decimal_separator;
+      gp_message ("warning", $subr_name, $msg);
+
+      $g_total_warning_count++;
+    }
 
   if ($decimal_separator ne ".")
     {
@@ -3027,21 +3514,26 @@ sub dump_function_info
 
   my %function_info = %{$function_info_ref};
   my $kip;
+  my $msg;
+
+  $msg = "function_info for " . $name;
+  gp_message ("debug", $subr_name, $msg);
 
-  gp_message ("debug", $subr_name, "function_info for $name");
   $kip = 0;
   for my $farray ($function_info{$name})
     {
       for my $elm (@{$farray})
         {
-          gp_message ("debug", $subr_name, "$kip: routine = ${$elm}{'routine'}");
+          $msg = $kip . ": routine = " . ${$elm}{"routine"};
+          gp_message ("debug", $subr_name, $msg);
           for my $key (sort keys %{$elm})
             {
               if ($key eq "routine")
                 {
                   next;
                 }
-              gp_message ("debug", $subr_name, "$kip: $key = ${$elm}{$key}");
+              $msg = $kip . ": $key = " . ${$elm}{$key};
+              gp_message ("debug", $subr_name, $msg);
             }
           $kip++;
         }
@@ -3051,191 +3543,6 @@ sub dump_function_info
 
 } #-- End of subroutine dump_function_info
 
-#------------------------------------------------------------------------------
-# This is an early scan to find the settings for some options very early on. 
-# For practical reasons the main option parsing and handling is done later, 
-# but without this early scan, these options will not be enabled until later
-# in the execution.
-#
-# This early scan fixes that, but it is not very elegant to do it this way
-# and in the future, this will be improved.  For now it gets the job done.
-#------------------------------------------------------------------------------
-sub early_scan_specific_options
-{
-  my $subr_name = get_my_name ();
-
-  my @options_with_value = qw /verbose warnings debug quiet/;
-  my $target_option;
-
-  my $ignore_value;
-  my $found_option;
-  my $option_requires_value;
-  my $option_value;
-  my $valid_input;
-  my @error_messages = ();
-
-  $option_requires_value = $TRUE;
-  for (@options_with_value)
-    {
-      $target_option = $_;
-      ($found_option, $option_value) = find_target_option (
-                                         \@ARGV, 
-                                         $option_requires_value, 
-                                         $target_option);
-      if ($found_option)
-        {
-#------------------------------------------------------------------------------
-# This part has been set up such that we can support other options too, should
-# this become necessary.
-#
-# A necessary, but limited check for the validity of a value is performed.
-# This avoids that an error message shows up twice later on.
-#------------------------------------------------------------------------------
-
-#------------------------------------------------------------------------------
-# All option values are converted to lower case.  This makes the checks easier.
-#------------------------------------------------------------------------------
-
-          if ($target_option eq "verbose")
-            {
-              my $verbose_value = lc ($option_value);
-              $valid_input = verify_if_input_is_valid ($verbose_value, "onoff");
-              if ($valid_input)
-                {
-                   $g_verbose = ($verbose_value eq "on") ? $TRUE : $FALSE;
-                   if ($verbose_value eq "on")
-#------------------------------------------------------------------------------
-# Set the status and disable output buffering in verbose mode.
-#------------------------------------------------------------------------------
-                     {
-                       $g_user_settings{"verbose"}{"current_value"} = "on";
-                       STDOUT->autoflush (1);
-                     }
-                   elsif ($verbose_value eq "off")
-                     {
-                       $g_user_settings{"verbose"}{"current_value"} = "off";
-                     }
-                }
-              else
-                {
-                  my $msg = "$option_value is not supported for the verbose option";
-                  push (@error_messages, $msg);
-                }
-            }
-          elsif ($target_option eq "warnings")
-            {
-              my $warnings_value = lc ($option_value);
-              $valid_input = verify_if_input_is_valid ($warnings_value, "onoff");
-              if ($valid_input)
-                {
-                   $g_warnings = ($warnings_value eq "on") ? $TRUE : $FALSE;
-                   if ($warnings_value eq "on")
-#------------------------------------------------------------------------------
-# Set the status and disable output buffering if warnings are enabled.
-#------------------------------------------------------------------------------
-                     {
-                       $g_user_settings{"warnings"}{"current_value"} = "on";
-                       STDOUT->autoflush (1);
-                     }
-                   elsif ($warnings_value eq "off")
-                     {
-                       $g_user_settings{"warnings"}{"current_value"} = "off";
-                     }
-                }
-              else
-                {
-                  my $msg = "$option_value is not supported for the warnings option";
-                  push (@error_messages, $msg);
-                }
-            }
-          elsif ($target_option eq "quiet") 
-            {
-              my $quiet_value = lc ($option_value);
-              $valid_input = verify_if_input_is_valid ($option_value, "onoff");
-              if ($valid_input)
-                {
-                   $g_quiet = ($quiet_value eq "on") ? $TRUE : $FALSE;
-                   if ($quiet_value eq "on")
-                     {
-                       $g_user_settings{"quiet"}{"current_value"} = "on";
-                     }
-                   elsif ($quiet_value eq "off")
-                     {
-                       $g_user_settings{"quiet"}{"current_value"} = "off";
-                     }
-                }
-              else
-                {
-                  my $msg = "$option_value is not supported for the quiet option";
-                  push (@error_messages, $msg);
-                }
-            }
-          elsif ($target_option eq "debug") 
-            {
-              my $debug_value = lc ($option_value);
-              $valid_input = verify_if_input_is_valid ($debug_value, "size");
-              if ($valid_input)
-                {
-                   if ($debug_value ne "off")
-#------------------------------------------------------------------------------
-# Disable output buffering in debug mode.
-#------------------------------------------------------------------------------
-                     {
-                       $g_user_settings{"debug"}{"current_value"} = "on";
-                       STDOUT->autoflush (1);
-                     }
-#------------------------------------------------------------------------------
-# This function also sets $g_user_settings{"debug"}{"current_value"}. 
-#------------------------------------------------------------------------------
-                   my $ignore_value = set_debug_size (\$debug_value);
-                }
-              else
-                {
-                  my $msg = "$option_value is not supported for the debug option";
-                  push (@error_messages, $msg);
-                }
-            }
-          else
-            {
-              my $msg = "target option $target_option not expected";
-              gp_message ("assertion", $subr_name, $msg);
-            }
-        }
-    }
-
-#------------------------------------------------------------------------------
-# Check for input errors.
-#------------------------------------------------------------------------------
-  my $input_errors = scalar (@error_messages); 
-  if ($input_errors > 0)
-    {
-      my $plural = ($input_errors == 1) ? 
-                        "is one error" : "are $input_errors errors";
-      print "There " . $plural . " in the options:\n";
-      for my $i (0 .. $#error_messages)
-        {
-          print "- $error_messages[$i]\n";
-        }
-      exit (0);
-    }
-#------------------------------------------------------------------------------
-# If quiet mode has been enabled, disable verbose, warnings and debug.
-#------------------------------------------------------------------------------
-  if ($g_quiet)
-    {
-      $g_user_settings{"verbose"}{"current_value"} = "off";
-      $g_user_settings{"warnings"}{"current_value"} = "off";
-      $g_user_settings{"debug"}{"current_value"}   = "off";
-      $g_verbose  = $FALSE;
-      $g_warnings = $FALSE;
-      my $debug_off = "off";
-      my $ignore_value = set_debug_size (\$debug_off);
-    }
-
-  return (0);
-
-} #-- End of subroutine early_scan_specific_options
-
 #------------------------------------------------------------------------------
 # TBD
 #------------------------------------------------------------------------------
@@ -3243,19 +3550,23 @@ sub elf_phdr
 {
   my $subr_name = get_my_name ();
 
-  my ($elf_loadobjects_found, $elf_arch, $loadobj, $routine, 
+  my ($elf_loadobjects_found, $elf_arch, $loadobj, $routine,
       $ARCHIVES_MAP_NAME, $ARCHIVES_MAP_VADDR, $elf_rats_ref) = @_;
 
   my %elf_rats = %{$elf_rats_ref};
 
+  my $msg;
   my $return_value;
 
 #------------------------------------------------------------------------------
 # TBD. Quick check. Can be moved up the call tree.
 #------------------------------------------------------------------------------
-    if ( ($elf_arch ne "Linux") and ($elf_arch ne "SunOS") )
+    if ( $elf_arch ne "Linux" )
       {
-        gp_message ("abort", $subr_name, "$elf_arch is not a supported OS");
+        $msg = $elf_arch . " is not a supported OS";
+        gp_message ("error", $subr_name, $msg);
+        $g_total_error_count++;
+        gp_message ("abort", $subr_name, $g_abort_msg);
       }
 
 #------------------------------------------------------------------------------
@@ -3268,20 +3579,31 @@ sub elf_phdr
   if ($elf_loadobjects_found)
     {
       gp_message ("debugXL", $subr_name, "calling elf_phdr_usual");
-      $return_value = elf_phdr_usual ($elf_arch, $loadobj, $routine, \%elf_rats);
+      $return_value = elf_phdr_usual ($elf_arch,
+                                     $loadobj,
+                                     $routine,
+                                     \%elf_rats);
     }
-  else 
+  else
     {
       gp_message ("debugXL", $subr_name, "calling elf_phdr_sometimes");
-      $return_value = elf_phdr_sometimes ($elf_arch, $loadobj, $routine, $ARCHIVES_MAP_NAME, $ARCHIVES_MAP_VADDR);
+      $return_value = elf_phdr_sometimes ($elf_arch,
+                                         $loadobj,
+                                         $routine,
+                                         $ARCHIVES_MAP_NAME,
+                                         $ARCHIVES_MAP_VADDR);
     }
 
   gp_message ("debug", $subr_name, "the return value = $return_value");
 
   if (not $return_value)
     {
-      gp_message ("abort", $subr_name, "need to handle a return value of FALSE");
-    } 
+      $msg = "need to handle a return value of FALSE";
+      gp_message ("error", $subr_name, $msg);
+      $g_total_error_count++;
+      gp_message ("abort", $subr_name, $g_abort_msg);
+    }
+
   return ($return_value);
 
 } #-- End of subroutine elf_phdr
@@ -3293,7 +3615,7 @@ sub elf_phdr_sometimes
 {
   my $subr_name = get_my_name ();
 
-  my ($elf_arch, $loadobj, $routine, $ARCHIVES_MAP_NAME, 
+  my ($elf_arch, $loadobj, $routine, $ARCHIVES_MAP_NAME,
       $ARCHIVES_MAP_VADDR) = @_;
 
   my $arch_uname_s = $local_system_config{"kernel_name"};
@@ -3304,10 +3626,11 @@ sub elf_phdr_sometimes
   gp_message ("debug", $subr_name, "arch_uname   = $arch_uname");
   gp_message ("debug", $subr_name, "arch         = $arch");
 
-  my $target_cmd;
-  my $command_string; 
-  my $error_code;
   my $cmd_output;
+  my $command_string;
+  my $error_code;
+  my $msg;
+  my $target_cmd;
 
   my $line;
   my $blo;
@@ -3332,8 +3655,8 @@ sub elf_phdr_sometimes
   if ($ARCHIVES_MAP_NAME eq $blo)
     {
       return ($ARCHIVES_MAP_VADDR);
-    } 
-  else 
+    }
+  else
     {
       return ($FALSE);
     }
@@ -3343,9 +3666,11 @@ sub elf_phdr_sometimes
 #------------------------------------------------------------------------------
 # We are masquerading between systems, must leave
 #------------------------------------------------------------------------------
-      gp_message ("debug", $subr_name, "masquerading arch_uname_s->$arch_uname_s elf_arch->$elf_arch");
+      $msg = "masquerading arch_uname_s->$arch_uname_s elf_arch->$elf_arch";
+      gp_message ("debug", $subr_name, $msg);
       return ($FALSE);
     }
+
   if ($loadobj eq "DYNAMIC_FUNCTIONS")
 #------------------------------------------------------------------------------
 # Linux vDSO, leave for now
@@ -3366,8 +3691,8 @@ sub elf_phdr_sometimes
   if ($ARCHIVES_MAP_NAME eq $blo)
     {
       return ($ARCHIVES_MAP_VADDR);
-    } 
-  else 
+    }
+  else
     {
       return ($FALSE);
     }
@@ -3387,13 +3712,20 @@ sub elf_phdr_usual
 
   my %elf_rats = %{$elf_rats_ref};
 
+  my $load_long_regex;
+  $load_long_regex     = '^\s+LOAD\s+(\S+)\s+(\S+)\s+(\S+)';
+  $load_long_regex    .= '\s+(\S+)\s+(\S+)\s+(R\sE)\s+(\S+)$';
+  my $load_short_regex = '^\s+LOAD\s+(\S+)\s+(\S+)\s+(\S+)$';
+  my $re_regex         = '^\s+(\S+)\s+(\S+)\s+(R\sE)\s+(\S+)$';
+
   my $return_code;
   my $cmd_output;
   my $target_cmd;
-  my $command_string; 
+  my $command_string;
   my $error_code;
   my $error_code1;
   my $error_code2;
+  my $msg;
 
   my ($elf_offset, $loadobjARC);
   my ($i, @foo, $foo, $foo1, $p_vaddr, $rc);
@@ -3401,10 +3733,13 @@ sub elf_phdr_usual
 
   my $arch_uname_s = $local_system_config{"kernel_name"};
 
-  gp_message ("debug", $subr_name, "elf_arch = $elf_arch loadobj = $loadobj routine = $routine");
+  $msg = "elf_arch = $elf_arch loadobj = $loadobj routine = $routine";
+  gp_message ("debug", $subr_name, $msg);
 
   my ($base, $ignore_value, $ignore_too) = fileparse ($loadobj);
-  gp_message ("debug", $subr_name, "base = $base ".basename ($loadobj));
+
+  $msg = "base = $base " . basename ($loadobj);
+  gp_message ("debug", $subr_name, $msg);
 
   if ($elf_arch eq "Linux")
     {
@@ -3414,7 +3749,10 @@ sub elf_phdr_usual
 # We are masquerading between systems, must leave.
 # Maybe we could use ELF_RATS
 #------------------------------------------------------------------------------
-          gp_message ("debug", $subr_name, "masquerading arch_uname_s->$arch_uname_s elf_arch->$elf_arch");
+          $msg  = "masquerading arch_uname_s->" . $arch_uname_s;
+          $msg .= " elf_arch->" . $elf_arch;
+          gp_message ("debug", $subr_name, $msg);
+
           return ($FALSE);
         }
       if ($loadobj eq "DYNAMIC_FUNCTIONS")
@@ -3431,8 +3769,10 @@ sub elf_phdr_usual
 
       ($error_code1, $cmd_output) = execute_system_cmd ($command_string);
 
-      gp_message ("debug", $subr_name, "executed command_string = $command_string");
-      gp_message ("debug", $subr_name, "cmd_output = $cmd_output");
+      $msg = "executed command_string = " . $command_string;
+      gp_message ("debug", $subr_name, $msg);
+      $msg = "cmd_output = " . $cmd_output;
+      gp_message ("debug", $subr_name, $msg);
 
       if ($error_code1 != 0)
         {
@@ -3445,24 +3785,32 @@ sub elf_phdr_usual
 
           if (exists ($elf_rats{$loadobjARC}))
             {
-              my $elfoid  = "$elf_rats{$loadobjARC}[1]/archives/$elf_rats{$loadobjARC}[0]";
+              my $elfoid;
+              $elfoid  = $elf_rats{$loadobjARC}[1] . "/archives/";
+              $elfoid .= $elf_rats{$loadobjARC}[0];
               $target_cmd     = $g_mapped_cmds{"readelf"};
               $command_string = $target_cmd . "-l " . $elfoid . " 2>/dev/null";
-              ($error_code2, $cmd_output) = execute_system_cmd ($command_string);
+              ($error_code2, $cmd_output) =
+                                       execute_system_cmd ($command_string);
+
               if ($error_code2 != 0)
                 {
-                  gp_message ("abort", $subr_name, "call failure for $command_string");
+                  $msg = "call failure for " . $command_string;
+                  gp_message ("error", $subr_name, $msg);
+                  $g_total_error_count++;
+                  gp_message ("abort", $subr_name, $g_abort_msg);
                 }
               else
                 {
-                  gp_message ("debug", $subr_name, "executed command_string = $command_string");
-                  gp_message ("debug", $subr_name, "cmd_output = $cmd_output");
+                  $msg = "executed command_string = " . $command_string;
+                  gp_message ("debug", $subr_name, $msg);
+                  $msg = "cmd_output = " . $cmd_output;
+                  gp_message ("debug", $subr_name, $msg);
                 }
             }
-          else 
+          else
             {
-              my $msg =  "elf_rats{$loadobjARC} does not exist";
+              $msg =  "elf_rats{$loadobjARC} does not exist";
               gp_message ("assertion", $subr_name, $msg);
             }
         }
@@ -3472,7 +3820,7 @@ sub elf_phdr_usual
 # Elf file type is EXEC (Executable file)
 # Entry point 0x4023a0
 # There are 11 program headers, starting at offset 64
-# 
+#
 # Program Headers:
 #   Type           Offset             VirtAddr           PhysAddr
 #                  FileSiz            MemSiz              Flags  Align
@@ -3499,12 +3847,13 @@ sub elf_phdr_usual
 #                  0x0000000000000000 0x0000000000000000  RW     10
 #   GNU_RELRO      0x0000000000078dc8 0x0000000000479dc8 0x0000000000479dc8
 #                  0x0000000000000238 0x0000000000000238  R      1
-# 
+#
 #  Section to Segment mapping:
 #   Segment Sections...
 #    00
 #    01     .interp
-#    02     .interp .note.gnu.build-id .note.ABI-tag .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt
+#    02     .interp .note.gnu.build-id .note.ABI-tag .gnu.hash .dynsym
+#           .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt
 #    03     .init .plt .text .fini
 #    04     .rodata .eh_frame_hdr .eh_frame
 #    05     .init_array .fini_array .dynamic .got .got.plt .data .bss
@@ -3531,11 +3880,11 @@ sub elf_phdr_usual
 #                 0x0000000000001010 0x0000000000001010  R E    200000
 #------------------------------------------------------------------------------
       @foo = split ("\n",$cmd_output);
-      for $i (0 .. $#foo) 
+      for $i (0 .. $#foo)
         {
           $foo = $foo[$i];
           chomp ($foo);
-          if ($foo =~ /^\s+LOAD\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(R\sE)\s+(\S+)$/)
+          if ($foo =~ /$load_long_regex/)
             {
               $Offset   = $1;
               $VirtAddr = $2;
@@ -3546,11 +3895,12 @@ sub elf_phdr_usual
               $Align    = $7;
 
               $elf_offset = $VirtAddr;
-              gp_message ("debug", $subr_name, "single line version elf_offset = $elf_offset");
+              $msg = "single line version elf_offset = " . $elf_offset;
+              gp_message ("debug", $subr_name, $msg);
               return ($elf_offset);
             }
-          elsif ($foo =~ /^\s+LOAD\s+(\S+)\s+(\S+)\s+(\S+)$/)
-            { 
+          elsif ($foo =~ /$load_short_regex/)
+            {
 #------------------------------------------------------------------------------
 # is it a two line version?
 #------------------------------------------------------------------------------
@@ -3559,67 +3909,23 @@ sub elf_phdr_usual
               $PhysAddr = $3;
               if ($i != $#foo)
                 {
-                  $foo1 = $foo[$i + 1]; 
+                  $foo1 = $foo[$i + 1];
                   chomp ($foo1);
-                  if ($foo1 =~ /^\s+(\S+)\s+(\S+)\s+(R\sE)\s+(\S+)$/)
+                  if ($foo1 =~ /$re_regex/)
                     {
                       $FileSiz  = $1;
                       $MemSiz   = $2;
                       $Flg      = $3;
                       $Align    = $4;
                       $elf_offset = $VirtAddr;
-                      gp_message ("debug", $subr_name, "two line version elf_offset = $elf_offset");
+                      $msg = "two line version elf_offset = " . $elf_offset;
+                      gp_message ("debug", $subr_name, $msg);
                       return ($elf_offset);
                     }
                 }
             }
         }
     }
-  elsif ($elf_arch eq "SunOS") 
-    {
-#------------------------------------------------------------------------------
-#Program Header[3]:
-#    p_vaddr:      0x10000     p_flags:    [ PF_X PF_R ]
-# folowed by
-#    p_paddr:      0           p_type:     [ PT_LOAD ]
-#------------------------------------------------------------------------------
-        if ($arch_uname_s ne $elf_arch)
-#------------------------------------------------------------------------------
-# we are masquerading between systems, must leave
-#------------------------------------------------------------------------------
-          { 
-            gp_message ("debug", $subr_name,"masquerading arch_uname_s = $arch_uname_s elf_arch = $elf_arch");
-            return (0);
-           }
-        $target_cmd     = $g_mapped_cmds{"elfdump"};
-        $command_string = $target_cmd . "-p " . $loadobj . " 2>/dev/null";
-        ($error_code, $cmd_output) = execute_system_cmd ($command_string);
-        if ($error_code != 0)
-          {
-            gp_message ("debug", $subr_name,"call failure for $command_string");
-            die ("$target_cmd call failure");
-          }
-        my @foo = split ("\n",$cmd_output);
-        for $i (0 .. $#foo) 
-          {
-            $foo = $foo[$i];
-            chomp ($foo);
-            if ($foo =~ /^\s+p_vaddr:\s+(\S+)\s+p_flags:\s+\[\sPF_X\sPF_R\s\]$/)
-              {
-                $p_vaddr = $1; # probably
-                if ($i != $#foo)
-                  {
-                    $foo1 = $foo[$i + 1];
-                    chomp ($foo1);
-                    if ($foo1 =~ /^\s+p_paddr:\s+(\S+)\s+p_type:\s+\[\sPT_LOAD\s\]$/)
-                      {
-                        $elf_offset = $p_vaddr;
-                        return ($elf_offset);
-                      }
-                  }
-              }
-          }
-      }
 
 } #-- End of subroutine elf_phdr_usual
 
@@ -3633,21 +3939,31 @@ sub execute_system_cmd
 
   my ($target_cmd) = @_;
 
+  my $cmd_output;
+  my $error_code;
+  my $msg;
+
   chomp ($target_cmd);
 
-  my $cmd_output = qx ($target_cmd);
-  my $error_code = ${^CHILD_ERROR_NATIVE};
+  $cmd_output = qx ($target_cmd);
+  $error_code = ${^CHILD_ERROR_NATIVE};
 
   if ($error_code != 0)
     {
-      gp_message ("error", $subr_name, "failure executing command $target_cmd");
-      gp_message ("error", $subr_name, "error code = $error_code");
+      chomp ($cmd_output);
+      $msg = "failure executing command " . $target_cmd;
+      gp_message ("error", $subr_name, $msg);
+      $msg = "error code = " . $error_code;
+      gp_message ("error", $subr_name, $msg);
+      $msg = "cmd_output = " . $cmd_output;
+
+      gp_message ("error", $subr_name, $msg);
+      $g_total_error_count++;
     }
   else
     {
-      chomp ($cmd_output);
-      gp_message ("debugM", $subr_name, "executed command $target_cmd");
-      gp_message ("debugM", $subr_name, "cmd_output = $cmd_output");
+      $msg = "executed command " . $target_cmd;
+      gp_message ("debugXL", $subr_name, $msg);
     }
 
   return ($error_code, $cmd_output);
@@ -3655,7 +3971,7 @@ sub execute_system_cmd
 } #-- End of subroutine execute_system_cmd
 
 #------------------------------------------------------------------------------
-# Scan the input file, which should be a gprofng generated map.xml file, and 
+# Scan the input file, which should be a gprofng generated map.xml file, and
 # extract the relevant information.
 #------------------------------------------------------------------------------
 sub extract_info_from_map_xml
@@ -3664,25 +3980,37 @@ sub extract_info_from_map_xml
 
   my ($input_map_xml_file) = @_;
 
+  my $map_xml_regex;
+  $map_xml_regex  = '<event kind="map"\s.*';
+  $map_xml_regex .= 'vaddr="0x([0-9a-fA-F]+)"\s+.*';
+  $map_xml_regex .= 'foffset="\+*0x([0-9a-fA-F]+)"\s.*';
+  $map_xml_regex .= 'modes="0x([0-9]+)"\s.*';
+  $map_xml_regex .= 'name="(.*)".*>$';
+
   my $extracted_information;
   my $input_line;
   my $vaddr;
   my $foffset;
+  my $msg;
   my $modes;
   my $name_path;
   my $name;
 
   my $full_path_exec;
   my $executable_name;
-  my $va_executable_in_hex; 
+  my $result_VA;
+  my $va_executable_in_hex;
 
+  $msg = "- unable to open file $input_map_xml_file for reading:";
   open (MAP_XML, "<", $input_map_xml_file)
-    or die ("$subr_name - unable to open file $input_map_xml_file for reading: $!");
-  gp_message ("debug", $subr_name, "opened file $input_map_xml_file for reading");
+    or die ($subr_name . $msg . " " . $!);
+
+  $msg = "opened file $input_map_xml_file for reading";
+  gp_message ("debug", $subr_name, $msg);
 
 #------------------------------------------------------------------------------
-# Scan the file.  We need to find the name of the executable with the mode set 
-# to 0x005.  For this entry we have to capture the name, the mode, the virtual 
+# Scan the file.  We need to find the name of the executable with the mode set
+# to 0x005.  For this entry we have to capture the name, the mode, the virtual
 # address and the offset.
 #------------------------------------------------------------------------------
   $extracted_information = $FALSE;
@@ -3690,36 +4018,46 @@ sub extract_info_from_map_xml
     {
       $input_line = $_;
       chomp ($input_line);
-      gp_message ("debug", $subr_name, "read input_line = $input_line");
-      if ($input_line =~   /^<event kind="map"\s.*vaddr="0x([0-9a-fA-F]+)"\s+.*foffset="\+*0x([0-9a-fA-F]+)"\s.*modes="0x([0-9]+)"\s.*name="(.*)".*>$/)
+
+      $msg = "read input_line = $input_line";
+      gp_message ("debug", $subr_name, $msg);
+
+      if ($input_line =~  /^$map_xml_regex/)
         {
-          gp_message ("debug", $subr_name, "target line = $input_line");
+          $msg = "target line = $input_line";
+          gp_message ("debug", $subr_name, $msg);
 
           $vaddr     = $1;
           $foffset   = $2;
           $modes     = $3;
           $name_path = $4;
           $name      = get_basename ($name_path);
-          gp_message ("debug", $subr_name, "extracted vaddr = $vaddr foffset = $foffset modes = $modes");
-          gp_message ("debug", $subr_name, "extracted name_path = $name_path name = $name");
+
+          $msg  = "extracted vaddr = $vaddr foffset = $foffset";
+          $msg .= " modes = $modes";
+          gp_message ("debug", $subr_name, $msg);
+
+          $msg = "extracted name_path = $name_path name = $name";
+          gp_message ("debug", $subr_name, $msg);
 
 #------------------------------------------------------------------------------
-# The base virtual address is calculated as vaddr-foffset.  Although Perl 
+# The base virtual address is calculated as vaddr-foffset.  Although Perl
 # handles arithmetic in hex, we take the safe way here.  Maybe overkill, but
 # I prefer to be safe than sorry in cases like this.
 #------------------------------------------------------------------------------
-          $full_path_exec       = $name_path;
-          $executable_name      = $name;
-          my $result_VA         = bigint::hex ($vaddr) - bigint::hex ($foffset);
+          $full_path_exec   = $name_path;
+          $executable_name  = $name;
+          $result_VA        = bigint::hex ($vaddr) - bigint::hex ($foffset);
           $va_executable_in_hex = sprintf ("0x%016x", $result_VA);
 
 ##          $ARCHIVES_MAP_NAME  = $name;
 ##          $ARCHIVES_MAP_VADDR = $va_executable_in_hex;
 
-##          gp_message ("debug", $subr_name, "set ARCHIVES_MAP_NAME  = $ARCHIVES_MAP_NAME");
-##          gp_message ("debug", $subr_name, "set ARCHIVES_MAP_VADDR = $ARCHIVES_MAP_VADDR");
-          gp_message ("debug", $subr_name, "result_VA            = $result_VA"); 
-          gp_message ("debug", $subr_name, "va_executable_in_hex = $va_executable_in_hex"); 
+          $msg = "result_VA            = $result_VA";
+          gp_message ("debug", $subr_name, $msg);
+
+          $msg = "va_executable_in_hex = $va_executable_in_hex";
+          gp_message ("debug", $subr_name, $msg);
 
 #------------------------------------------------------------------------------
 # Stop reading when we found the correct entry.
@@ -3734,20 +4072,24 @@ sub extract_info_from_map_xml
 
   if (not $extracted_information)
     {
-      my $msg = "cannot find the necessary information in file $input_map_xml_file";
+      $msg  = "cannot find the necessary information in file";
+      $msg .= " " . $input_map_xml_file;
       gp_message ("assertion", $subr_name, $msg);
     }
 
-  gp_message ("debug", $subr_name, "full_path_exec       = $full_path_exec"); 
-  gp_message ("debug", $subr_name, "executable_name      = $executable_name"); 
-  gp_message ("debug", $subr_name, "va_executable_in_hex = $va_executable_in_hex"); 
+  $msg = "full_path_exec       = $full_path_exec";
+  gp_message ("debug", $subr_name, $msg);
+  $msg = "executable_name      = $executable_name";
+  gp_message ("debug", $subr_name, $msg);
+  $msg = "va_executable_in_hex = $va_executable_in_hex";
+  gp_message ("debug", $subr_name, $msg);
 
   return ($full_path_exec, $executable_name, $va_executable_in_hex);
 
 } #-- End of subroutine extract_info_from_map_xml
 
 #------------------------------------------------------------------------------
-# This routine analyzes the metric line and extracts the metric specifics 
+# This routine analyzes the metric line and extracts the metric specifics
 # from it.
 # Example input: Exclusive Total CPU Time: e.%totalcpu
 #------------------------------------------------------------------------------
@@ -3802,7 +4144,7 @@ sub extract_metric_specifics
 #          $metric_spec =~ s/\%//;
 #          print "DB: after  \$metric_spec = $metric_spec\n";
 
-      return ($metric_spec, $metric_flavor, $metric_visibility, 
+      return ($metric_spec, $metric_flavor, $metric_visibility,
               $metric_name, $metric_description);
     }
   else
@@ -3813,37 +4155,286 @@ sub extract_metric_specifics
 } #-- End of subroutine extract_metric_specifics
 
 #------------------------------------------------------------------------------
-# TBD
+# Extract the option value(s) from the input array.  In case the number of
+# values execeeds the specified limit, warning messages are printed.
+#
+# In case the option value is valid, g_user_settings is updated with this
+# value and a value of TRUE is returned.  Otherwise the return value is FALSE.
+#
+# Note that not in all invocations of this subroutine, gp_message() is
+# operational.  Only after the debug settings have been finalized, the
+# messages are printed.
+#
+# This subroutine also generates warnings about multiple occurrences
+# and the validity of the values.
 #------------------------------------------------------------------------------
-sub extract_source_line_number
+sub extract_option_value
 {
   my $subr_name = get_my_name ();
 
-  my ($src_times_regex, $function_regex, $number_of_metrics, $input_line) = @_;
+  my ($option_dir_ref, $max_occurrences_ref, $internal_option_name_ref,
+      $option_name_ref) = @_;
+
+  my @option_dir           = @{ $option_dir_ref };
+  my $max_occurrences      = ${ $max_occurrences_ref };
+  my $internal_option_name = ${ $internal_option_name_ref };
+  my $option_name          = ${ $option_name_ref };
+
+  my $deprecated_option_used;
+  my $excess_occurrences;
+  my $msg;
+  my $no_of_occurrences;
+  my $no_of_warnings = 0;
+  my $option_value   = "not set yet";
+  my $option_value_missing;
+  my $option_value_missing_ref;
+  my $reset_blank_value;
+  my $special_treatment = $FALSE;
+  my $valid = $FALSE;
+  my $valid_ref;
+
+  if (@option_dir)
+    {
+      $no_of_occurrences = scalar (@option_dir);
+
+      $msg = "option_name          = $option_name";
+      gp_message ("debug", $subr_name, $msg);
+      $msg = "internal_option_name = $internal_option_name";
+      gp_message ("debug", $subr_name, $msg);
+      $msg = "no_of_occurrences    = $no_of_occurrences";
+      gp_message ("debug", $subr_name, $msg);
+
+      $excess_occurrences = ($no_of_occurrences > $max_occurrences) ?
+                                                       $TRUE : $FALSE;
 
 #------------------------------------------------------------------------------
-# The regex section.
+# This is not supposed to happen, but just to be sure, there is a check.
 #------------------------------------------------------------------------------
-  my $find_dot_regex = '\.';
-
-  my @fields_in_line = ();
-  my $hot_line;
-  my $line_id;
+      if ($no_of_occurrences < 1)
+        {
+          $msg  = "the number of fields is $no_of_occurrences";
+          $msg .= " - should at least be 1";
+          gp_message ("assertion", $subr_name, $msg);
+        }
 
 #------------------------------------------------------------------------------
-# To extract the source line number, we need to distinguish whether this is 
-# a line with, or without metrics.
+# For backward compatibility, we support the legacy "on" and "off" values for
+# certain options.
+#
+# We also support the debug option without value.  In case no value is given,
+# it is set to "on".
+#
+# Note that regardless of the value(s) in ARGV, internally we use the on/off
+# setting.
 #------------------------------------------------------------------------------
-      @fields_in_line = split (" ", $input_line);
-      if ( $input_line =~ /$src_times_regex/ )
+      if (($g_user_settings{$internal_option_name}{"data_type"} eq "onoff") or
+          ($internal_option_name eq "debug"))
         {
-          $hot_line = $1;
-          if ($hot_line eq "##")
+          $msg = "enable special treatment of the option";
+          gp_message ("debug", $subr_name, $msg);
+
+          $special_treatment = $TRUE;
+        }
+
 #------------------------------------------------------------------------------
-# The line id comes after the "##" symbol and the metrics.
+# Issue a warning if the same option occcurs more often than what is supported.
 #------------------------------------------------------------------------------
-            {
-              $line_id = $fields_in_line[$number_of_metrics+1];
+      if ($excess_occurrences)
+        {
+          $msg = "multiple occurrences of the " . $option_name .
+                 " option found:";
+
+          gp_message ("debugM", $subr_name, $msg);
+
+          gp_message ("warning", $subr_name, $g_html_new_line . $msg);
+        }
+
+#------------------------------------------------------------------------------
+# Main loop over all the occurrences of the options.  This is a rather simple
+# approach since only the last value seen will be accepted.
+#
+# To assist the user with troubleshooting, the values that are ignored will be
+# checked for validity and a marker to this extent will be printed.
+#
+# NOTE:
+# If an option may have multiple meaningful occurrences, this part needs to be
+# revisited.
+#------------------------------------------------------------------------------
+      $deprecated_option_used = $FALSE;
+      for my $key (keys @option_dir)
+        {
+          $option_value      = $option_dir[$key];
+          $reset_blank_value = $FALSE;
+
+#------------------------------------------------------------------------------
+# For the "onoff" options, convert a blank value to "on".
+#------------------------------------------------------------------------------
+          if (($option_value eq "on") or ($option_value eq "off"))
+            {
+              if (($option_name eq "--verbose") or ($option_name eq "--quiet"))
+                {
+                 $deprecated_option_used = $TRUE;
+                }
+            }
+
+#------------------------------------------------------------------------------
+# For the "onoff" options, convert a blank value to "on".
+#------------------------------------------------------------------------------
+          if ($special_treatment and ($option_value eq ""))
+            {
+              $option_value = "on";
+              $reset_blank_value = $TRUE;
+
+              $msg  = "reset option value for $option_name from blank";
+              $msg .= " to \"on\"";
+              gp_message ("debug", $subr_name, $msg);
+            }
+
+#------------------------------------------------------------------------------
+# Check for the option value to be valid.  It may also happen that an option
+# does not have a value, while it should have one.
+#------------------------------------------------------------------------------
+          ($valid_ref, $option_value_missing_ref) = check_and_set_user_option (
+                                                       $internal_option_name,
+                                                       $option_value);
+
+          $valid                = ${ $valid_ref };
+          $option_value_missing = ${ $option_value_missing_ref };
+
+          $msg  = "option_value = $option_value";
+          gp_message ("debug", $subr_name, $msg);
+          $msg  = "after check_and_set_user_option: valid = $valid";
+          $msg .= " option_value_missing = $option_value_missing";
+          gp_message ("debug", $subr_name, $msg);
+
+#------------------------------------------------------------------------------
+# Generate warning messages, but if an option value is missing, it will also
+# be considered to be a fatal error.
+#------------------------------------------------------------------------------
+          if ($excess_occurrences)
+            {
+              if ($option_value_missing)
+                {
+                  $msg  = "$option_name option - missing a value";
+                }
+              else
+                {
+#------------------------------------------------------------------------------
+# A little trick to avoid user confusion.  Although we have set the internal
+# value to "on", the user did not set this and so we print "" instead.
+#------------------------------------------------------------------------------
+                  if ($reset_blank_value)
+                    {
+                      $msg  = "$option_name option - value = \"\"";
+                    }
+                  else
+                    {
+                      $msg  = "$option_name option - value = $option_value";
+                    }
+                  $msg .= ($valid) ? " (valid value)" : " (invalid value)";
+                }
+
+              gp_message ("debug", $subr_name, $msg);
+              gp_message ("warning", $subr_name, $msg);
+            }
+
+#------------------------------------------------------------------------------
+# Check for the last occurrence of the option to be valid.  If it is not, it
+# is a fatal error.
+#------------------------------------------------------------------------------
+          if ((not $valid) && ($key == $no_of_occurrences-1))
+            {
+              if ($option_value_missing)
+                {
+                  $msg = "the $option_name option requires a value";
+                }
+              else
+                {
+                  $msg  = "the value of $option_value for the $option_name";
+                  $msg .= " option is invalid";
+                }
+              gp_message ("debug", $subr_name, $g_error_keyword . $msg);
+
+              gp_message ("error", $subr_name, $msg);
+
+              $g_total_error_count++;
+            }
+        }
+
+#------------------------------------------------------------------------------
+# Issue a warning if the same option occcurs more often than what is supported
+# and warn the user that all but the last value will be ignored.
+#------------------------------------------------------------------------------
+      if ($excess_occurrences)
+        {
+          $msg = "all values but the last one shown above are ignored";
+
+          gp_message ("debugM", $subr_name, $msg);
+          gp_message ("warning", $subr_name, $msg);
+
+          $g_total_warning_count++;
+        }
+    }
+
+#------------------------------------------------------------------------------
+# Issue a warning if the old on/off syntax is used still.
+#------------------------------------------------------------------------------
+  if ($deprecated_option_used)
+    {
+      $msg  = "<br>";
+      $msg .= "the on/off syntax for option $option_name has been";
+      $msg .= " deprecated";
+      gp_message ("warning", $subr_name, $msg);
+
+      $msg  = "this option acts like a switch now";
+      gp_message ("warning", $subr_name, $msg);
+
+      $msg  = "support for the old syntax may be terminated";
+      $msg .= " in a future update";
+      gp_message ("warning", $subr_name, $msg);
+
+      $msg  = "please check the man page of gp-display-html";
+      $msg .= " for more details";
+      gp_message ("warning", $subr_name, $msg);
+      $g_total_warning_count++;
+    }
+
+  return (\$valid);
+
+} #-- End of subroutine extract_option_value
+
+#------------------------------------------------------------------------------
+# TBD
+#------------------------------------------------------------------------------
+sub extract_source_line_number
+{
+  my $subr_name = get_my_name ();
+
+  my ($src_times_regex, $function_regex, $number_of_metrics, $input_line) = @_;
+
+#------------------------------------------------------------------------------
+# The regex section.
+#------------------------------------------------------------------------------
+  my $find_dot_regex = '\.';
+
+  my @fields_in_line = ();
+  my $hot_line;
+  my $line_id;
+
+#------------------------------------------------------------------------------
+# To extract the source line number, we need to distinguish whether this is
+# a line with, or without metrics.
+#------------------------------------------------------------------------------
+      @fields_in_line = split (" ", $input_line);
+      if ( $input_line =~ /$src_times_regex/ )
+        {
+          $hot_line = $1;
+          if ($hot_line eq "##")
+#------------------------------------------------------------------------------
+# The line id comes after the "##" symbol and the metrics.
+#------------------------------------------------------------------------------
+            {
+              $line_id = $fields_in_line[$number_of_metrics+1];
             }
           else
 #------------------------------------------------------------------------------
@@ -3874,7 +4465,55 @@ sub extract_source_line_number
 } #-- End of subroutine extract_source_line_number
 
 #------------------------------------------------------------------------------
-# For a give routine name and address, find the index into the 
+# Finalize the settings for the special options verbose, debug, warnings and
+# quiet.
+#------------------------------------------------------------------------------
+sub finalize_special_options
+{
+  my $subr_name = get_my_name ();
+
+  my $msg;
+
+#------------------------------------------------------------------------------
+# If quiet mode has been enabled, disable verbose, warnings and debug.
+#------------------------------------------------------------------------------
+  if ($g_quiet)
+    {
+      $g_user_settings{"verbose"}{"current_value"}    = "off";
+      $g_user_settings{"nowarnings"}{"current_value"} = "on";
+      $g_user_settings{"warnings"}{"current_value"}   = "off";
+      $g_user_settings{"debug"}{"current_value"}      = "off";
+      $g_debug    = $FALSE;
+      $g_verbose  = $FALSE;
+      $g_warnings = $FALSE;
+      my $debug_off = "off";
+      my $ignore_value = set_debug_size (\$debug_off);
+    }
+  else
+    {
+#------------------------------------------------------------------------------
+# Disable output buffering if verbose, debug, and/or warnings are enabled.
+#------------------------------------------------------------------------------
+      if ($g_verbose or $g_debug or $g_warnings)
+        {
+          STDOUT->autoflush (1);
+
+          $msg = "enabled autoflush for STDOUT";
+          gp_message ("debug", $subr_name, $msg);
+        }
+#------------------------------------------------------------------------------
+# If verbose and/or debug have been enabled, print a message.
+#------------------------------------------------------------------------------
+##      gp_message ("verbose", $subr_name, "verbose mode has been enabled");
+##      gp_message ("debug",   $subr_name, "debug " . $g_debug_size_value . " mode has been enabled");
+    }
+
+  return (0);
+
+} #-- End of subroutine finalize_special_options
+
+#------------------------------------------------------------------------------
+# For a give routine name and address, find the index into the
 # function_info array
 #------------------------------------------------------------------------------
 sub find_index_in_function_info
@@ -3906,7 +4545,7 @@ sub find_index_in_function_info
 
           $addr_offset = $function_info[$ref_index]{"addressobjtext"};
           gp_message ("debugXL", $subr_name, "$routine: addr_offset = $addr_offset");
-  
+
           $addr_offset =~ s/^@\d+://;
           gp_message ("debugXL", $subr_name, "$routine: addr_offset = $addr_offset");
           if ($addr_offset eq $current_address)
@@ -4030,7 +4669,7 @@ sub find_path_to_gp_display_text
         }
     }
 
-  return (\$error_occurred, \$return_value);
+  return (\$error_occurred, \$gp_path, \$return_value);
 
 } #-- End of subroutine find_path_to_gp_display_text
 
@@ -4121,14 +4760,14 @@ sub find_words_in_line
                 $start_word = $space_position;
                 $end_word   = $space - 1;
                 $space_position = $space;
-                my $keyword = substr ($input_line, $start_word, $end_word - $start_word + 1); 
+                my $keyword = substr ($input_line, $start_word, $end_word - $start_word + 1);
                 gp_message ("debugXL", $subr_name, "string search start_word = $start_word end_word = $end_word space_position = $space_position $keyword");
                 push (@word_delimiters, [$start_word, $end_word]);
               }
             elsif ( ($space == $space_position) and ($space < length ($input_line) - 1))
               {
                 $space          = $space + 1;
-                $space_position = $space; 
+                $space_position = $space;
               }
             else
               {
@@ -4142,7 +4781,7 @@ sub find_words_in_line
             $finished = $TRUE;
             $start_word = $space_position;
             $end_word = length ($input_line) - 1;
-            my $keyword = substr ($input_line, $start_word, $end_word - $start_word + 1); 
+            my $keyword = substr ($input_line, $start_word, $end_word - $start_word + 1);
             push (@word_delimiters, [$start_word, $end_word]);
             if ($keyword =~ /\s+/)
               {
@@ -4173,7 +4812,7 @@ sub find_words_in_line
 # TBD
 #------------------------------------------------------------------------------
 sub function_info
-{ 
+{
   my $subr_name = get_my_name ();
 
   my ($outputdir, $FUNC_FILE, $metric, $LINUX_vDSO_ref) = @_;
@@ -4185,7 +4824,7 @@ sub function_info
   my $full_address_field;
 
   my $FUNC_FILE_NO_PC;
-  my $off_with_the_PC; 
+  my $off_with_the_PC;
 
   my $blanks;
   my $lblanks;
@@ -4207,7 +4846,7 @@ sub function_info
 #------------------------------------------------------------------------------
   my $length_of_string = length ($outputdir);
 
-  if (rindex ($outputdir, "/") != $length_of_string-1) 
+  if (rindex ($outputdir, "/") != $length_of_string-1)
     {
       $outputdir .= "/";
     }
@@ -4224,12 +4863,12 @@ sub function_info
       $FUNC_FILE_NO_PC = $outputdir."calls";
       $is_calls        = $TRUE;
       $metric_ok       = $FALSE;
-    } 
+    }
   elsif ($FUNC_FILE_NO_PC eq $outputdir."calltree.sort.func")
     {
       $FUNC_FILE_NO_PC = $outputdir."calltree";
       $metric_ok       = $FALSE;
-    } 
+    }
   elsif ($FUNC_FILE_NO_PC eq $outputdir."functions.sort.func")
     {
       $FUNC_FILE_NO_PC = $outputdir."functions.func";
@@ -4271,8 +4910,8 @@ sub function_info
 # er_print * before PC for calls ! 101315
 #------------------------------------------------------------------------------
       $line_regex = "^(\\s*)(\\**)(\\S+)(:)(\\S+)(\\s+)(.*)";
-    } 
-  else 
+    }
+  else
     {
       $line_regex = "^(\\s*)(\\S+)(:)(\\S+)(\\s+)(.*)";
     }
@@ -4307,8 +4946,8 @@ sub function_info
               gp_message ("debugXL", $subr_name, "is_calls = ".(($is_calls) ? "TRUE" : "FALSE")." \$5 = $5");
               gp_message ("debugXL", $subr_name, "is_calls = ".(($is_calls) ? "TRUE" : "FALSE")." \$6 = $6");
               gp_message ("debugXL", $subr_name, "is_calls = ".(($is_calls) ? "TRUE" : "FALSE")." \$7 = $7");
-            } 
-          else 
+            }
+          else
             {
               $segment = $2;
               $offset  = $4;
@@ -4333,8 +4972,8 @@ sub function_info
                     {
                       $metric_value = $1; # whatever
                       $routine = $2;
-                    } 
-                  else 
+                    }
+                  else
                     {
                       $routine = $1;
                     }
@@ -4348,7 +4987,7 @@ sub function_info
                   for $vdso_key (keys %LINUX_vDSO)
                     {
                       if ($routine eq $LINUX_vDSO{$vdso_key})
-                        { 
+                        {
 #------------------------------------------------------------------------------
 # presume no duplicates - at least can check offset
 #------------------------------------------------------------------------------
@@ -4362,7 +5001,7 @@ sub function_info
 #------------------------------------------------------------------------------
 # the real segment
 #------------------------------------------------------------------------------
-                                  $segment = $1; 
+                                  $segment = $1;
                                   gp_message ("debugXL", $subr_name, "rescued segment for $PC_Address($routine)->$segment:$offset $FUNC_FILE");
                                   $PC_Address = $segment.":".$offset; # PC Addr.
                                   gp_message ("debugXL", $subr_name, "vdso line ->$line");
@@ -4373,8 +5012,8 @@ sub function_info
                             }
                         }
                     }
-                } 
-              else 
+                }
+              else
                 {
                   gp_message ("debug", $subr_name, "name_regex failure for file $FUNC_FILE");
                 }
@@ -4417,13 +5056,13 @@ sub function_info
                     }
                   gp_message ("debugXL", $subr_name, "vdso line ->$line");
                   if (substr ($line,$lblanks+$lvdso_key,1) eq " ")
-                    { 
+                    {
 #------------------------------------------------------------------------------
 # O.K. no field abuttal
 #------------------------------------------------------------------------------
                       gp_message ("debugXL", $subr_name, "vdso no field abuttal line ->$line");
-                    } 
-                  else 
+                    }
+                  else
                     {
                       gp_message ("debugXL", $subr_name, "vdso field abuttal line ->$line");
                       $line = $blanks.$vdso_key." ".$rest;
@@ -4444,8 +5083,8 @@ sub function_info
                 }
               $not_printed = $FALSE;
             }
-        } 
-      else 
+        }
+      else
         {
           if (!$pc_len)
             {
@@ -4453,18 +5092,18 @@ sub function_info
                 {
                   $pc_len = length ($1); # say 15
                   print FUNC_FILE_NO_PC substr ($line,$pc_len)."\n";
-                } 
-              else 
+                }
+              else
                 {
                   print FUNC_FILE_NO_PC "$line\n";
                 }
-            } 
-          else 
+            }
+          else
             {
               if ($pc_len)
                 {
                   my $strlen = length ($line);
-                  if ($strlen > 0 ) 
+                  if ($strlen > 0 )
                     {
                       print FUNC_FILE_NO_PC substr ($line,$pc_len)."\n";
                     }
@@ -4487,8 +5126,8 @@ sub function_info
             {
               $metric_value = $1; # whatever
               $routine = $2;
-            } 
-          else 
+            }
+          else
             {
               $routine = $1;
             }
@@ -4513,8 +5152,8 @@ sub function_info
           if (not exists ($functions_per_metric_indexes{$routine}))
             {
               $functions_per_metric_indexes{$routine} = [$index_val];
-            } 
-          else 
+            }
+          else
             {
               push (@{$functions_per_metric_indexes{$routine}},$index_val); # add $RI to list
             }
@@ -4536,21 +5175,21 @@ sub function_info
             {
               $functions_per_metric_first_index{$routine}{$PC_Address} = $index_val;
               $u++; #$RI
-            } 
-          else 
+            }
+          else
             {
               if (!($metric eq "calls" || $metric eq "calltree"))
                 {
                   gp_message ("debug", $subr_name, "file $FUNC_FILE: function $routine already has a PC Address");
                 }
-            } 
+            }
 
           $index_val++;
           gp_message ("debugXL", $subr_name, "updated index_val = $index_val");
           $n++;
           next;
-        } 
-      else 
+        }
+      else
         {
           if ($n && length ($line))
             {
@@ -4609,8 +5248,8 @@ sub generate_caller_callee
 {
   my $subr_name = get_my_name ();
 
-  my ($number_of_metrics_ref, $function_info_ref, $function_view_structure_ref, 
-      $function_address_info_ref, $addressobjtextm_ref, 
+  my ($number_of_metrics_ref, $function_info_ref, $function_view_structure_ref,
+      $function_address_info_ref, $addressobjtextm_ref,
       $input_string_ref) = @_;
 
   my $number_of_metrics       = ${ $number_of_metrics_ref };
@@ -4640,10 +5279,10 @@ sub generate_caller_callee
   my $full_hex_address;
   my $hex_address;
 
-  my $file_title; 
-  my $page_title; 
-  my $size_text; 
-  my $position_text; 
+  my $file_title;
+  my $page_title;
+  my $size_text;
+  my $position_text;
   my @html_metric_sort_header = ();
   my $html_header;
   my $html_title_header;
@@ -4651,17 +5290,17 @@ sub generate_caller_callee
   my $html_acknowledgement;
   my $html_end;
   my $html_line;
+
   my $marker_target_function;
   my $max_metrics_length = 0;
-  my $metrics_length; 
-  my $modified_line; 
+  my $metrics_length;
+  my $modified_line;
   my $name_regex;
   my $no_of_fields;
   my $routine;
   my $routine_length;
-  my $string_length; 
-  my $top_header; 
+  my $string_length;
+  my $top_header;
   my $total_header_lines;
   my $word_index_values_ref;
   my $infile;
@@ -4678,7 +5317,7 @@ sub generate_caller_callee
 
   gp_message ("debug", $subr_name, "infile = $infile outfile = $outfile");
 
-  open (CALLER_CALLEE_IN, "<", $infile) 
+  open (CALLER_CALLEE_IN, "<", $infile)
     or die ("unable to open caller file $infile for reading - '$!'");
   gp_message ("debug", $subr_name, "opened file $infile for reading");
 
@@ -4696,10 +5335,10 @@ sub generate_caller_callee
   $html_home   = ${ generate_home_link ("right") };
 
   $page_title    = "Caller Callee View";
-  $size_text     = "h2"; 
+  $size_text     = "h2";
   $position_text = "center";
   $html_title_header = ${ generate_a_header (\$page_title, \$size_text, \$position_text) };
-  
+
 #------------------------------------------------------------------------------
 # Read all of the file into array with the name caller_callee_data.
 #------------------------------------------------------------------------------
@@ -4712,14 +5351,14 @@ sub generate_caller_callee
 # Current Sort Metric: Exclusive Total CPU Time ( e.totalcpu )
 # Functions sorted by metric: Exclusive Total CPU Time
 # Callers and callees sorted by metric: Attributed Total CPU Time
-# 
+#
 # PC Addr.       Name              Attr.     Attr. CPU  Attr.         Attr.
 #                                  Total     Cycles     Instructions  Last-Level
 #                                  CPU sec.   sec.      Executed      Cache Misses
 # 1:0x00000000  *<Total>           3.502     4.005      15396819700   24024250
 # 7:0x00008070   start_thread      3.342     3.865      14500538981   23824045
 # 6:0x000233a0   __libc_start_main 0.160     0.140        896280719     200205
-# 
+#
 # PC Addr.       Name              Attr.     Attr. CPU  Attr.         Attr.
 #                                  Total     Cycles     Instructions  Last-Level
 #                                  CPU sec.   sec.      Executed      Cache Misses
@@ -4730,7 +5369,7 @@ sub generate_caller_callee
 #------------------------------------------------------------------------------
 # Scan the input file.  The first lines are assumed to be part of the header,
 # so we store those. The diagnostic lines that echo some settings are also
-# stored, but currently not used. 
+# stored, but currently not used.
 #------------------------------------------------------------------------------
   my $scan_header = $FALSE;
   my $scan_caller_callee_data = $FALSE;
@@ -4753,14 +5392,14 @@ sub generate_caller_callee
   my $get_addr_offset_regex  = '^@\d+:';
 
 #------------------------------------------------------------------------------
-# Get the length of the first metric field across all lines.  This value is 
+# Get the length of the first metric field across all lines.  This value is
 # used to pad the first metric with spaces and get the alignment right.
 #
 # Scan the input data and find the line(s) with metric values.  A complication
 # is that a function name may consists of more than one field.
 #
 # Note.  This part could be used to parse the other elements of the input file,
-# but that makes the loop very complicated.   Instead, we re-scan the data 
+# but that makes the loop very complicated.   Instead, we re-scan the data
 # below and process each block separately.
 #
 # Since this data is all in memory and relatively small, the performance should
@@ -4783,12 +5422,12 @@ sub generate_caller_callee
         {
           if (defined ($1) and defined ($2) and defined ($3))
 #------------------------------------------------------------------------------
-# This is a line of interest, since it has the address, the function name and 
+# This is a line of interest, since it has the address, the function name and
 # the values for the metrics.  Examples of valid lines are:
 #
 #  2:0x00005028  *xfree_large                             0.              0
 # 12:0x0004c2b0   munmap                                  0.143     6402086
-#  7:0x0001b2df   <static>@0x1b2df (<libgomp.so.1.0.0>)   0.              0 
+#  7:0x0001b2df   <static>@0x1b2df (<libgomp.so.1.0.0>)   0.              0
 #
 # The function name marked with a * is the current target.
 #------------------------------------------------------------------------------
@@ -4800,7 +5439,7 @@ sub generate_caller_callee
               if ($full_hex_address =~ /$get_hex_address_regex/)
                 {
                   $hex_address = "0x" . $2;
-                  push (@hex_addresses, $hex_address); 
+                  push (@hex_addresses, $hex_address);
                   gp_message ("debugXL", $subr_name, "pushed $hex_address");
                 }
               else
@@ -4810,11 +5449,11 @@ sub generate_caller_callee
                 }
               if ($marker eq "*")
                 {
-                  push (@special_marker, "*"); 
+                  push (@special_marker, "*");
                 }
               else
                 {
-                  push (@special_marker, "X"); 
+                  push (@special_marker, "X");
                 }
             }
           else
@@ -4856,7 +5495,7 @@ sub generate_caller_callee
               gp_message ("debugXL", $subr_name, $txt);
 
 #------------------------------------------------------------------------------
-# Generate the regex for the metrics. 
+# Generate the regex for the metrics.
 #
 # TBD: This should be an attribute of the function and be done once only.
 #------------------------------------------------------------------------------
@@ -4880,8 +5519,8 @@ sub generate_caller_callee
                             " its metrics = " . $its_metrics;
                   gp_message ("debugXL", $subr_name, $msg);
 
-                  push (@the_function_name, $func_name); 
-                  push (@the_metrics, $its_metrics); 
+                  push (@the_function_name, $func_name);
+                  push (@the_metrics, $its_metrics);
                 }
               else
                 {
@@ -4946,7 +5585,7 @@ sub generate_caller_callee
           gp_message ("debugXL", $subr_name, "line = $line data_function_block = $data_function_block");
 
           push (@function_blocks, $data_function_block);
-          my ($html_block_prologue_ref, $html_code_function_block_ref) = 
+          my ($html_block_prologue_ref, $html_code_function_block_ref) =
                                                 generate_html_function_blocks (
                                                   \$index_start,
                                                   \$index_end,
@@ -5067,16 +5706,16 @@ sub generate_caller_callee
 
           $no_of_fields = $#fields + 1;
           $elements_in_name = $no_of_fields - $number_of_metrics - 1;
-     
+
 #------------------------------------------------------------------------------
 # TBD: Too restrictive.
 # CHECK CODE IN GENERATE_CALLER_CALLEE
 #------------------------------------------------------------------------------
-          if ($elements_in_name == 1) 
+          if ($elements_in_name == 1)
             {
               $name_regex = '\s*(\d+:0x[a-fA-F0-9]+)\s+([\s\*])(\S+)\s+(.*)';
             }
-          elsif ($elements_in_name == 2) 
+          elsif ($elements_in_name == 2)
             {
               $name_regex = '\s*(\d+:0x[a-fA-F0-9]+)\s+([\s\*])((\S+)\s+(\S+))\s+(.*)';
             }
@@ -5094,11 +5733,11 @@ sub generate_caller_callee
               $full_hex_address = $1;
               $marker_target_function = $2;
               $routine = $3;
-              if ($elements_in_name == 1) 
+              if ($elements_in_name == 1)
                 {
                   $all_metrics = $4;
                 }
-              elsif ($elements_in_name == 2) 
+              elsif ($elements_in_name == 2)
                 {
                   $all_metrics = $6;
                 }
@@ -5111,7 +5750,7 @@ sub generate_caller_callee
                   $hex_address = "0x" . $2;
                 }
               push (@marker, $marker_target_function);
-              push (@address_field, $hex_address); 
+              push (@address_field, $hex_address);
               $modified_line = $all_metrics . " " . $routine;
               push (@metric_values, $all_metrics);
               gp_message ("debugXL", $subr_name, "xxxxxxx = $modified_line");
@@ -5165,7 +5804,7 @@ sub generate_caller_callee
 
                   my $addr_offset = $function_info[$ref_index]{"addressobjtext"};
                   gp_message ("debugXL", $subr_name, "$routine: addr_offset = $addr_offset");
-  
+
                   $addr_offset =~ s/$get_addr_offset_regex//;
                   gp_message ("debugXL", $subr_name, "$routine: addr_offset = $addr_offset");
                   if ($addr_offset eq $current_address)
@@ -5217,9 +5856,9 @@ sub generate_caller_callee
   print CALLER_CALLEE_OUT "$_\n" for @html_caller_callee;
   print CALLER_CALLEE_OUT "</pre>\n";
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Get the acknowledgement, return to main link, and final html statements.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   $html_home            = ${ generate_home_link ("left") };
   $html_acknowledgement = ${ create_html_credits () };
   $html_end             = ${ terminate_html_document () };
@@ -5245,8 +5884,8 @@ sub generate_dis_html
 {
   my $subr_name = get_my_name ();
 
-  my ($target_function_ref, $number_of_metrics_ref, $function_info_ref, 
-      $function_address_and_index_ref, $outputdir_ref, $func_ref, 
+  my ($target_function_ref, $number_of_metrics_ref, $function_info_ref,
+      $function_address_and_index_ref, $outputdir_ref, $func_ref,
       $source_line_ref, $metric_ref, $addressobj_index_ref) = @_;
 
   my $target_function            = ${ $target_function_ref };
@@ -5265,43 +5904,43 @@ sub generate_dis_html
   my $hex_instruction_end;
 
   my @colour_line = ();
-  my $hot_line; 
-  my $metric_values; 
+  my $hot_line;
+  my $metric_values;
   my $src_line;
-  my $dec_instr_address; 
+  my $dec_instr_address;
   my $instruction;
   my $operands;
+
   my $html_new_line = "<br>";
   my $add_new_line_before;
-  my $add_new_line_after; 
-  my $address_key; 
+  my $add_new_line_after;
+  my $address_key;
   my $boldface;
   my $file;
   my $filename = $func;
   my $func_name;
-  my $orig_hex_instr_address; 
-  my $hex_instr_address; 
+  my $orig_hex_instr_address;
+  my $hex_instr_address;
   my $index_string;
   my $input_metric;
   my $linenumber;
   my $name;
-  my $last_address; 
-  my $last_address_in_hex; 
+  my $last_address;
+  my $last_address_in_hex;
 
-  my $file_title; 
+  my $file_title;
   my $html_header;
   my $html_home;
   my $html_end;
-  
-  my $branch_regex     = $g_arch_specific_settings{"regex"};
+
+  my $branch_regex      = $g_arch_specific_settings{"regex"};
   my $convert_to_dot    = $g_locale_settings{"convert_to_dot"};
   my $decimal_separator = $g_locale_settings{"decimal_separator"};
   my $hp_value          = $g_user_settings{"highlight_percentage"}{"current_value"};
   my $linksubexp        = $g_arch_specific_settings{"linksubexp"};
   my $subexp            = $g_arch_specific_settings{"subexp"};
 
-  my $is_empty;
+  my $file_is_empty;
 
   my %branch_target = ();
   my %branch_target_no_ref = ();
@@ -5315,14 +5954,14 @@ sub generate_dis_html
   my $extended_branch_target_ref;
   my $branch_target_no_ref_ref;
 
-  my $branch_address; 
-  my $dec_branch_address; 
+  my $branch_address;
+  my $dec_branch_address;
   my $found_it;
   my $found_it_ref;
   my $func_name_in_dis_file;
   my $hex_branch_target;
-  my $instruction_address; 
-  my $instruction_offset; 
+  my $instruction_address;
+  my $instruction_offset;
   my $link;
   my $modified_line;
   my $raw_hex_branch_target;
@@ -5372,11 +6011,11 @@ sub generate_dis_html
   push (@modified_html, $html_header);
   push (@modified_html, $html_home);
   push (@modified_html, "<pre>");
+
 #------------------------------------------------------------------------------
 # Open the input and output files.
 #------------------------------------------------------------------------------
-  open (INPUT_DISASSEMBLY, "<", $filename) 
+  open (INPUT_DISASSEMBLY, "<", $filename)
     or die ("$subr_name - unable to open disassembly file $filename for reading: '$!'");
   gp_message ("debug", $subr_name , "opened file $filename for reading");
 
@@ -5387,8 +6026,8 @@ sub generate_dis_html
 #------------------------------------------------------------------------------
 # Check if the file is empty
 #------------------------------------------------------------------------------
-  $is_empty = is_file_empty ($filename);
-  if ($is_empty)
+  $file_is_empty = is_file_empty ($filename);
+  if ($file_is_empty)
     {
 
 #------------------------------------------------------------------------------
@@ -5444,18 +6083,18 @@ sub generate_dis_html
               @metrics = split (/$white_space_regex/ ,$1);
               $src_line_no = $2;
             }
-          else 
+          else
             {
               my $msg = "$input_line has an unexpected format";
               gp_message ("assertion", $subr_name, $msg);
             }
 
 #------------------------------------------------------------------------------
-# Compute the maximum length of the first metric and pad the field from the 
+# Compute the maximum length of the first metric and pad the field from the
 # left later on.  The fractional part is ignored.
 #------------------------------------------------------------------------------
           my $first_metric = $metrics[0];
-          my $new_length; 
+          my $new_length;
           if ($first_metric =~ /$first_integer_regex/)
             {
               $new_length = length ($first_metric);
@@ -5477,20 +6116,20 @@ sub generate_dis_html
 #------------------------------------------------------------------------------
             {
               $source_line[$line_no] = $src_line_no;
-              my $msg; 
-              $msg  = "found an instruction with a source line ref: ";
-              $msg .= "source_line[$line_no] = $source_line[$line_no]";
+              my $msg;
+              $msg  = "found an instruction with a source line ref:";
+              $msg .= " source_line[$line_no] = $source_line[$line_no]";
               gp_message ("debugXL", $subr_name, $msg);
             }
-            
+
 #------------------------------------------------------------------------------
-# Check for function calls.  If found, get the address offset from $4 and 
+# Check for function calls.  If found, get the address offset from $4 and
 # compute the target address.
 #------------------------------------------------------------------------------
-          ($found_it_ref, $branch_target_ref, $extended_branch_target_ref) = 
+          ($found_it_ref, $branch_target_ref, $extended_branch_target_ref) =
                                                  check_and_proc_dis_func_call (
                                                    \$input_line,
-                                                   \$line_no, 
+                                                   \$line_no,
                                                    \%branch_target,
                                                    \%extended_branch_target);
           $found_it = ${ $found_it_ref };
@@ -5509,7 +6148,7 @@ sub generate_dis_html
           ($found_it_ref, $branch_target_ref, $extended_branch_target_ref,
            $branch_target_no_ref_ref) = check_and_proc_dis_branches (
                                                \$input_line,
-                                               \$line_no, 
+                                               \$line_no,
                                                \%branch_target,
                                                \%extended_branch_target,
                                                \%branch_target_no_ref);
@@ -5580,7 +6219,7 @@ sub generate_dis_html
 # In both cases, the first line after the header has whitespace.  This is
 # followed by:
 #
-# - A source line file has "<line_no>." 
+# - A source line file has "<line_no>."
 # - A dissasembly file has "<Function:"
 #
 # These are the characteristics we use below.
@@ -5602,7 +6241,6 @@ sub generate_dis_html
           last;
         }
       push (@modified_html, "<i>" . $input_line . "</i>");
-      
     }
   my $line_index = scalar (@modified_html);
   gp_message ("debugXL", $subr_name, "final line_index = $line_index");
@@ -5663,20 +6301,20 @@ sub generate_dis_html
     }
   for my $row (keys @hot_program_counters)
     {
-      my $msg = "$filename row[" . $row . "] = ";
+      my $msg = "$filename row[" . $row . "] =";
       for my $col (keys @{$hot_program_counters[$row]})
         {
-          $msg .= "$hot_program_counters[$row][$col] "; 
-          $transposed_hot_pc[$col][$row] = $hot_program_counters[$row][$col]; 
+          $msg .= " $hot_program_counters[$row][$col]";
+          $transposed_hot_pc[$col][$row] = $hot_program_counters[$row][$col];
         }
       gp_message ("debugXL", $subr_name, "hot PC = $msg");
     }
   for my $row (keys @transposed_hot_pc)
     {
-      my $msg = "$filename row[" . $row . "] = ";
+      my $msg = "$filename row[" . $row . "] =";
       for my $col (keys @{$transposed_hot_pc[$row]})
         {
-          $msg .= "$transposed_hot_pc[$row][$col] "; 
+          $msg .= " $transposed_hot_pc[$row][$col]";
         }
       gp_message ("debugXL", $subr_name, "$filename transposed = $msg");
     }
@@ -5689,7 +6327,7 @@ sub generate_dis_html
       my $max_val = 0;
       for my $col (0 .. $#{$transposed_hot_pc[$row]})
         {
-          $max_val = max ($transposed_hot_pc[$row][$col], $max_val);;
+          $max_val = max ($transposed_hot_pc[$row][$col], $max_val);
         }
       if ($max_val =~ /$integer_regex/)
         {
@@ -5738,7 +6376,7 @@ sub generate_dis_html
 
               if (defined ($dec_instruction_start))
                 {
-                  if ($dec_instr_address < $dec_instruction_start) 
+                  if ($dec_instr_address < $dec_instruction_start)
                     {
                       $dec_instruction_start = $dec_instr_address;
                     }
@@ -5749,7 +6387,7 @@ sub generate_dis_html
                 }
               if (defined ($dec_instruction_end))
                 {
-                  if ($dec_instr_address > $dec_instruction_end) 
+                  if ($dec_instr_address > $dec_instruction_end)
                     {
                       $dec_instruction_end = $dec_instr_address;
                     }
@@ -5812,7 +6450,7 @@ sub generate_dis_html
 #------------------------------------------------------------------------------
 # Pad the line with the metrics to ensure correct alignment.
 #------------------------------------------------------------------------------
-              my $the_length; 
+              my $the_length;
               my @split_metrics = split (" ", $metric_values);
               my $first_metric = $split_metrics[0];
 ##              if ($first_metric =~ /^\d+$/)
@@ -5837,7 +6475,7 @@ sub generate_dis_html
 
 #------------------------------------------------------------------------------
 # Since the instruction address variable may change and because we need the
-# original address without html controls, we use a new variable for the 
+# original address without html controls, we use a new variable for the
 # (potentially) modified address.
 #------------------------------------------------------------------------------
               $hex_instr_address   = $orig_hex_instr_address;
@@ -5870,7 +6508,7 @@ sub generate_dis_html
 # Mark control flow instructions.  Several cases need to be distinguished.
 #
 # In all cases we give the instruction a specific color, mark it boldface
-# and add a new-line after the instruction 
+# and add a new-line after the instruction
 #------------------------------------------------------------------------------
               if ( ($instruction =~ /$control_flow_1_regex/)   or
                    ($instruction =~ /$control_flow_2_regex/)   or
@@ -5928,7 +6566,7 @@ sub generate_dis_html
                 }
 ##              if (exists ($inverse_branch_target{$hex_instr_address}) or
 ##                  exists ($branch_target_no_ref{$hex_instr_address}))
-              if (exists ($inverse_branch_target{$hex_instr_address})) 
+              if (exists ($inverse_branch_target{$hex_instr_address}))
 #------------------------------------------------------------------------------
 # This is a target address and we need to define the instruction address to be
 # a label.
@@ -5951,13 +6589,13 @@ sub generate_dis_html
               gp_message ("debugXL", $subr_name, "final modified_line = $modified_line");
 
 #------------------------------------------------------------------------------
-# This is a control flow instruction, but it is the last one and we do not 
+# This is a control flow instruction, but it is the last one and we do not
 # want to add a newline.
 #------------------------------------------------------------------------------
               gp_message ("debugXL", $subr_name, "decide where the <br> should go in the html");
               gp_message ("debugXL", $subr_name, "add_new_line_after  = $add_new_line_after");
               gp_message ("debugXL", $subr_name, "add_new_line_before = $add_new_line_before");
-                
+
               if ( $add_new_line_after and ($orig_hex_instr_address eq $hex_instruction_end) )
                 {
                   $add_new_line_after = $FALSE;
@@ -6006,7 +6644,7 @@ sub generate_dis_html
 #------------------------------------------------------------------------------
                 {
                   $modified_line = set_background_color_string (
-                                 $modified_line, 
+                                 $modified_line,
                                  $g_html_color_scheme{"background_color_hot"});
                 }
 #------------------------------------------------------------------------------
@@ -6017,7 +6655,7 @@ sub generate_dis_html
                   my @current_metrics = split (" ", $metric_values);
                   for my $metric (0 .. $#current_metrics)
                     {
-                      my $current_value; 
+                      my $current_value;
                       my $max_value;
                       $current_value = $current_metrics[$metric];
 #------------------------------------------------------------------------------
@@ -6041,7 +6679,7 @@ sub generate_dis_html
                                   gp_message ("debugXL", $subr_name, "metric $metric is within the relative_distance");
                                   gp_message ("debugXL", $subr_name, "change bg modified_line = $modified_line");
                                   $modified_line = set_background_color_string (
-                                                     $modified_line, 
+                                                     $modified_line,
                                                      $g_html_color_scheme{"background_color_lukewarm"});
                                   last;
                                 }
@@ -6105,15 +6743,15 @@ sub generate_dis_html
               my $spaces = $1;
               my $boldface = $TRUE;
               gp_message ("debugXL", $subr_name, "function_name = $2");
-              my $function_line       = "&lt;Function: " . $func_name_in_dis_file . ">"; 
+              my $function_line       = "&lt;Function: " . $func_name_in_dis_file . ">";
 
-##### HACK 
+##### HACK
 
               if ($func_name_in_dis_file eq $target_function)
                 {
                   my $color_function_name = color_string (
-                                 $function_line, 
-                                 $boldface, 
+                                 $function_line,
+                                 $boldface,
                                  $g_html_color_scheme{"target_function_name"});
                   my $label = "<a id=\"" . $g_function_tag_id{$target_function} . "\"></a>";
                   $html_name = $label . $spaces . "<i>" . $color_function_name . "</i>";
@@ -6121,8 +6759,8 @@ sub generate_dis_html
               else
                 {
                   my $color_function_name = color_string (
-                             $function_line, 
-                             $boldface, 
+                             $function_line,
+                             $boldface,
                              $g_html_color_scheme{"non_target_function_name"});
                   $html_name = "<i>" . $spaces . $color_function_name . "</i>";
                 }
@@ -6141,14 +6779,17 @@ sub generate_dis_html
 #
 # TBD: The same is done in process_source but should be done only once.
 #------------------------------------------------------------------------------
-  if ($hp_value > 0) 
+  if ($hp_value > 0)
     {
       my $rounded_percentage = sprintf ("%.1f", $hp_value);
-      $threshold_line = "<i>The setting for the highlight percentage (-hp) option: $rounded_percentage (%)</i>";
+      $threshold_line = "<i>The setting for the highlight percentage";
+      $threshold_line .= " (--highlight-percentage) option:";
+      $threshold_line .= " " . $rounded_percentage . " (%)</i>";
     }
   else
     {
-      $threshold_line = "<i>The highlight percentage (-hp) feature is not enabled</i>";
+      $threshold_line  = "<i>The highlight percentage feature has not been";
+      $threshold_line .= " enabled</i>";
     }
 
   $html_home = ${ generate_home_link ("left") };
@@ -6193,7 +6834,7 @@ sub generate_function_level_info
 {
   my $subr_name = get_my_name ();
 
-  my ($exp_dir_list_ref, $call_metrics, $summary_metrics, $input_string, 
+  my ($exp_dir_list_ref, $call_metrics, $summary_metrics, $input_string,
       $sort_fields_ref) = @_;
 
   my @exp_dir_list = @{ $exp_dir_list_ref };
@@ -6234,7 +6875,7 @@ sub generate_function_level_info
 
   gp_message ("debug", $subr_name, "calling $GP_DISPLAY_TEXT to get function information files");
 
-  open (SCRIPT_PC, ">", $script_file_PC) 
+  open (SCRIPT_PC, ">", $script_file_PC)
     or die ("$subr_name - unable to open script file $script_file_PC for writing: '$!'");
   gp_message ("debug", $subr_name, "opened file $script_file_PC for writing");
 
@@ -6269,20 +6910,20 @@ sub generate_function_level_info
 #------------------------------------------------------------------------------
 # Else the output from the next line goes to last sort.func
 #------------------------------------------------------------------------------
-  print SCRIPT_PC "# outfile $outputdir"."gp-metrics-functions-PC\n"; 
-  print SCRIPT_PC "outfile $outputdir"."gp-metrics-functions-PC\n"; 
+  print SCRIPT_PC "# outfile $outputdir"."gp-metrics-functions-PC\n";
+  print SCRIPT_PC "outfile $outputdir"."gp-metrics-functions-PC\n";
   print SCRIPT_PC "# metrics $script_pc_metrics\n";
   print SCRIPT_PC "metrics $script_pc_metrics\n";
 #------------------------------------------------------------------------------
 # Not really sorted
 #------------------------------------------------------------------------------
-  print SCRIPT_PC "# outfile $outputdir"."functions.sort.func-PC\n"; 
-  print SCRIPT_PC "outfile $outputdir"."functions.sort.func-PC\n"; 
+  print SCRIPT_PC "# outfile $outputdir"."functions.sort.func-PC\n";
+  print SCRIPT_PC "outfile $outputdir"."functions.sort.func-PC\n";
   print SCRIPT_PC "# functions\n";
   print SCRIPT_PC "functions\n";
 
-  print SCRIPT_PC "# outfile $outputdir"."functions.sort.func-PC2\n"; 
-  print SCRIPT_PC "outfile $outputdir"."functions.sort.func-PC2\n"; 
+  print SCRIPT_PC "# outfile $outputdir"."functions.sort.func-PC2\n";
+  print SCRIPT_PC "outfile $outputdir"."functions.sort.func-PC2\n";
   print SCRIPT_PC "# metrics address:name:$summary_metrics\n";
   print SCRIPT_PC "metrics address:name:$summary_metrics\n";
   print SCRIPT_PC "# sort $first_metric\n";
@@ -6298,8 +6939,8 @@ sub generate_function_level_info
 #------------------------------------------------------------------------------
 # Else the output from the next line goes to last sort.func
 #------------------------------------------------------------------------------
-      print SCRIPT_PC "# outfile $outputdir"."gp-metrics-".$field."-PC\n"; 
-      print SCRIPT_PC "outfile $outputdir"."gp-metrics-".$field."-PC\n"; 
+      print SCRIPT_PC "# outfile $outputdir"."gp-metrics-".$field."-PC\n";
+      print SCRIPT_PC "outfile $outputdir"."gp-metrics-".$field."-PC\n";
       print SCRIPT_PC "# metrics $script_pc_metrics\n";
       print SCRIPT_PC "metrics $script_pc_metrics\n";
       print SCRIPT_PC "# outfile $outputdir".$field.".sort.func-PC\n";
@@ -6331,8 +6972,8 @@ sub generate_function_level_info
 #------------------------------------------------------------------------------
 # Else the output from the next line goes to last sort.func
 #------------------------------------------------------------------------------
-  print SCRIPT_PC "# outfile $outputdir"."gp-metrics-calls-PC\n"; 
-  print SCRIPT_PC "outfile $outputdir"."gp-metrics-calls-PC\n"; 
+  print SCRIPT_PC "# outfile $outputdir"."gp-metrics-calls-PC\n";
+  print SCRIPT_PC "outfile $outputdir"."gp-metrics-calls-PC\n";
   $script_pc_metrics = "address:$call_metrics";
   print SCRIPT_PC "# metrics $script_pc_metrics\n";
   print SCRIPT_PC "metrics $script_pc_metrics\n";
@@ -6340,8 +6981,8 @@ sub generate_function_level_info
 #------------------------------------------------------------------------------
 # Not really sorted
 #------------------------------------------------------------------------------
-  print SCRIPT_PC "# outfile $outputdir"."calls.sort.func-PC\n"; 
-  print SCRIPT_PC "outfile $outputdir"."calls.sort.func-PC\n"; 
+  print SCRIPT_PC "# outfile $outputdir"."calls.sort.func-PC\n";
+  print SCRIPT_PC "outfile $outputdir"."calls.sort.func-PC\n";
 
 #------------------------------------------------------------------------------
 # Get caller-callee list
@@ -6416,18 +7057,18 @@ sub generate_function_level_info
 
   if ($error_code != 0)
     {
-      $ignore_value = msg_display_text_failure ($gp_display_text_cmd, 
-                                                $error_code, 
+      $ignore_value = msg_display_text_failure ($gp_display_text_cmd,
+                                                $error_code,
                                                 $gp_error_file);
-      gp_message ("abort", "execution terminated");
+      gp_message ("abort", $subr_name, "execution terminated");
     }
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Parse the full function view and store the data.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   my @input_data = ();
   my $empty_line_regex = '^\s*$';
-  
+
 ##  my $full_function_view = $outputdir . "functions.full";
 
   open (ALL_FUNC_DATA, "<", $full_function_view)
@@ -6440,7 +7081,7 @@ sub generate_function_level_info
   for (my $line = 0; $line <= $#input_data; $line++)
     {
       my $input_line = $input_data[$line];
-     
+
 #      if ($input_line =~ /^<Total>\s+.*/)
       if ($input_line =~ /\s*(\d+:0x[a-fA-F0-9]+)\s+(\S+)\s+(.*)/)
         {
@@ -6456,7 +7097,7 @@ sub generate_function_level_info
           gp_message ("debugXL", $subr_name, "$line: $input_data[$line]");
 
           push (@g_full_function_view_table, $input_data[$line]);
+
           my $hex_address;
           my $full_hex_address = $1;
           my $routine = $2;
@@ -6491,8 +7132,8 @@ sub generate_function_view
 {
   my $subr_name = get_my_name ();
 
-  my ($directory_name_ref, $summary_metrics_ref, $number_of_metrics_ref, 
-      $function_info_ref, $function_view_structure_ref, $function_address_info_ref, 
+  my ($directory_name_ref, $summary_metrics_ref, $number_of_metrics_ref,
+      $function_info_ref, $function_view_structure_ref, $function_address_info_ref,
       $sort_fields_ref, $exp_dir_list_ref, $addressobjtextm_ref) = @_;
 
   my $directory_name          = ${ $directory_name_ref };
@@ -6506,48 +7147,48 @@ sub generate_function_view
   my %addressobjtextm         = %{ $addressobjtextm_ref };
 
   my @abs_path_exp_dirs = ();
-  my @experiment_directories; 
+  my @experiment_directories;
 
-  my $target_function; 
+  my $target_function;
   my $html_line;
   my $ftag;
-  my $routine_length; 
+  my $routine_length;
   my %html_source_functions = ();
 
-  my $href_link; 
+  my $href_link;
   my $infile;
   my $input_experiments;
-  my $keep_value; 
-  my $loadobj; 
-  my $address_field; 
-  my $address_offset; 
+  my $keep_value;
+  my $loadobj;
+  my $address_field;
+  my $address_offset;
   my $msg;
-  my $exe; 
-  my $extra_field; 
+  my $exe;
+  my $extra_field;
   my $new_target_function;
-  my $file_title; 
-  my $html_output_file; 
-  my $html_function_view; 
-  my $overview_file; 
-  my $exp_name; 
-  my $exp_type; 
+  my $file_title;
+  my $html_output_file;
+  my $html_function_view;
+  my $overview_file;
+  my $exp_name;
+  my $exp_type;
   my $html_header;
-  my $routine; 
-  my $length_header; 
+  my $routine;
+  my $length_header;
   my $length_metrics;
-  my $full_index_line; 
-  my $acknowledgement; 
+  my $full_index_line;
+  my $acknowledgement;
   my @full_function_view_line = ();
   my $spaces;
-  my $size_text; 
-  my $position_text; 
-  my $html_first_metric_file; 
+  my $size_text;
+  my $position_text;
+  my $html_first_metric_file;
   my $html_new_line = "<br>";
-  my $html_acknowledgement; 
+  my $html_acknowledgement;
   my $html_end;
-  my $html_home; 
-  my $page_title; 
-  my $html_title_header; 
+  my $html_home;
+  my $page_title;
+  my $html_title_header;
 
   my $outputdir         = append_forward_slash ($directory_name);
   my $LANG              = $g_locale_settings{"LANG"};
@@ -6590,7 +7231,7 @@ sub generate_function_view
           gp_message ("assertion", $subr_name, $msg);
         }
 
-      $html_source_functions{$target_function} = $function_info[$i]{"html function block"}; 
+      $html_source_functions{$target_function} = $function_info[$i]{"html function block"};
     }
 
   for my $i (sort keys %html_source_functions)
@@ -6607,7 +7248,7 @@ sub generate_function_view
 # Current Sort Metric: Exclusive Total CPU Time ( e.totalcpu )
 # Current Sort Metric: Exclusive Total CPU Time ( e.totalcpu )
 # Functions sorted by metric: Exclusive Total CPU Time
-# 
+#
 # PC Addr.        Name              Excl.     Excl. CPU  Excl.         Excl.
 #                                   Total     Cycles     Instructions  Last-Level
 #                                   CPU sec.   sec.      Executed      Cache Misses
@@ -6635,7 +7276,7 @@ sub generate_function_view
         }
 #------------------------------------------------------------------------------
 # The default function view is based upon the first metric in the list.  We use
-# this file in the index.html file. 
+# this file in the index.html file.
 #------------------------------------------------------------------------------
       if ($metric eq $g_first_metric)
         {
@@ -6647,7 +7288,7 @@ sub generate_function_view
 
       $html_output_file = $outputdir . $html_function_view;
 
-      open (FUNCTION_VIEW, ">", $html_output_file) 
+      open (FUNCTION_VIEW, ">", $html_output_file)
         or die ("$subr_name - unable to open file $html_output_file for writing - '$!'");
       gp_message ("debug", $subr_name, "opened file $html_output_file for writing");
 
@@ -6655,7 +7296,7 @@ sub generate_function_view
       $html_header     = ${ create_html_header (\$file_title) };
 
       $page_title    = "Function View";
-      $size_text     = "h2"; 
+      $size_text     = "h2";
       $position_text = "center";
       $html_title_header = ${ generate_a_header (\$page_title, \$size_text, \$position_text) };
 
@@ -6666,12 +7307,12 @@ sub generate_function_view
       print FUNCTION_VIEW $html_new_line . "\n";
 
       my $function_view_structure_ref = process_function_overview (
-                                          \$metric, 
-                                          \$exp_type, 
-                                          \$summary_metrics, 
-                                          \$number_of_metrics, 
-                                          \@function_info, 
-                                          \%function_view_structure, 
+                                          \$metric,
+                                          \$exp_type,
+                                          \$summary_metrics,
+                                          \$number_of_metrics,
+                                          \@function_info,
+                                          \%function_view_structure,
                                           \$overview_file);
 
       my %function_view_structure = %{ $function_view_structure_ref };
@@ -6680,11 +7321,11 @@ sub generate_function_view
 # Core part: extract the true function name and find the html code for it.
 #------------------------------------------------------------------------------
       gp_message ("debugXL", $subr_name, "the final table");
+
       print FUNCTION_VIEW "<pre>\n";
       print FUNCTION_VIEW "$_\n" for @{ $function_view_structure{"header"} };
 
-      my $max_length_header  = $function_view_structure{"max header length"}; 
+      my $max_length_header  = $function_view_structure{"max header length"};
       my $max_length_metrics = $function_view_structure{"max metrics length"};
 
 #------------------------------------------------------------------------------
@@ -6704,9 +7345,8 @@ sub generate_function_view
       my $func_header = $spaces . $function_view_structure{"table name"};
       gp_message ("debugXL", $subr_name, "func_header = " . $func_header);
 
-      
-      print FUNCTION_VIEW $spaces . "<b>" . 
-                          $function_view_structure{"table name"} . 
+      print FUNCTION_VIEW $spaces . "<b>" .
+                          $function_view_structure{"table name"} .
                           "</b>" . $html_new_line . "\n";
 
 #------------------------------------------------------------------------------
@@ -6742,14 +7382,14 @@ sub generate_function_view
 
       print FUNCTION_VIEW "$_\n" for @full_function_view_line;
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Clear the array before filling it up again.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
       @full_function_view_line = ();
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Get the acknowledgement, return to main link, and final html statements.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
       $html_home            = ${ generate_home_link ("left") };
       $html_acknowledgement = ${ create_html_credits () };
       $html_end             = ${ terminate_html_document () };
@@ -6763,7 +7403,7 @@ sub generate_function_view
       close (FUNCTION_VIEW);
     }
 
-  return (\$html_first_metric_file); 
+  return (\$html_first_metric_file);
 
 } #-- End of subroutine generate_function_view
 
@@ -6777,7 +7417,7 @@ sub generate_home_link
 
   my ($which_side) = @_;
 
-  my $html_home_line; 
+  my $html_home_line;
 
   if (($which_side ne "left") and ($which_side ne "right"))
     {
@@ -6786,8 +7426,8 @@ sub generate_home_link
     }
 
   $html_home_line .= "<div class=\"" . $which_side . "\">";
-  $html_home_line .= "<br><a href='" . $g_html_base_file_name{"index"}; 
-  $html_home_line .= ".html' style='background-color:"; 
+  $html_home_line .= "<br><a href='" . $g_html_base_file_name{"index"};
+  $html_home_line .= ".html' style='background-color:";
   $html_home_line .= $g_html_color_scheme{"index"};
   $html_home_line .= "'><b>Return to main view</b></a>";
   $html_home_line .= "</div>";
@@ -6811,11 +7451,11 @@ sub generate_html_function_blocks
   $length_first_metric_ref,
   $special_marker_ref,
   $the_function_name_ref,
-  $separator_ref, 
-  $number_of_metrics_ref, 
-  $data_function_block_ref, 
-  $function_info_ref, 
-  $function_view_structure_ref) = @_; 
+  $separator_ref,
+  $number_of_metrics_ref,
+  $data_function_block_ref,
+  $function_info_ref,
+  $function_view_structure_ref) = @_;
 
   my $index_start = ${ $index_start_ref };
   my $index_end   = ${ $index_end_ref };
@@ -6831,7 +7471,7 @@ sub generate_html_function_blocks
   my @function_info           = @{ $function_info_ref };
   my %function_view_structure = %{ $function_view_structure_ref };
 
-  my $decimal_separator = $g_locale_settings{"decimal_separator"}; 
+  my $decimal_separator = $g_locale_settings{"decimal_separator"};
 
   my @html_block_prologue = ();
   my @html_code_function_block = ();
@@ -6845,33 +7485,33 @@ sub generate_html_function_blocks
   my @split_number = ();
   my @function_tags = ();
 
-  my $all_metrics; 
+  my $all_metrics;
   my $current_function_name;
   my $no_of_fields;
   my $name_regex;
   my $full_hex_address;
   my $hex_address;
-  my $target_function; 
-  my $marker_function; 
-  my $routine; 
-  my $routine_length; 
-  my $metrics_length; 
+  my $target_function;
+  my $marker_function;
+  my $routine;
+  my $routine_length;
+  my $metrics_length;
   my $max_metrics_length = 0;
   my $modified_line;
-  my $string_length; 
-  my $addr_offset; 
-  my $current_address; 
+  my $string_length;
+  my $addr_offset;
+  my $current_address;
   my $found_a_match;
   my $ref_index;
   my $alt_name;
-  my $length_first_field; 
+  my $length_first_field;
   my $gap;
-  my $ipad; 
-  my $html_line; 
-  my $target_tag; 
-  my $tag_for_header; 
-  my $href_file; 
-  my $found_alt_name; 
+  my $ipad;
+  my $html_line;
+  my $target_tag;
+  my $tag_for_header;
+  my $href_file;
+  my $found_alt_name;
   my $name_in_header;
   my $create_hyperlinks;
 
@@ -6937,7 +7577,7 @@ sub generate_html_function_blocks
             {
               my $decimal_point = $decimal_separator;
               $decimal_point =~ s/\\//;
-              my $txt = "input_line = $input_line = ended with 0"; 
+              my $txt = "input_line = $input_line = ended with 0";
               $txt   .= $decimal_point;
               gp_message ("debugXL", $subr_name, $txt);
 
@@ -6958,16 +7598,16 @@ sub generate_html_function_blocks
       $max_metrics_length = max ($max_metrics_length, $metrics_length);
 
       push (@marker, $marker_function);
-      push (@address_field, $hex_address); 
+      push (@address_field, $hex_address);
       push (@metric_values, $all_metrics);
       push (@function_names, $routine);
 
       my $index_into_function_info_ref = get_index_function_info (
-                                         \$routine, 
-                                         \$hex_addresses[$i], 
+                                         \$routine,
+                                         \$hex_addresses[$i],
                                          $function_info_ref);
 
-      my $index_into_function_info = ${ $index_into_function_info_ref }; 
+      my $index_into_function_info = ${ $index_into_function_info_ref };
       $target_tag = $function_info[$index_into_function_info]{"tag_id"};
       $alt_name = $function_info[$index_into_function_info]{"alt_name"};
 
@@ -7044,11 +7684,11 @@ sub generate_html_function_blocks
 
       if ($marker[$i] eq "*")
         {
-            $html_line = "<br>" . $html_line; 
+            $html_line = "<br>" . $html_line;
         }
       elsif (($marker[$i] ne "*") and ($i == 0))
         {
-            $html_line = "<br>" . $html_line; 
+            $html_line = "<br>" . $html_line;
         }
 
       gp_message ("debugXL", $subr_name, "html_line = $html_line");
@@ -7059,7 +7699,7 @@ sub generate_html_function_blocks
       $routine         = $function_names[$i];
       $current_address = $address_field[$i];
 
-      my $target_index_ref = find_index_in_function_info (\$routine, \$current_address, \@function_info); 
+      my $target_index_ref = find_index_in_function_info (\$routine, \$current_address, \@function_info);
       my $target_index     = ${ $target_index_ref };
 
       gp_message ("debugXL", $subr_name, "routine = $routine current_address = $current_address target_index = $target_index");
@@ -7068,7 +7708,7 @@ sub generate_html_function_blocks
 # TBD Do this once for each function and store the result.  This is a saving
 # because functions may and typically will appear more than once.
 #------------------------------------------------------------------------------
-      my $spaces_left = $function_view_structure{"max function length"} - $function_info[$target_index]{"function length"}; 
+      my $spaces_left = $function_view_structure{"max function length"} - $function_info[$target_index]{"function length"};
 
 #------------------------------------------------------------------------------
 # Add the links to the line. Make sure there is at least one space.
@@ -7087,7 +7727,7 @@ sub generate_html_function_blocks
           $html_line .= $function_info[$target_index]{"href_disassembly"};
         }
 
-      push (@html_code_function_block, $html_line); 
+      push (@html_code_function_block, $html_line);
     }
 
     for my $lines (0 .. $#html_code_function_block)
@@ -7095,192 +7735,12 @@ sub generate_html_function_blocks
         gp_message ("debugXL", $subr_name, "final html block = " . $html_code_function_block[$lines]);
       }
 
-  return (\@html_block_prologue, \@html_code_function_block); 
+  return (\@html_block_prologue, \@html_code_function_block);
 
 } #-- End of subroutine generate_html_function_blocks
 
 #------------------------------------------------------------------------------
-# Generate the index.html file.
-#------------------------------------------------------------------------------
-sub generate_index
-{
-  my $subr_name = get_my_name ();
-
-  my ($outputdir_ref, $html_first_metric_file_ref, $summary_metrics_ref, 
-      $number_of_metrics_ref, $function_info_ref, $function_address_info_ref, 
-      $sort_fields_ref, $exp_dir_list_ref, $addressobjtextm_ref,
-      $metric_description_reversed_ref, $number_of_warnings_ref,
-      $table_execution_stats_ref) = @_;
-
-  my $outputdir               = ${ $outputdir_ref };
-  my $html_first_metric_file  = ${ $html_first_metric_file_ref };
-  my $summary_metrics         = ${ $summary_metrics_ref };
-  my $number_of_metrics       = ${ $number_of_metrics_ref };
-  my @function_info           = @{ $function_info_ref };
-  my %function_address_info   = %{ $function_address_info_ref };
-  my @sort_fields             = @{ $sort_fields_ref };
-  my @exp_dir_list            = @{ $exp_dir_list_ref };
-  my %addressobjtextm         = %{ $addressobjtextm_ref };
-  my %metric_description_reversed = %{ $metric_description_reversed_ref };
-  my $number_of_warnings      = ${ $number_of_warnings_ref };
-  my @table_execution_stats   = @{ $table_execution_stats_ref };
-
-  my @file_contents = ();
-
-  my $acknowledgement; 
-  my @abs_path_exp_dirs = ();
-  my $input_experiments;
-  my $target_function; 
-  my $html_line;
-  my $ftag;
-  my $max_length = 0;
-  my %html_source_functions = ();
-  my $html_header; 
-  my @experiment_directories = ();
-  my $html_acknowledgement; 
-  my $html_file_title; 
-  my $html_output_file; 
-  my $html_function_view;
-  my $html_caller_callee_view;
-  my $html_experiment_info; 
-  my $html_warnings_page;
-  my $href_link; 
-  my $file_title; 
-  my $html_gprofng;
-  my $html_end;
-  my $max_length_metrics;
-  my $page_title;
-  my $size_text;
-  my $position_text;
-  my $ln;
-  my $base;
-  my $base_index_page;
-  my $infile;
-  my $outfile;
-  my $rec;
-  my $skip;
-  my $callsize;
-  my $dest;
-  my $final_string;
-  my @headers;
-  my $header;
-  my $sort_index;
-  my $pc_address;
-  my $anchor;
-  my $directory_name;
-  my $f2;
-  my $f3;
-  my $file;
-  my $sline;
-  my $src;
-  my $srcfile_name;
-  my $tmp1;
-  my $tmp2;
-  my $fullsize;
-  my $regf2;
-  my $trimsize;
-  my $EIL;
-  my $EEIL;
-  my $AOBJ;
-  my $RI;
-  my $HDR;
-  my $CALLER_CALLEE;
-  my $NAME;
-  my $SRC;
-  my $TRIMMED;
-
-#------------------------------------------------------------------------------
-# Add a forward slash to make it easier when creating file names.
-#------------------------------------------------------------------------------
-  $outputdir         = append_forward_slash ($outputdir);
-  gp_message ("debug", $subr_name, "outputdir = $outputdir");
-
-  my $LANG              = $g_locale_settings{"LANG"};
-  my $decimal_separator = $g_locale_settings{"decimal_separator"};
-
-  $input_experiments = join (", ", @exp_dir_list);
-
-  for my $i (0 .. $#exp_dir_list)
-    {
-      my $dir = get_basename ($exp_dir_list[$i]);
-      push @abs_path_exp_dirs, $dir;
-    }
-  $input_experiments = join (", ", @abs_path_exp_dirs);
-
-  gp_message ("debug", $subr_name, "input_experiments = $input_experiments");
-  
-#------------------------------------------------------------------------------
-# TBD: Pass in the values for $expr_name and $cmd
-#------------------------------------------------------------------------------
-  $html_file_title = "Main index page";
-
-  @experiment_directories = split (",", $input_experiments);
-  $html_acknowledgement = ${ create_html_credits () };
-
-  $html_end              = ${ terminate_html_document () };
-
-  $html_output_file = $outputdir . $g_html_base_file_name{"index"} . ".html"; 
-
-  open (INDEX, ">", $html_output_file) 
-    or die ("$subr_name - unable to open file $html_output_file for writing - '$!'");
-  gp_message ("debug", $subr_name, "opened file $html_output_file for writing");
-
-  $page_title    = "GPROFNG Performance Analysis";
-  $size_text     = "h1";
-  $position_text = "center";
-  $html_gprofng = ${ generate_a_header (\$page_title, \$size_text, \$position_text) };
-
-  $html_header     = ${ create_html_header (\$html_file_title) };
-
-  print INDEX $html_header;
-  print INDEX $html_gprofng;
-  print INDEX "$_" for @g_html_experiment_stats;
-  print INDEX "$_" for @table_execution_stats;
-
-  $html_experiment_info  = "<a href=\'";
-  $html_experiment_info .= $g_html_base_file_name{"experiment_info"} . ".html";
-  $html_experiment_info .= "\'><h3>Experiment Details</h3></a>\n";
-
-  $html_warnings_page  = "<a href=\'";
-  $html_warnings_page .= $g_html_base_file_name{"warnings"} . ".html";
-  $html_warnings_page .= "\'><h3>Warnings (" . $number_of_warnings . ")</h3></a>\n";
-
-  $html_function_view  = "<a href=\'";
-  $html_function_view .= $html_first_metric_file;
-  $html_function_view .= "\'><h3>Function View</h3></a>\n";
-
-  $html_caller_callee_view  = "<a href=\'";
-  $html_caller_callee_view .= $g_html_base_file_name{"caller_callee"} . ".html";
-  $html_caller_callee_view .= "\'><h3>Caller Callee View</h3></a>\n";
-
-  print INDEX "<br>\n";
-##  print INDEX "<b>\n";
-  print INDEX $html_experiment_info;
-  print INDEX $html_warnings_page;;
-##  print INDEX "<br>\n";
-##  print INDEX "<br>\n";
-  print INDEX $html_function_view;
-##  print INDEX "<br>\n";
-##  print INDEX "<br>\n";
-  print INDEX $html_caller_callee_view;
-##  print INDEX "</b>\n";
-##  print INDEX "<br>\n";
-##  print INDEX "<br>\n";
-  print INDEX $html_acknowledgement;
-  print INDEX $html_end;
-
-  close (INDEX);
-
-  gp_message ("debug", $subr_name, "closed file $html_output_file");
-
-  return (0);
-
-} #-- End of subroutine generate_index
-
-#------------------------------------------------------------------------------
-# Get all the metrics available 
+# Get all the metrics available
 #
 # (gp-display-text) metric_list
 # Current metrics: e.totalcpu:i.totalcpu:e.cycles:e+insts:e+llm:name
@@ -7312,8 +7772,8 @@ sub get_all_the_metrics
   my $outputdir   = ${ $outputdir_ref };
 
   my $ignore_value;
-  my $gp_functions_cmd; 
-  my $gp_display_text_cmd; 
+  my $gp_functions_cmd;
+  my $gp_display_text_cmd;
 
   my $metrics_output_file = $outputdir . "metrics-all";
   my $result_file   = $outputdir . $g_gp_output_file;
@@ -7322,7 +7782,7 @@ sub get_all_the_metrics
 
   my @metrics_data = ();
 
-  open (SCRIPT_METRICS, ">", $script_file_metrics) 
+  open (SCRIPT_METRICS, ">", $script_file_metrics)
     or die ("$subr_name - unable to open script file $script_file_metrics for writing: '$!'");
   gp_message ("debug", $subr_name, "opened script file $script_file_metrics for writing");
 
@@ -7344,13 +7804,13 @@ sub get_all_the_metrics
 
   if ($error_code != 0)
     {
-      $ignore_value = msg_display_text_failure ($gp_display_text_cmd, 
-                                                $error_code, 
+      $ignore_value = msg_display_text_failure ($gp_display_text_cmd,
+                                                $error_code,
                                                 $gp_error_file);
       gp_message ("abort", $subr_name, "execution terminated");
     }
 
-  open (METRICS_INFO, "<", $metrics_output_file) 
+  open (METRICS_INFO, "<", $metrics_output_file)
     or die ("$subr_name - unable to open file $metrics_output_file for reading '$!'");
   gp_message ("debug", $subr_name, "opened file $metrics_output_file for reading");
 
@@ -7419,7 +7879,7 @@ sub get_basename
 } #-- End of subroutine get_basename
 
 #------------------------------------------------------------------------------
-# Get the details on the experiments and store these in a file.  Each 
+# Get the details on the experiments and store these in a file.  Each
 # experiment has its own file.  This makes the processing easier.
 #------------------------------------------------------------------------------
 sub get_experiment_info
@@ -7434,14 +7894,15 @@ sub get_experiment_info
   my $cmd_output;
   my $current_slot;
   my $error_code;
-  my $exp_info_file; 
+  my $exp_info_file;
   my @exp_info       = ();
   my @experiment_data = ();
   my $gp_error_file;
   my $gp_display_text_cmd;
-  my $gp_functions_cmd; 
-  my $gp_log_file; 
+  my $gp_functions_cmd;
+  my $gp_log_file;
   my $ignore_value;
+  my $msg;
   my $overview_file;
   my $result_file;
   my $script_file;
@@ -7455,7 +7916,7 @@ sub get_experiment_info
   $gp_log_file   = $outputdir . $g_gp_output_file;
   $gp_error_file = $outputdir . $g_gp_error_logfile;
 
-  open (SCRIPT_EXPERIMENT_INFO, ">", $script_file) 
+  open (SCRIPT_EXPERIMENT_INFO, ">", $script_file)
     or die ("$subr_name - unable to open script file $script_file for writing: '$!'");
   gp_message ("debug", $subr_name, "opened script file $script_file for writing");
 
@@ -7485,29 +7946,29 @@ sub get_experiment_info
 
   if ($error_code != 0)
     {
-      $ignore_value = msg_display_text_failure ($gp_display_text_cmd, 
-                                                $error_code, 
+      $ignore_value = msg_display_text_failure ($gp_display_text_cmd,
+                                                $error_code,
                                                 $gp_error_file);
       gp_message ("abort", $subr_name, "execution terminated");
     }
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # The first file has the following format:
 #
 # ID Sel     PID Experiment
 # == === ======= ======================================================
 #  1 yes 2078714 <absolute_path/mxv.hwc.1.thr.er
 #  2 yes 2078719 <absolute_path/mxv.hwc.2.thr.er
-#-------------------------------------------------------------------------------
-  open (EXP_INFO, "<", $exp_info_file) 
+#------------------------------------------------------------------------------
+  open (EXP_INFO, "<", $exp_info_file)
     or die ("$subr_name - unable to open file $exp_info_file for reading '$!'");
   gp_message ("debug", $subr_name, "opened script file $exp_info_file for reading");
 
   chomp (@exp_info = <EXP_INFO>);
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # TBD - Check for the groups to exist below:
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   $current_slot = 0;
   for my $i (0 .. $#exp_info)
     {
@@ -7532,21 +7993,21 @@ sub get_experiment_info
             }
           else
             {
-              my $msg = "remainder = $remainder has an unexpected format";
+              $msg = "remainder = $remainder has an unexpected format";
               gp_message ("assertion", $subr_name, $msg);
             }
         }
     }
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # The experiment IDs and names are known.  We can now generate the info for
 # each individual experiment.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   $gp_log_file   = $outputdir . $g_gp_output_file;
   $gp_error_file = $outputdir . $g_gp_error_logfile;
 
   $script_file = $outputdir . "gp-details-exp.script";
 
-  open (SCRIPT_EXPERIMENT_DETAILS, ">", $script_file) 
+  open (SCRIPT_EXPERIMENT_DETAILS, ">", $script_file)
     or die ("$subr_name - unable to open script file $script_file for writing: '$!'");
   gp_message ("debug", $subr_name, "opened script file $script_file for writing");
 
@@ -7571,19 +8032,20 @@ sub get_experiment_info
 
   $gp_functions_cmd = "$GP_DISPLAY_TEXT -script $script_file $the_experiments";
 
-  gp_message ("debug", $subr_name, "executing $GP_DISPLAY_TEXT to get the experiment details");
+  $msg = "executing $GP_DISPLAY_TEXT to get the experiment details";
+  gp_message ("debug", $subr_name, $msg);
 
   $gp_display_text_cmd = "$gp_functions_cmd 1>> $gp_log_file 2>> $gp_error_file";
 
   ($error_code, $cmd_output) = execute_system_cmd ($gp_display_text_cmd);
 
   if ($error_code != 0)
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # This is unlikely to happen, but you never know.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
     {
-      $ignore_value = msg_display_text_failure ($gp_display_text_cmd, 
-                                                $error_code, 
+      $ignore_value = msg_display_text_failure ($gp_display_text_cmd,
+                                                $error_code,
                                                 $gp_error_file);
       gp_message ("abort", $subr_name, "execution terminated");
     }
@@ -7649,13 +8111,13 @@ sub getfilesize
 } #-- End of subroutine getfilesize
 
 #------------------------------------------------------------------------------
-# Parse the fsummary output and for all functions, store all the information 
-# found in "function_info".  In addition to this, several derived structures 
+# Parse the fsummary output and for all functions, store all the information
+# found in "function_info".  In addition to this, several derived structures
 # are stored as well, making this structure a "onestop" place to get all the
 # info that is needed.
 #------------------------------------------------------------------------------
 sub get_function_info
-{ 
+{
   my $subr_name = get_my_name ();
 
   my ($FSUMMARY_FILE) = @_;
@@ -7675,6 +8137,8 @@ sub get_function_info
 #------------------------------------------------------------------------------
   my %functions_index             = ();
 
+  my $msg;
+
 # TBD: check
   my $full_address_field;
   my %source_files   = ();
@@ -7705,7 +8169,7 @@ sub get_function_info
 #
 # Current Sort Metric: Exclusive Total CPU Time ( e.totalcpu )
 # Functions sorted by metric: Exclusive Total CPU Time
-# 
+#
 # <Total>
 #         Exclusive Total CPU Time: 11.538 (100.0%)
 #         Inclusive Total CPU Time: 11.538 (100.0%)
@@ -7716,14 +8180,14 @@ sub get_function_info
 #                      Load Object: <Total>
 #                     Mangled Name:
 #                          Aliases:
-# 
+#
 # a_function_name
 #         Exclusive Total CPU Time:  4.003 ( 34.7%)
 #         Inclusive Total CPU Time:  4.003 ( 34.7%)
 #                             Size:    715
 #                       PC Address: 2:0x00006c61
-#                      Source File: <absolute path to source file> 
-#                      Object File: <object filename> 
+#                      Source File: <absolute path to source file>
+#                      Object File: <object filename>
 #                      Load Object: <executable name>
 #                     Mangled Name:
 #                          Aliases:
@@ -7819,8 +8283,8 @@ sub get_function_info
                 {
                   $g_multi_count_function{$routine} = $TRUE;
                 }
-              my $msg = "g_function_occurrences{$routine} = " .
-                        $g_function_occurrences{$routine};
+              $msg  = "g_function_occurrences{$routine} = ";
+              $msg .= $g_function_occurrences{$routine};
               gp_message ("debugXL", $subr_name, $msg);
             }
 #------------------------------------------------------------------------------
@@ -7845,14 +8309,14 @@ sub get_function_info
           gp_message ("debugXL", $subr_name, "stored " . $function_info[$i]{"routine"});
 
 #------------------------------------------------------------------------------
-# The $functions_index hash contains an array.  After an initial assignment, 
+# The $functions_index hash contains an array.  After an initial assignment,
 # other values that have been found are pushed onto the arrays.
 #------------------------------------------------------------------------------
           if (not exists ($functions_index{$routine}))
             {
               $functions_index{$routine} = [$i];
-            } 
-          else 
+            }
+          else
             {
 #------------------------------------------------------------------------------
 # Add the array index to the list
@@ -7900,7 +8364,7 @@ sub get_function_info
         }
       else
         {
-          my $msg = "unexpected: number of fields = " . $no_of_elements; 
+          $msg = "unexpected: number of fields = " . $no_of_elements;
           gp_message ("assertion", $subr_name, $msg);
         }
 #------------------------------------------------------------------------------
@@ -7930,7 +8394,7 @@ sub get_function_info
           my $offset;
 #------------------------------------------------------------------------------
 # The format of the address is assumed to be the following 2:0x000070a8
-# Note that the regex is pretty wide.  This is from the original code and 
+# Note that the regex is pretty wide.  This is from the original code and
 # could be made more specific:
 #          if ($value =~ /\s*(\S+):(\S+)/)
 #------------------------------------------------------------------------------
@@ -7945,8 +8409,9 @@ sub get_function_info
               $address_decimal = bigint::hex ($offset); # decimal
 #------------------------------------------------------------------------------
 # Construct the address field.  Note that we use the hex address here.
+# For example @2:0x0003f280
 #------------------------------------------------------------------------------
-              $full_address_field = '@'.$segment.":0x".$offset; # e.g. @2:0x0003f280
+              $full_address_field = '@'.$segment.":0x".$offset;
 
               $function_info[$i]{"addressobj"}     = $address_decimal;
               $function_info[$i]{"addressobjtext"} = $full_address_field;
@@ -7956,29 +8421,31 @@ sub get_function_info
             {
               $function_address_and_index{$routine}{$value} = $i;
 
-              my $msg = "function_address_and_index{$routine}{$value} = " .
-                        $function_address_and_index{$routine}{$value};
+              $msg  = "function_address_and_index{$routine}{$value} = ";
+              $msg .= $function_address_and_index{$routine}{$value};
               gp_message ("debugXL", $subr_name, $msg);
-            } 
-          else 
+            }
+          else
             {
-              gp_message ("debugXL", $subr_name, "function_info: $FSUMMARY_FILE: function $routine already has a PC Address");
-            } 
+              $msg  = "function_info: $FSUMMARY_FILE: function $routine";
+              $msg .= " already has a PC Address";
+              gp_message ("debugXL", $subr_name, $msg);
+            }
 
           $number_of_functions++;
         }
     }
   close (FSUMMARY_FILE);
+
 #------------------------------------------------------------------------------
 # For every function in the function overview, set up an html structure with
 # the various hyperlinks.
 #------------------------------------------------------------------------------
   gp_message ("debugXL", $subr_name, "augment function_info with alt_name");
-  my $target_function; 
+  my $target_function;
   my $html_line;
   my $ftag;
-  my $routine_length; 
+  my $routine_length;
   my %html_source_functions = ();
   for my $i (keys @function_info)
     {
@@ -8021,7 +8488,7 @@ sub get_function_info
 #------------------------------------------------------------------------------
           my $loadobj = $function_info[$i]{"Load Object"};
           my $address_field = $function_info[$i]{"addressobjtext"};
-          my $address_offset; 
+          my $address_offset;
 
 #------------------------------------------------------------------------------
 # The address field has the following format: @<n>:<address_offset>
@@ -8058,14 +8525,14 @@ sub get_function_info
   gp_message ("debug", $subr_name, "augment function_info with alt_name completed");
 
 #------------------------------------------------------------------------------
-# Compute the maximum function name length. 
+# Compute the maximum function name length.
 #
 # The maximum length is stored in %function_view_structure.
 #------------------------------------------------------------------------------
   my $max_function_length = 0;
   for my $i (0 .. $#function_info)
     {
-      $max_function_length = max ($max_function_length, $function_info[$i]{"function length"});
+      $max_function_length = List::Util::max ($max_function_length, $function_info[$i]{"function length"});
 
       gp_message ("debugXL", $subr_name, "function_info[$i]{\"alt_name\"} = " . $function_info[$i]{"alt_name"} . " length = " . $function_info[$i]{"function length"});
     }
@@ -8087,7 +8554,7 @@ sub get_function_info
   my $top_of_table = $FALSE;
   for my $i (keys @function_info)
     {
-      my $new_target_function; 
+      my $new_target_function;
 
       if (defined ($function_info[$i]{"alt_name"}))
         {
@@ -8111,7 +8578,7 @@ sub get_function_info
       if ($target_function eq "<Total>")
 #------------------------------------------------------------------------------
 # <Total> is a pseudo function and there is no source, or disassembly for it.
-# We could add a link to the caller-callee part, but this is currently not 
+# We could add a link to the caller-callee part, but this is currently not
 # done.
 #------------------------------------------------------------------------------
         {
@@ -8143,7 +8610,7 @@ sub get_function_info
             }
 
 #------------------------------------------------------------------------------
-# Create the block with the function name, in boldface, plus the links to the 
+# Create the block with the function name, in boldface, plus the links to the
 # source, disassembly and caller-callee views.
 #------------------------------------------------------------------------------
 
@@ -8158,7 +8625,8 @@ sub get_function_info
           $html_line .= $function_info[$i]{"href_caller_callee"};
         }
 
-      gp_message ("debugXL", $subr_name, "target_function = $target_function html_line = $html_line");
+      $msg = "target_function = $target_function html_line = $html_line";
+      gp_message ("debugM", $subr_name, $msg);
       $html_source_functions{$target_function} = $html_line;
 
 #------------------------------------------------------------------------------
@@ -8169,11 +8637,14 @@ sub get_function_info
 
   for my $i (keys %html_source_functions)
     {
-      gp_message ("debugXL", $subr_name, "html_source_functions{$i} = $html_source_functions{$i}");
+      $msg = "html_source_functions{$i} = $html_source_functions{$i}";
+      gp_message ("debugM", $subr_name, $msg);
     }
   for my $i (keys @function_info)
     {
-      gp_message ("debugXL", $subr_name, "function_info[$i]{\"html function block\"} = " . $function_info[$i]{"html function block"}); 
+      $msg  = "function_info[$i]{\"html function block\"} = ";
+      $msg .= $function_info[$i]{"html function block"};
+      gp_message ("debugM", $subr_name, $msg);
     }
 
 #------------------------------------------------------------------------------
@@ -8183,7 +8654,9 @@ sub get_function_info
     {
       for my $role (sort keys %{ $function_info[$i] })
         {
-           gp_message ("debug", $subr_name, "on return: function_info[$i]{$role} = $function_info[$i]{$role}");
+           $msg  = "on return: function_info[$i]{$role} = ";
+           $msg .= $function_info[$i]{$role};
+           gp_message ("debugM", $subr_name, $msg);
         }
     }
 #------------------------------------------------------------------------------
@@ -8193,7 +8666,9 @@ sub get_function_info
     {
       for my $fields (sort keys %{ $function_address_and_index{$F} })
         {
-           gp_message ("debug", $subr_name, "on return: function_address_and_index{$F}{$fields} = $function_address_and_index{$F}{$fields}");
+           $msg  = "on return: function_address_and_index{$F}{$fields} = ";
+           $msg .= $function_address_and_index{$F}{$fields};
+           gp_message ("debugM", $subr_name, $msg);
         }
     }
 #------------------------------------------------------------------------------
@@ -8209,7 +8684,7 @@ sub get_function_info
     }
 
 #------------------------------------------------------------------------------
-# Print the data structure %function_view_structure. This is a hash. 
+# Print the data structure %function_view_structure. This is a hash.
 #------------------------------------------------------------------------------
   for my $F (keys %function_view_structure)
     {
@@ -8229,11 +8704,11 @@ sub get_function_info
       gp_message ("debug", $subr_name, "on return: g_function_occurrences{$F} = $g_function_occurrences{$F}");
       if ($g_function_occurrences{$F} == 1)
         {
-          $number_of_unique_functions++; 
+          $number_of_unique_functions++;
         }
       else
         {
-          $number_of_non_unique_functions++; 
+          $number_of_non_unique_functions++;
         }
     }
 
@@ -8246,25 +8721,23 @@ sub get_function_info
 #------------------------------------------------------------------------------
 # TBD: Include in experiment data. Include names with multiple occurrences.
 #------------------------------------------------------------------------------
-  my $msg;
-
   $msg = "Number of source files                                        : " .
          $num_source_files;
   gp_message ("debug", $subr_name, $msg);
-  $msg = "Total number of functions: $number_of_functions"; 
+  $msg = "Total number of functions: $number_of_functions";
   gp_message ("debug", $subr_name, $msg);
   $msg = "Number of functions functions with a unique name              : " .
-         $number_of_unique_functions; 
+         $number_of_unique_functions;
   gp_message ("debug", $subr_name, $msg);
   $msg = "Number of functions functions with more than one occurrence   : " .
-         $number_of_non_unique_functions; 
+         $number_of_non_unique_functions;
   gp_message ("debug", $subr_name, $msg);
-  my $multi_occurrences = $number_of_functions - $number_of_unique_functions; 
+  my $multi_occurrences = $number_of_functions - $number_of_unique_functions;
   $msg = "Total number of multiple occurences of the same function name : " .
-         $multi_occurrences; 
+         $multi_occurrences;
   gp_message ("debug", $subr_name, $msg);
 
-  return (\@function_info, \%function_address_and_index, \%addressobjtextm, 
+  return (\@function_info, \%function_address_and_index, \%addressobjtextm,
           \%LINUX_vDSO, \%function_view_structure);
 
 } #-- End of subroutine get_function_info
@@ -8302,7 +8775,7 @@ sub get_hdr_info
     {
       $ASORTFILE=$outputdir."calls";
       $metric = "calls"
-    } 
+    }
   elsif ($file eq $outputdir."calltree.sort.func")
     {
       $ASORTFILE=$outputdir."calltree";
@@ -8358,10 +8831,10 @@ sub get_hdr_info
       last;
      }
   close (ASORTFILE);
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Ruud - Fixed a bug. The output should not be appended, but overwritten.
 # open (HI,">>$OUTPUTDIR"."hdrinfo");
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   my $outfile = $outputdir."hdrinfo";
 
   if ($first_call)
@@ -8399,7 +8872,7 @@ sub get_hdr_info
 } #-- End of subroutine get_hdr_info
 
 #------------------------------------------------------------------------------
-# Get the home directory and the location(s) of the configuration file on the 
+# Get the home directory and the location(s) of the configuration file on the
 # current system.
 #------------------------------------------------------------------------------
 sub get_home_dir_and_rc_path
@@ -8416,22 +8889,22 @@ sub get_home_dir_and_rc_path
   $target_cmd  = $g_mapped_cmds{"printenv"} . " HOME";
 
   ($error_code, $home_dir) = execute_system_cmd ($target_cmd);
-   
+
   if ($error_code != 0)
     {
-      my $msg = "cannot find a setting for HOME - please set this"; 
+      my $msg = "cannot find a setting for HOME - please set this";
       gp_message ("assertion", $subr_name, $msg);
     }
   else
 
 #------------------------------------------------------------------------------
-# The home directory is known and we can define the locations for the 
+# The home directory is known and we can define the locations for the
 # configuration file.
 #------------------------------------------------------------------------------
     {
       @rc_file_paths = (".", "$home_dir");
-    } 
-  
+    }
+
   gp_message ("debug", $subr_name, "upon return: \@rc_file_paths = @rc_file_paths");
 
   return ($home_dir, \@rc_file_paths);
@@ -8487,7 +8960,7 @@ sub get_hot_functions
 #------------------------------------------------------------------------------
 # Get the summary of the hot functions
 #------------------------------------------------------------------------------
-  open (SCRIPT, ">", $script_file) 
+  open (SCRIPT, ">", $script_file)
     or die ("$subr_name - unable to open script file $script_file for writing: '$!'");
   gp_message ("debug", $subr_name, "opened script file $script_file for writing");
 
@@ -8528,8 +9001,8 @@ sub get_hot_functions
 
   if ($error_code != 0)
     {
-      $ignore_value = msg_display_text_failure ($gp_display_text_cmd, 
-                                                $error_code, 
+      $ignore_value = msg_display_text_failure ($gp_display_text_cmd,
+                                                $error_code,
                                                 $gp_error_file);
       gp_message ("abort", $subr_name, "execution terminated");
       my $msg = "error code = $error_code - failure executing command $gp_display_text_cmd";
@@ -8597,7 +9070,7 @@ sub get_index_function_info
 
           gp_message ("debug", $subr_name, "$routine: retrieving duplicate entry at ref_index = $ref_index");
           gp_message ("debug", $subr_name, "$routine: addr_offset = $addr_offset");
-  
 #------------------------------------------------------------------------------
 # TBD: Do this substitution when storing "addressobjtext" in function_info.
 #------------------------------------------------------------------------------
@@ -8625,9 +9098,9 @@ sub get_index_function_info
 
 } #-- End of subroutine get_index_function_info
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Get the setting for LANG, or assign a default if it is not set.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub get_LANG_setting
 {
   my $subr_name = get_my_name ();
@@ -8635,14 +9108,14 @@ sub get_LANG_setting
   my $error_code;
   my $lang_setting;
   my $target_cmd;
-  my $command_string; 
+  my $command_string;
   my $LANG;
 
   $target_cmd = $g_mapped_cmds{"printenv"};
 #------------------------------------------------------------------------------
 # Use the printenv command to get the settings for LANG.
 #------------------------------------------------------------------------------
-  if ($target_cmd eq "road_to_nowhere")
+  if ($target_cmd eq "road to nowhere")
     {
       $error_code = 1;
     }
@@ -8679,8 +9152,8 @@ sub get_metrics_data
 
   my @exp_dir_list = @{ $exp_dir_list_ref };
 
-  my $cmd_options; 
-  my $cmd_output; 
+  my $cmd_options;
+  my $cmd_output;
   my $error_code;
   my $expr_name;
   my $metrics_cmd;
@@ -8696,7 +9169,7 @@ sub get_metrics_data
 # to get all the output in files $outfile1 and $outfile2.  These are then
 # parsed.
 #------------------------------------------------------------------------------
-  $cmd_options   = " -viewmode machine -compare off -thread_select all"; 
+  $cmd_options   = " -viewmode machine -compare off -thread_select all";
   $cmd_options  .= " -outfile $outfile2";
   $cmd_options  .= " -fsingle '<Total>' -metric_list $expr_name";
 
@@ -8708,7 +9181,7 @@ sub get_metrics_data
   ($error_code, $metrics_output) = execute_system_cmd ($metrics_cmd);
 
 #------------------------------------------------------------------------------
-# Error handling.  Any error that occurred is fatal and execution 
+# Error handling.  Any error that occurred is fatal and execution
 # should be aborted by the caller.
 #------------------------------------------------------------------------------
   if ($error_code == 0)
@@ -8766,9 +9239,9 @@ sub get_my_name
 
 } #-- End of subroutine get_my_name
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Determine the characteristics of the current system
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub get_system_config_info
 {
 #------------------------------------------------------------------------------
@@ -8795,25 +9268,26 @@ sub get_system_config_info
 #------------------------------------------------------------------------------
   my $subr_name = get_my_name ();
 
-  my $target_cmd;
-  my $hostname_current;
   my $error_code;
-  my $ignore_output; 
+  my $hostname_current;
+  my $ignore_output;
+  my $msg;
+  my $target_cmd;
 #------------------------------------------------------------------------------
-# Test once if the command succeeds.  This avoids we need to check every 
+# Test once if the command succeeds.  This avoids we need to check every
 # specific # command below.
 #------------------------------------------------------------------------------
   $target_cmd    = $g_mapped_cmds{uname};
   ($error_code, $ignore_output) = execute_system_cmd ($target_cmd);
-   
+
   if ($error_code != 0)
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # This is unlikely to happen, but you never know.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
     {
       gp_message ("abort", $subr_name, "failure to execute the uname command");
     }
-  
   my $kernel_name       = qx ($target_cmd -s); chomp ($kernel_name);
   my $nodename          = qx ($target_cmd -n); chomp ($nodename);
   my $kernel_release    = qx ($target_cmd -r); chomp ($kernel_release);
@@ -8822,7 +9296,7 @@ sub get_system_config_info
   my $processor         = qx ($target_cmd -p); chomp ($processor);
   my $hardware_platform = qx ($target_cmd -i); chomp ($hardware_platform);
   my $operating_system  = qx ($target_cmd -o); chomp ($operating_system);
-  
   $local_system_config{"kernel_name"}       = $kernel_name;
   $local_system_config{"nodename"}          = $nodename;
   $local_system_config{"kernel_release"}    = $kernel_release;
@@ -8831,7 +9305,7 @@ sub get_system_config_info
   $local_system_config{"processor"}         = $processor;
   $local_system_config{"hardware_platform"} = $hardware_platform;
   $local_system_config{"operating_system"}  = $operating_system;
-  
   gp_message ("debug", $subr_name, "the output from the $target_cmd command is split into the following variables:");
   gp_message ("debug", $subr_name, "kernel_name       = $kernel_name");
   gp_message ("debug", $subr_name, "nodename          = $nodename");
@@ -8841,7 +9315,7 @@ sub get_system_config_info
   gp_message ("debug", $subr_name, "processor         = $processor");
   gp_message ("debug", $subr_name, "hardware_platform = $hardware_platform");
   gp_message ("debug", $subr_name, "operating_system  = $operating_system");
-  
 #------------------------------------------------------------------------------
 # Check if the system we are running on is supported.
 #------------------------------------------------------------------------------
@@ -8849,7 +9323,14 @@ sub get_system_config_info
 
   if (not $is_supported)
     {
-      gp_message ("error", $subr_name, "$machine is not supported");
+      $msg = "the $machine instruction set architecture is not supported";
+      gp_message ("error", $subr_name, $msg);
+      gp_message ("diag", $subr_name, "Error: " . $msg);
+
+      $msg = "temporarily ignored for development purposes";
+      gp_message ("error", $subr_name, $msg);
+
+      $g_total_error_count++;
       exit (0);
     }
 #------------------------------------------------------------------------------
@@ -8859,15 +9340,15 @@ sub get_system_config_info
   $target_cmd       = $g_mapped_cmds{hostname};
   $hostname_current = qx ($target_cmd); chomp ($hostname_current);
   $error_code       = ${^CHILD_ERROR_NATIVE};
-   
   if ($error_code == 0)
     {
       $local_system_config{"hostname_current"} = $hostname_current;
     }
   else
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # This is unlikely to happen, but you never know.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
     {
       gp_message ("abort", $subr_name, "failure to execute the hostname command");
     }
@@ -8880,46 +9361,47 @@ sub get_system_config_info
 
 } #-- End of subroutine get_system_config_info
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # This subroutine prints a message.  Several types of messages are supported.
-# In case the type is "abort", or "error", execution is terminated.  
+# In case the type is "abort", or "error", execution is terminated.
 #
-# Note that "debug", "warning", and "error" mode, the name of the calling 
-# subroutine is truncated to 30 characters.  In case the name is longer, 
+# Note that "debug", "warning", and "error" mode, the name of the calling
+# subroutine is truncated to 30 characters.  In case the name is longer,
 # a warning message # is issued so you know this has happened.
 #
-# Note that we use lcfirst () and ucfirst () to enforce whether the first 
+# Note that we use lcfirst () and ucfirst () to enforce whether the first
 # character is printed in lower or uppercase.  It is nothing else than a
 # convenience, but creates more consistency across messages.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub gp_message
 {
   my $subr_name = get_my_name ();
 
   my ($action, $caller_name, $comment_line) = @_;
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # The debugXL identifier is special.  It is accepted, but otherwise ignored.
 # This allows to (temporarily) disable debug print statements, but keep them
 # around.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   my %supported_identifiers = (
-    "verbose" => "[Verbose]",
-    "debug"   => "[Debug]",
-    "error"   => "[Error]",
-    "warning" => "[Warning]",
-    "abort"   => "[Abort]",
+    "verbose"   => "[Verbose]",
+    "debug"     => "[Debug]",
+    "error"     => "[Error]",
+    "warning"   => "[Warning]",
+    "abort"     => "[Abort]",
     "assertion" => "[Assertion error]",
-    "diag"    => "",
+    "diag"      => "",
   );
 
-  my $debug_size; 
+  my $debug_size;
   my $identifier;
-  my $fixed_size_name; 
+  my $fixed_size_name;
+  my $ignore_value;
   my $string_limit = 30;
   my $strlen = length ($caller_name);
   my $trigger_debug = $FALSE;
-  my $truncated_name; 
+  my $truncated_name;
   my $msg;
 
   if ($action =~ /debug\s*(.+)/)
@@ -8933,11 +9415,11 @@ sub gp_message
             {
               if ($g_debug_size{$debug_size})
                 {
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # All we need to know is whether a debug action is requested and whether the
 # size has been enabled.  By setting $action to "debug", the code below is
 # simplified.  Note that only using $trigger_debug below is actually sufficient.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
                   $trigger_debug = $TRUE;
                 }
             }
@@ -8953,9 +9435,9 @@ sub gp_message
       $trigger_debug = $TRUE;
     }
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Catch any non-supported identifier.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   if (defined ($supported_identifiers{$action}))
     {
       $identifier = $supported_identifiers{$action};
@@ -8964,113 +9446,168 @@ sub gp_message
     {
       die ("$subr_name - input error: $action is not supported");
     }
-  if (($action eq "debug") and ($g_user_settings{"debug"}{"current_value"} eq "off"))
+  if (($action eq "debug") and (not $g_debug))
     {
       $trigger_debug = $FALSE;
     }
 
-#-------------------------------------------------------------------------------
-# Unconditionally buffer all warning messages.  These are meant to be displayed
-# separately. 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+# Unconditionally buffer all warning messages.  These are available through the
+# index.html page and cannot be disabled.
+#
+# If the quiet mode has been enabled, warnings are not printed though.
+#------------------------------------------------------------------------------
   if ($action eq "warning")
     {
-      push (@g_warning_messages, ucfirst ($comment_line));
+#------------------------------------------------------------------------------
+# Remove any leading <br>, capitalize the first letter, and put the <br> back
+# before storing the message in the buffer.
+#------------------------------------------------------------------------------
+      if ($comment_line =~ /^$g_html_new_line/)
+        {
+          $msg = $comment_line;
+          $msg =~ s/$g_html_new_line//;
+          $comment_line = $g_html_new_line . ucfirst ($msg);
+
+          push (@g_warning_msgs, $comment_line);
+        }
+      else
+        {
+          push (@g_warning_msgs, ucfirst ($comment_line));
+        }
+    }
+
+#------------------------------------------------------------------------------
+# Unconditionally buffer all errror messages.  These will be printed prior to
+# terminate execution.
+#------------------------------------------------------------------------------
+  if ($action eq "error")
+#------------------------------------------------------------------------------
+# Remove any leading <br>, capitalize the first letter, and put the <br> back.
+#------------------------------------------------------------------------------
+    {
+      if ($comment_line =~ /^$g_html_new_line/)
+        {
+          $msg = $comment_line;
+          $msg =~ s/$g_html_new_line//;
+          $comment_line = $g_html_new_line . ucfirst ($msg);
+
+          push (@g_error_msgs, $comment_line);
+        }
+      else
+        {
+          push (@g_error_msgs, ucfirst ($comment_line));
+        }
     }
 
-#-------------------------------------------------------------------------------
-# Quick return in several cases.  Note that "debug", "verbose", "warning", and 
+#------------------------------------------------------------------------------
+# Quick return in several cases.  Note that "debug", "verbose", "warning", and
 # "diag" messages are suppressed in quiet mode, but "error", "abort" and
 # "assertion" always pass.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   if ((
            ($action eq "verbose") and (not $g_verbose))
        or (($action eq "debug")   and (not $trigger_debug))
-       or (($action eq "verbose") and ($g_quiet)) 
-       or (($action eq "debug")   and ($g_quiet)) 
-       or (($action eq "warning") and (not $g_warnings)) 
+       or (($action eq "verbose") and ($g_quiet))
+       or (($action eq "debug")   and ($g_quiet))
+       or (($action eq "warning") and ($g_quiet))
        or (($action eq "diag")    and ($g_quiet)))
     {
       return (0);
     }
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # In diag mode, just print the input line and nothing else.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   if ((
-          $action eq "debug") 
+          $action eq "debug")
       or ($action eq "abort")
-      or ($action eq "warning") 
-      or ($action eq "assertion") 
-      or ($action eq "error"))
-    {
-#-------------------------------------------------------------------------------
-# Construct the string to be printed.  Include an identifier and the name of 
-# the function. 
-#-------------------------------------------------------------------------------
+      or ($action eq "assertion"))
+##      or ($action eq "error"))
+    {
+#------------------------------------------------------------------------------
+# Construct the string to be printed.  Include an identifier and the name of
+# the function.
+#------------------------------------------------------------------------------
       if ($strlen > $string_limit)
         {
           $truncated_name  = substr ($caller_name, 0, $string_limit);
           $fixed_size_name = sprintf ("%-"."$string_limit"."s", $truncated_name);
-          print "Warning in $subr_name - the name of the caller is: $caller_name\n";
-          print "Warning in $subr_name - the string length is $strlen and exceeds $string_limit\n";
+          print "Warning in $subr_name - the name of the caller is: " .
+               $caller_name . "\n";
+          print "Warning in $subr_name - the string length is $strlen and " .
+                "exceeds $string_limit\n";
         }
       else
         {
           $fixed_size_name = sprintf ("%-"."$string_limit"."s", $caller_name);
         }
 
-      if (($action eq "error") or ($action eq "abort")) 
-#-------------------------------------------------------------------------------
+##      if (($action eq "error") or ($action eq "abort"))
+      if ($action eq "abort")
+#------------------------------------------------------------------------------
 # Enforce that the message starts with a lowercase symbol.  Since these are
 # user errors, the name of the routine is not shown.  The same for "abort".
 # If you want to display the routine name too, use an assertion.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
         {
-          printf ("%-9s %s\n", $identifier, lcfirst ($comment_line));
+          my $error_identifier = $supported_identifiers{"error"};
+          if (@g_error_msgs)
+            {
+              $ignore_value = print_errors_buffer (\$error_identifier);
+            }
+          printf ("%-9s %s", $identifier, ucfirst ($comment_line));
+          printf (" - %s\n", "execution is terminated");
         }
       elsif ($action eq "assertion")
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Enforce that the message starts with a lowercase symbol.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
         {
-          printf ("%-9s %-30s - %s\n", $identifier, $fixed_size_name, $comment_line);
+#------------------------------------------------------------------------------
+# The lines are too long, but breaking the argument list gives this warning:
+# printf (...) interpreted as function
+#------------------------------------------------------------------------------
+          printf ("%-17s %-30s", $identifier, $fixed_size_name);
+          printf (" - %s\n", $comment_line);
         }
       elsif (($action eq "debug") and ($trigger_debug))
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Debug messages are printed "as is".  Avoids issues when searching for them ;-)
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
         {
-          printf ("%-9s %-30s - %s\n", $identifier, $fixed_size_name, $comment_line);
+          printf ("%-9s %-30s", $identifier, $fixed_size_name);
+          printf (" - %s\n", $comment_line);
         }
       else
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Enforce that the message starts with a lowercase symbol.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
         {
-          printf ("%-9s %-30s - %s\n", $identifier, $fixed_size_name, lcfirst ($comment_line));
+          printf ("%-9s %-30s", $identifier, $fixed_size_name);
+          printf (" - %s\n", $comment_line);
         }
     }
   elsif ($action eq "verbose")
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # The first character in the verbose message is capatilized.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
     {
       printf ("%s\n", ucfirst ($comment_line));
     }
   elsif ($action eq "diag")
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # The diag messages are meant to be diagnostics.  Only the comment line is
 # printed.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
     {
       printf ("%s\n", $comment_line);
       return (0);
     }
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Terminate execution in case the identifier is "abort".
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   if (($action eq "abort") or ($action eq "assertion"))
     {
 ##      print "ABORT temporarily disabled for testing purposes\n";
@@ -9080,172 +9617,351 @@ sub gp_message
     {
       return (0);
     }
-   
 } #-- End of subroutine gp_message
 
 #------------------------------------------------------------------------------
-# Dynamically load the modules needed.  Returns a list with the modules that
-# could not be loaded.
+# Create an HTML page with the warnings.  If there are no warnings, include
+# line to this extent.  The alternative is to supporess the entire page, but
+# that breaks the consistency in the output.
 #------------------------------------------------------------------------------
-sub handle_module_availability
+sub html_create_warnings_page
 {
   my $subr_name = get_my_name ();
 
-  gp_message ("verbose", $subr_name, "Handling module requirements");
+  my ($outputdir_ref) = @_;
+
+  my $outputdir = ${ $outputdir_ref };
+
+  my $file_title;
+  my $html_acknowledgement;
+  my $html_end;
+  my $html_header;
+  my $html_home_left;
+  my $html_home_right;
+  my $html_title_header;
+  my $msg_no_warnings = "There are no warning messages issued.";
+  my $page_title;
+  my $position_text;
+  my $size_text;
+
+  my $outfile = $outputdir . $g_html_base_file_name{"warnings"} . ".html";
+
+  gp_message ("debug", $subr_name, "outfile = $outfile");
+
+  open (WARNINGS_OUT, ">", $outfile)
+    or die ("unable to open $outfile for writing - '$!'");
+  gp_message ("debug", $subr_name, "opened file $outfile for writing");
+
+  gp_message ("debug", $subr_name, "building warning file $outfile");
 
 #------------------------------------------------------------------------------
-# This is clunky at best, but there is a chicken egg problem here.  For the
-# man page to be generated, the --help and --version options need to work,
-# but this part of the code only works if the "stat" function is available.
-# The "feature qw (state)" is required for the code to compile.
-#
-# TBD: Consider using global variables and to decouple parts of the option
-# handling.
-#;
-##  my @modules_used = ("feature", 
-##                     "File::stat", 
+# Generate some of the structures used in the HTML output.
 #------------------------------------------------------------------------------
-  my @modules_used = (
-                      "List::Util", 
-                      "Cwd", 
-                      "File::Basename", 
-                      "File::stat", 
-                      "POSIX", 
-                      "bigint", 
-                      "bignum");
+  $file_title  = "Warning messages";
+  $html_header = ${ create_html_header (\$file_title) };
+  $html_home_right   = ${ generate_home_link ("right") };
+
+  $page_title    = "Warning Messages";
+  $size_text     = "h2";
+  $position_text = "center";
+  $html_title_header = ${ generate_a_header (\$page_title, \$size_text, \$position_text) };
 
-  my @missing_modules = ();
-  my $cmd;
-  my $result;
-  
 #------------------------------------------------------------------------------
-# This loop checks for the availability of the modules and if so, imports 
-# the module.
-#
-# The names of missing modules, if any, are stored and printed in the error
-# handling section below.
+# Get the acknowledgement, return to main link, and final html statements.
+#------------------------------------------------------------------------------
+  $html_home_left       = ${ generate_home_link ("left") };
+  $html_acknowledgement = ${ create_html_credits () };
+  $html_end             = ${ terminate_html_document () };
+
 #------------------------------------------------------------------------------
-  for my $i (0 .. $#modules_used)
+# Generate the HTML file.
+#------------------------------------------------------------------------------
+  print WARNINGS_OUT $html_header;
+  print WARNINGS_OUT $html_home_right;
+  print WARNINGS_OUT $html_title_header;
+
+  if ($g_total_warning_count > 0)
     {
-      my $m = $modules_used[$i];
-      if (eval "require $m;")
-        {
-          if ($m eq "feature")
-            {
-              $cmd = $m . "->import ( qw (state))";
-            }
-          elsif ($m eq "List::Util")
-            {
-              $cmd = $m . "->import ( qw (min max))";
-            }
-          elsif ($m eq "bigint")
-            {
-              $cmd = $m . "->import ( qw (hex))";
-            }
-          else
-            {
-              $cmd = $m . "->import";
-            }
-          $cmd .= ";";
-          $result = eval ("$cmd");
-          gp_message ("debugM", $subr_name, "cmd = $cmd");
-        }
-      else
-        {
-          push (@missing_modules, $m);
-        }
+      print WARNINGS_OUT "<pre>\n";
+      print WARNINGS_OUT "$_\n" for @g_warning_msgs;
+      print WARNINGS_OUT "</pre>\n";
     }
+  else
+    {
+      print WARNINGS_OUT $msg_no_warnings;
+    }
+
+  print WARNINGS_OUT $html_home_left;
+  print WARNINGS_OUT "<br>\n";
+  print WARNINGS_OUT $html_acknowledgement;
+  print WARNINGS_OUT $html_end;
+
+  close (WARNINGS_OUT);
+
+  return (0);
+
+} #-- End of subroutine html_create_warnings_page
 
 #------------------------------------------------------------------------------
-# Count the number of missing modules.  It is upon the caller to decide what 
-# to do in case of errors.  Currently, execution is aborted.
+# Generate the HTML with the experiment summary.
 #------------------------------------------------------------------------------
-  my $errors = scalar (@missing_modules);
+sub html_generate_exp_summary
+{
+  my $subr_name = get_my_name ();
+
+  my ($outputdir_ref, $experiment_data_ref) = @_;
+
+  my $outputdir       = ${ $outputdir_ref };
+  my @experiment_data = @{ $experiment_data_ref };
+  my $file_title;
+  my $outfile;
+  my $page_title;
+  my $size_text;
+  my $position_text;
+  my $html_header;
+  my $html_home;
+  my $html_title_header;
+  my $html_acknowledgement;
+  my $html_end;
+  my @html_exp_table_data = ();
+  my $html_exp_table_data_ref;
+  my @table_execution_stats = ();
+  my $table_execution_stats_ref;
 
-  return (\$errors, \@missing_modules);
+  gp_message ("debug", $subr_name, "outputdir = $outputdir");
+  $outputdir = append_forward_slash ($outputdir);
+  gp_message ("debug", $subr_name, "outputdir = $outputdir");
 
-} #-- End of subroutine handle_module_availability
+  $file_title = "Experiment information";
+  $page_title = "Experiment Information";
+  $size_text = "h2";
+  $position_text = "center";
+  $html_header = ${ create_html_header (\$file_title) };
+  $html_home   = ${ generate_home_link ("right") };
 
+  $html_title_header = ${ generate_a_header (\$page_title, \$size_text, \$position_text) };
+
+  $outfile = $outputdir . $g_html_base_file_name{"experiment_info"} . ".html";
+  open (EXP_INFO, ">", $outfile)
+    or die ("unable to open $outfile for writing - '$!'");
+  gp_message ("debug", $subr_name, "opened file $outfile for writing");
+
+  print EXP_INFO $html_header;
+  print EXP_INFO $html_home;
+  print EXP_INFO $html_title_header;
+
+  ($html_exp_table_data_ref, $table_execution_stats_ref) = html_generate_table_data ($experiment_data_ref);
+
+  @html_exp_table_data   = @{ $html_exp_table_data_ref };
+  @table_execution_stats = @{ $table_execution_stats_ref };
+
+  print EXP_INFO "$_" for @html_exp_table_data;
+;
+##  print EXP_INFO "<pre>\n";
+##  print EXP_INFO "$_\n" for @html_caller_callee;
+##  print EXP_INFO "</pre>\n";
+
+#------------------------------------------------------------------------------
+# Get the acknowledgement, return to main link, and final html statements.
+#------------------------------------------------------------------------------
+  $html_home            = ${ generate_home_link ("left") };
+  $html_acknowledgement = ${ create_html_credits () };
+  $html_end             = ${ terminate_html_document () };
+
+  print EXP_INFO $html_home;
+  print EXP_INFO "<br>\n";
+  print EXP_INFO $html_acknowledgement;
+  print EXP_INFO $html_end;
+
+  close (EXP_INFO);
+
+  return (\@table_execution_stats);
+
+} #-- End of subroutine html_generate_exp_summary
+
+#------------------------------------------------------------------------------
+# Generate the index.html file.
+#------------------------------------------------------------------------------
+sub html_generate_index
+{
+  my $subr_name = get_my_name ();
+
+  my ($outputdir_ref, $html_first_metric_file_ref, $summary_metrics_ref,
+      $number_of_metrics_ref, $function_info_ref, $function_address_info_ref,
+      $sort_fields_ref, $exp_dir_list_ref, $addressobjtextm_ref,
+      $metric_description_reversed_ref, $table_execution_stats_ref) = @_;
+
+  my $outputdir               = ${ $outputdir_ref };
+  my $html_first_metric_file  = ${ $html_first_metric_file_ref };
+  my $summary_metrics         = ${ $summary_metrics_ref };
+  my $number_of_metrics       = ${ $number_of_metrics_ref };
+  my @function_info           = @{ $function_info_ref };
+  my %function_address_info   = %{ $function_address_info_ref };
+  my @sort_fields             = @{ $sort_fields_ref };
+  my @exp_dir_list            = @{ $exp_dir_list_ref };
+  my %addressobjtextm         = %{ $addressobjtextm_ref };
+  my %metric_description_reversed = %{ $metric_description_reversed_ref };
+  my @table_execution_stats   = @{ $table_execution_stats_ref };
+
+  my @file_contents = ();
+
+  my $acknowledgement;
+  my @abs_path_exp_dirs = ();
+  my $input_experiments;
+  my $target_function;
+  my $html_line;
+  my $ftag;
+  my $max_length = 0;
+  my %html_source_functions = ();
+  my $html_header;
+  my @experiment_directories = ();
+  my $html_acknowledgement;
+  my $html_file_title;
+  my $html_output_file;
+  my $html_function_view;
+  my $html_caller_callee_view;
+  my $html_experiment_info;
+  my $html_warnings_page;
+  my $href_link;
+  my $file_title;
+  my $html_gprofng;
+  my $html_end;
+  my $max_length_metrics;
+  my $page_title;
+  my $size_text;
+  my $position_text;
+
+  my $ln;
+  my $base;
+  my $base_index_page;
+  my $infile;
+  my $outfile;
+  my $rec;
+  my $skip;
+  my $callsize;
+  my $dest;
+  my $final_string;
+  my @headers;
+  my $header;
+  my $sort_index;
+  my $pc_address;
+  my $anchor;
+  my $directory_name;
+  my $f2;
+  my $f3;
+  my $file;
+  my $sline;
+  my $src;
+  my $srcfile_name;
+  my $tmp1;
+  my $tmp2;
+  my $fullsize;
+  my $regf2;
+  my $trimsize;
+  my $EIL;
+  my $EEIL;
+  my $AOBJ;
+  my $RI;
+  my $HDR;
+  my $CALLER_CALLEE;
+  my $NAME;
+  my $SRC;
+  my $TRIMMED;
+
+#------------------------------------------------------------------------------
+# Add a forward slash to make it easier when creating file names.
+#------------------------------------------------------------------------------
+  $outputdir         = append_forward_slash ($outputdir);
+  gp_message ("debug", $subr_name, "outputdir = $outputdir");
+
+  my $LANG              = $g_locale_settings{"LANG"};
+  my $decimal_separator = $g_locale_settings{"decimal_separator"};
+
+  $input_experiments = join (", ", @exp_dir_list);
+
+  for my $i (0 .. $#exp_dir_list)
+    {
+      my $dir = get_basename ($exp_dir_list[$i]);
+      push @abs_path_exp_dirs, $dir;
+    }
+  $input_experiments = join (", ", @abs_path_exp_dirs);
+
+  gp_message ("debug", $subr_name, "input_experiments = $input_experiments");
 #------------------------------------------------------------------------------
-# Generate the HTML with the experiment summary.
+# TBD: Pass in the values for $expr_name and $cmd
 #------------------------------------------------------------------------------
-sub html_generate_exp_summary
-{
-  my $subr_name = get_my_name ();
+  $html_file_title = "Main index page";
 
-  my ($outputdir_ref, $experiment_data_ref) = @_;
+  @experiment_directories = split (",", $input_experiments);
+  $html_acknowledgement = ${ create_html_credits () };
 
-  my $outputdir       = ${ $outputdir_ref };
-  my @experiment_data = @{ $experiment_data_ref };
-  my $file_title;
-  my $outfile;
-  my $page_title;
-  my $size_text; 
-  my $position_text;
-  my $html_header;
-  my $html_home;
-  my $html_title_header;
-  my $html_acknowledgement;
-  my $html_end;
-  my @html_exp_table_data = ();
-  my $html_exp_table_data_ref;
-  my @table_execution_stats = ();
-  my $table_execution_stats_ref;
+  $html_end              = ${ terminate_html_document () };
 
-  gp_message ("debug", $subr_name, "outputdir = $outputdir");
-  $outputdir = append_forward_slash ($outputdir);
-  gp_message ("debug", $subr_name, "outputdir = $outputdir");
+  $html_output_file = $outputdir . $g_html_base_file_name{"index"} . ".html";
 
-  $file_title = "Experiment information";
-  $page_title = "Experiment Information";
-  $size_text = "h2";
+  open (INDEX, ">", $html_output_file)
+    or die ("$subr_name - unable to open file $html_output_file for writing - '$!'");
+  gp_message ("debug", $subr_name, "opened file $html_output_file for writing");
+
+  $page_title    = "GPROFNG Performance Analysis";
+  $size_text     = "h1";
   $position_text = "center";
-  $html_header = ${ create_html_header (\$file_title) };
-  $html_home   = ${ generate_home_link ("right") };
+  $html_gprofng = ${ generate_a_header (\$page_title, \$size_text, \$position_text) };
 
-  $html_title_header = ${ generate_a_header (\$page_title, \$size_text, \$position_text) };
+  $html_header     = ${ create_html_header (\$html_file_title) };
 
-  $outfile = $outputdir . $g_html_base_file_name{"experiment_info"} . ".html";
-  open (EXP_INFO, ">", $outfile)
-    or die ("unable to open $outfile for writing - '$!'");
-  gp_message ("debug", $subr_name, "opened file $outfile for writing");
+  print INDEX $html_header;
+  print INDEX $html_gprofng;
+  print INDEX "$_" for @g_html_experiment_stats;
+  print INDEX "$_" for @table_execution_stats;
 
-  print EXP_INFO $html_header;
-  print EXP_INFO $html_home;
-  print EXP_INFO $html_title_header;
+  $html_experiment_info  = "<a href=\'";
+  $html_experiment_info .= $g_html_base_file_name{"experiment_info"} . ".html";
+  $html_experiment_info .= "\'><h3>Experiment Details</h3></a>\n";
 
-  ($html_exp_table_data_ref, $table_execution_stats_ref) = html_generate_table_data ($experiment_data_ref);
+  $html_warnings_page  = "<a href=\'";
+  $html_warnings_page .= $g_html_base_file_name{"warnings"} . ".html";
+  $html_warnings_page .= "\'><h3>Warnings (" . $g_total_warning_count;
+  $html_warnings_page .= ")</h3></a>\n";
 
-  @html_exp_table_data   = @{ $html_exp_table_data_ref };
-  @table_execution_stats = @{ $table_execution_stats_ref };
+  $html_function_view  = "<a href=\'";
+  $html_function_view .= $html_first_metric_file;
+  $html_function_view .= "\'><h3>Function View</h3></a>\n";
 
-  print EXP_INFO "$_" for @html_exp_table_data;
-;
-##  print EXP_INFO "<pre>\n";
-##  print EXP_INFO "$_\n" for @html_caller_callee;
-##  print EXP_INFO "</pre>\n";
+  $html_caller_callee_view  = "<a href=\'";
+  $html_caller_callee_view .= $g_html_base_file_name{"caller_callee"} . ".html";
+  $html_caller_callee_view .= "\'><h3>Caller Callee View</h3></a>\n";
 
-#-------------------------------------------------------------------------------
-# Get the acknowledgement, return to main link, and final html statements.
-#-------------------------------------------------------------------------------
-  $html_home            = ${ generate_home_link ("left") };
-  $html_acknowledgement = ${ create_html_credits () };
-  $html_end             = ${ terminate_html_document () };
+  print INDEX "<br>\n";
+##  print INDEX "<b>\n";
+  print INDEX $html_experiment_info;
+  print INDEX $html_warnings_page;
+##  print INDEX "<br>\n";
+##  print INDEX "<br>\n";
+  print INDEX $html_function_view;
+##  print INDEX "<br>\n";
+##  print INDEX "<br>\n";
+  print INDEX $html_caller_callee_view;
+##  print INDEX "</b>\n";
+##  print INDEX "<br>\n";
+##  print INDEX "<br>\n";
 
-  print EXP_INFO $html_home;
-  print EXP_INFO "<br>\n";
-  print EXP_INFO $html_acknowledgement;
-  print EXP_INFO $html_end;
+  print INDEX $html_acknowledgement;
+  print INDEX $html_end;
 
-  close (EXP_INFO);
+  close (INDEX);
 
-  return (\@table_execution_stats);
+  gp_message ("debug", $subr_name, "closed file $html_output_file");
 
-} #-- End of subroutine html_generate_exp_summary
+  return (0);
 
-#-------------------------------------------------------------------------------
+} #-- End of subroutine html_generate_index
+
+#------------------------------------------------------------------------------
 # Generate the entries for the tables with the experiment info.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub html_generate_table_data
 {
   my $subr_name = get_my_name ();
@@ -9256,15 +9972,15 @@ sub html_generate_table_data
   my @html_exp_table_data = ();
   my $html_line;
 ##  my $html_header_line;
-  my $entry_name; 
+  my $entry_name;
   my $key;
-  my $size_text; 
+  my $size_text;
   my $position_text;
-  my $title_table_1; 
-  my $title_table_2; 
-  my $title_table_3; 
-  my $title_table_summary; 
-  my $html_table_title; 
+  my $title_table_1;
+  my $title_table_2;
+  my $title_table_3;
+  my $title_table_summary;
+  my $html_table_title;
 
   my @experiment_table_1_def = ();
   my @experiment_table_2_def = ();
@@ -9291,32 +10007,32 @@ sub html_generate_table_data
   $title_table_3 = "Run Time Statistics";
   $title_table_summary = "Main Statistics";
 
-  $size_text     = "h3"; 
+  $size_text     = "h3";
   $position_text = "left";
 
-  push @experiment_table_1_def, { name => "Experiment name" , key => "exp_name_short"}; 
-  push @experiment_table_1_def, { name => "Hostname"        , key => "hostname"}; 
-  push @experiment_table_1_def, { name => "Operating system", key => "OS"}; 
-  push @experiment_table_1_def, { name => "Architecture",     key => "architecture"}; 
-  push @experiment_table_1_def, { name => "Page size",        key => "page_size"}; 
-  
-  push @experiment_table_2_def, { name => "Target command"          , key => "target_cmd"}; 
-  push @experiment_table_2_def, { name => "Date command executed"   , key => "start_date"}; 
-  push @experiment_table_2_def, { name => "Data collection duration", key => "data_collection_duration"}; 
-  push @experiment_table_2_def, { name => "End time of the experiment", key => "end_experiment"}; 
-
-  push @experiment_table_3_def, { name => "User CPU time (seconds)", key => "user_cpu_time"}; 
-##  push @experiment_table_3_def, { name => "User CPU time (percentage)", key => "user_cpu_percentage"}; 
-  push @experiment_table_3_def, { name => "System CPU time (seconds)", key => "system_cpu_time"}; 
-##  push @experiment_table_3_def, { name => "System CPU time (percentage)", key => "system_cpu_percentage"}; 
-  push @experiment_table_3_def, { name => "Sleep time (seconds)", key => "sleep_time"}; 
-##  push @experiment_table_3_def, { name => "Sleep time (percentage)", key => "sleep_percentage"}; 
-
-  push @exp_table_summary_def, { name => "Experiment name" , key => "exp_name_short"}; 
-  push @exp_table_summary_def, { name => "Hostname"        , key => "hostname"}; 
-  push @exp_table_summary_def, { name => "User CPU time (seconds)", key => "user_cpu_time"}; 
-  push @exp_table_summary_def, { name => "System CPU time (seconds)", key => "system_cpu_time"}; 
-  push @exp_table_summary_def, { name => "Sleep time (seconds)", key => "sleep_time"}; 
+  push @experiment_table_1_def, { name => "Experiment name" , key => "exp_name_short"};
+  push @experiment_table_1_def, { name => "Hostname"        , key => "hostname"};
+  push @experiment_table_1_def, { name => "Operating system", key => "OS"};
+  push @experiment_table_1_def, { name => "Architecture",     key => "architecture"};
+  push @experiment_table_1_def, { name => "Page size",        key => "page_size"};
+
+  push @experiment_table_2_def, { name => "Target command"          , key => "target_cmd"};
+  push @experiment_table_2_def, { name => "Date command executed"   , key => "start_date"};
+  push @experiment_table_2_def, { name => "Data collection duration", key => "data_collection_duration"};
+  push @experiment_table_2_def, { name => "End time of the experiment", key => "end_experiment"};
+
+  push @experiment_table_3_def, { name => "User CPU time (seconds)", key => "user_cpu_time"};
+##  push @experiment_table_3_def, { name => "User CPU time (percentage)", key => "user_cpu_percentage"};
+  push @experiment_table_3_def, { name => "System CPU time (seconds)", key => "system_cpu_time"};
+##  push @experiment_table_3_def, { name => "System CPU time (percentage)", key => "system_cpu_percentage"};
+  push @experiment_table_3_def, { name => "Sleep time (seconds)", key => "sleep_time"};
+##  push @experiment_table_3_def, { name => "Sleep time (percentage)", key => "sleep_percentage"};
+
+  push @exp_table_summary_def, { name => "Experiment name" , key => "exp_name_short"};
+  push @exp_table_summary_def, { name => "Hostname"        , key => "hostname"};
+  push @exp_table_summary_def, { name => "User CPU time (seconds)", key => "user_cpu_time"};
+  push @exp_table_summary_def, { name => "System CPU time (seconds)", key => "system_cpu_time"};
+  push @exp_table_summary_def, { name => "Sleep time (seconds)", key => "sleep_time"};
 
   $html_table_title = ${ generate_a_header (\$title_table_1, \$size_text, \$position_text) };
 
@@ -9363,13 +10079,13 @@ sub html_text_empty_file
 
   my ($comment_ref, $error_file_ref) = @_;
 
-  my $comment; 
-  my $error_file; 
-  my $error_message; 
-  my $file_title; 
+  my $comment;
+  my $error_file;
+  my $error_message;
+  my $file_title;
   my $html_end;
   my $html_header;
-  my $html_home; 
+  my $html_home;
 
   my @html_empty_file = ();
 
@@ -9410,9 +10126,10 @@ sub is_file_empty
 
   my ($filename) = @_;
 
-  my $size;
-  my $file_stat;
   my $is_empty;
+  my $file_stat;
+  my $msg;
+  my $size;
 
   chomp ($filename);
 
@@ -9422,7 +10139,8 @@ sub is_file_empty
 # The return value is used in the caller.  This is why we return the empty
 # string in case the file does not exist.
 #------------------------------------------------------------------------------
-      gp_message ("debug", $subr_name, "filename = $filename not found");
+      $msg = "filename = $filename not found";
+      gp_message ("debug", $subr_name, $msg);
       $is_empty = $TRUE;
     }
   else
@@ -9432,7 +10150,8 @@ sub is_file_empty
       $is_empty  = ($size == 0) ? $TRUE : $FALSE;
     }
 
-  gp_message ("debug", $subr_name, "filename = $filename size = $size is_empty = $is_empty");
+  $msg = "filename = $filename size = $size is_empty = $is_empty";
+  gp_message ("debug", $subr_name, $msg);
 
   return ($is_empty);
 
@@ -9451,7 +10170,7 @@ sub is_file_executable
   my $index_offset;
   my $is_executable;
   my $mode;
-  my $number_of_bytes; 
+  my $number_of_bytes;
   my @permission_settings = ();
   my %permission_values = ();
 
@@ -9477,7 +10196,7 @@ sub is_file_executable
 # Get username.  We currently do not do anything with this though and the
 # code is commented out.
 #
-#      my $my_name = getlogin () || getpwuid($<) || "Kilroy";;
+#      my $my_name = getlogin () || getpwuid($<) || "Kilroy";
 #      gp_message ("debug", $subr_name, "my_name = $my_name");
 #------------------------------------------------------------------------------
 
@@ -9524,7 +10243,7 @@ sub is_file_executable
           my $msg = "permission_values{" . $k . "} = " .
                     $permission_values{$k};
           gp_message ("debugXL", $subr_name, $msg);
-    
+
           if ($permission_values{$k} % 2 == 0)
             {
               $is_executable = $FALSE;
@@ -9539,9 +10258,32 @@ sub is_file_executable
 
 } #-- End of subroutine is_file_executable
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+# Print a message after a failure in $GP_DISPLAY_TEXT.
+#------------------------------------------------------------------------------
+sub msg_display_text_failure
+{
+  my $subr_name = get_my_name ();
+
+  my ($gp_display_text_cmd, $error_code, $error_file) = @_;
+
+  my $msg;
+
+  $msg = "error code = $error_code - failure executing the following command:";
+  gp_message ("error", $subr_name, $msg);
+
+  gp_message ("error", $subr_name, $gp_display_text_cmd);
+
+  $msg = "check file $error_file for more details";
+  gp_message ("error", $subr_name, $msg);
+
+  return (0);
+
+} #-- End of subroutine msg_display_text_failure
+
+#------------------------------------------------------------------------------
 # TBD.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub name_regex
 {
   my $subr_name = get_my_name ();
@@ -9578,12 +10320,12 @@ sub name_regex
 
   gp_message ("debugXL", $subr_name,"1:metrics->$metrics<- field->$field<- file->$file<-");
 
-#-------------------------------------------------------------------------------
-# According to https://perldoc.perl.org/File::Basename, both dirname and 
+#------------------------------------------------------------------------------
+# According to https://perldoc.perl.org/File::Basename, both dirname and
 # basename are not reliable and fileparse () is recommended instead.
 #
 # Note that $gp_metrics_dir has a trailing "/".
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   ($gp_metrics_file, $gp_metrics_dir, $suffix_not_used) = fileparse ($file, ".sort.func-PC");
 
   gp_message ("debugXL", $subr_name, "gp_metrics_dir = $gp_metrics_dir gp_metrics_file = $gp_metrics_file");
@@ -9614,10 +10356,10 @@ sub name_regex
       $rat = $_;
       chomp ($rat);
       gp_message ("debugXL", $subr_name, "rat = $rat - new_metrics = $new_metrics");
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Capture the string after "Current metrics:" and if it ends with ":name",
 # remove it.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
       if ($rat =~ /^\s*Current metrics:\s*(.*)$/)
         {
           $new_metrics = $1;
@@ -9632,9 +10374,9 @@ sub name_regex
 
   if ($is_calls or $is_calltree)
     {
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Remove any inclusive metrics from the list.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
       while ($new_metrics =~ /(.*)(i\.[^:]+)(.*)$/)
         {
           $pre  = $1;
@@ -9652,15 +10394,15 @@ sub name_regex
 
   gp_message ("debugXL", $subr_name, "2:metrics->$metrics<- field->$field<- file->$file<-");
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Find the line starting with "address:" and strip this part away.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   if ($metrics =~ /^address:(.*)/)
     {
       $reported_metrics = $1;
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Focus on the filename ending with "-PC".  When found, strip this part away.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
       if ($file =~ /^(.*)-PC$/)
         {
           $noPCfile = $1;
@@ -9672,11 +10414,11 @@ sub name_regex
         }
     }
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Split the list into an array with the individual metrics.
 #
 # TBD: This should be done only once!
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   @reported_metrics = split (":", $reported_metrics);
   for my $i (@reported_metrics)
     {
@@ -9712,8 +10454,8 @@ sub name_regex
         {
           my $a;
           my $am;
-          $a = $m; 
-          $a =~ s/^a/e/; 
+          $a = $m;
+          $a =~ s/^a/e/;
           $am = ${ retrieve_metric_description (\$a, \%metric_description) };
           $am =~ s/Exclusive/Attributed/;
           push (@moo,"$m:$am\n");
@@ -9759,7 +10501,7 @@ sub name_regex
   if ( ($field eq "functions") or ($field eq "calls") or ($field eq "calltree"))
     {
       $mf = $nf + 1;
-    } 
+    }
   else
     {
       for my $candidate_metric (@splitted_metrics)
@@ -9777,8 +10519,8 @@ sub name_regex
   if ($mf == 1)
     {
       $re = "^\\s*(\\S+)"; # metric value
-    } 
-  else 
+    }
+  else
     {
       $re = "^\\s*\\S+";
     }
@@ -9792,8 +10534,8 @@ sub name_regex
           if ($m == $mf)
             {
               $re .= "\\s+(\\S+)"; # metric value
-            } 
-          else 
+            }
+          else
             {
               $re .= "\\s+\\S+";
             }
@@ -9809,8 +10551,8 @@ sub name_regex
     {
       $re .= "\\s+.*\\+-(.*)"; # name
       $Xre .= "\\s+.*\\+-(.*)\$"; # name (Right?)
-    } 
-  else 
+    }
+  else
     {
       $re .= "\\s+(.*)"; # name
       $Xre .= "\\s+(.*)\$"; # name
@@ -9828,9 +10570,9 @@ sub name_regex
 
 } #-- End of subroutine name_regex
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # TBD
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub nosrc
 {
   my $subr_name = get_my_name ();
@@ -9862,7 +10604,7 @@ sub nosrc
 #------------------------------------------------------------------------------
 # TBD.
 #------------------------------------------------------------------------------
-sub numerically 
+sub numerically
 {
   my $f1;
   my $f2;
@@ -9875,8 +10617,8 @@ sub numerically
           $f2 = int ($2);
           $f1 == $f2 ? 0 : ($f1 < $f2 ? -1 : +1);
         }
-    } 
-  else 
+    }
+  else
     {
       return ($a <=> $b);
     }
@@ -9884,307 +10626,406 @@ sub numerically
 
 #------------------------------------------------------------------------------
 # Parse the user options. Also perform a basic check.  More checks and also
-# some specific to the option will be performed after this subroutine.
+# some more specific to the option, plus cross option checks,  will be
+# performed soon after this subroutine has executed.
+#
+# Warnings, but also errors, are buffered.  In this way we can collect as many
+# warnings and errors as possible, before bailing out in case of an error.
 #------------------------------------------------------------------------------
 sub parse_and_check_user_options
 {
   my $subr_name = get_my_name ();
 
-  my ($no_of_args_ref, $option_list_ref) = @_;
-
-  my $no_of_args  = ${ $no_of_args_ref };
-  my @option_list = @{ $option_list_ref };
-
   my @exp_dir_list;
 
   my $arg;
-  my $calltree_value; 
-  my $debug_value; 
-  my $default_metrics_value; 
-  my $func_limit_value; 
+  my $calltree_value;
+  my $debug_value;
+  my $default_metrics_value;
+  my $func_limit_value;
   my $found_exp_dir = $FALSE;
-  my $ignore_metrics_value; 
+  my $ignore_metrics_value;
   my $ignore_value;
-  my $message;
+  my $msg;
   my $outputdir_value;
-  my $quiet_value; 
+  my $quiet_value;
   my $hp_value;
   my $valid;
-  my $verbose_value; 
+  my $verbose_value;
+
+  my $number_of_fields;
+
+  my $internal_option_name;
+  my $option_name;
+
+  my $verbose = undef;
+  my $warning = undef;
+
+  my @opt_debug                = ();
+  my @opt_highlight_percentage = ();
+  my @opt_nowarnings           = ();
+  my @opt_obsoleted_hp         = ();
+  my @opt_output               = ();
+  my @opt_overwrite            = ();
+  my @opt_quiet                = ();
+  my @opt_verbose              = ();
+  my @opt_warnings             = ();
+
+#------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+  my $no_of_warnings;
+  my $total_warning_msgs = 0;
+  my $option_value;
+  my $option_warnings;
+  my $no_of_warnings_ref;
+  my $no_of_errors_ref;
+
+  my $index_exp;
+  my $first = $TRUE;
+  my $trigger = $FALSE;
+  my $found_non_exp = $FALSE;
+  my $name_non_exp_dir;
+  my $no_of_experiments = 0;
+
+  my @opt_help = ();
+  my @opt_version = ();
+  my $stop_execution = $FALSE;
 
-  $no_of_args++;
+  my $option_value_ref;
+  my $max_occurrences;
+#------------------------------------------------------------------------------
+# Configure Getopt to:
+# - Silence warnings, since these are handled by the code.
+# - Enforce case sensitivity in order to support -o and -O for example.
+#------------------------------------------------------------------------------
+  Getopt::Long::Configure("pass_through", "no_ignore_case");
 
-  gp_message ("debug", $subr_name, "no_of_args  = $no_of_args");
-  gp_message ("debug", $subr_name, "option_list = @option_list");
+#------------------------------------------------------------------------------
+# Check for the --help and --version options.  Print a message and exit.
+# Note that we support using both options simultaneously on the command line.
+#------------------------------------------------------------------------------
+  GetOptions (
+    "help"    => \@opt_help,
+    "version" => \@opt_version
+  );
 
-  my $option_errors = 0;
+  if (@opt_help)
+    {
+      $stop_execution = $TRUE;
+      $ignore_value   = print_help_info ();
+    }
+  if (@opt_version)
+    {
+      $stop_execution = $TRUE;
+      $ignore_value   = print_version_info ();
+    }
 
-  while (defined ($arg = shift @ARGV))
+  if ($stop_execution)
     {
-      gp_message ("debug", $subr_name, "parsing options arg = $arg");
-      gp_message ("debug", $subr_name, "parsing options \@ARGV = @ARGV");
+      exit (0);
+    }
+
+#------------------------------------------------------------------------------
+# First, scan ARGV for the experiment names.  If there are no names, or the
+# list with the names is not contiguous (meaning there is an non-experiment
+# name in this list), an error message is printed and execution is terminated.
+#
+# Upon return from this function, the list with the experiment names is
+# known and has been removed from ARGV.
+#
+# As a result, exp_dir_list is available from there on.
+#
+# This makes the subsequent processing of ARGV with GetOptions()  easier.
+#------------------------------------------------------------------------------
+  @exp_dir_list = @{ check_the_experiment_list () };
 
 #------------------------------------------------------------------------------
-# The gprofng driver adds this option.  We need to get rid of it.
+# Configure Getopt to:
+# - Silence warnings, since these are handled by the code.
+# - Enforce case sensitivity in order to support -o and -O for example.
+# - Allow unique abbreviations (also the default).
+#------------------------------------------------------------------------------
+  Getopt::Long::Configure("pass_through", "no_ignore_case", "auto_abbrev");
+#------------------------------------------------------------------------------
+# Get the remaining command line options.
+#
+# Recall:
+# = => option requires a value
+# : => option value is optional
 #------------------------------------------------------------------------------
-      next if ($arg eq "--whoami=gprofng display html");
 
 #------------------------------------------------------------------------------
-# Parse the input options and check for the values to be valid.
+# All options are considered to be a string.
 #
-# Valid values are stored in the main option table.
+# We request every option supported to have an optional value.  Otherwise,
+# GetOptions skips an option that does not have a value.
 #
-# TBD: The early check handles some of these already and the duplicates
-# can be removed.  Be aware of some global settings though.
+# The logic that parses the options deals with this and checks if an option
+# that should have a value, actually has one.
 #------------------------------------------------------------------------------
-      if ($arg eq "--version")
-        {
-          print_version_info (); 
-          exit (0);
-        }
-      elsif ($arg eq "--help")
+  GetOptions (
+    "verbose|v:s"            => \@opt_verbose,
+    "debug|d:s"              => \@opt_debug,
+    "warnings|w:s"           => \@opt_warnings,
+    "nowarnings:s"           => \@opt_nowarnings,
+    "quiet|q:s"              => \@opt_quiet,
+    "output|o=s"             => \@opt_output,
+    "overwrite|O=s"          => \@opt_overwrite,
+    "highlight-percentage=s" => \@opt_highlight_percentage,
+    "hp=s"                   => \@opt_obsoleted_hp
+  );
+
+#------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+# Handle the user input and where needed, generate warnings.  In a later stage
+# we check for (cross option) errors and warnings.
+#------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# The very first thing to do is to determine if the user has enabled one of the
+# following options and take action accordingly:
+# --quiet, --verbose, --debug, --warnings
+#
+# We first need to check for quiet mode to be set.  If so, all messages need to
+# be silenced, regardless of the settings for verbose, debug, and warnings.
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# The quiet option.
+#------------------------------------------------------------------------------
+  if (@opt_quiet)
+    {
+      $max_occurrences      = 1;
+      $internal_option_name = "quiet";
+      $option_name          = "--quiet";
+
+      my ($valid_ref) = extract_option_value (\@opt_quiet,
+                                             \$max_occurrences,
+                                             \$internal_option_name,
+                                             \$option_name);
+
+      $valid = ${ $valid_ref };
+
+      if ($valid)
         {
-          $ignore_value = print_help_info ();
-          exit (0);
+          $g_quiet = $g_user_settings{"quiet"}{"current_value"} eq "on" ?
+                                                               $TRUE : $FALSE;
         }
-      elsif (($arg eq "-v") or ($arg eq "--verbose"))
+    }
+
+#------------------------------------------------------------------------------
+# The debug option.
+#------------------------------------------------------------------------------
+  if (@opt_debug)
+    {
+      $max_occurrences      = 1;
+      $internal_option_name = "debug";
+      $option_name          = "-d/--debug";
+
+      my ($valid_ref) = extract_option_value (\@opt_debug,
+                                             \$max_occurrences,
+                                             \$internal_option_name,
+                                             \$option_name);
+
+      $valid = ${ $valid_ref };
+
+      if ($valid)
+#------------------------------------------------------------------------------
+# Set the appropriate debug size (e.g. "XL") in a table that is used in the
+# gp_message() subroutine.
+#------------------------------------------------------------------------------
         {
-          $verbose_value = shift @ARGV; 
-          $valid = check_user_option ("verbose", $verbose_value);
-          if (not $valid)
-            {
-              $option_errors++;
-            }
-          else
-            {
-              $g_verbose = $g_user_settings{"verbose"}{"current_value"} eq "on" ? $TRUE : $FALSE;
-            }
-          next;
+          $g_debug = $TRUE;
+          $ignore_value = set_debug_size ();
         }
-      elsif (($arg eq "-w") or ($arg eq "--warnings"))
+    }
+
+#------------------------------------------------------------------------------
+# The verbose option.
+#------------------------------------------------------------------------------
+  if (@opt_verbose)
+    {
+      $max_occurrences      = 1;
+      $internal_option_name = "verbose";
+      $option_name          = "--verbose";
+
+      my ($valid_ref) = extract_option_value (\@opt_verbose,
+                                             \$max_occurrences,
+                                             \$internal_option_name,
+                                             \$option_name);
+      $valid = ${ $valid_ref };
+
+      if ($valid)
         {
-          my $warnings_value = shift @ARGV; 
-          $valid = check_user_option ("warnings", $warnings_value);
-          if (not $valid)
-            {
-              $option_errors++;
-            }
-          else
-            {
-              $g_warnings = $g_user_settings{"warnings"}{"current_value"} eq "on" ? $TRUE : $FALSE;
-            }
-          next;
+          $g_verbose = $g_user_settings{"verbose"}{"current_value"} eq "on" ?
+                                                               $TRUE : $FALSE;
         }
-      elsif (($arg eq "-d") or ($arg eq "--debug"))
-        {
-          $debug_value = shift @ARGV;
-          $valid = check_user_option ("debug", $debug_value);
-          if (not $valid)
-            {
-              $option_errors++;
-            }
-          else
-            {
+    }
+
 #------------------------------------------------------------------------------
-# This function internally converts the value to uppercase. 
+# The nowarnings option.
 #------------------------------------------------------------------------------
-              my $ignore_value = set_debug_size (\$debug_value);
-            }
-          next;
-        }
-      elsif (($arg eq "-q") or ($arg eq "--quiet"))
-        {
-          $quiet_value = shift @ARGV; 
-          $valid = check_user_option ("quiet", $quiet_value);
+  if (@opt_nowarnings)
+    {
+      $max_occurrences      = 1;
+      $internal_option_name = "nowarnings";
+      $option_name          = "--nowarnings";
 
-          if (not $valid)
-            {
-              $option_errors++;
-            }
-          else
-            {
-              $g_quiet = $g_user_settings{"quiet"}{"current_value"} eq "on" ? $TRUE : $FALSE;
-            }
-          next;
-        }
-      elsif (($arg eq "-o") or ($arg eq "--output"))
-        {
-          $outputdir_value = shift @ARGV; 
-          $valid = check_user_option ("output", $outputdir_value);
+      my ($valid_ref) = extract_option_value (\@opt_nowarnings,
+                                             \$max_occurrences,
+                                             \$internal_option_name,
+                                             \$option_name);
 
-          if (not $valid)
-            {
-              $option_errors++;
-            }
+      $valid = ${ $valid_ref };
 
-          next;
-        }
-      elsif (($arg eq "-O") or ($arg eq "--overwrite"))
+      if ($valid)
         {
-          $outputdir_value = shift @ARGV; 
-          $valid = check_user_option ("overwrite", $outputdir_value);
+          $g_warnings =
+               $g_user_settings{"nowarnings"}{"current_value"} eq "on" ?
+                                                               $FALSE : $TRUE;
+        }
+    }
 
-          if (not $valid)
-            {
-              $option_errors++;
-            }
+#------------------------------------------------------------------------------
+# The warnings option (deprecated).
+#------------------------------------------------------------------------------
+  if (@opt_warnings)
+    {
+      $max_occurrences      = 1;
+      $internal_option_name = "warnings";
+      $option_name          = "--warnings";
 
-          next; 
-        }
-      elsif (($arg eq "-hp") or ($arg eq "--highlight-percentage"))
-        { 
-          $hp_value     = shift @ARGV; 
-          $valid = check_user_option ("highlight_percentage", $hp_value);
+      my ($valid_ref) = extract_option_value (\@opt_warnings,
+                                             \$max_occurrences,
+                                             \$internal_option_name,
+                                             \$option_name);
+    }
 
-          if (not $valid)
-            {
-              $option_errors++;
-            }
+#------------------------------------------------------------------------------
+# At this point, the debug, verbose, warnings and quiet settings are known.
+# This subroutine makes the final decision on these settings.  For example, if
+# quiet mode has been specified, the settings for debug, verbose and warnings
+# are ignored.
+#------------------------------------------------------------------------------
+  $ignore_value = finalize_special_options ();
 
-          next;
-        }
-# Temporarily disabled       elsif (($arg eq "-fl") or ($arg eq "--func-limit"))
-# Temporarily disabled         {
-# Temporarily disabled           $func_limit_value = shift @ARGV; 
-# Temporarily disabled           $valid = check_user_option ("func_limit", $func_limit_value);
-# Temporarily disabled 
-# Temporarily disabled           if (not $valid)
-# Temporarily disabled             {
-# Temporarily disabled               $option_errors++;
-# Temporarily disabled             }
-# Temporarily disabled 
-# Temporarily disabled           next;
-# Temporarily disabled         }
-# Temporarily disabled       elsif (($arg eq "-ct") or ($arg eq "--calltree"))
-# Temporarily disabled         {
-# Temporarily disabled           $calltree_value = shift @ARGV;
-# Temporarily disabled           $valid = check_user_option ("calltree", $calltree_value);
-# Temporarily disabled 
-# Temporarily disabled           if (not $valid)
-# Temporarily disabled             {
-# Temporarily disabled               $option_errors++;
-# Temporarily disabled             }
-# Temporarily disabled 
-# Temporarily disabled           next; 
-# Temporarily disabled         }
-# Temporarily disabled       elsif (($arg eq "-tp") or ($arg eq "--threshold-percentage"))
-# Temporarily disabled         { 
-# Temporarily disabled           $tp_value     = shift @ARGV; 
-# Temporarily disabled           $valid = check_user_option ("threshold_percentage", $tp_value);
-# Temporarily disabled 
-# Temporarily disabled           if (not $valid)
-# Temporarily disabled             {
-# Temporarily disabled               $option_errors++;
-# Temporarily disabled             }
-# Temporarily disabled 
-# Temporarily disabled           next;
-# Temporarily disabled         }
-# Temporarily disabled       elsif (($arg eq "-dm") or ($arg eq "--default-metrics"))
-# Temporarily disabled         { 
-# Temporarily disabled           $default_metrics_value = shift @ARGV;
-# Temporarily disabled           $valid = check_user_option ("default_metrics", $default_metrics_value);
-# Temporarily disabled 
-# Temporarily disabled           if (not $valid)
-# Temporarily disabled             {
-# Temporarily disabled               $option_errors++;
-# Temporarily disabled             }
-# Temporarily disabled 
-# Temporarily disabled           next;
-# Temporarily disabled         }
-# Temporarily disabled       elsif (($arg eq "-im") or ($arg eq "--ignore-metrics"))
-# Temporarily disabled         { 
-# Temporarily disabled           $ignore_metrics_value = shift @ARGV; 
-# Temporarily disabled           $valid = check_user_option ("ignore_metrics", $ignore_metrics_value);
-# Temporarily disabled 
-# Temporarily disabled           if (not $valid)
-# Temporarily disabled             {
-# Temporarily disabled               $option_errors++;
-# Temporarily disabled             }
-# Temporarily disabled 
-# Temporarily disabled           next;
-# Temporarily disabled         }
-      else
-        {
-  
 #------------------------------------------------------------------------------
-# When we get to this part of the code it means that the current command line 
-# argument is not a known option.
-#
-# We check if it is the name of an experiment directory and if so, add it to 
-# the list with directories to use.
-#
-# If not, print an error message and increment the error variable because this
-# is clearly something that is not right.
-#-------------------------------------------------------------------------------
+# A this point we know we can start printing messages in case verbose and/or
+# debug mode have been set.
+#------------------------------------------------------------------------------
+  $msg = "the original command line options: " . join (", ", @CopyOfARGV);
+  gp_message ("debug", $subr_name, $msg);
 
-          if ($arg =~ /^\-.*/)
-            {
-#-------------------------------------------------------------------------------
-# It is an option, but not a supported one.  Print a message and increment
-# the error count.
-#-------------------------------------------------------------------------------
-              $message = "option $arg is not a known option";
-              push (@g_user_input_errors, $message);
+  $msg = "the command line options after the special options: " .
+         join (", ", @ARGV);
+  gp_message ("debug", $subr_name, $msg);
 
-              $option_errors++;
-            }
-          else
-            {
-#-------------------------------------------------------------------------------
-# Other than options, the input has to consist of at least one directory name.  
-# First remove any trailing slashes (/) and then check if the name is valid.
-#-------------------------------------------------------------------------------
-              $arg =~ s/\/*\/$//;
-              if ($arg =~ /.+\.er$/)
-                {
-#-------------------------------------------------------------------------------
-# It is the name of an experiment directory and is added to the list.
-#-------------------------------------------------------------------------------
-                  $found_exp_dir = $TRUE;
-                  push (@exp_dir_list, $arg);
-                }
-              else
-                {
-#-------------------------------------------------------------------------------
-# It is not a valid experiment directory name. Print a message and exit.
-#-------------------------------------------------------------------------------
-                  $message = "not a valid experiment directory name: $arg";
-                  push (@g_user_input_errors, $message);
+  gp_message ("verbose", $subr_name, "Parsing the user options");
 
-                  $option_errors++;
-                }
-            }
+#------------------------------------------------------------------------------
+# The output option.
+#------------------------------------------------------------------------------
+  if (@opt_output)
+    {
+      $max_occurrences      = 1;
+      $internal_option_name = "output";
+      $option_name          = "-o/--output";
 
-        } #-- End of last else
+      my ($valid_ref) = extract_option_value (\@opt_output,
+                                             \$max_occurrences,
+                                             \$internal_option_name,
+                                             \$option_name);
+    }
 
-    } #-- End of while-loop
+#------------------------------------------------------------------------------
+# The overwrite option.
+#------------------------------------------------------------------------------
+  if (@opt_overwrite)
+    {
+      $max_occurrences      = 1;
+      $internal_option_name = "overwrite";
+      $option_name          = "-O/--overwrite";
+
+      my ($valid_ref) = extract_option_value (\@opt_overwrite,
+                                             \$max_occurrences,
+                                             \$internal_option_name,
+                                             \$option_name);
+    }
+
+#------------------------------------------------------------------------------
+# The highlight-percentage option.
+#------------------------------------------------------------------------------
+  if (@opt_highlight_percentage)
+    {
+      $max_occurrences      = 1;
+      $internal_option_name = "highlight_percentage";
+      $option_name          = "--highlight-percentage";
+
+      my ($valid_ref) = extract_option_value (\@opt_highlight_percentage,
+                                             \$max_occurrences,
+                                             \$internal_option_name,
+                                             \$option_name);
+    }
 
-#-------------------------------------------------------------------------------
-# Check if the name of the experiment directories is valid.  Note that later
-# we check for these directories to exist.
-#-------------------------------------------------------------------------------
-  if (not $found_exp_dir) 
+#------------------------------------------------------------------------------
+# The hp option (deprecated)
+#------------------------------------------------------------------------------
+  if (@opt_obsoleted_hp)
     {
-      $message = "experiment directory name(s) are either not valid, or missing";
-      push (@g_user_input_errors, $message);
+      $max_occurrences      = 1;
+      $internal_option_name = "hp";
+      $option_name          = "-hp";
 
-      $option_errors++;
+      my ($valid_ref) = extract_option_value (\@opt_obsoleted_hp,
+                                             \$max_occurrences,
+                                             \$internal_option_name,
+                                             \$option_name);
     }
 
 #------------------------------------------------------------------------------
-# Check for fatal errors to have occurred. If so, stop execution.  Otherwise,
-# confirm the verbose setting.
+# By now, all options given on the command line have been processed and the
+# list with experiment directories is known.
+#
+# Process the remainder of ARGV, but other than the option generated by the
+# driver, ARGV should be empty.
+#------------------------------------------------------------------------------
+  $ignore_value = wrap_up_user_options ();
+
+# Temporarily disabled       elsif (($arg eq "-fl") or ($arg eq "--func-limit"))
+# Temporarily disabled       elsif (($arg eq "-ct") or ($arg eq "--calltree"))
+# Temporarily disabled       elsif (($arg eq "-tp") or ($arg eq "--threshold-percentage"))
+# Temporarily disabled       elsif (($arg eq "-dm") or ($arg eq "--default-metrics"))
+# Temporarily disabled       elsif (($arg eq "-im") or ($arg eq "--ignore-metrics"))
+
+  if (@exp_dir_list)
+#------------------------------------------------------------------------------
+# Print the list of the experiment directories found.
+#
+# Note that later we also check for these directories to actually exist
+# and be valid experiments..
 #------------------------------------------------------------------------------
-  if ($option_errors > 0)
     {
-      gp_message ("debug", $subr_name, "a total of $option_errors input errors have been found");
+      $found_exp_dir = $TRUE;
+      $msg = "the following experiment directories will be used:";
+      gp_message ("debug", $subr_name, $msg);
+      for my $i (keys @exp_dir_list)
+        {
+          my $msg = "exp_dir_list[$i] = $exp_dir_list[$i]";
+          gp_message ("debug", $subr_name, $msg);
+        }
     }
   else
+#------------------------------------------------------------------------------
+# Print a message if the experiment list is not valid, or empty.  There will
+# also be error messages in the buffer. These will be printed later.
+#------------------------------------------------------------------------------
     {
-      gp_message ("debug", $subr_name, "no errors in the options found");
+      $msg = "experiment directory name(s) are either not valid, or missing";
+      gp_message ("debug", $subr_name, $msg);
     }
 
-  return ($option_errors, $found_exp_dir, \@exp_dir_list);
+  return (\$found_exp_dir, \@exp_dir_list);
 
 } #-- End of subroutine parse_and_check_user_options
 
@@ -10195,12 +11036,12 @@ sub parse_dis_files
 {
   my $subr_name = get_my_name ();
 
-  my ($number_of_metrics_ref, $function_info_ref, 
-      $function_address_and_index_ref, $input_string_ref, 
+  my ($number_of_metrics_ref, $function_info_ref,
+      $function_address_and_index_ref, $input_string_ref,
       $addressobj_index_ref) = @_;
 
 #------------------------------------------------------------------------------
-# Note that $function_address_and_index_ref is not used, but we need to pass 
+# 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 };
@@ -10214,16 +11055,17 @@ sub parse_dis_files
   my $dis_filename_id_regex = 'file\.([0-9]+)\.dis';
 
   my $filename;
+  my $msg;
   my $outputdir = append_forward_slash ($input_string);
 
   my @source_line = ();
-  my $source_line_ref; 
+  my $source_line_ref;
 
   my @metric = ();
   my $metric_ref;
 
   my $target_function;
+
   gp_message ("debug", $subr_name, "building disassembly files");
   gp_message ("debug", $subr_name, "outputdir = $outputdir");
 
@@ -10258,24 +11100,38 @@ sub parse_dis_files
               gp_message ("debug", $subr_name, "processing disassembly file: $base_name unknown id");
             }
         }
-        
       $filename = $_;
       gp_message ("verbose", $subr_name, "  Processing disassembly file $filename");
       ($source_line_ref, $metric_ref) = generate_dis_html (
                                           \$target_function,
-                                          \$number_of_metrics, 
-                                          $function_info_ref, 
-                                          $function_address_and_index_ref, 
-                                          \$outputdir, 
-                                          \$filename, 
-                                          \@source_line, 
-                                          \@metric, 
+                                          \$number_of_metrics,
+                                          $function_info_ref,
+                                          $function_address_and_index_ref,
+                                          \$outputdir,
+                                          \$filename,
+                                          \@source_line,
+                                          \@metric,
                                           \%addressobj_index);
 
       @source_line = @{ $source_line_ref };
-      @metric      = @{ $metric_ref };
+
+#------------------------------------------------------------------------------
+# TBD.  This part needs work.  The return variables from generate_dis_html ()
+# are not used, so the code below is meaningless, but awaiting a true fix,
+# the problem which appears on aarch64 is bypassed.
+#------------------------------------------------------------------------------
+      if (defined ($metric_ref))
+        {
+          @metric = @{ $metric_ref };
+        }
+      else
+        {
+          $msg = "metric_ref after generate_dis_html is undefined";
+          gp_message ("debug", $subr_name, $msg);
+        }
     }
+
   return (0)
 
 } #-- End of subroutine parse_dis_files
@@ -10303,9 +11159,9 @@ sub parse_source_files
       gp_message ("debug", $subr_name, "processing source file: $_");
 
       my $found_target = process_source (
-                           $number_of_metrics, 
-                           $function_info_ref, 
-                           $outputdir_with_slash, 
+                           $number_of_metrics,
+                           $function_info_ref,
+                           $outputdir_with_slash,
                            $_);
 
       if (not $found_target)
@@ -10327,16 +11183,16 @@ sub prepend_backslashes
 
   gp_message ("debug", $subr_name, "target_string on entry  = $target_string");
 
-  $target_string =~ s/\(/\\\(/g; 
-  $target_string =~ s/\)/\\\)/g; 
-  $target_string =~ s/\+/\\\+/g; 
-  $target_string =~ s/\[/\\\[/g; 
-  $target_string =~ s/\]/\\\]/g; 
-  $target_string =~ s/\*/\\\*/g; 
-  $target_string =~ s/\./\\\./g; 
-  $target_string =~ s/\$/\\\$/g; 
-  $target_string =~ s/\^/\\\^/g; 
-  $target_string =~ s/\#/\\\#/g; 
+  $target_string =~ s/\(/\\\(/g;
+  $target_string =~ s/\)/\\\)/g;
+  $target_string =~ s/\+/\\\+/g;
+  $target_string =~ s/\[/\\\[/g;
+  $target_string =~ s/\]/\\\]/g;
+  $target_string =~ s/\*/\\\*/g;
+  $target_string =~ s/\./\\\./g;
+  $target_string =~ s/\$/\\\$/g;
+  $target_string =~ s/\^/\\\^/g;
+  $target_string =~ s/\#/\\\#/g;
 
   gp_message ("debug", $subr_name, "target_string on return = $target_string");
 
@@ -10355,8 +11211,8 @@ sub preprocess_function_files
 
   my $outputdir   = append_forward_slash ($input_string);
   my @sort_fields = @{ $sort_fields_ref };
-  
-  my $error_code; 
+
+  my $error_code;
   my $cmd_output;
   my $re;
 
@@ -10409,103 +11265,280 @@ sub preprocess_function_files
 
 } #-- End of subroutine preprocess_function_files
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+# Print the original list with the command line options.
+#------------------------------------------------------------------------------
+sub print_command_line_options
+{
+  my ($identifier_ref) = @_;
+
+  my $identifier = ${ $identifier_ref };
+  my $msg;
+
+  $msg = "The command line options (shown for ease of reference): ";
+  printf ("%-9s %s\n", $identifier, ucfirst ($msg));
+
+  $msg = join (", ", @CopyOfARGV);
+  printf ("%-9s %s\n", $identifier, $msg);
+
+#  printf ("%-9s\n", $identifier);
+
+  return (0);
+
+} #-- End of subroutine print_command_line_options
+
+#------------------------------------------------------------------------------
+# Print all the errors messages in the buffer.
+#------------------------------------------------------------------------------
+sub print_errors_buffer
+{
+  my $subr_name = get_my_name ();
+
+  my ($identifier_ref) = @_;
+
+  my $ignore_value;
+  my $msg;
+  my $plural_or_single;
+  my $identifier = ${ $identifier_ref };
+
+  $plural_or_single = ($g_total_error_count > 1) ? "errors have" : "error has";
+
+  if (@g_warning_msgs and $g_warnings)
+#------------------------------------------------------------------------------
+# Make sure that all warnings are printed in case of an error.  This is to
+# avoid that warnings get lost in case the program terminates early.
+#------------------------------------------------------------------------------
+    {
+      $ignore_value = print_warnings_buffer ();
+    }
+
+  if (not $g_options_printed)
+#------------------------------------------------------------------------------
+# The options are printed as part of the warnings, so only if the warnings are
+# not printed, we need to print them in case of errors.
+#------------------------------------------------------------------------------
+    {
+      $g_options_printed = $TRUE;
+      $ignore_value =  print_command_line_options (\$identifier);
+    }
+
+  $msg  =  "a total of " . $g_total_error_count;
+  $msg .=  " fatal " . $plural_or_single . " been detected:";
+  printf ("%-9s %s\n", $identifier, ucfirst ($msg));
+
+  for my $key (keys @g_error_msgs)
+    {
+      $msg = $g_error_msgs[$key];
+      printf ("%-11s %s\n", $identifier, ucfirst ($msg));
+    }
+
+  return (0);
+
+} #-- End of subroutine print_errors_buffer
+
+#------------------------------------------------------------------------------
 # Print the help overview
-#-------------------------------------------------------------------------------
-sub print_help_info 
+#------------------------------------------------------------------------------
+sub print_help_info
 {
-  print
-    #-------Marker line - do not go beyond this line ------------------------------
-    "Usage: $driver_cmd [OPTION(S)] EXPERIMENT(S)\n".
-    "\n".
-    "Process one or more experiments to generate a directory containing the\n" .
-    "index.html file that may be used to browse the experiment data.\n".
-    "\n".
-    "Options:\n".
-    "\n".
-    " --help              print usage information and exit.\n".
-    " --version           print the version number and exit.\n".
-    " --verbose {on|off}  enable/disable verbose mode that shows diagnostic\n" .
-    "                       messages about the processing of the data; default\n" .
-    "                       is off.\n".
-    #-------Marker line - do not go beyond this line ------------------------------
-    " -d, --debug {on|s|m|l|xl|off}  control the printing of run time information\n" .
-    "                        to assist with troubleshooting, or further\n" .
-    "                        development of this tool; on gives a modest amount\n" .
-    "                        of information; s, m, l, or xl gives an increasing\n" .
-    "                        amount of information and off disables the printing\n" .
-    "                        of debug information; note that currently on, s, m,\n" .
-    "                        and l are equivalent; this is expected to change in\n" .
-    "                        future updates; default is off.\n" .
-    #-------Marker line - do not go beyond this line ------------------------------
-    " -hp, ----highlight-percentage <value>  a percentage value in the interval\n" .
-    "                                 [0,100] to select and color code source\n" .
-    "                                 lines as well as instructions that are\n" .
-    "                                 within this percentage of the maximum\n" .
-    "                                 metric value(s); a value of zero (-hp 0)\n" .
-    "                                 disables this feature; the default is 90.\n".
-    #-------Marker line - do not go beyond this line ------------------------------
-    " -o, --output <dir-name>  use <dir-name> to store the results in; the\n" .
-    "                            default name is ./display.<n>.html with <n> the\n" .
-    "                            first positive integer number not in use; an\n" .
-    "                            existing directory is not overwritten.\n".
-    #-------Marker line - do not go beyond this line ------------------------------
-    " -O, --overwrite <dir-name>  use <dir-name> to store the results in and\n" .
-    "                               overwrite any existing directory with the\n" .
-    "                               same name; make sure that umask is set to the\n" .
-    "                               correct access permissions.\n" .
-    #-------Marker line - do not go beyond this line ------------------------------
-    " -q, --quiet {on|off}  disable/allow the display of all warning, debug and\n" .
-    "                         verbose messages; if set to on, the settings for\n" .
-    "                         verbose, warnings and debug are ignored; default\n" .
-    "                         is off.\n".
-    #-------Marker line - do not go beyond this line ------------------------------
-    " -w, --warnings {on|off}  enable/disable run time warning messages;\n" .
-    "                            default is on.\n".
-    "\n".
-# Temmporarily disabled    " -fl, --func-limit <limit>  impose a limit on the number of functions processed;\n".
-# Temmporarily disabled    "                             this is an integer number; set to 0 to process all\n".
-# Temmporarily disabled    "                             functions; the default value is 100.\n".
-# Temmporarily disabled    "\n".
-# Temmporarily disabled    "  -ct, --calltree {on|off}  enable or disable an html page with a call tree linked\n".
-# Temmporarily disabled    "                             from the bottom of the first page; default is off.\n".
-# Temmporarily disabled    "\n".
-# Temmporarily disabled    "  -tp, --threshold-percentage <percentage>  provide a percentage of metric accountability; the\n".
-# Temmporarily disabled    "                                             inclusion of functions for each metric will take\n".
-# Temmporarily disabled    "                                             place in sort order until the percentage has been\n".
-# Temmporarily disabled    "                                             reached.\n".
-# Temmporarily disabled    "\n".
-# Temmporarily disabled    "  -dm, --default-metrics {on|off}  enable or disable automatic selection of metrics\n".
-# Temmporarily disabled    "                                   and use a default set of metrics; the default is off.\n".
-# Temmporarily disabled    "\n".
-# Temmporarily disabled    "  -im, --ignore-metrics <metric-list>  ignore the metrics from <metric-list>.\n".
-# Temmporarily disabled    "\n".
-# Temmporarily disabled     "Environment:\n".
-# Temmporarily disabled     "\n".
-# Temmporarily disabled     "The options can be set in a configuration file called .gp-display-html.rc.  This\n".
-# Temmporarily disabled     "file needs to be either in the current directory, or in the home directory of the user.\n".
-# Temmporarily disabled     "The long name of the option without the leading dashes is supported.  For example calltree\n".
-# Temmporarily disabled     "to enable or disable the call tree.  Note that some options take a value.  In case the same option\n".
-# Temmporarily disabled     "occurs multiple times in this file, only the last setting encountered is preserved.\n".
-# Temmporarily disabled     "\n".
-    "Documentation:\n".
-    "\n".
-    "A getting started guide for gprofng is maintained as a Texinfo manual.\n" .
-    "If the info and gprofng programs are properly installed at your site,\n" .
-    "the command \"info gprofng\" should give you access to this document.\n".
-    "\n".
-    "See also:\n".
-    "\n".
-    "gprofng(1), gp-archive(1), gp-collect-app(1), gp-display-src(1), " .
-    "gp-display-text(1)\n";
-
-    return (0);
+  my $space = " ";
+
+  printf("%s\n",
+  "Usage: $driver_cmd [OPTION(S)] EXPERIMENT(S)");
+  printf("\n");
+  printf("%s\n",
+  "Process one or more experiments to generate a directory containing the");
+  printf("%s\n",
+  "index.html file that may be used to browse the experiment data.");
+  printf("\n");
+  printf("%s\n",
+  "Options:");
+  printf("\n");
+  #-------Marker line - do not go beyond this line ----------------------------
+  print_help_line ("--help",
+  "Print usage information and exit.");
+
+  #-------Marker line - do not go beyond this line ----------------------------
+  print_help_line ("--version",
+  "Print the version number and exit.");
+
+  #-------Marker line - do not go beyond this line ----------------------------
+  print_help_line ("--verbose",
+  "Enable verbose mode to show diagnostic messages about the");
+  print_help_line ("",
+  "processing of the data.  By default verbose mode is disabled.");
+
+  #-------Marker line - do not go beyond this line ----------------------------
+  print_help_line ("-d [<db-vol-size>], --debug[=<db-vol-size>]",
+  "Control the printing of run time debug information to assist with");
+  print_help_line ("",
+  "the troubleshooting, or further development of this tool.");
+  print_help_line ("",
+  "The <db-vol-size> parameter controls the output volume and is");
+  print_help_line ("",
+  "one from the list {s | S | m | M | l | L | xl | XL}.");
+  print_help_line ("",
+  "If db-vol-size is not specified, a modest amount of information");
+  print_help_line ("",
+  "is printed.  This is equivalent to select size s, or S. The");
+  print_help_line ("",
+  "volume of data goes up as the size increases.  Note that");
+  print_help_line ("",
+  "currently l/L is  equivalent to xl/XL, but this is expected to");
+  print_help_line ("",
+  "change in future updates.  By default debug mode is disabled.");
+
+  #-------Marker line - do not go beyond this line ----------------------------
+  print_help_line ("--highlight-percentage=<value>",
+  "A percentage value in the interval [0,100] to select and color");
+  print_help_line ("",
+  "code source lines, as well as instructions, that are within this");
+  print_help_line ("",
+  "percentage of the maximum metric value(s).  A value of zero");
+  print_help_line ("",
+  "disables this feature.  The default value is 90 (%).");
+
+  #-------Marker line - do not go beyond this line ----------------------------
+  print_help_line ("-o <dirname>, --output=<dirname>",
+  "Use <dirname> as the directory name to store the results in.");
+  print_help_line ("",
+  "In absence of this option, the default name is display.<n>.html.");
+  print_help_line ("",
+  "This directory is created in the current directory.  The number");
+  print_help_line ("",
+  "<n> is the first positive integer number not in use in this");
+  print_help_line ("",
+  "naming scheme.  An existing directory with the same name is not");
+  print_help_line ("",
+  "overwritten.  Make sure that umask is set to the correct access");
+  print_help_line ("",
+  "permissions.");
+
+  #-------Marker line - do not go beyond this line --------------------------
+  print_help_line ("-O <dirname>, --overwrite=<dirname>",
+  "Use <dirname> as the directory name to store the results in.");
+  print_help_line ("",
+  "In absence of this option, the default name is display.<n>.html.");
+  print_help_line ("",
+  "This directory is created in the current directory.  The number");
+  print_help_line ("",
+  "<n> is the first positive integer number not in use in this");
+  print_help_line ("",
+  "naming scheme.  An existing directory with the same name is");
+  print_help_line ("",
+  "silently overwritten.  Make sure that umask is set to the");
+  print_help_line ("",
+  "correct access permissions.");
+
+  #-------Marker line - do not go beyond this line --------------------------
+  print_help_line ("-q, --quiet",
+  "Disable the display of all warning, debug, verbose and any");
+  print_help_line ("",
+  "other messages.  If enabled, the settings for verbose and debug");
+  print_help_line ("",
+  "are accepted, but ignored.  With this option, there is no screen");
+  print_help_line ("",
+  "output, other than errors.  By default quiet mode is disabled");
+
+  #-------Marker line - do not go beyond this line --------------------------
+  print_help_line ("--nowarnings",
+  "Disable the printing of warning messages on stdout.  By default");
+  print_help_line ("",
+  "warning messages are printed.");
+
+  #-------Marker line - do not go beyond this line --------------------------
+  printf("\n");
+  printf ("%s\n","Report bugs to <https://sourceware.org/bugzilla/>");
+
+  return (0);
 
 } #-- End of subroutine print_help_info
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
+# Print a single line as part of the help output.
+#
+# If the first item is not the empty string, it is considered to be the
+# option.  If the length of the option exceeds the limit set by $max_space,
+# it is printed by itself and the text is printed on the next line.  Otherwise
+# the text follows the option.
+#
+# To assist with the development of the help text, we check if the total length
+# of the line exceeds the max numbers of columns (79 according to the GNU
+# coding standards).
+#------------------------------------------------------------------------------
+sub print_help_line
+{
+  my $subr_name = get_my_name ();
+
+  my ($item, $help_text) = @_;
+
+  my $length_item = length ($item);
+  my $max_col = 79;
+  my $max_space = 14;
+  my $no_of_spaces;
+  my $pad;
+  my $space = " ";
+  my $the_message;
+
+  if ($length_item > $max_col)
+    {
+      printf ("Error: $item is $length_item long - exceeds $max_col\n");
+      exit (0);
+    }
+  elsif ( $length_item == 0 )
+    {
+      $no_of_spaces = $max_space;
+
+      $pad = "";
+      for my $i (1..$no_of_spaces)
+        {
+          $pad .= $space;
+        }
+      $the_message = $pad . $help_text;
+    }
+  else
+    {
+    if ($length_item < $max_space)
+      {
+        $no_of_spaces = $max_space - length ($item);
+        $pad = "";
+        for my $i (1..$no_of_spaces)
+          {
+            $pad .= $space;
+          }
+        $the_message = $item . $pad . $help_text;
+      }
+    else
+      {
+        $pad = "";
+        for my $i (1..$max_space)
+          {
+            $pad .= $space;
+          }
+        printf("%s\n", $item);
+        $the_message = $pad . $help_text;
+      }
+    }
+
+  if (length ($the_message) <= $max_col)
+    {
+      printf ("%s\n", $the_message);
+    }
+  else
+    {
+      my $delta = length ($the_message) - $max_col;
+      printf ("%s\n", "$the_message - exceeds $max_col by $delta");
+      exit (0);
+    }
+
+
+  return (0);
+
+} #-- End of subroutine print_help_line
+
+#------------------------------------------------------------------------------
 # Print the meta data for each experiment directory.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub print_meta_data_experiments
 {
   my $subr_name = get_my_name ();
@@ -10526,7 +11559,7 @@ sub print_meta_data_experiments
 
 #------------------------------------------------------------------------------
 # Brute force subroutine that prints the contents of a structure with function
-# level information.  This version is for a top level array structure, 
+# level information.  This version is for a top level array structure,
 # followed by a hash.
 #------------------------------------------------------------------------------
 sub print_metric_function_array
@@ -10535,7 +11568,7 @@ sub print_metric_function_array
 
   my ($metric, $struct_type_name, $target_structure_ref) = @_;
 
-  my @target_structure = @{$target_structure_ref}; 
+  my @target_structure = @{$target_structure_ref};
 
   gp_message ("debugXL", $subr_name, "contents of structure ".$struct_type_name."{".$metric."}:");
 
@@ -10564,7 +11597,7 @@ sub print_metric_function_hash
 
   my ($sub_struct_type, $metric, $struct_type_name, $target_structure_ref) = @_;
 
-  my %target_structure = %{$target_structure_ref}; 
+  my %target_structure = %{$target_structure_ref};
 
   gp_message ("debugXL", $subr_name, "contents of structure ".$struct_type_name."{".$metric."}:");
 
@@ -10595,7 +11628,7 @@ sub print_metric_function_hash
           gp_message ("assertion", $subr_name, $msg);
         }
     }
-        
   return (0);
 
 } #-- End of subroutine print_metric_function_hash
@@ -10624,7 +11657,7 @@ sub print_opening_message
 
 #------------------------------------------------------------------------------
 # If there are at least two entries, find the last comma and replace it by
-# " and".  Note that we know there is at least one comma, so the value 
+# " and".  Note that we know there is at least one comma, so the value
 # returned by rindex () cannot be -1.
 #------------------------------------------------------------------------------
   if ($no_of_dirs > 1)
@@ -10646,7 +11679,7 @@ sub print_opening_message
     }
 
   $msg .= ($time_percentage_multiplier*100.0)."% of the time";
-      
   gp_message ("verbose", $subr_name, $msg);
 
 } #-- End of subroutine print_opening_message
@@ -10691,14 +11724,14 @@ sub print_program_header
 # In case the length of the comment exceeds the length of the dashed line,
 # the comment line is allowed to stick out to the right.
 #
-# If the length of the comment is less than the dashed line, it is centered 
-# relative to the # length of the dashed line. 
+# If the length of the comment is less than the dashed line, it is centered
+# relative to the # length of the dashed line.
 
-# If the length of the comment and this line do not divide, an extra space is 
+# If the length of the comment and this line do not divide, an extra space is
 # added to the left of the comment.
 #
 # For example, if the comment is 55 long, there are 5 spaces to be distributed.
-# There will be 3 spaces, followed by the comment. 
+# There will be 3 spaces, followed by the comment.
 #------------------------------------------------------------------------------
 sub print_table_user_settings
 {
@@ -10706,17 +11739,19 @@ sub print_table_user_settings
 
   my ($mode, $comment) = @_;
 
+  my $data_type;
+  my $debug_size_value = $g_user_settings{"debug"}{"current_value"};
+  my $db_size;
+  my $defined;
+  my $keyword;
   my $leftover;
   my $padding;
-
-  my $keyword;
   my $user_option;
-  my $defined;
   my $value;
-  my $data_type; 
 
-  my $HEADER_LIMIT = 60;
-  my $header = sprintf ("%-20s   %-9s   %8s   %s", "keyword", "option", "user set", "value");
+  my $HEADER_LIMIT = 79;
+  my $header = sprintf ("%-20s   %-22s   %8s   %s",
+                        "keyword", "option", "user set", "internal value");
 
 #------------------------------------------------------------------------------
 # Generate the dashed line
@@ -10742,7 +11777,7 @@ sub print_table_user_settings
     {
       $padding = 0;
     }
-    
 #------------------------------------------------------------------------------
 # Generate the first blank part of the line.
 #------------------------------------------------------------------------------
@@ -10766,34 +11801,44 @@ sub print_table_user_settings
 #------------------------------------------------------------------------------
 # Print a line for each option. The list is sorted alphabetically.
 #------------------------------------------------------------------------------
-  for my $rc_keyword  (sort keys %g_user_settings)
+  for my $key  (sort keys %g_user_settings)
     {
-      $keyword     = $rc_keyword;
-      $user_option = $g_user_settings{$rc_keyword}{"option"};
-      $defined     = ($g_user_settings{$rc_keyword}{"defined"} ? "set" : "not set");
-      $data_type   = $g_user_settings{$rc_keyword}{"data_type"};
+      $keyword     = $key;
+      $user_option = $g_user_settings{$key}{"option"};
+      $defined     = ($g_user_settings{$key}{"defined"} ? "set" : "not set");
+      $data_type   = $g_user_settings{$key}{"data_type"};
 
-      if (defined ($g_user_settings{$rc_keyword}{"current_value"}))
+      if (defined ($g_user_settings{$key}{"current_value"}))
         {
-          $value = $g_user_settings{$rc_keyword}{"current_value"};
+          $value = $g_user_settings{$key}{"current_value"};
           if ($data_type eq "boolean")
             {
               $value = $value ? "on" : "off";
             }
+#------------------------------------------------------------------------------
+# In case of the debug option, we add the "(size)" string to remind the user
+# that this is the size.
+#------------------------------------------------------------------------------
+          if ($key eq "debug")
+            {
+              $db_size = ($debug_size_value eq "on") ? "s" : $debug_size_value;
+              $value = $db_size . " (size)";
+            }
         }
       else
         {
-          $value       = "undefined";
+          $value = "undefined";
         }
 
-      my $print_line = sprintf ("%-20s   %-9s   %8s   %s", $keyword, $user_option, $defined, $value);
+      my $print_line = sprintf ("%-20s   %-22s   %8s   %s",
+                                $keyword, $user_option, $defined, $value);
 
       gp_message ($mode, $subr_name, $print_line);
     }
 } #-- End of subroutine print_table_user_settings
 
 #------------------------------------------------------------------------------
-# Dump the contents of nested hash "g_user_settings".  Some simple formatting 
+# Dump the contents of nested hash "g_user_settings".  Some simple formatting
 # is applied to make it easier to distinguish the various values.
 #------------------------------------------------------------------------------
 sub print_user_settings
@@ -10802,18 +11847,18 @@ sub print_user_settings
 
   my ($mode, $comment) = @_;
 
-  my $keyword_value_pair; 
+  my $keyword_value_pair;
 
   gp_message ($mode, $subr_name, $comment);
 
-  for my $rc_keyword (keys %g_user_settings)
+  for my $key (keys %g_user_settings)
     {
-      my $print_line = sprintf ("%-20s =>", $rc_keyword);
-      for my $fields (sort keys %{ $g_user_settings{$rc_keyword} })
+      my $print_line = sprintf ("%-20s =>", $key);
+      for my $fields (sort keys %{ $g_user_settings{$key} })
         {
-          if (defined ($g_user_settings{$rc_keyword}{$fields}))
+          if (defined ($g_user_settings{$key}{$fields}))
             {
-              $keyword_value_pair = $fields." = ".$g_user_settings{$rc_keyword}{$fields};
+              $keyword_value_pair = $fields." = ".$g_user_settings{$key}{$fields};
             }
           else
             {
@@ -10828,7 +11873,7 @@ sub print_user_settings
 #------------------------------------------------------------------------------
 # Print the version number and license information.
 #------------------------------------------------------------------------------
-sub print_version_info 
+sub print_version_info
 {
   print "$version_info\n";
   print "Copyright (C) 2023 Free Software Foundation, Inc.\n";
@@ -10840,6 +11885,40 @@ sub print_version_info
 
 } #-- End of subroutine print_version_info
 
+#------------------------------------------------------------------------------
+# Dump all the warning messages in the buffer.
+#------------------------------------------------------------------------------
+sub print_warnings_buffer
+{
+  my $subr_name = get_my_name ();
+
+  my $ignore_value;
+  my $msg;
+
+  if (not $g_options_printed)
+#------------------------------------------------------------------------------
+# Only if the options have not yet been printed, print them.
+#------------------------------------------------------------------------------
+    {
+      $g_options_printed = $TRUE;
+      $ignore_value = print_command_line_options (\$g_warn_keyword);
+    }
+
+  for my $i (keys @g_warning_msgs)
+    {
+      $msg = $g_warning_msgs[$i];
+      if ($msg =~ /^$g_html_new_line/)
+        {
+          $msg =~ s/$g_html_new_line//;
+          printf ("%-9s\n", $g_warn_keyword);
+        }
+      printf ("%-9s %s\n", $g_warn_keyword, ucfirst ($msg));
+    }
+
+  return (0);
+
+} #-- End of subroutine print_warnings_buffer
+
 #------------------------------------------------------------------------------
 # Process the call tree input data and generate HTML output.
 #------------------------------------------------------------------------------
@@ -10847,7 +11926,7 @@ sub process_calltree
 {
   my $subr_name = get_my_name ();
 
-  my ($function_info_ref, $function_address_info_ref, $addressobjtextm_ref, 
+  my ($function_info_ref, $function_address_info_ref, $addressobjtextm_ref,
        $input_string) = @_;
 
   my @function_info         = @{ $function_info_ref };
@@ -10864,16 +11943,16 @@ sub process_calltree
   my $infile  = $outputdir . "calltree";
   my $outfile = $outputdir . "calltree.html";
 
-  open (CALL_TREE_IN, "<", $infile) 
+  open (CALL_TREE_IN, "<", $infile)
     or die ("Not able to open calltree file $infile for reading - '$!'");
   gp_message ("debug", $subr_name, "opened file $infile for reading");
 
-  open (CALL_TREE_OUT, ">", $outfile) 
+  open (CALL_TREE_OUT, ">", $outfile)
     or die ("Not able to open $outfile for writing - '$!'");
   gp_message ("debug", $subr_name, "opened file $outfile for writing");
 
   gp_message ("debug", $subr_name, "building calltree file $outfile");
-  
+
 #------------------------------------------------------------------------------
 # The directory name is potentially used below, but since it is a constant,
 # we get it here and only once.
@@ -10892,13 +11971,13 @@ sub process_calltree
   my $size_text     = "h2";
   my $position_text = "center";
   my $html_title_header = ${ generate_a_header (
-                            \$page_title, 
-                            \$size_text, 
+                            \$page_title,
+                            \$size_text,
                             \$position_text) };
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Get the acknowledgement, return to main link, and final html statements.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   my $html_home_left       = ${ generate_home_link ("left") };
   my $html_acknowledgement = ${ create_html_credits () };
   my $html_end             = ${ terminate_html_document () };
@@ -10922,17 +12001,17 @@ sub process_calltree
   print CALL_TREE_OUT $html_home_right;
   print CALL_TREE_OUT $html_title_header;
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Print the generated HTML structures here.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 ##  print CALL_TREE_OUT "$_" for @whatever;
 ##  print CALL_TREE_OUT "<pre>\n";
 ##  print CALL_TREE_OUT "$_\n" for @whatever2;
 ##  print CALL_TREE_OUT "</pre>\n";
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Print the last part of the HTML file.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   print CALL_TREE_OUT $html_home_left;
   print CALL_TREE_OUT "<br>\n";
   print CALL_TREE_OUT $html_acknowledgement;
@@ -10944,9 +12023,9 @@ sub process_calltree
 
 } #-- End of subroutine process_calltree
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Process the generated experiment info file(s).
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub process_experiment_info
 {
   my $subr_name = get_my_name ();
@@ -10976,9 +12055,9 @@ sub process_experiment_info
   my $sleep_time;
   my $sleep_percentage;
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Define the regular expressions used to capture the info.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Target command (64-bit): './../bindir/mxv-pthreads.exe -m 3000 -n 2000 -t 2'
 
   my $target_cmd_regex = '\s*Target command\s+(\(.+\)):\s+\'(.+)\'';
@@ -11015,9 +12094,9 @@ sub process_experiment_info
 
   my $sleep_regex = '\s*Sleep:\s+(.+)\s+\(\s*(.+)\)';
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Scan the experiment data and select the info of interest.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   for my $i (sort keys @experiment_data)
     {
       $exp_id        = $experiment_data[$i]{"exp_id"};
@@ -11027,15 +12106,15 @@ sub process_experiment_info
       my $msg = "exp_id = $exp_id name = $exp_name file = $exp_data_file";
       gp_message ("debug", $subr_name, $msg);
 
-      open (EXPERIMENT_INFO, "<", $exp_data_file) 
+      open (EXPERIMENT_INFO, "<", $exp_data_file)
         or die ("$subr_name - unable to open file $exp_data_file for reading '$!'");
       gp_message ("debug", $subr_name, "opened file $exp_data_file for reading");
 
       chomp (@exp_info = <EXPERIMENT_INFO>);
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Process the info for the current experiment.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
       for my $line (0 .. $#exp_info)
         {
           $input_line = $exp_info[$line];
@@ -11067,13 +12146,13 @@ sub process_experiment_info
               gp_message ("debugM", $subr_name, "$exp_id => $start_date");
               $experiment_data[$i]{"start_date"} = $start_date;
             }
-          elsif ($input_line =~ /$end_experiment_regex/) 
+          elsif ($input_line =~ /$end_experiment_regex/)
             {
               $end_experiment = $1;
               gp_message ("debugM", $subr_name, "$exp_id => $end_experiment");
               $experiment_data[$i]{"end_experiment"} = $end_experiment;
             }
-          elsif ($input_line =~ /$data_collection_duration_regex/) 
+          elsif ($input_line =~ /$data_collection_duration_regex/)
             {
               $data_collection_duration = $1;
               gp_message ("debugM", $subr_name, "$exp_id => $data_collection_duration");
@@ -11087,7 +12166,7 @@ sub process_experiment_info
 #                                    Duration (sec.): 1.812
 #                           Total Thread Time (sec.): 1.812
 #                          Average number of Threads: 1.000
-# 
+#
 #                               Process Times (sec.):
 #                                           User CPU: 1.666 ( 91.9%)
 #                                         System CPU: 0.090 (  5.0%)
@@ -11100,13 +12179,13 @@ sub process_experiment_info
 #                                           Wait CPU: 0.    (  0. %)
 #                                              Sleep: 0.056 (  3.1%)
 #------------------------------------------------------------------------------
-          elsif ($input_line =~ /$total_thread_time_regex/) 
+          elsif ($input_line =~ /$total_thread_time_regex/)
             {
               $total_thread_time = $1;
               gp_message ("debugM", $subr_name, "$exp_id => $total_thread_time");
               $experiment_data[$i]{"total_thread_time"} = $total_thread_time;
             }
-          elsif ($input_line =~ /$user_cpu_regex/) 
+          elsif ($input_line =~ /$user_cpu_regex/)
             {
               $user_cpu_time       = $1;
               $user_cpu_percentage = $2;
@@ -11114,7 +12193,7 @@ sub process_experiment_info
               $experiment_data[$i]{"user_cpu_time"} = $user_cpu_time . "&nbsp; (" . $user_cpu_percentage . ")";
               $experiment_data[$i]{"user_cpu_percentage"} = $user_cpu_percentage;
             }
-          elsif ($input_line =~ /$system_cpu_regex/) 
+          elsif ($input_line =~ /$system_cpu_regex/)
             {
               $system_cpu_time       = $1;
               $system_cpu_percentage = $2;
@@ -11122,7 +12201,7 @@ sub process_experiment_info
               $experiment_data[$i]{"system_cpu_time"} = $system_cpu_time . "&nbsp; (" . $system_cpu_percentage . ")";
               $experiment_data[$i]{"system_cpu_percentage"} = $system_cpu_percentage;
             }
-          elsif ($input_line =~ /$sleep_regex/) 
+          elsif ($input_line =~ /$sleep_regex/)
             {
               $sleep_time       = $1;
               $sleep_percentage = $2;
@@ -11157,14 +12236,14 @@ sub process_function_files
 {
   my $subr_name = get_my_name ();
 
-  my ($exp_dir_list_ref, $executable_name, $time_percentage_multiplier, 
-      $summary_metrics, $process_all_functions, $elf_loadobjects_found, 
-      $outputdir, $sort_fields_ref, $function_info_ref, 
-      $function_address_and_index_ref, $LINUX_vDSO_ref, 
-      $metric_description_ref, $elf_arch, $base_va_executable, 
+  my ($exp_dir_list_ref, $executable_name, $time_percentage_multiplier,
+      $summary_metrics, $process_all_functions, $elf_loadobjects_found,
+      $outputdir, $sort_fields_ref, $function_info_ref,
+      $function_address_and_index_ref, $LINUX_vDSO_ref,
+      $metric_description_ref, $elf_arch, $base_va_executable,
       $ARCHIVES_MAP_NAME, $ARCHIVES_MAP_VADDR, $elf_rats_ref) = @_;
 
-  my $old_fsummary; 
+  my $old_fsummary;
   my $total_attributed_time;
   my $current_attributed_time;
   my $value;
@@ -11216,7 +12295,7 @@ sub process_function_files
   my $srcfile;
   my $RIN;
   my $gp_listings_cmd;
-  my $gp_display_text_cmd; 
+  my $gp_display_text_cmd;
   my $ignore_value;
 
   my $result_file   = $outputdir . "gp-listings.out";
@@ -11246,30 +12325,30 @@ sub process_function_files
 
       gp_message ("debugXL", $subr_name, "suffix_not_used = $suffix_not_used");
       gp_message ("debugXL", $subr_name, "func-PC->$infile<- metric->$metric<-");
-  
+
    # Function_info creates the functions files from the PC ones
    # as well as culling PC and metric information
 
-      ($function_address_info_ref, 
-       $functions_per_metric_first_index_ref, 
+      ($function_address_info_ref,
+       $functions_per_metric_first_index_ref,
        $functions_per_metric_indexes_ref) = function_info (
-                                              $outputdir, 
-                                              $infile, 
-                                              $metric, 
+                                              $outputdir,
+                                              $infile,
+                                              $metric,
                                               $LINUX_vDSO_ref);
 
       @{$function_address_info{$metric}}            = @{$function_address_info_ref};
       %{$functions_per_metric_indexes{$metric}}     = %{$functions_per_metric_indexes_ref};
       %{$functions_per_metric_first_index{$metric}} = %{$functions_per_metric_first_index_ref};
 
-      $ignore_value = print_metric_function_array ($metric, 
-                                                   "function_address_info", 
+      $ignore_value = print_metric_function_array ($metric,
+                                                   "function_address_info",
                                                    \@{$function_address_info{$metric}});
-      $ignore_value = print_metric_function_hash ("hash_hash",  $metric, 
-                                                  "functions_per_metric_first_index", 
+      $ignore_value = print_metric_function_hash ("hash_hash",  $metric,
+                                                  "functions_per_metric_first_index",
                                                   \%{$functions_per_metric_first_index{$metric}});
-      $ignore_value = print_metric_function_hash ("hash_array", $metric, 
-                                                  "functions_per_metric_indexes", 
+      $ignore_value = print_metric_function_hash ("hash_array", $metric,
+                                                  "functions_per_metric_indexes",
                                                   \%{$functions_per_metric_indexes{$metric}});
     }
 
@@ -11297,7 +12376,7 @@ sub process_function_files
     {
       get_hdr_info ($outputdir, $outputdir."calltree.sort.func");
     }
-  
+
   gp_message ("debug", $subr_name, "process functions");
 
   my $scriptfile     = $outputdir.'gp-script';
@@ -11318,21 +12397,21 @@ sub process_function_files
   for my $metric (@sort_fields)
     {
       gp_message ("debug", $subr_name, "handling $metric->$metric_description{$metric}");
-  
+
       $total_attributed_time   = 0;
       $current_attributed_time = 0;
-  
+
       $value = $function_address_info{$metric}[0]{"metric_value"}; # <Total>
       if ($convert_to_dot)
         {
           $value =~ s/$decimal_separator/\./;
         }
       $total_attributed_time = $value;
-  
+
 #------------------------------------------------------------------------------
 # start at 1 - skipping <Total>
 #------------------------------------------------------------------------------
-      for my $INDEX (1 .. $#{$function_address_info{$metric}}) 
+      for my $INDEX (1 .. $#{$function_address_info{$metric}})
         {
 #------------------------------------------------------------------------------
 #Looking to handle at least 99% of the time - or what the user asked for
@@ -11343,14 +12422,14 @@ sub process_function_files
           gp_message ("debugXL", $subr_name, " total $total_attributed_time current $current_attributed_time");
           gp_message ("debugXL", $subr_name, "  (found routine $routine : value $value)");
 
-          if ($convert_to_dot) 
+          if ($convert_to_dot)
             {
               $value =~ s/$decimal_separator/\./;
             }
 
           if ( ($value > $total_attributed_time*(1-$time_percentage_multiplier)) or
-               ( ($total_attributed_time == 0) and ($value>0) ) or 
-               $process_all_functions) 
+               ( ($total_attributed_time == 0) and ($value>0) ) or
+               $process_all_functions)
             {
               $PCA = $function_address_info{$metric}[$INDEX]{"PC Address"};
 
@@ -11363,22 +12442,22 @@ sub process_function_files
                   gp_message ("debugXL", $subr_name, "not exists: function_address_and_index{$routine}{$PCA}");
                 }
 
-              if (exists ($functions_per_metric_first_index{$metric}{$routine}{$PCA}) and 
+              if (exists ($functions_per_metric_first_index{$metric}{$routine}{$PCA}) and
                   exists ($function_address_and_index{$routine}{$PCA}))
                 {
 #------------------------------------------------------------------------------
 # handled_routines now contains $RI from "first_metric" (?)
 #------------------------------------------------------------------------------
-                  $handled_routines{$function_address_and_index{$routine}{$PCA}} = 1; 
+                  $handled_routines{$function_address_and_index{$routine}{$PCA}} = 1;
                   my $description = ${ retrieve_metric_description (\$metric, \%metric_description) };
                   if ($metric_description{$metric} =~ /Exclusive Total CPU Time/)
                     {
-                      $routine_list{$routine} = 1 
+                      $routine_list{$routine} = 1
                     }
 
                   gp_message ("debugXL", $subr_name, " $routine is candidate");
-                } 
-              else 
+                }
+              else
                 {
                   die ("internal error for metric $metric and routine $routine");
                 }
@@ -11401,13 +12480,13 @@ sub process_function_files
       $function_info[$routine_index]{"srcline"} = "";
       $address_field = $function_info[$routine_index]{"addressobjtext"};
 
-##      $disfile = "file\.$routine_index\.dis"; 
+##      $disfile = "file\.$routine_index\.dis";
       $disfile = "file." . $routine_index . "." . $g_html_base_file_name{"disassembly"};
       $srcfile = "";
       $srcfile = "file\.$routine_index\.src.txt";
 
 #------------------------------------------------------------------------------
-# If the file is unknown, we can disassemble anyway and add disassembly 
+# If the file is unknown, we can disassemble anyway and add disassembly
 # to the script.
 #------------------------------------------------------------------------------
       print SCRIPT "# outfile $outputdir"."$disfile\n";
@@ -11452,14 +12531,14 @@ sub process_function_files
       $limit_txt = $func_limit - 1;
   }
 
-  $number_of_metrics = scalar (@sort_fields); 
+  $number_of_metrics = scalar (@sort_fields);
 
   $n_metrics_text = ($number_of_metrics == 1) ? "metric" : "metrics";
 
   gp_message ("debugXL", $subr_name, "built function list with $RIN functions");
   gp_message ("debugXL", $subr_name, "$number_of_metrics $n_metrics_text and a function limit of $limit_txt");
 
-# add ELF program header offset 
+# add ELF program header offset
 
   for my $routine_index (sort {$a <=> $b} keys %handled_routines)
     {
@@ -11490,9 +12569,9 @@ sub process_function_files
 
           $function_info[$routine_index]{"addressobj"} += bigint::hex (
                                                 determine_base_va_address (
-                                                  $executable_name, 
-                                                  $base_va_executable, 
-                                                  $loadobj, 
+                                                  $executable_name,
+                                                  $base_va_executable,
+                                                  $loadobj,
                                                   $routine));
           $addressobj_index{$function_info[$routine_index]{"addressobj"}} = $routine_index;
 
@@ -11517,10 +12596,10 @@ sub process_function_files
 
   if ($error_code != 0)
     {
-      $ignore_value = msg_display_text_failure ($gp_display_text_cmd, 
-                                                $error_code, 
+      $ignore_value = msg_display_text_failure ($gp_display_text_cmd,
+                                                $error_code,
                                                 $gp_error_file);
-      gp_message ("abort", "execution terminated");
+      gp_message ("abort", $subr_name, "execution terminated");
     }
 
   return (\@function_info, \%function_address_info, \%addressobj_index);
@@ -11534,7 +12613,7 @@ sub process_function_files
 #
 # Current Sort Metric: Exclusive Total CPU Time ( e.totalcpu )
 # Functions sorted by metric: Exclusive Total CPU Time
-# 
+#
 # PC Addr.       Name              Excl.     Excl. CPU  Excl.         Excl.         Excl.   Excl.
 #                                  Total     Cycles     Instructions  Last-Level    IPC     CPI
 #                                  CPU sec.   sec.      Executed      Cache Misses
@@ -11557,29 +12636,29 @@ sub process_function_overview
   my %function_view_structure = %{ $function_view_structure_ref };
   my $overview_file           = ${ $overview_file_ref };
 
-  my $all_metrics; 
+  my $all_metrics;
   my $decimal_separator = $g_locale_settings{"decimal_separator"};
   my $length_of_block;
-  my $elements_in_name; 
+  my $elements_in_name;
   my $full_hex_address;
   my $header_line;
   my $hex_address;
   my $html_line;
   my $input_line;
-  my $name_regex; 
-  my $no_of_fields; 
+  my $name_regex;
+  my $no_of_fields;
   my $metrics_length;
-  my $missing_digits; 
+  my $missing_digits;
   my $remaining_part_header;
-  my $routine; 
-  my $routine_length; 
+  my $routine;
+  my $routine_length;
   my $scan_header        = $FALSE;
   my $scan_function_data = $FALSE;
   my $string_length;
-  my $total_header_lines; 
+  my $total_header_lines;
 
   my @address_field           = ();
-  my @fields                  = (); 
+  my @fields                  = ();
   my @function_data           = ();
   my @function_names          = ();
   my @function_view_array     = ();
@@ -11603,10 +12682,10 @@ sub process_function_overview
 #------------------------------------------------------------------------------
   if (is_file_empty ($overview_file))
     {
-      gp_message ("error", $subr_name, "assertion error: file $overview_file is empty");
+      gp_message ("assertion", $subr_name, "file $overview_file is empty");
     }
 
-  open (FUNC_OVERVIEW, "<", $overview_file) 
+  open (FUNC_OVERVIEW, "<", $overview_file)
     or die ("$subr_name - unable to open file $overview_file for reading '$!'");
   gp_message ("debug", $subr_name, "opened file $overview_file for reading");
 
@@ -11627,9 +12706,9 @@ sub process_function_overview
   chomp (@function_data = <FUNC_OVERVIEW>);
   gp_message ("debug", $subr_name, "read all of file $overview_file into memory");
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Parse the function view info and store the data.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   my $max_header_length  = 0;
   my $max_metrics_length = 0;
 
@@ -11653,7 +12732,7 @@ sub process_function_overview
         {
           $scan_header = $TRUE;
         }
-      elsif ($input_line =~ /$total_marker_regex/) 
+      elsif ($input_line =~ /$total_marker_regex/)
         {
           $scan_header        = $FALSE;
           $scan_function_data = $TRUE;
@@ -11662,7 +12741,7 @@ sub process_function_overview
       if ($scan_header)
         {
 #------------------------------------------------------------------------------
-# This group is only defined for the first line of the header and $4 contains 
+# This group is only defined for the first line of the header and $4 contains
 # the remaining part of the line after "Name", without the leading spaces.
 #------------------------------------------------------------------------------
           if (defined ($4))
@@ -11672,7 +12751,7 @@ sub process_function_overview
               gp_message ("debugXL", $subr_name, $msg);
 
 #------------------------------------------------------------------------------
-# Determine the maximum length of the header.  This needs to be done before 
+# Determine the maximum length of the header.  This needs to be done before
 # the HTML controls are added.
 #------------------------------------------------------------------------------
               my $header_length = length ($remaining_part_header);
@@ -11692,7 +12771,7 @@ sub process_function_overview
 # Captures the subsequent header lines.  Assume they exist.
 #------------------------------------------------------------------------------
           elsif ($input_line =~ /$catch_all_regex/)
-            { 
+            {
               $header_line = $1;
               gp_message ("debugXL", $subr_name, "header_line = $header_line");
 
@@ -11708,7 +12787,7 @@ sub process_function_overview
 
               gp_message ("debugXL", $subr_name, "max_header_length = $max_header_length");
               gp_message ("debugXL", $subr_name, "html_line = $html_line");
-            } 
+            }
         }
 #------------------------------------------------------------------------------
 # This is a line with function data.
@@ -11721,17 +12800,17 @@ sub process_function_overview
           $elements_in_name = $no_of_fields - $number_of_metrics - 1;
 
           gp_message ("debugXL", $subr_name, "no_of_fields = $no_of_fields elements_in_name = $elements_in_name");
-     
 #------------------------------------------------------------------------------
 # TBD: Handle this better in case a function entry has more than 2 words.
 # Build the regex dynamically and use eval to capture the correct group.
 # CHECK CODE IN GENERATE_CALLER_CALLEE
 #------------------------------------------------------------------------------
-          if ($elements_in_name == 1) 
+          if ($elements_in_name == 1)
             {
               $name_regex = '\s*(\d+:0x[a-fA-F0-9]+)\s+(\S+)\s+(.*)';
             }
-          elsif ($elements_in_name == 2) 
+          elsif ($elements_in_name == 2)
             {
               $name_regex = '\s*(\d+:0x[a-fA-F0-9]+)\s+((\S+)\s+(\S+))\s+(.*)';
             }
@@ -11745,20 +12824,20 @@ sub process_function_overview
               $full_hex_address   = $1;
               $routine            = $2;
 
-              if ($elements_in_name == 1) 
+              if ($elements_in_name == 1)
                 {
                   $all_metrics = $3;
                 }
-              elsif ($elements_in_name == 2) 
+              elsif ($elements_in_name == 2)
                 {
                   $all_metrics = $5;
                 }
 
 #------------------------------------------------------------------------------
-# In case the last metric is 0. only, we append 3 extra characters that 
+# In case the last metric is 0. only, we append 3 extra characters that
 # represent zero.  We cannot change the number to 0.000 though because that
 # has a different interpretation than 0.
-# In a later phase, the "ZZZ" symbol will be removed again, but for now it 
+# In a later phase, the "ZZZ" symbol will be removed again, but for now it
 # creates consistency in, for example, the length of the metrics part.
 #------------------------------------------------------------------------------
               if ($all_metrics =~ /$zero_dot_at_end_regex/)
@@ -11771,7 +12850,7 @@ sub process_function_overview
 #------------------------------------------------------------------------------
                       my $decimal_point = $decimal_separator;
                       $decimal_point =~ s/$backward_slash_regex//;
-                      my $txt = "all_metrics = $all_metrics ended with 0"; 
+                      my $txt = "all_metrics = $all_metrics ended with 0";
                       $txt   .= "$decimal_point ($decimal_separator)";
                       gp_message ("debugXL", $subr_name, $txt);
 
@@ -11780,14 +12859,14 @@ sub process_function_overview
                 }
               $metrics_length = length ($all_metrics);
               $max_metrics_length = max ($max_metrics_length, $metrics_length);
-              gp_message ("debugXL", $subr_name, "$routine all_metrics = $all_metrics metrics_length = $metrics_length"); 
+              gp_message ("debugXL", $subr_name, "$routine all_metrics = $all_metrics metrics_length = $metrics_length");
 
               if ($full_hex_address =~ /$get_hex_address_regex/)
                 {
                   $hex_address = "0x" . $2;
                 }
 
-              push (@address_field, $hex_address); 
+              push (@address_field, $hex_address);
               push (@metric_values, $all_metrics);
 
 #------------------------------------------------------------------------------
@@ -11817,7 +12896,7 @@ sub process_function_overview
   my @function_index_list       = ();
 
 #------------------------------------------------------------------------------
-# First, an index list is built.  If we are to index the functions in order of 
+# First, an index list is built.  If we are to index the functions in order of
 # appearance in the function overview from 0 to n-1, the value of the array
 # for index "i" is the index into the large "function_info" structure.  This
 # has the final name, the html function block, etc.
@@ -11836,8 +12915,8 @@ sub process_function_overview
       my $current_address = $address_field[$i];
 
       my $found_a_match = $FALSE;
-      my $final_function_name; 
-      my $ref_index; 
+      my $final_function_name;
+      my $ref_index;
 
 #------------------------------------------------------------------------------
 # Check if there are duplicate entries for this function.  If there are, use
@@ -11856,7 +12935,7 @@ sub process_function_overview
 # part after the colon and remove the first part.
 #------------------------------------------------------------------------------
               $addr_offset =~ s/$get_addr_offset_regex//;
-             
               gp_message ("debugXL", $subr_name, "$routine: ref_index = $ref_index");
               gp_message ("debugXL", $subr_name, "$routine: function_info[$ref_index]{'alt_name'} = $function_info[$ref_index]{'alt_name'}");
               gp_message ("debugXL", $subr_name, "$routine: addr_offset = $addr_offset");
@@ -11882,7 +12961,7 @@ sub process_function_overview
           if (defined ($g_map_function_to_index{$routine}[0]))
             {
               $found_a_match = $TRUE;
-              $ref_index = $g_map_function_to_index{$routine}[0]; 
+              $ref_index = $g_map_function_to_index{$routine}[0];
               push (@function_index_list, $ref_index);
               my $final_function_name = $function_info[$ref_index]{"routine"};
               gp_message ("debugXL", $subr_name, "pushed single occurrence: ref_index = $ref_index final_function_name = $final_function_name");
@@ -11900,7 +12979,7 @@ sub process_function_overview
     }
 
 #------------------------------------------------------------------------------
-# The loop over all function names has completed and @function_index_list 
+# The loop over all function names has completed and @function_index_list
 # contains the index values into @function_info for the functions.
 #
 # All we now need to do is to retrieve the correct field(s) from the array.
@@ -11972,17 +13051,17 @@ sub process_function_overview
 # be there.
 #
 # TBD: Check if this can be done only once.
-# ------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
     my $target_keyword = "Excl.";
 
     ($foundit_ref, $index_values_ref) = find_keyword_in_string (
-                                          \$remaining_part_header, 
+                                          \$remaining_part_header,
                                           \$target_keyword);
 
     $foundit      = ${ $foundit_ref };
     @index_values = @{ $index_values_ref };
 
-    if ($foundit) 
+    if ($foundit)
       {
         for my $i (keys @index_values)
           {
@@ -11996,7 +13075,7 @@ sub process_function_overview
         gp_message ("assertion", $subr_name, $msg);
       }
 
-# ------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Compute the number of spaces we need to add between the "(sort)" strings.
 #
 # For example:
@@ -12012,11 +13091,11 @@ sub process_function_overview
 # The number of spaces to be added is stored in @padding_values.  These are
 # the spaces to be added before the occurrence of "(sort)".  This is why the
 # first padding value is 0.
-# ------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 
-# ------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # TBD: This needs to be done only once.
-# ------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
     my @padding_values = ();
     my $P_previous     = 0;
     for my $i (keys @index_values)
@@ -12035,7 +13114,7 @@ sub process_function_overview
         my $txt = "padding_values[$i] = $padding_values[$i]";
         gp_message ("debugXL", $subr_name, $txt);
       }
-    
 #------------------------------------------------------------------------------
 # Build up the sort line.  Mark the current metric and make sure the line is
 # aligned with the header.
@@ -12062,19 +13141,19 @@ sub process_function_overview
 # The current metric should have a different background color.
 #------------------------------------------------------------------------------
           {
-            $sort_string = "<a href=\'" . $g_html_base_file_name{"function_view"} . 
-                           "." . $metric_value . ".html' style='background-color:" . 
-                           $g_html_color_scheme{"background_selected_sort"} . 
+            $sort_string = "<a href=\'" . $g_html_base_file_name{"function_view"} .
+                           "." . $metric_value . ".html' style='background-color:" .
+                           $g_html_color_scheme{"background_selected_sort"} .
                            "\'><b>(sort)</b></a>";
           }
         elsif (($exp_type eq "functions") and ($metric_value eq $g_first_metric))
 #------------------------------------------------------------------------------
-# Set the background color for the sort metric in the main function overview. 
+# Set the background color for the sort metric in the main function overview.
 #------------------------------------------------------------------------------
           {
-            $sort_string = "<a href=\'" . $g_html_base_file_name{"function_view"} . 
-                           "." . $metric_value . ".html' style='background-color:" . 
-                           $g_html_color_scheme{"background_selected_sort"} . 
+            $sort_string = "<a href=\'" . $g_html_base_file_name{"function_view"} .
+                           "." . $metric_value . ".html' style='background-color:" .
+                           $g_html_color_scheme{"background_selected_sort"} .
                            "'><b>(sort)</b></a>";
           }
         else
@@ -12082,7 +13161,7 @@ sub process_function_overview
 # Do not set a specific background for all other metrics.
 #------------------------------------------------------------------------------
           {
-            $sort_string = "<a href=\'" . $g_html_base_file_name{"function_view"} . 
+            $sort_string = "<a href=\'" . $g_html_base_file_name{"function_view"} .
                            "." . $metric_value . ".html'>(sort)</a>";
           }
 
@@ -12124,7 +13203,7 @@ sub process_function_overview
       gp_message ("debugXL", $subr_name, $msg);
     }
 #------------------------------------------------------------------------------
-# Element "function table" contains the array with all the function view data. 
+# Element "function table" contains the array with all the function view data.
 #------------------------------------------------------------------------------
   $function_view_structure{"header"}         = [@header_lines];
   $function_view_structure{"metrics part"}   = [@metrics_part];
@@ -12156,13 +13235,13 @@ sub process_metrics
   my ($html_metrics_record,$imetric,$metric);
 
   $html_metrics_record =
-    "<!doctype html public \"-//w3c//dtd html 3.2//EN\">\n<html lang=\"$LANG\">\n<head>\n" . 
+    "<!doctype html public \"-//w3c//dtd html 3.2//EN\">\n<html lang=\"$LANG\">\n<head>\n" .
     "<meta http-equiv=\"content-type\" content=\"text/html; charset=iso-8859-1\">\n" .
     "<title>Function Metrics</title></head><body lang=\"$LANG\" bgcolor=".$g_html_color_scheme{"background_color_page"}."<pre>\n";
 
   $outfile = $outputdir . "metrics.html";
 
-  open (METRICSOUT, ">", $outfile) 
+  open (METRICSOUT, ">", $outfile)
     or die ("$subr_name - unable to open file $outfile for writing - '$!'");
   gp_message ("debug", $subr_name, "opened file $outfile for writing");
 
@@ -12194,7 +13273,7 @@ sub process_metrics
 
 #  $imetricn = scalar (keys %IMETRICS);
   $imetricn = scalar (keys %ignored_metrics);
-  if ($imetricn) 
+  if ($imetricn)
     {
       $html_metrics_record .= "</p><p style=\"font-size:14px;color:red\"> Metrics ignored ($imetricn)\n</p><p style=\"font-size:14px\">";
 #      for $imetric (sort keys %IMETRICS){
@@ -12216,9 +13295,9 @@ sub process_metrics
 
 } #-- End of subroutine process_metrics
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # TBD
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub process_metrics_data
 {
   my $subr_name = get_my_name ();
@@ -12240,7 +13319,7 @@ sub process_metrics_data
   my $metric_name;
   my $metric_text;
   my $metricdata;
-  my $metric_line; 
+  my $metric_line;
 
   my $summary_metrics;
   my $detail_metrics;
@@ -12262,12 +13341,12 @@ sub process_metrics_data
 
       my ($last_metric,$metric,$value,$i,$r);
 
-      open (METRICTOTALS, "<", $outfile2) 
+      open (METRICTOTALS, "<", $outfile2)
         or die ("Unable to open metric value data file $outfile2 for reading - '$!'");
       gp_message ("debug", $subr_name, "opened $outfile2 to parse metric value data");
 
 #------------------------------------------------------------------------------
-# Below an example of the file that has just been opened.  The lines I marked 
+# Below an example of the file that has just been opened.  The lines I marked
 # with a * has been wrapped by my for readability.  This is not the case in the
 # file, but makes for a really long line.
 #
@@ -12284,9 +13363,9 @@ sub process_metrics_data
 #       Inclusive Instructions Executed: 54417033412 (100.0%)
 #     Exclusive Last-Level Cache Misses:   252730685 (100.0%)
 #     Inclusive Last-Level Cache Misses:   252730685 (100.0%)
-#  *   Exclusive Instructions Per Cycle:      Inclusive Instructions Per Cycle:      
-#  *         Exclusive Cycles Per Instruction:      
-#  *         Inclusive Cycles Per Instruction:                                  
+#  *   Exclusive Instructions Per Cycle:      Inclusive Instructions Per Cycle:
+#  *         Exclusive Cycles Per Instruction:
+#  *         Inclusive Cycles Per Instruction:
 #  *         Size:           0
 #                            PC Address: 1:0x00000000
 #                           Source File: (unknown)
@@ -12302,7 +13381,7 @@ sub process_metrics_data
           gp_message ("debug", $subr_name, "file metrictotals: $metricdata");
 
 #------------------------------------------------------------------------------
-# Ignoring whitespace, search for any line with a ":" in it, followed by 
+# Ignoring whitespace, search for any line with a ":" in it, followed by
 # a number with or without a dot.  So, an integer or floating-point number.
 #------------------------------------------------------------------------------
           if ($metricdata =~ /\s*(.*):\s+(\d+\.*\d*)/)
@@ -12376,7 +13455,7 @@ sub process_metrics_data
 
     if (scalar (keys %metric_value) == 0)
 #------------------------------------------------------------------------------
-# If we have no metrics > 0, fudge a "Exclusive Total CPU Time", else we 
+# If we have no metrics > 0, fudge a "Exclusive Total CPU Time", else we
 # blow up later.
 #
 # TBD: See if this can be handled differently.
@@ -12437,7 +13516,7 @@ sub process_metrics_data
 # The original regex has bugs because the line should not be allowed to start
 # with a ":".  So this is wrong:
 #  if (($metric =~ /\s*(.*):\s+(\S)((\.\S+)|(\+\S+))/) and !($metric =~/^Current/))
-# 
+#
 # This is better:
 #      if (($metric =~ /\s*(.+):\s+(\S)((\.\S+)|(\+\S+))/) and !($metric =~/^Current/))
 #
@@ -12451,7 +13530,7 @@ sub process_metrics_data
 #------------------------------------------------------------------------------
 # Ruud   if (($metric =~ /\s*(.*):\s+(\S)((\.\S+)|(\+\S+))/) && !($metric =~/^Current/)){
 
-      ($metric_spec, $metric_flavor, $metric_visibility, $metric_name, $metric_text) = 
+      ($metric_spec, $metric_flavor, $metric_visibility, $metric_name, $metric_text) =
               extract_metric_specifics ($metric_line);
 
 #      if (($metric_line =~ /\s*(.+):\s+([ei])([\.\+%]+)(\S*)/) and !($metric_line =~/^Current/))
@@ -12498,17 +13577,17 @@ sub process_metrics_data
                 {
                   $user_metrics = $TRUE;
                   gp_message ("debug", $subr_name, "m: user_metrics set to TRUE");
-                } 
+                }
               elsif ($metric_spec =~ /system/)
-                { 
+                {
                   $system_metrics = $TRUE;
                   gp_message ("debug", $subr_name, "m: system_metrics set to TRUE");
-                } 
+                }
               elsif ($metric_spec =~ /wall/)
                 {
                   $wall_metrics = $TRUE;
                   gp_message ("debug", $subr_name, "m: wall_metrics set to TRUE");
-                } 
+                }
 #------------------------------------------------------------------------------
 # TBD I don't see why these need to be skipped.  Also, should be totalcpu.
 #------------------------------------------------------------------------------
@@ -12530,13 +13609,13 @@ sub process_metrics_data
                           gp_message ("debug", $subr_name, "updated m:detail_metrics=$detail_metrics - 1");
                           $detail_metrics_system = $detail_metrics_system.':'.$metric_spec;
                           gp_message ("debug", $subr_name, "updated m:detail_metrics_system=$detail_metrics_system - 1");
-                        } 
+                        }
                       else
                         {
                           gp_message ("debug", $subr_name, "m: no want above metric for detail_metrics or detail_metrics_system");
                         }
-                    } 
-                  else 
+                    }
+                  else
                     {
                       $summary_metrics = $metric_spec;
                       gp_message ("debug", $subr_name, "initialized summary_metrics = $summary_metrics - 2");
@@ -12546,19 +13625,19 @@ sub process_metrics_data
                           gp_message ("debug", $subr_name, "m:detail_metrics=$detail_metrics - 2");
                           $detail_metrics_system = $metric_spec;
                           gp_message ("debug", $subr_name, "m:detail_metrics_system=$detail_metrics_system - 2");
-                        } 
-                      else 
+                        }
+                      else
                         {
                           gp_message ("debug", $subr_name, "m: no want above metric for detail_metrics or detail_metrics_system");
                         }
                     }
                   gp_message ("debug", $subr_name, " metric $metric_spec added");
-                } 
-              else 
+                }
+              else
                 {
                   gp_message ("debug", $subr_name, "m: no want above metric was a 0 total");
                 }
-            } 
+            }
         }
     }
 
@@ -12596,7 +13675,7 @@ sub process_metrics_data
         {
           $summary_metrics = "e.user:".$summary_metrics;
         }
-      else 
+      else
         {
           $summary_metrics = "e.user:i.user:".$summary_metrics;
         }
@@ -12610,8 +13689,8 @@ sub process_metrics_data
       if ($g_user_settings{"ignore_metrics"}{"defined"} and exists ($ignored_metrics{"user"}))
         {
           $call_metrics = "a.user:".$call_metrics;
-        } 
-      else 
+        }
+      else
         {
           $call_metrics = "a.user:i.user:".$call_metrics;
         }
@@ -12650,7 +13729,7 @@ sub process_non_target_source
 {
   my $subr_name = get_my_name ();
 
-  my ($start_scan, $end_scan, 
+  my ($start_scan, $end_scan,
       $src_times_regex, $function_regex, $number_of_metrics,
       $file_contents_ref, $modified_html_ref) = @_;
 
@@ -12672,9 +13751,9 @@ sub process_non_target_source
 # Generate straightforward HTML, but define an anchor based on the source line
 # number in the list.
 #------------------------------------------------------------------------------
-      $line_id = extract_source_line_number ($src_times_regex, 
-                                             $function_regex, 
-                                             $number_of_metrics, 
+      $line_id = extract_source_line_number ($src_times_regex,
+                                             $function_regex,
+                                             $number_of_metrics,
                                              $input_line);
 
       if ($input_line =~ /$function_regex/)
@@ -12692,13 +13771,13 @@ sub process_non_target_source
 #------------------------------------------------------------------------------
       $modified_line = "<a id=\"line_" . $line_id . "\"></a>";
 
-      my $coloured_line; 
+      my $coloured_line;
       if ($colour_code_line)
         {
           my $boldface = $TRUE;
           $coloured_line = color_string (
-                             $input_line, 
-                             $boldface, 
+                             $input_line,
+                             $boldface,
                              $g_html_color_scheme{"non_target_function_name"});
           $colour_code_line = $FALSE;
           $modified_line .= "$coloured_line";
@@ -12721,6 +13800,9 @@ sub process_non_target_source
 #
 # Errors are stored during the parsing and processing phase.  They are printed
 # at the end and sorted by line number.
+#
+#
+# TBD: Does not yet use the warnings/error system.  This needs to be fixed.
 #------------------------------------------------------------------------------
 sub process_rc_file
 {
@@ -12731,19 +13813,21 @@ sub process_rc_file
 #------------------------------------------------------------------------------
 # Local structures.
 #------------------------------------------------------------------------------
-  my %rc_settings_user = ();  #-- Store the values extracted from the config file
+# Stores the values extracted from the config file:
+  my %rc_settings_user = ();
   my %error_and_warning_msgs = ();
-  my @rc_file_paths = (); 
+  my @rc_file_paths = ();
 
   my @split_line;
   my @my_fields;
 
-  my $message;
-  my $first_part; 
+  my $msg;
+  my $first_part;
   my $line;
   my $line_number;
-  my $number_of_fields; 
-  my $number_of_paths; 
+  my $no_of_arguments;
+  my $number_of_fields;
+  my $number_of_paths;
   my $parse_errors;   #-- Count the number of errors
   my $parse_warnings; #-- Count the number of errors
 
@@ -12767,16 +13851,19 @@ sub process_rc_file
 #------------------------------------------------------------------------------
 # Check for the presence of a configuration file.
 #------------------------------------------------------------------------------
-  gp_message ("debug", $subr_name, "number_of_paths = $number_of_paths rc_file_paths = @rc_file_paths");
+  $msg = "number_of_paths = $number_of_paths rc_file_paths = @rc_file_paths";
+  gp_message ("debug", $subr_name, $msg);
 
   $rc_file_found = $FALSE;
   for my $path_name (@rc_file_paths)
     {
       $rc_config_file = $path_name . "/" . $rc_file_name;
-      gp_message ("debug", $subr_name, "looking for configuration file $rc_config_file");
-      if (-f $rc_config_file) 
+      $msg = "looking for configuration file " . $rc_config_file;
+      gp_message ("debug", $subr_name, $msg);
+      if (-f $rc_config_file)
         {
-          gp_message ("debug", $subr_name, "found configuration file $rc_config_file");
+          $msg = "found configuration file " . $rc_config_file;
+          gp_message ("debug", $subr_name, $msg);
           $rc_file_found  = $TRUE;
           last;
         }
@@ -12787,21 +13874,26 @@ sub process_rc_file
 # There is no configuration file and we can skip this subroutine.
 #------------------------------------------------------------------------------
     {
-      gp_message ("verbose", $subr_name, "Configuration file $rc_file_name not found");
+      $msg = "configuration file $rc_file_name not found";
+      gp_message ("verbose", $subr_name, $msg);
       return (0);
     }
   else
     {
+      $msg = "unable to open file $rc_config_file for reading:";
       open (GP_DISPLAY_HTML_RC, "<", "$rc_config_file")
-        or die ("$subr_name - unable to open file $rc_config_file for reading: $!");
+        or die ($subr_name . " - " . $msg . " " . $!);
 #------------------------------------------------------------------------------
 # The configuration file has been opened for reading.
 #------------------------------------------------------------------------------
-      gp_message ("debug", $subr_name, "file $rc_config_file has been opened for reading");
+      $msg = "file $rc_config_file has been opened for reading";
+      gp_message ("debug", $subr_name, $msg);
     }
 
-  gp_message ("verbose", $subr_name, "Found configuration file $rc_config_file");
-  gp_message ("debug",   $subr_name, "processing configuration file $rc_config_file");
+  $msg = "found configuration file $rc_config_file";
+  gp_message ("verbose", $subr_name, $msg);
+  $msg = "processing configuration file " . $rc_config_file;
+  gp_message ("debug", $subr_name, $msg);
 
 #------------------------------------------------------------------------------
 # Here we scan the configuration file for the settings.
@@ -12846,8 +13938,8 @@ sub process_rc_file
         }
 
 #------------------------------------------------------------------------------
-# Split the input line using the "#" symbol as a separator.  We have already 
-# handled the case of an isolated comment line, so there may only be an 
+# Split the input line using the "#" symbol as a separator.  We have already
+# handled the case of an isolated comment line, so there may only be an
 # embedded comment.
 #
 # Regardless of this, we are only interested in the first part.
@@ -12869,8 +13961,8 @@ sub process_rc_file
 #------------------------------------------------------------------------------
         {
           $parse_errors++;
-          $message = "non-supported character(s) (\&,\^,\*,\@,\$) found: $line"; 
-          $error_and_warning_msgs{"error"}{$line_number}{"message"} = $message;
+          $msg = "non-supported character(s) (\&,\^,\*,\@,\$) found: $line";
+          $error_and_warning_msgs{"error"}{$line_number}{"message"} = $msg;
           next;
         }
       else
@@ -12889,17 +13981,18 @@ sub process_rc_file
           @my_fields = split (/\s/, $split_line[0]);
 
           $number_of_fields = scalar (@my_fields);
-          gp_message ("debug", $subr_name, "number of fields = $number_of_fields");
+          $msg = "number of fields = " . $number_of_fields;
+          gp_message ("debug", $subr_name, $msg);
         }
 
-      if ($number_of_fields ge 3) 
+      if ($number_of_fields ge 3)
 #------------------------------------------------------------------------------
 # This is not supported.
 #------------------------------------------------------------------------------
         {
           $parse_errors++;
-          $message = "more than 2 fields found: $first_part"; 
-          $error_and_warning_msgs{"error"}{$line_number}{"message"} = $message;
+          $msg = "more than 2 fields found: $first_part";
+          $error_and_warning_msgs{"error"}{$line_number}{"message"} = $msg;
           next;
         }
       elsif ($number_of_fields eq 2)
@@ -12914,12 +14007,13 @@ sub process_rc_file
         }
       else
         {
-          my $msg = "[line $line_number] $rc_config_file - number of fields = $number_of_fields";
+          $msg  = "[line $line_number] $rc_config_file -";
+          $msg .= " number of fields = $number_of_fields";
           gp_message ("assertion", $subr_name, $msg);
         }
 
 #------------------------------------------------------------------------------
-# Store the keyword, value and line number. 
+# Store the keyword, value and line number.
 #------------------------------------------------------------------------------
       if (exists ($rc_settings_user{$rc_keyword}))
         {
@@ -12928,20 +14022,23 @@ sub process_rc_file
           my $prev_line_number = $rc_settings_user{$rc_keyword}{"line_no"};
           if ($rc_value ne $prev_value)
             {
-              $message = "option $rc_keyword previously set at line $prev_line_number: new value '$rc_value' overrides '$prev_value'";
+              $msg  = "option $rc_keyword previously set at line";
+              $msg .= " $prev_line_number: new value '$rc_value'";
+              $msg .= " ' overrides '$prev_value'";
             }
           else
             {
-              $message = "option $rc_keyword previously set to the same value at line $prev_line_number";
+              $msg  = "option $rc_keyword previously set to the same value";
+              $msg .= " at line $prev_line_number";
             }
-          $error_and_warning_msgs{"warning"}{$line_number}{"message"} = $message;
+          $error_and_warning_msgs{"warning"}{$line_number}{"message"} = $msg;
         }
       $rc_settings_user{$rc_keyword}{"value"}   = $rc_value;
       $rc_settings_user{$rc_keyword}{"line_no"} = $line_number;
 
-      gp_message ("debug", $subr_name, "stored keyword     = $rc_keyword"); 
-      gp_message ("debug", $subr_name, "stored value       = $rc_value"); 
-      gp_message ("debug", $subr_name, "stored line number = $line_number"); 
+      gp_message ("debug", $subr_name, "stored keyword     = $rc_keyword");
+      gp_message ("debug", $subr_name, "stored value       = $rc_value");
+      gp_message ("debug", $subr_name, "stored line number = $line_number");
     }
 
 #------------------------------------------------------------------------------
@@ -12956,19 +14053,22 @@ sub process_rc_file
   for my $keyword (keys %rc_settings_user)
     {
       my $key_value = $rc_settings_user{$keyword}{"value"};
-      gp_message ("debug", $subr_name, "keyword = $keyword value = $key_value");
+      $msg = "keyword = " . $keyword . " value = " . $key_value;
+      gp_message ("debug", $subr_name, $msg);
     }
 
   for my $rc_keyword  (keys %g_user_settings)
     {
        for my $fields (keys %{ $g_user_settings{$rc_keyword} })
          {
-           gp_message ("debug", $subr_name, "before config file: $rc_keyword $fields = $g_user_settings{$rc_keyword}{$fields}");
+           $msg  = "before config file: $rc_keyword $fields =";
+           $msg .= " " . $g_user_settings{$rc_keyword}{$fields};
+           gp_message ("debug", $subr_name, $msg);
          }
     }
 
 #------------------------------------------------------------------------------
-# We are almost done.  Check for all keywords found whether they are valid.  
+# We are almost done.  Check for all keywords found whether they are valid.
 # Also verify that the corresponding value is valid.
 #
 # Update the g_user_settings table if everything is okay.
@@ -12986,7 +14086,7 @@ sub process_rc_file
 # - Check how many values it requires (currently exactly one is supported)
 # - Is the value a valid number or string?
 #------------------------------------------------------------------------------
-          my $no_of_arguments = $g_user_settings{$rc_keyword}{"no_of_arguments"};
+          $no_of_arguments = $g_user_settings{$rc_keyword}{"no_of_arguments"};
 
           if ($no_of_arguments eq 1)
             {
@@ -12998,21 +14098,25 @@ sub process_rc_file
 #------------------------------------------------------------------------------
                 {
                   my $data_type   = $g_user_settings{$rc_keyword}{"data_type"};
-                  my $valid_input = verify_if_input_is_valid ($input_value, $data_type);
+                  my $valid_input =
+                       verify_if_input_is_valid ($input_value, $data_type);
 #------------------------------------------------------------------------------
 # Check if the value is valid.
 #------------------------------------------------------------------------------
                   if ($valid_input)
                     {
-                      $g_user_settings{$rc_keyword}{"current_value"} = $rc_value;
+                      $g_user_settings{$rc_keyword}{"current_value"} =
+                                                               $rc_value;
                       $g_user_settings{$rc_keyword}{"defined"}  = $TRUE;
                     }
                   else
                     {
                       $parse_errors++;
                       $line_number = $rc_settings_user{$rc_keyword}{"line_no"};
-                      $message = "input value '$input_value' for keyword $rc_keyword is not valid";
-                      $error_and_warning_msgs{"error"}{$line_number}{"message"} = $message;
+                      $msg  = "input value '$input_value' for keyword";
+                      $msg .= " $rc_keyword is not valid";
+                      $error_and_warning_msgs{"error"}{$line_number}{"message"}
+                                                               = $msg;
                       next;
                     }
                 }
@@ -13023,8 +14127,9 @@ sub process_rc_file
                 {
                   $parse_errors++;
                   $line_number = $rc_settings_user{$rc_keyword}{"line_no"};
-                  $message = "missing value for keyword '$rc_keyword'";
-                  $error_and_warning_msgs{"error"}{$line_number}{"message"} = $message;
+                  $msg = "missing value for keyword '$rc_keyword'";
+                  $error_and_warning_msgs{"error"}{$line_number}{"message"}
+                                                               = $msg;
                   next;
                 }
             }
@@ -13054,39 +14159,45 @@ sub process_rc_file
         {
           $parse_errors++;
           $line_number = $rc_settings_user{$rc_keyword}{"line_no"};
-          $message = "keyword $rc_keyword is not supported";
-          $error_and_warning_msgs{"error"}{$line_number}{"message"} = $message;
+          $msg = "keyword $rc_keyword is not supported";
+          $error_and_warning_msgs{"error"}{$line_number}{"message"} = $msg;
         }
     }
   for my $rc_keyword  (keys %g_user_settings)
     {
        for my $fields (keys %{ $g_user_settings{$rc_keyword} })
          {
-           gp_message ("debug", $subr_name, "after config file: $rc_keyword $fields = $g_user_settings{$rc_keyword}{$fields}");
+           $msg  = "after config file: $rc_keyword $fields =";
+           $msg .= " " . $g_user_settings{$rc_keyword}{$fields};
+           gp_message ("debug", $subr_name, $msg);
          }
     }
   print_table_user_settings ("debug", "upon the return from $subr_name");
 
   if ( ($parse_errors == 0) and ($parse_warnings == 0) )
     {
-      gp_message ("verbose", $subr_name, "Successfully parsed and processed the configuration file");
+      $msg = "successfully parsed and processed the configuration file";
+      gp_message ("verbose", $subr_name, $msg);
     }
   else
     {
       if ($parse_errors > 0)
         {
           my $plural_or_single = ($parse_errors > 1) ? "errors" : "error";
-          $message = $g_error_keyword . "found $parse_errors fatal $plural_or_single in the configuration file:";
-          gp_message ("debug", $subr_name, $message);
+          $msg  = $g_error_keyword . "found $parse_errors fatal";
+          $msg .= " " .  $plural_or_single . " in the configuration file:";
+          gp_message ("debug", $subr_name, $msg);
 #------------------------------------------------------------------------------
-# Sort the hash keys, the line numbers, alphabetically and print the 
+# Sort the hash keys, the line numbers, alphabetically and print the
 # corresponding error messages.
 #------------------------------------------------------------------------------
-          for my $line_no (sort {$a <=> $b} (keys %{ $error_and_warning_msgs{"error"} }))
+          for my $line_no (sort {$a <=> $b}
+                               (keys %{ $error_and_warning_msgs{"error"} }))
             {
-              $message  = $g_error_keyword. "[line $line_no] in file $rc_config_file - ";
-              $message .= $error_and_warning_msgs{"error"}{$line_no}{"message"};
-              gp_message ("debug", $subr_name, $message);
+              $msg  = $g_error_keyword . "[line $line_no] in file";
+              $msg .=  $rc_config_file . " - ";
+              $msg .= $error_and_warning_msgs{"error"}{$line_no}{"message"};
+              gp_message ("debug", $subr_name, $msg);
             }
         }
 
@@ -13094,13 +14205,16 @@ sub process_rc_file
         {
           if ($parse_warnings > 0)
             {
-              $message = $g_warn_keyword . "found $parse_warnings warnings in the configuration file:";
-              gp_message ("debug", $subr_name, $message);
-              for my $line_no (sort {$a <=> $b} (keys %{ $error_and_warning_msgs{"warning"} }))
+              $msg  = $g_warn_keyword . " found $parse_warnings warnings in";
+              $msg .= "  the configuration file:";
+              gp_message ("debug", $subr_name, $msg);
+              for my $line_no (sort {$a <=> $b}
+                               (keys %{ $error_and_warning_msgs{"warning"} }))
                 {
-                  $message = $g_warn_keyword . "[line $line_no] in file $rc_config_file - ";
-                  $message .= $error_and_warning_msgs{"warning"}{$line_no}{"message"};
-                  gp_message ("debug", $subr_name, $message);
+                  $msg  = $g_warn_keyword;
+                  $msg .= " [line $line_no] in file $rc_config_file - ";
+                  $msg .= $error_and_warning_msgs{"warning"}{$line_no}{"message"};
+                  gp_message ("debug", $subr_name, $msg);
                 }
             }
         }
@@ -13117,7 +14231,7 @@ sub process_source
 {
   my $subr_name = get_my_name ();
 
-  my ($number_of_metrics, $function_info_ref, 
+  my ($number_of_metrics, $function_info_ref,
       $outputdir, $input_filename) = @_;
 
   my @function_info = @{ $function_info_ref };
@@ -13137,12 +14251,12 @@ sub process_source
 # Computed dynamically below.
 # TBD: Try to move this up.
 #------------------------------------------------------------------------------
-  my $src_times_regex; 
-  my $hot_lines_regex; 
-  my $metric_regex; 
+  my $src_times_regex;
+  my $hot_lines_regex;
+  my $metric_regex;
   my $metric_extra_regex;
 
-  my @components = (); 
+  my @components = ();
   my @fields_in_line = ();
   my @file_contents = ();
   my @hot_source_lines  = ();
@@ -13150,37 +14264,37 @@ sub process_source
   my @modified_html = ();
   my @transposed_hot_lines = ();
 
-  my $colour_coded_line; 
-  my $colour_coded_line_ref; 
+  my $colour_coded_line;
+  my $colour_coded_line_ref;
   my $line_id;
   my $ignore_value;
-  my $func_name_in_src_file; 
+  my $func_name_in_src_file;
   my $html_new_line = "<br>";
-  my $input_line; 
+  my $input_line;
   my $metric_values;
-  my $modified_html_ref; 
-  my $modified_line; 
+  my $modified_html_ref;
+  my $modified_line;
   my $is_empty;
   my $start_all_source;
   my $start_target_source;
   my $end_target_source;
-  my $output_line; 
+  my $output_line;
   my $hot_line;
   my $src_line_no;
-  my $src_code_line; 
+  my $src_code_line;
 
   my $decimal_separator = $g_locale_settings{"decimal_separator"};
   my $hp_value = $g_user_settings{"highlight_percentage"}{"current_value"};
+
   my $file_title;
-  my $found_target; 
-  my $html_dis_record; 
-  my $html_end; 
+  my $found_target;
+  my $html_dis_record;
+  my $html_end;
   my $html_header;
-  my $html_home; 
-  my $rounded_percentage; 
-  my $start_tracking; 
-  my $threshold_line; 
+  my $html_home;
+  my $rounded_percentage;
+  my $start_tracking;
+  my $threshold_line;
 
   my $base;
   my $boldface;
@@ -13188,7 +14302,7 @@ sub process_source
   my $routine;
 
   my $LANG      = $g_locale_settings{"LANG"};
-  my $the_title = set_title ($function_info_ref, $input_filename, 
+  my $the_title = set_title ($function_info_ref, $input_filename,
                              "process source");
   my $outfile   = $input_filename . ".html";
 
@@ -13196,7 +14310,7 @@ sub process_source
 # Remove the .txt from file.<n>.src.txt
 #------------------------------------------------------------------------------
   my $html_output_file  = $input_filename;
-  $html_output_file     =~ s/$txt_ext_regex/.html/; 
+  $html_output_file     =~ s/$txt_ext_regex/.html/;
 
   gp_message ("debug", $subr_name, "input_filename = $input_filename");
   gp_message ("debug", $subr_name, "the_title = $the_title");
@@ -13267,7 +14381,7 @@ sub process_source
 # Open the input file with the source code
 #------------------------------------------------------------------------------
     {
-      open (SRC_LISTING, "<", $input_filename) 
+      open (SRC_LISTING, "<", $input_filename)
         or die ("$subr_name - unable to open file $input_filename for reading: '$!'");
       gp_message ("debug", $subr_name, "opened file $input_filename for reading");
     }
@@ -13315,7 +14429,7 @@ sub process_source
 # In both cases, the first line after the header has whitespace.  This is
 # followed by either one of the following:
 #
-# - <line_no>. 
+# - <line_no>.
 # - <Function:
 #
 # These are the characteristics we use below.
@@ -13341,7 +14455,7 @@ sub process_source
 #------------------------------------------------------------------------------
         {
           $modified_line = "<i>" . $input_line . "</i>";
-          push (@modified_html, $modified_line); 
+          push (@modified_html, $modified_line);
         }
     }
 #------------------------------------------------------------------------------
@@ -13387,7 +14501,7 @@ sub process_source
 
                   gp_message ("debugXL", $subr_name, "found target function $routine");
                   gp_message ("debugXL", $subr_name, "function_name = $2 routine = $routine");
-                  gp_message ("debugXL", $subr_name, "routine = $routine start_tracking = $start_tracking"); 
+                  gp_message ("debugXL", $subr_name, "routine = $routine start_tracking = $start_tracking");
                   gp_message ("debugXL", $subr_name, "start_target_source = $start_target_source");
                 }
             }
@@ -13406,7 +14520,7 @@ sub process_source
 #------------------------------------------------------------------------------
   if (not $found_target)
     {
-      my $msg; 
+      my $msg;
       gp_message ("debug", $subr_name, "target function $routine not found");
 
       $msg = "function $routine not found in $base - " .
@@ -13423,8 +14537,8 @@ sub process_source
     {
       $end_target_source = $#file_contents;
     }
-  gp_message ("debugXL", $subr_name, "routine = $routine start_tracking = $start_tracking"); 
-  gp_message ("debugXL", $subr_name, "start_target_source = $start_target_source"); 
+  gp_message ("debugXL", $subr_name, "routine = $routine start_tracking = $start_tracking");
+  gp_message ("debugXL", $subr_name, "start_target_source = $start_target_source");
   gp_message ("debugXL", $subr_name, "end_target_source   = $end_target_source");
 
 #------------------------------------------------------------------------------
@@ -13446,7 +14560,7 @@ sub process_source
         {
           gp_message ("debugXL", $subr_name, " $line_number : found a hot line");
 #------------------------------------------------------------------------------
-# We found a hot line and the metric fields are stored in $2.  We turn this   
+# We found a hot line and the metric fields are stored in $2.  We turn this
 # string into an array and add it as a row to hot_source_lines.
 #------------------------------------------------------------------------------
               $hot_line      = $1;
@@ -13467,10 +14581,10 @@ sub process_source
 #------------------------------------------------------------------------------
   for my $row (keys @hot_source_lines)
     {
-      my $msg = "row[" . $row . "] = ";
+      my $msg = "row[" . $row . "] =";
       for my $col (keys @{$hot_source_lines[$row]})
         {
-          $msg .= "$hot_source_lines[$row][$col] ";
+          $msg .= " $hot_source_lines[$row][$col]";
           $transposed_hot_lines[$col][$row] = $hot_source_lines[$row][$col];
         }
     }
@@ -13481,10 +14595,10 @@ sub process_source
 #------------------------------------------------------------------------------
   for my $row (keys @transposed_hot_lines)
     {
-      my $msg = "row[" . $row . "] = ";
+      my $msg = "row[" . $row . "] =";
       for my $col (keys @{$transposed_hot_lines[$row]})
         {
-          $msg .= "$transposed_hot_lines[$row][$col] ";
+          $msg .= " $transposed_hot_lines[$row][$col]";
         }
       gp_message ("debugXL", $subr_name, "hot lines = $msg");
     }
@@ -13519,11 +14633,11 @@ sub process_source
 #------------------------------------------------------------------------------
 # Process those functions that are not the current target.
 #------------------------------------------------------------------------------
-  $modified_html_ref = process_non_target_source ($start_all_source, 
+  $modified_html_ref = process_non_target_source ($start_all_source,
                                                   $start_target_source-1,
                                                   $src_times_regex,
-                                                  $function_regex, 
-                                                  $number_of_metrics, 
+                                                  $function_regex,
+                                                  $number_of_metrics,
                                                   \@file_contents,
                                                   \@modified_html);
   @modified_html = @{ $modified_html_ref };
@@ -13537,8 +14651,8 @@ sub process_source
                                               $routine,
                                               \@max_metric_values,
                                               $src_times_regex,
-                                              $function2_regex, 
-                                              $number_of_metrics, 
+                                              $function2_regex,
+                                              $number_of_metrics,
                                               \@file_contents,
                                               \@modified_html);
   @modified_html = @{ $modified_html_ref };
@@ -13548,8 +14662,8 @@ sub process_source
       $modified_html_ref = process_non_target_source ($end_target_source+1,
                                                       $#file_contents,
                                                       $src_times_regex,
-                                                      $function_regex, 
-                                                      $number_of_metrics, 
+                                                      $function_regex,
+                                                      $number_of_metrics,
                                                       \@file_contents,
                                                       \@modified_html);
       @modified_html = @{ $modified_html_ref };
@@ -13562,14 +14676,17 @@ sub process_source
 #
 # TBD: The same is done in generate_dis_html but should be done only once.
 #------------------------------------------------------------------------------
-  if ($hp_value > 0) 
+  if ($hp_value > 0)
     {
       my $rounded_percentage = sprintf ("%.1f", $hp_value);
-      $threshold_line = "<i>The setting for the highlight percentage (-hp) option: $rounded_percentage (%)</i>";
+      $threshold_line = "<i>The setting for the highlight percentage";
+      $threshold_line .= " (--highlight-percentage) option:";
+      $threshold_line .= " " . $rounded_percentage . " (%)</i>";
     }
   else
     {
-      $threshold_line = "<i>The highlight percentage (-hp) feature is not enabled</i>";
+      $threshold_line  = "<i>The highlight percentage feature has not been";
+      $threshold_line .= " enabled</i>";
     }
 
   $html_home = ${ generate_home_link ("left") };
@@ -13597,7 +14714,7 @@ sub process_source
     }
   close (NEW_HTML);
   close (SRC_LISTING);
-  
+
   return ($found_target);
 
 } #-- End of subroutine process_source
@@ -13640,9 +14757,9 @@ sub process_target_source
 #------------------------------------------------------------------------------
       $input_line =~ s/$g_less_than_regex/$g_html_less_than_regex/g;
 
-      $line_id = extract_source_line_number ($src_times_regex, 
-                                             $function2_regex, 
-                                             $number_of_metrics, 
+      $line_id = extract_source_line_number ($src_times_regex,
+                                             $function2_regex,
+                                             $number_of_metrics,
                                              $input_line);
 
       gp_message ("debug", $subr_name, "line_number = $line_number : input_line = $input_line line_id = $line_id");
@@ -13660,8 +14777,8 @@ sub process_target_source
               gp_message ("debug", $subr_name, "function_name = $2");
               my $function_line       = "&lt;Function: " . $func_name_in_file . ">";
               my $color_function_name = color_string (
-                                          $function_line, 
-                                          $boldface, 
+                                          $function_line,
+                                          $boldface,
                                           $g_html_color_scheme{"target_function_name"});
               my $ftag;
               if (exists ($g_function_tag_id{$target_function}))
@@ -13702,7 +14819,7 @@ sub process_target_source
             {
               @components = split (" ", $input_line, 1+$number_of_metrics+2);
               $modified_line = set_background_color_string (
-                                 $input_line, 
+                                 $input_line,
                                  $g_html_color_scheme{"background_color_hot"});
             }
           else
@@ -13760,24 +14877,25 @@ sub process_user_options
   my $subr_name = get_my_name ();
 
   my ($exp_dir_list_ref) = @_;
-  
+
   my @exp_dir_list = @{ $exp_dir_list_ref };
 
   my %ignored_metrics = ();
 
-  my $error_code; 
-  my $message;
+  my $abs_path_dir;
+  my @candidate_ignored_metrics = ();
+  my $error_code;
+  my $hp_value;
+  my $msg;
 
   my $outputdir;
 
   my $target_cmd;
-  my $rm_output_msg; 
+  my $rm_output_msg;
   my $mkdir_output_msg;
-  my $time_percentage_multiplier; 
+  my $time_percentage_multiplier;
   my $process_all_functions;
 
-  my $option_errors = 0;
-
 #------------------------------------------------------------------------------
 # The -o and -O options are mutually exclusive.
 #------------------------------------------------------------------------------
@@ -13788,81 +14906,140 @@ sub process_user_options
 
   if ($define_new_output_dir and $overwrite_output_dir)
     {
-      my $msg;
-
       $msg  = "the -o/--output and -O/--overwrite options are both set, " .
               "but are mutually exclusive";
-      push (@g_user_input_errors, $msg);
+      gp_message ("error", $subr_name, $msg);
 
       $msg  = "(setting for -o = $dir_o_option, " .
               "setting for -O = $dir_O_option)";
-      push (@g_user_input_errors, $msg);
+      gp_message ("error", $subr_name, $msg);
 
-      $option_errors++;
+      $g_total_error_count++;
     }
 
 #------------------------------------------------------------------------------
-# Define the quiet mode.  While this is an on/off keyword in the input, we 
-# use a boolean in the remainder, because it reads easier.
+# The warnings option is deprecated.  Print a warning to this extent and point
+# to the --nowarnings option.
 #------------------------------------------------------------------------------
-  my $quiet_value = $g_user_settings{"quiet"}{"current_value"};
-  $g_quiet        = ($quiet_value eq "on") ? $TRUE : $FALSE;
-
 #------------------------------------------------------------------------------
-# In quiet mode, all verbose, warnings and debug messages are suppressed.
+# Handle the situation that both or one of the highlight-percentage and hp
+# options are set.
 #------------------------------------------------------------------------------
-  if ($g_quiet)
+  if ($g_user_settings{"warnings"}{"defined"})
     {
-      $g_user_settings{"verbose"}{"current_value"} = "off";
-      $g_user_settings{"warnings"}{"current_value"} = "off";
-      $g_user_settings{"debug"}{"current_value"}   = "off";
-      $g_verbose  = $FALSE;
-      $g_warnings = $FALSE;
-      my $debug_off = "off";
-      my $ignore_value = set_debug_size (\$debug_off);
+      $msg  = "<br>" . "the --warnings option has been deprecated and";
+      $msg .= " will be ignored";
+      gp_message ("warning", $subr_name, $msg);
+
+      if ($g_user_settings{"nowarnings"}{"defined"})
+        {
+          $msg  = "since the --nowarnings option is also used, warnings";
+          $msg .= " are disabled";
+          gp_message ("warning", $subr_name, $msg);
+        }
+      else
+        {
+          $msg = "by default, warnings are enabled and can be disabled with";
+          gp_message ("warning", $subr_name, $msg);
+          $msg = " the --nowarnings option";
+          gp_message ("warning", $subr_name, $msg);
+        }
+      $g_total_warning_count++;
     }
-  else
-    {
+
 #------------------------------------------------------------------------------
-# Get the verbose mode.
+# In case both the --highlight-percentage and -hp option are set, issue a
+# warning and continue with the --highlight-percentage value.
 #------------------------------------------------------------------------------
-      my $verbose_value = $g_user_settings{"verbose"}{"current_value"};
-      $g_verbose        = ($verbose_value eq "on") ? $TRUE : $FALSE;
+  if ($g_user_settings{"hp"}{"defined"})
+    {
+      $msg  = "<br>" . "the -hp option has been deprecated and";
+      $msg .= " will be ignored";
+      gp_message ("warning", $subr_name, $msg);
+
+      if ($g_user_settings{"highlight_percentage"}{"defined"})
+        {
+          $msg  = "since the --highlight-percentage option is also used,";
+          $msg .= " the value of ";
+          $msg .= $g_user_settings{"highlight_percentage"}{"current_value"};
+          $msg .= " will be applied";
+          gp_message ("warning", $subr_name, $msg);
+        }
+      else
+        {
 #------------------------------------------------------------------------------
-# Get the warning mode.
+# If only the -hp option is set, we use it, because we do not want to break
+# compatibility (yet) and force the user to change the option.
 #------------------------------------------------------------------------------
-      my $warning_value = $g_user_settings{"warnings"}{"current_value"};
-      $g_warnings       = ($warning_value eq "on") ? $TRUE : $FALSE;
+
+## FUTURE          $msg  = "instead, the default setting of "
+## FUTURE          $msg .= $g_user_settings{"highlight_percentage"}{"current_value"};
+## FUTURE          $msg .= " for the --highlight-percentage will be used";
+## FUTURE          gp_message ("warning", $subr_name, $msg);
+
+## FUTURE          $msg = "please use this option to set the highlighting value";
+## FUTURE          gp_message ("warning", $subr_name, $msg);
+
+          $g_user_settings{"highlight_percentage"}{"current_value"} =
+          $g_user_settings{"hp"}{"current_value"};
+
+          $g_user_settings{"highlight_percentage"}{"defined"} = $TRUE;
+
+          $msg = "for now, the value of " .
+                 $g_user_settings{"hp"}{"current_value"} .
+                 " for the -hp option is used, but please change the" .
+                 " option to --highlight-percentage";
+          gp_message ("warning", $subr_name, $msg);
+        }
+
+      $g_total_warning_count++;
     }
 
 #------------------------------------------------------------------------------
-# The value for HP should be in the interval (0,100]. We already enforced
+# Regardless of the use of the -hp option, we continue with the value for
+# highlight-percentage.  Some more checks are carried out now.
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# This value should be in the interval [0,100].
 # the number to be positive, but the limits have not been checked yet.
 #------------------------------------------------------------------------------
-  my $hp_value = $g_user_settings{"highlight_percentage"}{"current_value"};
+  $hp_value = $g_user_settings{"highlight_percentage"}{"current_value"};
 
   if (($hp_value < 0) or ($hp_value > 100))
     {
-      my $msg = "the value for the highlight percentage is set to $hp_value, ";
-      $msg   .= "but must be in the range [0, 100]"; 
-      push (@g_user_input_errors, $msg);
+      $msg  = "the value for the highlight percentage is set to $hp_value,";
+      $msg .= " but must be in the range [0, 100]";
+      gp_message ("error", $subr_name, $msg);
+
+      $g_total_error_count++;
+    }
+  elsif ($hp_value == 0.0)
+#------------------------------------------------------------------------------
+# A value of zero is interpreted to mean that highlighting should be disabled.
+# To make the checks for this later on easier, set it to an integer value of 0.
+#------------------------------------------------------------------------------
+    {
+      $g_user_settings{"highlight_percentage"}{"current_value"} = 0;
 
-      $option_errors++;
+      $msg  = "reset the highlight percentage value from 0.0 to";
+      $msg .= " " . $g_user_settings{"highlight_percentage"}{"current_value"};
+      gp_message ("debug", $subr_name, $msg);
     }
 
 #------------------------------------------------------------------------------
-# The value for TP should be in the interval (0,100]. We already enforced
+# The value for TP should be in the interval (0,100].  We already enforced
 # the number to be positive, but the limits have not been checked yet.
 #------------------------------------------------------------------------------
   my $tp_value = $g_user_settings{"threshold_percentage"}{"current_value"};
 
   if (($tp_value < 0) or ($tp_value > 100))
     {
-      my $msg = "the value for the total percentage is set to $tp_value, " .
-                "but must be in the range (0, 100]"; 
-      push (@g_user_input_errors, $message);
+      $msg  = "the value for the total percentage is set to $tp_value,";
+      $msg .=   " but must be in the range (0, 100]";
+      gp_message ("error", $subr_name, $msg);
 
-      $option_errors++;
+      $g_total_error_count++;
     }
   else
     {
@@ -13879,13 +15056,12 @@ sub process_user_options
           $process_all_functions = $FALSE;
         }
 
-      my $txt;
-      $txt = "value of time_percentage_multiplier = " .
-             $time_percentage_multiplier; 
-      gp_message ("debugM", $subr_name, $txt);
-      $txt = "value of process_all_functions      = " .
+      $msg = "value of time_percentage_multiplier = " .
+             $time_percentage_multiplier;
+      gp_message ("debugM", $subr_name, $msg);
+      $msg = "value of process_all_functions      = " .
              ($process_all_functions ? "TRUE" : "FALSE");
-      gp_message ("debugM", $subr_name, $txt);
+      gp_message ("debugM", $subr_name, $msg);
     }
 
 #------------------------------------------------------------------------------
@@ -13894,11 +15070,9 @@ sub process_user_options
 # to be excluded metrics as an index.  The value of $TRUE assigned does not
 # really matter.
 #------------------------------------------------------------------------------
-  my @candidate_ignored_metrics;
-
   if ($g_user_settings{"ignore_metrics"}{"defined"})
     {
-      @candidate_ignored_metrics = 
+      @candidate_ignored_metrics =
               split (":", $g_user_settings{"ignore_metrics"}{"current_value"});
     }
   for my $metric (@candidate_ignored_metrics)
@@ -13908,34 +15082,28 @@ sub process_user_options
     }
   for my $metric (keys %ignored_metrics)
     {
-      my $txt = "ignored_metrics{$metric} = $ignored_metrics{$metric}";
-      gp_message ("debugM", $subr_name, $txt);
+      my $msg = "ignored_metrics{$metric} = $ignored_metrics{$metric}";
+      gp_message ("debugM", $subr_name, $msg);
     }
 
 #------------------------------------------------------------------------------
-# Check if the experiment directories exist.
+# Check if the experiment directories exist and if they do, add the absolute
+# path.  This is easier in the remainder.
 #------------------------------------------------------------------------------
   for my $i (0 .. $#exp_dir_list)
     {
       if (-d $exp_dir_list[$i])
         {
-          my $abs_path_dir = Cwd::abs_path ($exp_dir_list[$i]);
+          $abs_path_dir = Cwd::abs_path ($exp_dir_list[$i]);
           $exp_dir_list[$i] = $abs_path_dir;
-          my $txt = "directory $exp_dir_list[$i] exists";
-          gp_message ("debugM", $subr_name, $txt);
-        }
-      else
-        {
-          my $msg = "directory $exp_dir_list[$i] does not exist";
 
-          push (@g_user_input_errors, $msg);
-          $option_errors++;
+          $msg = "directory $exp_dir_list[$i] exists";
+          gp_message ("debugM", $subr_name, $msg);
         }
     }
 
-  return ($option_errors, \%ignored_metrics, $outputdir, 
-          $time_percentage_multiplier, $process_all_functions,
-          \@exp_dir_list);
+  return (\%ignored_metrics, $outputdir, $time_percentage_multiplier,
+         $process_all_functions, \@exp_dir_list);
 
 } #-- End of subroutine process_user_options
 
@@ -14008,7 +15176,7 @@ sub retrieve_metric_description
 #------------------------------------------------------------------------------
 # TBD.
 #------------------------------------------------------------------------------
-sub rnumerically 
+sub rnumerically
 {
   my ($f1,$f2);
   if ($a =~ /^([^\d]*)(\d+)/)
@@ -14019,8 +15187,8 @@ sub rnumerically
           $f2 = int ($2);
           $f1 == $f2 ? 0 : ($f1 > $f2 ? -1 : +1);
         }
-    } 
-  else 
+    }
+  else
     {
       return ($b <=> $a);
     }
@@ -14040,7 +15208,7 @@ sub set_arch_and_regexes
 
   gp_message ("debug", $subr_name, "arch_uname = $arch_uname");
 
-  if ($arch_uname eq "x86_64") 
+  if ($arch_uname eq "x86_64")
     {
       #x86/x64 hardware uses jump
       $architecture_supported = $TRUE;
@@ -14057,10 +15225,10 @@ sub set_arch_and_regexes
       $g_arch_specific_settings{"subexp"}     = '(\[\s*)(0x[0-9a-f]+)';
       $g_arch_specific_settings{"linksubexp"} = '(\[\s*)(0x[0-9a-f]+)';
     }
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # TBD: Remove the elsif block
-#-------------------------------------------------------------------------------
-  elsif ($arch_uname=~m/sparc/s) 
+#------------------------------------------------------------------------------
+  elsif ($arch_uname=~m/sparc/s)
     {
       #sparc hardware uses branch
       $architecture_supported = $FALSE;
@@ -14076,7 +15244,7 @@ sub set_arch_and_regexes
       $g_arch_specific_settings{subexp}     = '(\s*)(0x[0-9a-f]+)\s*$';
       $g_arch_specific_settings{linksubexp} = '(\s*)(0x[0-9a-f]+\s*$)';
     }
-  else 
+  else
     {
       $architecture_supported = $FALSE;
       gp_message ("debug", $subr_name, "detected $arch_uname hardware - this not supported; limited functionality");
@@ -14104,7 +15272,7 @@ sub set_background_color_string
   $msg = "color = $color input_string = $input_string";
   gp_message ("debugXL", $subr_name, $msg);
 
-  $background_color_string = "<span style='background-color: " . $color . 
+  $background_color_string = "<span style='background-color: " . $color .
                              "'>" . $input_string . "</span>";
 
   $msg = "color = $color background_color_string = " .
@@ -14123,20 +15291,12 @@ sub set_debug_size
 {
   my $subr_name = get_my_name ();
 
-  my ($debug_value_ref) = @_;
-
-  my $debug_value = lc (${ $debug_value_ref });
+  my $debug_value = lc ($g_user_settings{"debug"}{"current_value"});
 
 #------------------------------------------------------------------------------
-# Regardless of the value, the debug settings are defined here.
+# Set the corresponding sizes in the table.  A value of "on" is equivalent to
+# size "s".
 #------------------------------------------------------------------------------
-  $g_user_settings{"debug"}{"defined"} = $TRUE;
-
-#------------------------------------------------------------------------------
-# By default, set the value to "on", but correct below if needed.
-#------------------------------------------------------------------------------
-  $g_user_settings{"debug"}{"current_value"} = "on";
-
   if (($debug_value eq "on") or ($debug_value eq "s"))
     {
       $g_debug_size{"on"} = $TRUE;
@@ -14168,7 +15328,8 @@ sub set_debug_size
 # Any other value is considered to disable debugging.
 #------------------------------------------------------------------------------
     {
-      $g_user_settings{"debug"}{"current_value"} = "off";
+##      $g_user_settings{"debug"}{"current_value"} = "off";
+      $g_debug            = $FALSE;
       $g_debug_size{"on"} = $FALSE;
       $g_debug_size{"s"}  = $FALSE;
       $g_debug_size{"m"}  = $FALSE;
@@ -14179,13 +15340,18 @@ sub set_debug_size
 #------------------------------------------------------------------------------
 # Activate in case of an emergency :-)
 #------------------------------------------------------------------------------
-##  if ($g_debug_size{$debug_value})
-##    {
-##      for my $i (keys %g_debug_size)
-##        {
-##          print "$subr_name g_debug_size{$i} = $g_debug_size{$i}\n";
-##        }
-##    }
+  my $show_sizes = $FALSE;
+
+  if ($show_sizes)
+    {
+      if ($g_debug_size{$debug_value})
+        {
+          for my $i (keys %g_debug_size)
+            {
+              print "$subr_name g_debug_size{$i} = $g_debug_size{$i}\n";
+            }
+        }
+    }
 
   return (0);
 
@@ -14223,7 +15389,7 @@ sub set_default_metrics
       gp_message ("debug", $subr_name,"the value of metric_line = $metric_line");
 
 #------------------------------------------------------------------------------
-# Decode the metric part of the input line. If a valid line, return the 
+# Decode the metric part of the input line. If a valid line, return the
 # metric components. Otherwise return "skipped" in the metric_spec field.
 #------------------------------------------------------------------------------
       my ($metric_spec, $metric_flavor, $metric_visibility, $metric_name, $metric_description) = extract_metric_specifics ($metric_line);
@@ -14277,14 +15443,14 @@ sub set_default_metrics
   $detail_metrics        = $summary_metrics;
   $detail_metrics_system = $summary_metrics;
 
-  return (\%metric_description, \%metric_found, 
+  return (\%metric_description, \%metric_found,
          $summary_metrics, $detail_metrics, $detail_metrics_system, $call_metrics);
 
 } #-- End of subroutine set_default_metrics
 
 #------------------------------------------------------------------------------
 # Set various system specific variables.  These depend upon both the processor
-# architecture and OS. The values are stored in global structure 
+# architecture and OS. The values are stored in global structure
 # g_arch_specific_settings.
 #------------------------------------------------------------------------------
 sub set_system_specific_variables
@@ -14295,14 +15461,14 @@ sub set_system_specific_variables
 
   my $elf_arch;
   my $read_elf_cmd;
-  my $elf_support; 
+  my $elf_support;
   my $architecture_supported;
   my $arch;
   my $regex;
   my $subexp;
   my $linksubexp;
 
-  if ($arch_uname eq "x86_64") 
+  if ($arch_uname eq "x86_64")
     {
 #------------------------------------------------------------------------------
 # x86/x64 hardware uses jump
@@ -14328,7 +15494,7 @@ sub set_system_specific_variables
       $g_arch_specific_settings{"subexp"} = '(0x[0-9a-f]+)';
       $g_arch_specific_settings{"linksubexp"} = '(\s*)(0x[0-9a-f]+)';
     }
-  else 
+  else
     {
       $architecture_supported = $FALSE;
       $g_arch_specific_settings{"arch_supported"}  = $FALSE;
@@ -14337,12 +15503,12 @@ sub set_system_specific_variables
 #------------------------------------------------------------------------------
 # TBD Ruud: need to handle this better
 #------------------------------------------------------------------------------
-  if ($arch_uname_s eq "Linux") 
+  if ($arch_uname_s eq "Linux")
     {
       $elf_arch     = $arch_uname_s;
       $read_elf_cmd = $g_mapped_cmds{"readelf"};
 
-      if ($read_elf_cmd eq "road_to_nowhere")
+      if ($read_elf_cmd eq "road to nowhere")
         {
           $elf_support = $FALSE;
         }
@@ -14351,8 +15517,8 @@ sub set_system_specific_variables
           $elf_support = $TRUE;
         }
       gp_message ("debugXL", $subr_name, "elf_support = $elf_support read_elf_cmd = $read_elf_cmd elf_arch = $elf_arch");
-    } 
-  else 
+    }
+  else
     {
       gp_message ("abort", $subr_name, "the $arch_uname_s operating system is not supported");
     }
@@ -14376,6 +15542,7 @@ sub set_title
 
   my $base;
   my $first_line;
+  my $file_is_empty;
   my $src_file;
   my $RI;
   my $the_title;
@@ -14405,7 +15572,7 @@ sub set_title
             }
         }
       $the_title = "Source";
-    } 
+    }
   elsif ($from_where eq "disassembly")
     {
       if ($base =~ /^file\.(\d+)\.dis$/)
@@ -14421,8 +15588,8 @@ sub set_title
             }
         }
       $the_title = "Disassembly";
-    } 
-  else 
+    }
+  else
     {
       $msg = "called from unknown routine - $from_where";
       gp_message ("assertion", $subr_name, $msg);
@@ -14432,18 +15599,18 @@ sub set_title
     {
       $routine = $function_info[$RI]{"routine"};
     }
-  
+
   if ($from_where eq "process source")
     {
-      my $is_empty = is_file_empty ($filename);
+      $file_is_empty = is_file_empty ($filename);
 
-      if ($is_empty)
+      if ($file_is_empty)
         {
           $src_file = "";
         }
       else
         {
-          open ($SRC, "<", $filename) 
+          open ($SRC, "<", $filename)
             or die ("$subr_name - unable to open source file $filename for reading:'$!'");
           gp_message ("debug", $subr_name, "opened file $filename for reading");
 
@@ -14466,13 +15633,31 @@ sub set_title
     }
   elsif ($from_where eq "disassembly")
     {
+      $msg = "unable to open disassembly file $filename for reading:";
       open ($DIS, "<", $filename)
-        or die ("$subr_name - unable to open disassembly file $filename for reading: '$!'");
+        or die ($subr_name . " - " . $msg . " " . $!);
       gp_message ("debug", $subr_name, "opened file $filename for reading");
 
-      $first_line = <$DIS>;
+      $file_is_empty = is_file_empty ($filename);
+
+      if ($file_is_empty)
+#------------------------------------------------------------------------------
+# Currently, the disassembly file for <static> functions appears to be empty
+# on aarch64.  This might be a bug, but it is in any case better to handle
+# this situation.
+#------------------------------------------------------------------------------
+        {
+          $first_line = "";
+          $msg = "file $filename is empty";
+          gp_message ("debugM", $subr_name, $msg);
+        }
+      else
+        {
+          $first_line = <$DIS>;
+        }
+
       close ($DIS);
-  
+
       if ($first_line =~ /^Source\s+file:\s+([^\s]+)/)
         {
           $src_file = "$1"
@@ -14493,8 +15678,8 @@ sub set_title
       if ($src_file ne "(unknown)")
         {
           $the_title .= " ($src_file)";
-        } 
-      else 
+        }
+      else
         {
           $the_title .= " $src_file";
         }
@@ -14505,34 +15690,32 @@ sub set_title
 } #-- End of subroutine set_title
 
 #------------------------------------------------------------------------------
-# Handles where the output should go.  If needed, a directory is # created 
-# where the results will go.
+# Handles where the output should go.  If needed, a directory to store the
+# results in is created.
 #------------------------------------------------------------------------------
 sub set_up_output_directory
 {
   my $subr_name = get_my_name ();
 
   my $error_code;
-  my $message;
+  my $msg;
   my $mkdir_output_msg;
-  my $option_errors;
   my $outputdir = "does_not_exist_yet";
   my $rm_output_msg;
+  my $success;
   my $target_cmd;
 
   my $define_new_output_dir = $g_user_settings{"output"}{"defined"};
   my $overwrite_output_dir  = $g_user_settings{"overwrite"}{"defined"};
 
-  $option_errors = 0;
-
   if ((not $define_new_output_dir) and (not $overwrite_output_dir))
 #------------------------------------------------------------------------------
-# If neither -o or -O are set, find the next number to be used in the name for 
+# If neither -o or -O are set, find the next number to be used in the name for
 # the default output directory.
 #------------------------------------------------------------------------------
     {
       my $dir_id = 1;
-      while (-d "display.".$dir_id.".html") 
+      while (-d "display.".$dir_id.".html")
         { $dir_id++; }
       $outputdir = "display.".$dir_id.".html";
     }
@@ -14554,7 +15737,8 @@ sub set_up_output_directory
 #------------------------------------------------------------------------------
 # The name of the output directory is known and we can proceed.
 #------------------------------------------------------------------------------
-  gp_message ("debug", $subr_name, "the target output directory is $outputdir");
+  $msg = "the target output directory is $outputdir";
+  gp_message ("debug", $subr_name, $msg);
 
   if (-d $outputdir)
     {
@@ -14563,35 +15747,38 @@ sub set_up_output_directory
 #------------------------------------------------------------------------------
       if ($define_new_output_dir)
         {
-          $message  = "directory $outputdir already exists";
-          $message .= " (use the -O option to overwrite an existing directory)";
-          push (@g_user_input_errors, $message);
+          $msg  = "directory $outputdir already exists";
+          gp_message ("error", $subr_name, $msg);
+          $msg  = "use the -O/--overwite  option to overwrite an";
+          $msg .= " existing directory";
+          gp_message ("error", $subr_name, $msg);
+
+          $g_total_error_count++;
 
-          $option_errors++;
+          gp_message ("abort", $subr_name, $g_abort_msg);
 
-          return ($option_errors, $outputdir);
         }
       elsif ($overwrite_output_dir)
 #------------------------------------------------------------------------------
 # It is a bit risky to remove this directory and so we proceed with caution.
 # What if the user decides to call it "*" e.g. "-O \*" for example? While this
-# should have been caught when processing the options, we still like to 
+# should have been caught when processing the options, we still like to
 # be very cautious here before executing /bin/rm -rf.
 #------------------------------------------------------------------------------
         {
-          if ($outputdir eq "*") 
+          if ($outputdir eq "*")
             {
-              $message = "it is not allowed to use * as a value for the -O option";
-              push (@g_user_input_errors, $message);
+              $msg = "it is not allowed to use * as a value for the -O option";
+              gp_message ("error", $subr_name, $msg);
 
-              $option_errors++;
+              $g_total_error_count++;
 
-              return ($option_errors, $outputdir);
+              gp_message ("abort", $subr_name, $g_abort_msg);
             }
           else
             {
 #------------------------------------------------------------------------------
-# The output directory exists, but it is okay to overwrite it. It is 
+# The output directory exists, but it is okay to overwrite it. It is
 # removed here and created again below.
 #------------------------------------------------------------------------------
               $target_cmd = $g_mapped_cmds{"rm"} . " -rf " . $outputdir;
@@ -14599,36 +15786,48 @@ sub set_up_output_directory
 
                 if ($error_code != 0)
                   {
+                    $msg = "fatal error when trying to remove $outputdir";
                     gp_message ("error", $subr_name, $rm_output_msg);
-                    gp_message ("abort", $subr_name, "fatal error when trying to remove $outputdir");
+                    gp_message ("error", $subr_name, $msg);
+
+                    $g_total_error_count++;
+
+                    gp_message ("abort", $subr_name, $g_abort_msg);
                   }
                 else
                   {
-                    gp_message ("debug", $subr_name, "directory $outputdir has been removed");
+                    $msg = "directory $outputdir has been removed";
+                    gp_message ("debug", $subr_name, $msg);
                   }
             }
         }
     } #-- End of if-check for $outputdir
 
-#-------------------------------------------------------------------------------
-# When we get here, the fatal scenarios have been cleared and the name for 
+#------------------------------------------------------------------------------
+# When we get here, the fatal scenarios have not occurred and the name for
 # $outputdir is known.  Time to create it.  Note that recursive creation is
-# supported and umask controls the access permissions.
-#-------------------------------------------------------------------------------
+# supported and the user umask settings control the access permissions.
+#------------------------------------------------------------------------------
   $target_cmd = $g_mapped_cmds{"mkdir"} . " -p " . $outputdir;
   ($error_code, $mkdir_output_msg) = execute_system_cmd ($target_cmd);
 
   if ($error_code != 0)
     {
-      my $msg = "a fatal problem occurred when creating directory $outputdir";
-      gp_message  ("abort", $subr_name, $msg);
+      $msg = "a fatal problem occurred when creating directory $outputdir";
+      gp_message ("error", $subr_name, $mkdir_output_msg);
+      gp_message  ("error", $subr_name, $msg);
+
+      $g_total_error_count++;
+
+      gp_message ("abort", $subr_name, $g_abort_msg);
     }
   else
     {
-      gp_message  ("debug", $subr_name, "created output directory $outputdir");
+      $msg = "created output directory $outputdir";
+      gp_message  ("debug", $subr_name, $msg);
     }
 
-  return ($option_errors, $outputdir);
+  return ($outputdir);
 
 } #-- End of subroutine set_up_output_directory
 
@@ -14644,8 +15843,9 @@ sub tag_name
 #------------------------------------------------------------------------------
 # Keeps track how many names have been tagged already.
 #------------------------------------------------------------------------------
-  state $S_total_tagged_names = 0; 
+  state $S_total_tagged_names = 0;
 
+  my $msg;
   my $unique_name;
 
   gp_message ("debug", $subr_name, "target_name on entry  = $target_name");
@@ -14663,21 +15863,32 @@ sub tag_name
 #------------------------------------------------------------------------------
 # Remove inlining info
 #------------------------------------------------------------------------------
-  $target_name =~ s/, instructions from source file.*//; 
+  $target_name =~ s/, instructions from source file.*//;
 
   if (defined $g_tagged_names{$target_name})
     {
-      gp_message ("debug", $subr_name, "target_name = $target_name is already defined: $g_tagged_names{$target_name}");
-      gp_message ("debug", $subr_name, "target_name on return = $target_name");
+      $msg  = "target_name = $target_name is already defined: ";
+      $msg .= $g_tagged_names{$target_name};
+      gp_message ("debug", $subr_name, $msg);
+
+      $msg = "target_name on return = $target_name";
+      gp_message ("debug", $subr_name, $msg);
+
       return ($g_tagged_names{$target_name});
     }
   else
     {
       $unique_name = "ftag".$S_total_tagged_names;
-      $S_total_tagged_names++; 
+      $S_total_tagged_names++;
       $g_tagged_names{$target_name} = $unique_name;
-      gp_message ("debug", $subr_name, "target_name = $target_name is new and added: g_tagged_names{$target_name} = $g_tagged_names{$target_name}");
-      gp_message ("debug", $subr_name, "target_name on return = $target_name");
+
+      $msg  = "target_name = $target_name is new and added: ";
+      $msg .= "g_tagged_names{$target_name} = $g_tagged_names{$target_name}";
+      gp_message ("debug", $subr_name, $msg);
+
+      $msg = "target_name on return = $target_name";
+      gp_message ("debug", $subr_name, $msg);
+
       return ($unique_name);
     }
 
@@ -14699,11 +15910,11 @@ sub terminate_html_document
 
 } #-- End of subroutine terminate_html_document
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Perform some basic checks to ensure the input data is consistent.  This part
 # could be refined and expanded over time.  For example by using a checksum
 # mechanism to verify the consistency of the executables.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 sub verify_consistency_experiments
 {
   my $subr_name = get_my_name ();
@@ -14714,15 +15925,16 @@ sub verify_consistency_experiments
 
   my $executable_name;
   my $full_path_executable_name;
+  my $msg;
   my $ref_executable_name;
 
   my $first_exp_dir     = $TRUE;
   my $count_differences = 0;
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 # Enforce that the full path names to the executable are the same.  This could
 # be overkill and a checksum approach would be more flexible.
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
   for my $full_exp_dir (@exp_dir_list)
     {
       my $exp_dir = get_basename ($full_exp_dir);
@@ -14730,17 +15942,23 @@ sub verify_consistency_experiments
       if ($first_exp_dir)
         {
           $first_exp_dir = $FALSE;
-          $ref_executable_name = $g_exp_dir_meta_data{$exp_dir}{"full_path_exec"}; 
-          gp_message ("debug", $subr_name, "ref_executable_name = $ref_executable_name");
+          $ref_executable_name =
+                       $g_exp_dir_meta_data{$exp_dir}{"full_path_exec"};
+          $msg = "ref_executable_name = " . $ref_executable_name;
+          gp_message ("debug", $subr_name, $msg);
           next;
         }
-        $full_path_executable_name = $g_exp_dir_meta_data{$exp_dir}{"full_path_exec"}; 
-        gp_message ("debug", $subr_name, "full_path_executable_name = $full_path_executable_name");
+        $full_path_executable_name =
+                       $g_exp_dir_meta_data{$exp_dir}{"full_path_exec"};
+        $msg = "full_path_executable_name = " . $full_path_executable_name;
+        gp_message ("debug", $subr_name, $msg);
 
         if ($full_path_executable_name ne $ref_executable_name)
           {
             $count_differences++;
-            gp_message ("debug", $subr_name, "$full_path_executable_name does not match $ref_executable_name");
+            $msg  = $full_path_executable_name . " does not match";
+            $msg .= " " . $ref_executable_name;
+            gp_message ("debug", $subr_name, $msg);
           }
     }
 
@@ -14752,7 +15970,7 @@ sub verify_consistency_experiments
 
 #------------------------------------------------------------------------------
 # Check if the input item is valid for the data type specified. Validity is
-# verified in the context of gprofng.  The definition for the metrics is a 
+# verified in the context of gprofng.  The definition for the metrics is a
 # good example of that.
 #------------------------------------------------------------------------------
 sub verify_if_input_is_valid
@@ -14761,6 +15979,7 @@ sub verify_if_input_is_valid
 
   my ($input_item, $data_type) = @_;
 
+  my $msg;
   my $return_value = $FALSE;
 
 #------------------------------------------------------------------------------
@@ -14799,7 +16018,7 @@ sub verify_if_input_is_valid
     }
   elsif ($data_type eq "metric_names")
 #------------------------------------------------------------------------------
-# A gprofng metric definition but without the flavour and visibility .  Either 
+# A gprofng metric definition but without the flavour and visibility .  Either
 # the name consists of "default" only, or a keyword with lowercase letters
 # only.  This pattern may be repeated with a ":" as the separator.
 #------------------------------------------------------------------------------
@@ -14827,7 +16046,7 @@ sub verify_if_input_is_valid
 # This can be almost anything, including "/" and "."
 #------------------------------------------------------------------------------
     {
-      if ($input_item =~ /^[\w\/\.]*$/)
+      if ($input_item =~ /^[\w\/\.\-]*$/)
         {
           $return_value = $TRUE;
         }
@@ -14854,7 +16073,7 @@ sub verify_if_input_is_valid
     }
   elsif ($data_type eq "size")
 #------------------------------------------------------------------------------
-# Supported values are "on", "off", "s", "m", "l", OR "xl".
+# Supported values are "on", "off", "s", "m", "l", or "xl".
 #------------------------------------------------------------------------------
     {
       if ($input_item =~ /^on$|^off$|^s$|^m$|^l$|^xl$/)
@@ -14910,10 +16129,118 @@ sub verify_if_input_is_valid
     }
   else
     {
-      my $msg = "the $data_type data type for input $input_item is not supported";
+      $msg = "the $data_type data type for input $input_item is not supported";
       gp_message ("assertion", $subr_name, $msg);
-    } 
+    }
 
   return ($return_value);
 
 } #-- End of subroutine verify_if_input_is_valid
+
+#------------------------------------------------------------------------------
+# Scan the leftovers in ARGV.  Other than the option generated by the driver,
+# this list should be empty.  Anything left here is considered to be a fatal
+# error and pushed into the g_error_msgs buffer.
+#
+# We use two different arrays for the errors found.  This allows us to group
+# the same type of errors.
+#------------------------------------------------------------------------------
+sub wrap_up_user_options
+{
+  my $subr_name = get_my_name ();
+
+  my @opt_unsupported = ();
+  my @opt_ignored     = ();
+
+  my $current_option;
+  my $driver_inserted = "--whoami=gprofng display html";
+  my $ignore_option;
+  my $msg;
+  my $option_delimiter = "--";
+
+  if (@ARGV)
+    {
+      $msg = "items in ARGV: " . join (" ", @ARGV);
+      gp_message ("debugXL", $subr_name, $msg);
+
+      $ignore_option = $FALSE;
+      for my $i (keys @ARGV)
+        {
+          $current_option = $ARGV[$i];
+
+          $msg = "ARGV[$i] = $current_option";
+
+          if ($current_option eq $option_delimiter)
+#------------------------------------------------------------------------------
+# The user may use a feature of GetOptions to delimit the options.  After
+# this, only experiment names are allowed and these have been handled already,
+# so anything found after this delimite is an error.
+#
+# This is why we set a flag if the delimiter has been found.
+#------------------------------------------------------------------------------
+            {
+              $ignore_option = $TRUE;
+              gp_message ("debugXL", $subr_name, $msg . " (option delimiter)");
+            }
+          elsif ($ignore_option)
+#------------------------------------------------------------------------------
+# We have seen the delimiter, but there are still options, or other strings.
+# In any case, it is not allowed.
+#------------------------------------------------------------------------------
+            {
+              push (@opt_ignored, $current_option);
+              gp_message ("debugXL", $subr_name, $msg . " (ignored)");
+            }
+          elsif ($current_option ne $driver_inserted)
+#------------------------------------------------------------------------------
+# The gprofng driver inserts this and it should be ignored.  This is why we
+# only recorded those options different than the one inserted by the driver.
+#------------------------------------------------------------------------------
+            {
+              push (@opt_unsupported, $current_option);
+              gp_message ("debugXL", $subr_name, $msg . " (unsupported)");
+            }
+          else
+#------------------------------------------------------------------------------
+# The gprofng driver inserts this option and it should be ignored.
+#------------------------------------------------------------------------------
+            {
+              gp_message ("debugXL", $subr_name, $msg .
+                          " (driver inserted and ignored)");
+            }
+        }
+    }
+
+#------------------------------------------------------------------------------
+# Store any illegal input in the g_error_msgs buffer.
+#------------------------------------------------------------------------------
+  if (@opt_ignored)
+    {
+      $msg = "the following input is out of place:";
+      for my $i (keys @opt_ignored)
+        {
+          $msg .= " " . $opt_ignored[$i];
+        }
+      gp_message ("error", $subr_name, $msg);
+
+      $g_total_error_count++;
+    }
+  if (@opt_unsupported)
+    {
+      $msg = "the following items in the input are not supported:";
+      for my $i (keys @opt_unsupported)
+        {
+          $msg .= " " . $opt_unsupported[$i];
+        }
+      gp_message ("error", $subr_name, $msg);
+
+      $msg  = "perhaps an error in the option name, or an option value";
+      $msg .= " is missing?";
+      gp_message ("error", $subr_name, $msg);
+
+      $g_total_error_count++;
+    }
+
+  return (0);
+
+} #-- End of subroutine wrap_up_user_options