Blame maint/genstates

Packit Service c5cf8c
#! /usr/bin/env perl
Packit Service c5cf8c
use File::Find;
Packit Service c5cf8c
Packit Service c5cf8c
%states = ();
Packit Service c5cf8c
Packit Service c5cf8c
# Find all the source and header files and parse the states.
Packit Service c5cf8c
find sub
Packit Service c5cf8c
{
Packit Service c5cf8c
	if ($File::Find::name =~ /\.[ich]$/)
Packit Service c5cf8c
	{
Packit Service c5cf8c
		%local_states = ();
Packit Service c5cf8c
		$line_no = 1;
Packit Service c5cf8c
		$previous_line_no = 1;
Packit Service c5cf8c
		$filename = $File::Find::name;
Packit Service c5cf8c
		#printf("opening $_\n");
Packit Service c5cf8c
		open (F, "$_") or die "unable to open $_";
Packit Service c5cf8c
		while (<F>)
Packit Service c5cf8c
		{
Packit Service c5cf8c
			chomp;
Packit Service c5cf8c
			if (/STATE_DECL\((.+)\)/)
Packit Service c5cf8c
			{
Packit Service c5cf8c
				if (!/^#\s*define/)
Packit Service c5cf8c
				{
Packit Service c5cf8c
					if ($local_states{$1} eq "declared")
Packit Service c5cf8c
					{
Packit Service c5cf8c
						printf("$filename:$previous_line_no:$line_no\n");
Packit Service c5cf8c
						printf("ERROR: no FUNC_ENTER/EXIT for declared state '$1'\n");
Packit Service c5cf8c
					}
Packit Service c5cf8c
#					if ($local_states{$1} eq "entered")
Packit Service c5cf8c
#					{
Packit Service c5cf8c
#						# This actually could be a nested state declaration of the same name.
Packit Service c5cf8c
#						printf("$filename:$line_no\n");
Packit Service c5cf8c
#						printf("ERROR: no FUNC_EXIT for state '$1'\n");
Packit Service c5cf8c
#					}
Packit Service c5cf8c
					#printf("state declared: $1\n");
Packit Service c5cf8c
					if (/\s+\\\s*/)
Packit Service c5cf8c
					{
Packit Service c5cf8c
						# Assume that if the declared state is in a macro then it will be correctly entered and exited.
Packit Service c5cf8c
						# Otherwise it is too hard to parse the file.
Packit Service c5cf8c
						$local_states{$1} = "exited";
Packit Service c5cf8c
					}
Packit Service c5cf8c
					else
Packit Service c5cf8c
					{
Packit Service c5cf8c
						$local_states{$1} = "declared";
Packit Service c5cf8c
					}
Packit Service c5cf8c
					$previous_line_no = $line_no;
Packit Service c5cf8c
				}
Packit Service c5cf8c
			}
Packit Service c5cf8c
			if (/FUNC_ENTER.*\((.+)\)/)
Packit Service c5cf8c
			{
Packit Service c5cf8c
				if ( (!/^#\s*define/) && (!/\s+\\\s*/) )
Packit Service c5cf8c
				{
Packit Service c5cf8c
					if ($local_states{$1} eq "declared")
Packit Service c5cf8c
					{
Packit Service c5cf8c
						#printf("state entered: '$1'\n");
Packit Service c5cf8c
						$local_states{$1} = "entered";
Packit Service c5cf8c
					}
Packit Service c5cf8c
					else
Packit Service c5cf8c
					{
Packit Service c5cf8c
						if (!defined($local_states{$1}))
Packit Service c5cf8c
						{
Packit Service c5cf8c
							printf("$filename:$line_no\n");
Packit Service c5cf8c
							printf("ERROR: FUNC_ENTER for undefined state '$1'\n");
Packit Service c5cf8c
						}
Packit Service c5cf8c
						if ($local_states{$1} eq "entered")
Packit Service c5cf8c
						{
Packit Service c5cf8c
							printf("$filename:$line_no\n");
Packit Service c5cf8c
							printf("ERROR: FUNC_ENTER repeated for state '$1'\n");
Packit Service c5cf8c
						}
Packit Service c5cf8c
#						if ($local_states{$1} eq "exited")
Packit Service c5cf8c
#						{
Packit Service c5cf8c
#							printf("$filename:$line_no\n");
Packit Service c5cf8c
#							printf("Warning: FUNC_ENTER after FUNC_EXIT for state '$1'\n");
Packit Service c5cf8c
#						}
Packit Service c5cf8c
					}
Packit Service c5cf8c
				}
Packit Service c5cf8c
			}
Packit Service c5cf8c
			if (/FUNC_EXIT.*\((.+)\)/)
Packit Service c5cf8c
			{
Packit Service c5cf8c
				if ( (!/^#\s*define/) && (!/\s+\\\s*/) )
Packit Service c5cf8c
				{
Packit Service c5cf8c
					if (($local_states{$1} eq "entered") || ($local_states{$1} eq "exited"))
Packit Service c5cf8c
					{
Packit Service c5cf8c
						#printf("state exited: $1\n");
Packit Service c5cf8c
						$local_states{$1} = "exited";
Packit Service c5cf8c
					}
Packit Service c5cf8c
					else
Packit Service c5cf8c
					{
Packit Service c5cf8c
						if (!defined($local_states{$1}))
Packit Service c5cf8c
						{
Packit Service c5cf8c
							printf("$filename:$line_no\n");
Packit Service c5cf8c
							printf("ERROR: FUNC_EXIT for undefined state '$1'\n");
Packit Service c5cf8c
						}
Packit Service c5cf8c
						if ($local_states{$1} eq "declared")
Packit Service c5cf8c
						{
Packit Service c5cf8c
							printf("$filename:$line_no\n");
Packit Service c5cf8c
							printf("ERROR: FUNC_EXIT without FUNC_ENTER for state '$1'\n");
Packit Service c5cf8c
						}
Packit Service c5cf8c
					}
Packit Service c5cf8c
				}
Packit Service c5cf8c
			}
Packit Service c5cf8c
			$line_no = $line_no + 1;
Packit Service c5cf8c
		}
Packit Service c5cf8c
		close F;
Packit Service c5cf8c
		foreach (keys(%local_states))
Packit Service c5cf8c
		{
Packit Service c5cf8c
			if ($local_states{$_} eq "declared")
Packit Service c5cf8c
			{
Packit Service c5cf8c
				printf("$filename:\n");
Packit Service c5cf8c
				printf("ERROR: no FUNC_ENTER/EXIT for declared state $_\n");
Packit Service c5cf8c
			}
Packit Service c5cf8c
			else
Packit Service c5cf8c
			{
Packit Service c5cf8c
				if ($local_states{$_} eq "entered")
Packit Service c5cf8c
				{
Packit Service c5cf8c
					printf("$filename:\n");
Packit Service c5cf8c
					printf("ERROR: FUNC_ENTER without FUNC_EXIT for state $_\n");
Packit Service c5cf8c
				}
Packit Service c5cf8c
				else
Packit Service c5cf8c
				{
Packit Service c5cf8c
					if (!($_ eq ""))
Packit Service c5cf8c
					{
Packit Service c5cf8c
						$states{$_} = "NULL";
Packit Service c5cf8c
					}
Packit Service c5cf8c
				}
Packit Service c5cf8c
			}
Packit Service c5cf8c
		}
Packit Service c5cf8c
	}
Packit Service c5cf8c
}, "src";
Packit Service c5cf8c
Packit Service c5cf8c
@states = sort keys(%states);
Packit Service c5cf8c
Packit Service c5cf8c
# Remove the MPID_STATE_ prefix
Packit Service c5cf8c
foreach (@states)
Packit Service c5cf8c
{
Packit Service c5cf8c
	if ( !($_ eq "") )
Packit Service c5cf8c
	{
Packit Service c5cf8c
		/(MPID_STATE_)(.+)/;
Packit Service c5cf8c
		$display_names{"$1$2"} = "$2";
Packit Service c5cf8c
	}
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
# Find all the describe_states.txt files and parse them
Packit Service c5cf8c
find sub
Packit Service c5cf8c
{
Packit Service c5cf8c
	if ($_ eq "describe_states.txt")
Packit Service c5cf8c
	{
Packit Service c5cf8c
		open F, $_;
Packit Service c5cf8c
		$line_no = 1;
Packit Service c5cf8c
		while (<F>)
Packit Service c5cf8c
		{
Packit Service c5cf8c
			chomp;
Packit Service c5cf8c
			# Check for a line with a display name and a color
Packit Service c5cf8c
			/\s*(\S+)(\s+)(\S+)(\s+)(\d+)(\s+)(\d+)(\s+)(\d+).*/;
Packit Service c5cf8c
			if (defined($1) && defined($2) && defined($3) && defined($4) && defined($5) && defined($6) && defined($7) && defined($8) && defined($9))
Packit Service c5cf8c
			{
Packit Service c5cf8c
				if (!defined($states{$1}))
Packit Service c5cf8c
				{
Packit Service c5cf8c
					printf("Warning1: described state '$1' not used, consider removing it from $File::Find::name:$line_no\n");
Packit Service c5cf8c
				}
Packit Service c5cf8c
				$display_names{$1} = "$3";
Packit Service c5cf8c
				$states{$1} = "\"$5 $7 $9\"";
Packit Service c5cf8c
			}
Packit Service c5cf8c
			else
Packit Service c5cf8c
			{
Packit Service c5cf8c
				# Check for a line with just a color
Packit Service c5cf8c
				/\s*(\S+)(\s+)(\d+)(\s+)(\d+)(\s+)(\d+).*/;
Packit Service c5cf8c
				if (defined($1) && defined($2) && defined($3) && defined($4) && defined($5) && defined($6) && defined($7))
Packit Service c5cf8c
				{
Packit Service c5cf8c
					if (!defined($states{$1}))
Packit Service c5cf8c
					{
Packit Service c5cf8c
						printf("Warning2: described state '$1' not used, consider removing it from $File::Find::name:$line_no\n");
Packit Service c5cf8c
					}
Packit Service c5cf8c
					$states{$1} = "\"$3 $5 $7\"";
Packit Service c5cf8c
				}
Packit Service c5cf8c
				else
Packit Service c5cf8c
				{
Packit Service c5cf8c
					# Check for a line with just a display name
Packit Service c5cf8c
					/\s*(\S+)(\s+)(\S+).*/;
Packit Service c5cf8c
					if (defined($1) && defined($2) && defined($3))
Packit Service c5cf8c
					{
Packit Service c5cf8c
						if (!defined($states{$1}))
Packit Service c5cf8c
						{
Packit Service c5cf8c
							printf("Warning3: described state '$1' not used, consider removing it from $File::Find::name:$line_no\n");
Packit Service c5cf8c
						}
Packit Service c5cf8c
						$display_names{$1} = "$3";
Packit Service c5cf8c
					}
Packit Service c5cf8c
				}
Packit Service c5cf8c
			}
Packit Service c5cf8c
			$line_no = $line_no + 1;
Packit Service c5cf8c
		}
Packit Service c5cf8c
		close F;
Packit Service c5cf8c
	}
Packit Service c5cf8c
}, "src";
Packit Service c5cf8c
Packit Service c5cf8c
# FIXME: It would be better to assemble this from just the relevant 
Packit Service c5cf8c
# modules, rather than all files.  A directory-based approach, such as
Packit Service c5cf8c
# that from extractstrings, could be used.
Packit Service c5cf8c
#
Packit Service c5cf8c
open HFILE, ">src/include/mpiallstates.h"
Packit Service c5cf8c
	or die "Unable to open src/include/mpiallstates.h";
Packit Service c5cf8c
print HFILE "/* -*- Mode: C; c-basic-offset:4 ; -*- */\n";
Packit Service c5cf8c
print HFILE "/*\n";
Packit Service c5cf8c
print HFILE " *  (C) 2001 by Argonne National Laboratory.\n";
Packit Service c5cf8c
print HFILE " *      See COPYRIGHT in top-level directory.\n";
Packit Service c5cf8c
print HFILE " */\n";
Packit Service c5cf8c
print HFILE "\n";
Packit Service c5cf8c
print HFILE "/* automatically generated by maint/genstates */\n";
Packit Service c5cf8c
print HFILE "\n";
Packit Service c5cf8c
print HFILE "#ifndef MPIALLSTATES_H_INCLUDED\n";
Packit Service c5cf8c
print HFILE "#define MPIALLSTATES_H_INCLUDED\n";
Packit Service c5cf8c
print HFILE "\n";
Packit Service c5cf8c
print HFILE "/* Insert all the states to be logged here */\n";
Packit Service c5cf8c
print HFILE "\n";
Packit Service c5cf8c
print HFILE "enum MPID_TIMER_STATE\n";
Packit Service c5cf8c
print HFILE "{\n";
Packit Service c5cf8c
foreach (@states)
Packit Service c5cf8c
{
Packit Service c5cf8c
	if ( !($_ eq "") )
Packit Service c5cf8c
	{
Packit Service c5cf8c
		print HFILE "$_,\n";
Packit Service c5cf8c
	}
Packit Service c5cf8c
}
Packit Service c5cf8c
print HFILE "MPID_NUM_TIMER_STATES\n";
Packit Service c5cf8c
print HFILE "};\n";
Packit Service c5cf8c
print HFILE "\n";
Packit Service c5cf8c
print HFILE "#endif\n";
Packit Service c5cf8c
close HFILE;
Packit Service c5cf8c
Packit Service c5cf8c
# FIXME: This is RLOG specific and should be placed in the appropriate 
Packit Service c5cf8c
# RLOG directory, not common.  
Packit Service c5cf8c
# FIXME: It would also make more sense for the RLOG_Describe_state routine
Packit Service c5cf8c
# to perform the random color assignement when provided with an empty
Packit Service c5cf8c
# or null color string, rather than including all of this code in what is
Packit Service c5cf8c
# otherwise an RLOG-specific file.
Packit Service c5cf8c
Packit Service c5cf8c
open F, ">src/util/logging/common/describe_states.c"
Packit Service c5cf8c
	or die "Unable to open src/util/logging/common/describe_states.c";
Packit Service c5cf8c
print F "/* -*- Mode: C; c-basic-offset:4 ; -*- */\n";
Packit Service c5cf8c
print F "/*\n";
Packit Service c5cf8c
print F " *  (C) 2001 by Argonne National Laboratory.\n";
Packit Service c5cf8c
print F " *      See COPYRIGHT in top-level directory.\n";
Packit Service c5cf8c
print F " */\n";
Packit Service c5cf8c
print F "\n";
Packit Service c5cf8c
print F "/* automatically generated by maint/genstates */\n";
Packit Service c5cf8c
print F "\n";
Packit Service c5cf8c
print F "#include \"mpiimpl.h\"\n";
Packit Service c5cf8c
print F "\n";
Packit Service c5cf8c
print F "/* Define MPICH_MPI_FROM_PMPI if weak symbols are not supported to build\n";
Packit Service c5cf8c
print F "   the MPI routines */\n";
Packit Service c5cf8c
print F "#ifndef MPICH_MPI_FROM_PMPI\n";
Packit Service c5cf8c
print F "\n";
Packit Service c5cf8c
print F "#ifdef HAVE_TIMING\n";
Packit Service c5cf8c
print F "\n";
Packit Service c5cf8c
print F "#if (USE_LOGGING == MPICH_LOGGING__RLOG)\n";
Packit Service c5cf8c
print F "\n";
Packit Service c5cf8c
print F "int MPII_Describe_timer_states()\n";
Packit Service c5cf8c
print F "{\n";
Packit Service c5cf8c
print F "\n";
Packit Service c5cf8c
foreach (@states)
Packit Service c5cf8c
{
Packit Service c5cf8c
	if ( !($_ eq "") )
Packit Service c5cf8c
	{
Packit Service c5cf8c
		print F "    RLOG_DescribeState(g_pRLOG, $_, \"$display_names{$_}\", $states{$_});\n";
Packit Service c5cf8c
	}
Packit Service c5cf8c
}
Packit Service c5cf8c
print F "    return 0;\n";
Packit Service c5cf8c
print F "}\n";
Packit Service c5cf8c
print F "\n";
Packit Service c5cf8c
print F "#endif /* USE_LOGGING == MPICH_LOGGING__RLOG */\n";
Packit Service c5cf8c
print F "#endif /* HAVE_TIMING */\n";
Packit Service c5cf8c
print F "#endif /* MPICH_MPI_FROM_PMPI */\n";