mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-25 23:00:15 +00:00
c2d5e61177
llvm-svn: 209995
168 lines
6.3 KiB
Perl
Executable File
168 lines
6.3 KiB
Perl
Executable File
#!/usr/bin/env perl
|
|
|
|
# ompts_parser [option] SOURCEFILE
|
|
#
|
|
# Creats the tests and the crosstests for the OpenMP-Testsuite out of an templatefiles which are given to the programm.
|
|
#
|
|
# Options:
|
|
# -test: make test
|
|
# -crosstest: make crosstest
|
|
# -orphan if possible generate tests using orphan regions (not implemented yet)
|
|
# -lang=LANG preprocessing for language LANG, where LANG is one of the following languages:
|
|
# c, fortran
|
|
# -o=FILENAME outputfile (only when one templatefile is specified)
|
|
|
|
|
|
# Using Getopt::long to extract the programm options
|
|
use Getopt::Long;
|
|
# Using functions: Set of subroutines to modify the testcode
|
|
use ompts_parserFunctions;
|
|
|
|
# Getting given options
|
|
GetOptions("-test" => \$test,"-crosstest" => \$crosstest, "-o=s" => \$outputfile, "-orphan" => \$orphan, "-f!", "-lang=s" => \$language);
|
|
|
|
# Remaining arguments are the templatefiles.
|
|
# Adding these to the list of to be parsed files if they exist.
|
|
foreach $file(@ARGV)
|
|
{
|
|
if(-e $file){ push(@sourcefiles,$file); }
|
|
else { print "Error: Unknown Option $file\n"; }
|
|
}
|
|
|
|
# Checking if options were valid:
|
|
#################################################################
|
|
# preparations and checks for sourcefiles
|
|
if(@sourcefiles == 0){die "No files to parse are specified!";}
|
|
if($outputfile && (@sourcefiles != 1 || ($test && $crosstest) ) ){die "There were multiple files for one outputfiles specified!";}
|
|
# preparations fopr orphan tests
|
|
if($orphan){ $orphanprefix = "orphaned"; }
|
|
else { $orphanprefix = ""; }
|
|
# preparations for test / crosstest
|
|
if($test){push(@testtypes,"test");
|
|
# %checks['test']="check";
|
|
}
|
|
if($crosstest){push(@testtypes,"ctest");
|
|
# %checks['crosstest']="crosscheck";
|
|
}
|
|
# preparations and checks for language
|
|
if($language eq"c") { $extension = "c";}
|
|
elsif($language eq "fortran" or $language eq "f") { $language = "f"; $extension = "f";}
|
|
else { die "You must specify a valid language!"; }
|
|
|
|
|
|
# Reading the templates for the tests into @sources
|
|
foreach $srcfile (@sourcefiles)
|
|
{
|
|
# Reading the content of the current sourcefile into $src
|
|
open(TEST,$srcfile) or print "Error: Could not open template $srcfile\n";
|
|
while(<TEST>){ $src .= $_; }
|
|
close(TEST);
|
|
# Adding the content $src to the end of the list @sources
|
|
push(@sources,$src);
|
|
}
|
|
|
|
# Extracting the source for the mainprogramm and saving it in $mainprocsrc
|
|
if($language eq "c") { $mainprocsrc = "ompts_standaloneProc.c"; }
|
|
elsif($language eq "f") { $mainprocsrc = "ompts_standaloneProc.f"; }
|
|
open(MAINPROC,$mainprocsrc) or die "Could not open the sourcefile for the main program $mainprocsrc";
|
|
while(<MAINPROC>){
|
|
$mainproc .= $_;
|
|
}
|
|
|
|
foreach $testtype (@testtypes)
|
|
{
|
|
foreach $src(@sources)
|
|
{
|
|
# Some temporary testinformation:
|
|
($description) = get_tag_values('ompts:testdescription',$src);
|
|
($directive) = get_tag_values('ompts:directive',$src);
|
|
($functionname) = get_tag_values('ompts:testcode:functionname',$src);
|
|
|
|
open(OUTFILE,">".$language.$orphanprefix.$testtype."_".$functionname.".".$extension) or die("Could not create the output file for $directive");
|
|
|
|
# Creating the source for the test:
|
|
($code) = get_tag_values('ompts:testcode',$src);
|
|
# Putting together the functions and the mainprogramm:
|
|
$code .= $mainproc;
|
|
|
|
# get the parameters <ompts:orphan:params> by joon
|
|
# thanks to Dr. Yin Ma in Absoft
|
|
($parms) = get_tag_values('ompts:orphan:parms',$code);
|
|
($parms) = leave_single_space($parms);
|
|
# to remove parameters tag between 'ompts:orphan:parms' by joon
|
|
($code) = replace_tags('ompts:orphan:parms','',$code);
|
|
|
|
# Make modifications for the orphaned testversion if necessary:
|
|
if($orphan)
|
|
{
|
|
# Get the global variables:
|
|
@defs = get_tag_values("ompts:orphan:vars",$code);
|
|
$orphvarsdef = "";
|
|
foreach $_ (@defs)
|
|
{
|
|
#print $_;
|
|
if(not /^[ ]*$/gs) { $orphvarsdef = join("\n",$orphvarsdef,$_); }
|
|
#print "OK\n".$orphvarsdef;
|
|
}
|
|
if($language eq "f")
|
|
{
|
|
# Generate the orphan subroutines:
|
|
$orphfuncs = create_orph_fortranfunctions("$testtype_", $code);
|
|
# Replace orphan regions by functioncalls:
|
|
($code) = orphan_regions2fortranfunctions( "$testtype_", ($code) );
|
|
($code) = enlarge_tags('ompts:orphan:vars','','',($code));
|
|
($code) = enlarge_tags('ompts:orphan:parms','','',($code));
|
|
#to find orphan call statemetn and add parameters
|
|
|
|
# Put all together:
|
|
$code = $code . $orphfuncs;
|
|
}
|
|
elsif($language eq "c")
|
|
{
|
|
# Generate predeclarations for orpahn functions:
|
|
$orphfuncsdefs = orph_functions_declarations("$testtype_",$code);
|
|
# Generate the orphan functions:
|
|
$orphfuncs = create_orph_cfunctions("$testtype_",$code);
|
|
# Repla:e orphan regions by functioncalls:
|
|
($code) = orphan_regions2cfunctions( "$testtype_", ($code) );
|
|
# Deleting the former declarations of the variables in the orphan regions:
|
|
($code) = delete_tags('ompts:orphan:vars',($code));
|
|
# Put all together:
|
|
$code = "#include \"omp_testsuite.h\"\n".$orphvarsdef . $orphfuncsdefs . $code . $orphfuncs;
|
|
}
|
|
else {
|
|
print "An error occurred!";
|
|
}
|
|
}
|
|
# remove parameters between <ompts:orphan:parms> tags, added by joon
|
|
($code)= replace_tags('ompts:orphan:parms',$code);
|
|
|
|
# Remove the marks for the orpahn regions and its variables:
|
|
($code) = enlarge_tags('ompts:orphan','','',($code));
|
|
($code) = enlarge_tags('ompts:orphan:vars','','',($code));
|
|
|
|
# remove parameters between for orphaned directive parametes, added by joon
|
|
($code) = enlarge_tags('ompts:orphan:parms','','',($code));
|
|
|
|
if($testtype eq "test") {
|
|
# Remove the marks for the testcode and remove the code for the crosstests:
|
|
($code) = enlarge_tags('ompts:check','','',($code));
|
|
($code) = delete_tags('ompts:crosscheck',($code));
|
|
}
|
|
elsif($testtype eq "ctest") {
|
|
# Remove the marks for the crosstestcode and remove the code for the tests:
|
|
($code) = enlarge_tags('ompts:crosscheck','','',($code));
|
|
($code) = delete_tags('ompts:check',($code));
|
|
}
|
|
# Making some final modifications:
|
|
($code) = replace_tags('testfunctionname',$testtype."_".$functionname,($code));
|
|
($code) = replace_tags('directive',$directive,($code));
|
|
($code) = replace_tags('description',$description,($code));
|
|
($code) = enlarge_tags('ompts:testcode:functionname',$testtype."_",'',($code) );
|
|
# $code = "\#include \"omp_testsuite.h\"\n".$code;
|
|
# Write the result into the file and close it:
|
|
print OUTFILE $code;
|
|
close(OUTFILE);
|
|
}
|
|
}
|