225 lines
4.8 KiB
Perl
225 lines
4.8 KiB
Perl
|
# profevts.pl
|
||
|
# Thierry Fevrier 25-Feb-2000
|
||
|
#
|
||
|
# Perl script to generate IA64 profiling events.
|
||
|
#
|
||
|
# Caveats:
|
||
|
# sorry but it is my first perl script...
|
||
|
# and it was done very quickly to satisfy the needs
|
||
|
# of a simple program.
|
||
|
#
|
||
|
|
||
|
require 5.001;
|
||
|
|
||
|
# Forward declarations
|
||
|
sub Usage;
|
||
|
sub PrintProlog;
|
||
|
sub PrintBody;
|
||
|
sub HalpProfileMappingToSource;
|
||
|
sub PrintEpilog;
|
||
|
|
||
|
# Contants
|
||
|
|
||
|
my $SCRIPT_VERSION = "1.00";
|
||
|
my $SCRIPT_CMD = "profevts.pl";
|
||
|
my $SCRIPT_LONGVERSION = "PROFEVTS.PL Version $SCRIPT_VERSION";
|
||
|
my $typedstr = "HalpProfileMapping";
|
||
|
|
||
|
if ($#ARGV != 0)
|
||
|
{
|
||
|
$error = "requires 1 arguments...";
|
||
|
Usage($error);
|
||
|
}
|
||
|
my $filename = $ARGV[0];
|
||
|
if (-e $filename && -T $filename)
|
||
|
{
|
||
|
open(FH, "<$filename") || die "$SCRIPT_CMD: could not open $filename...\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$error = "$filename does not exist or is not a text file...";
|
||
|
Usage($error);
|
||
|
}
|
||
|
|
||
|
while ( <FH> )
|
||
|
{
|
||
|
# look for the specified string
|
||
|
if ( ($_ =~ /$typedstr/) && ($_ =~ /\[.*\]/) && ($_ =~ /\{/) ) {
|
||
|
chop $_;
|
||
|
PrintProlog( $typedstr );
|
||
|
if ( PrintBody( ) )
|
||
|
{
|
||
|
PrintEpilog( $typedstr );
|
||
|
last;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print "Parsing failed...\n";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
close(FH);
|
||
|
exit 0;
|
||
|
|
||
|
sub PrintBody
|
||
|
{
|
||
|
# Note: in_comment is really for the section defining the structure.
|
||
|
# I do not handle the case if the structure is inside a comment block.
|
||
|
my $in_comment = 0;
|
||
|
my $index = 0;
|
||
|
|
||
|
LINE:
|
||
|
while (<FH>)
|
||
|
{
|
||
|
local($line) = $_;
|
||
|
#print $line;
|
||
|
|
||
|
if ( $line =~ /^\s*#.*$/ ) {
|
||
|
chop $line;
|
||
|
#print "Found pre-processor macro \"$line\" in $typedstr...\n";
|
||
|
print "$line\n";
|
||
|
next LINE;
|
||
|
}
|
||
|
|
||
|
local($line) = $_;
|
||
|
if ( $in_comment ) {
|
||
|
# Does this line have the end of the C comment?
|
||
|
#
|
||
|
if ($line =~ /\*\//)
|
||
|
{
|
||
|
# Yes. Keep everything after the end of the
|
||
|
# comment and keep going with normal processing
|
||
|
|
||
|
$line = $';
|
||
|
$in_comment = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
next LINE;
|
||
|
}
|
||
|
}
|
||
|
# Remove single line C "/* */" comments
|
||
|
$line =~ s/\/\*.*?\*\///g;
|
||
|
|
||
|
# Remove any "//" comments
|
||
|
# Make sure the start of the comment is NOT
|
||
|
# inside a string
|
||
|
if (($line =~ /\/\//) && ($line !~ /\".*?\/\/.*?\"/))
|
||
|
{
|
||
|
$line =~ s/\/\/.*$/ /;
|
||
|
}
|
||
|
|
||
|
# Multi-line C comment?
|
||
|
# Make sure the start of the comment is NOT
|
||
|
# inside a string
|
||
|
if (($line =~ /\/\*/) && ($line !~ /\".*?\/\*.*?\"/))
|
||
|
{
|
||
|
# Grab anything before the comment
|
||
|
# Need to make it look like there's still a EOL marker
|
||
|
$line = $` . "\n";
|
||
|
|
||
|
# Remember that we're in "comment" mode
|
||
|
$in_comment = 1;
|
||
|
|
||
|
next LINE;
|
||
|
}
|
||
|
|
||
|
local($line_pack) = $line;
|
||
|
|
||
|
# Replace spaces between word characters with '#'
|
||
|
$line_pack =~ s/(\w)\s+(\w)/$1#$2/g;
|
||
|
|
||
|
# remove whitespace
|
||
|
$line_pack =~ tr/ \t//d;
|
||
|
|
||
|
# Remove quoted double-quote characters
|
||
|
$line_pack =~ s/'\\?"'/'_'/g;
|
||
|
|
||
|
# Remove any strings
|
||
|
# Note: Doesn't handle quoted quote characters correctly
|
||
|
$line_pack =~ s/"[^"]*"/_/g;
|
||
|
|
||
|
# Remove any "//" comments
|
||
|
$line_pack =~ s/\/\/.*$//;
|
||
|
|
||
|
# For empty lines,
|
||
|
if ( $line_pack eq "\n" )
|
||
|
{
|
||
|
next LINE;
|
||
|
}
|
||
|
|
||
|
if ( $line_pack =~ /^\}/)
|
||
|
{
|
||
|
return $index;
|
||
|
}
|
||
|
|
||
|
# Remove beginning "{"
|
||
|
$line_pack =~ s/^\{(.*)\}.*$/$1/;
|
||
|
|
||
|
# print "line_pack: $line_pack\n";
|
||
|
|
||
|
@words = split(/,/, $line_pack);
|
||
|
HalpProfileMappingToSource( $index, @words );
|
||
|
|
||
|
$index++;
|
||
|
next LINE;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
}
|
||
|
|
||
|
sub HalpProfileMappingToSource
|
||
|
{
|
||
|
local($idx, $supported, $event, $profileSource, $profileSourceMask, $interval, $defInterval, $maxInterval, $minInterval) = @_;
|
||
|
if ( $idx eq 0 )
|
||
|
{
|
||
|
print " \{ \"ProfileTime\", ProfileTime, \"ProfileTime\", $defInterval, $defInterval \}";
|
||
|
}
|
||
|
elsif ( $supported eq "FALSE" ) {
|
||
|
print ",\n \{ \"INVALID_$idx\", ProfileIA64Maximum, \"INVALID_$idx\", 0, 0 \}";
|
||
|
}
|
||
|
else {
|
||
|
print ",\n \{ \"$event\", Profile$event, \"$event\", $defInterval, 0 \}";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sub PrintProlog
|
||
|
{
|
||
|
local($str) = @_;
|
||
|
local($basename) = $filename;
|
||
|
local($header) = $filename;
|
||
|
local($arrayname);
|
||
|
$basename =~ s/.*\\(.*).[ch]/$1/;
|
||
|
$arrayname = $basename . "StaticSources";
|
||
|
if ($header !~ /\.h/)
|
||
|
{
|
||
|
$header =~ s/\.c$/\.h/;
|
||
|
}
|
||
|
print "\/\/\n";
|
||
|
print "\/\/ This file is automatically generated by $SCRIPT_CMD, parsing\n";
|
||
|
print "\/\/ $filename.\n";
|
||
|
print "\/\/\n\n";
|
||
|
print "\#include \"$header\"\n\n";
|
||
|
print "SOURCE\n";
|
||
|
print "$arrayname\[\] = \{\n";
|
||
|
}
|
||
|
|
||
|
sub PrintEpilog
|
||
|
{
|
||
|
local($str) = @_;
|
||
|
print "\n};\n";
|
||
|
}
|
||
|
|
||
|
sub Usage
|
||
|
{
|
||
|
local($error) = @_;
|
||
|
|
||
|
die "$error\n",
|
||
|
"$SCRIPT_LONGVERSION\n",
|
||
|
"Usage : $SCRIPT_CMD filename\n",
|
||
|
"Options:\n",
|
||
|
" filename file containing the IA64 $typedstr definition\n";
|
||
|
}
|
||
|
|