forked from OSchip/llvm-project
281 lines
7.9 KiB
Raku
Executable File
281 lines
7.9 KiB
Raku
Executable File
#!/usr/bin/perl -w
|
|
|
|
# functions.pm
|
|
# This package contains a set of subroutines to modify the templates for the openMP Testuite.
|
|
|
|
|
|
################################################################################
|
|
# subroutines to extract, modify or delete tags from the template
|
|
################################################################################
|
|
|
|
# LIST get_tag_values( $tagname, $string )
|
|
# subrutine to get the text encloded by a tag.
|
|
# Returns a list containing the inner texts of the found tags
|
|
sub get_tag_values
|
|
{
|
|
my ( $tagname, $string );
|
|
( $tagname, $string ) = @_;
|
|
my (@tmp,@tmp2);
|
|
@tmp = split(/\<$tagname\>/,$string);
|
|
foreach $_(@tmp){
|
|
push(@tmp2,split(/\<\/$tagname\>/));
|
|
}
|
|
my(@result,$i);
|
|
$i=1; # couter to get only every second item
|
|
foreach $_(@tmp2){
|
|
if($i%2 eq 0){
|
|
push(@result,$_);
|
|
}
|
|
$i++;
|
|
}
|
|
return @result;
|
|
}
|
|
|
|
# LIST replace_tags( $tagname, $replacestring, @list )
|
|
# subrutine to replace tags by a replacestring.
|
|
# Returns a list of the srings after conversion.
|
|
sub replace_tags
|
|
{
|
|
my ($tagname, $replacestring, @stringlist, @result);
|
|
($tagname, $replacestring, @stringlist) = @_;
|
|
foreach $_(@stringlist) {
|
|
s#\<$tagname\>(.*?)\<\/$tagname\>#$replacestring#gs;
|
|
push(@result,$_);
|
|
}
|
|
return @result;
|
|
}
|
|
|
|
# LIST enlarge_tags( $tagname, $before, $after, @list )
|
|
# subrutine to replace tags by the tags added by a string before and after.
|
|
# Returns a list of the srings after conversion.
|
|
sub enlarge_tags
|
|
{
|
|
my ($tagname, $before, $after, @stringlist,@result);
|
|
($tagname, $before, $after, @stringlist) = @_;
|
|
foreach $_(@stringlist) {
|
|
s#\<$tagname\>(.*?)\<\/$tagname\>#$before$1$after#gs;
|
|
push(@result,$_);
|
|
}
|
|
return @result;
|
|
}
|
|
|
|
# LIST delete_tags( $tagname, @list )
|
|
# subrutine to delete tags in a string.
|
|
# Returns a list of the cleared strings
|
|
sub delete_tags
|
|
{
|
|
my($tagname,@stringlist);
|
|
($tagname, @stringlist) = @_;
|
|
my(@result);
|
|
foreach $_(@stringlist) {
|
|
s#\<$tagname\>(.*?)\<\/$tagname\>##gs;
|
|
push(@result,$_);
|
|
}
|
|
return @result;
|
|
}
|
|
|
|
|
|
|
|
################################################################################
|
|
# subroutines for generating "orpahned" tests
|
|
################################################################################
|
|
|
|
# SCALAR create_orph_cfunctions( $prefix, $code )
|
|
# returns a string containing the definitions of the functions for the
|
|
# orphan regions.
|
|
sub create_orph_cfunctions
|
|
{
|
|
my ($code,@defs);
|
|
($code) = @_;
|
|
@defs = get_tag_values('ompts:orphan',$code);
|
|
($functionname) = get_tag_values('ompts:testcode:functionname',$code);
|
|
my ( @result,$functionsrc, $i);
|
|
$functionsrc = "\n/* Automatically generated definitions of the orphan functions */\n";
|
|
|
|
$i = 1;
|
|
foreach (@defs) {
|
|
$functionsrc .= "\nvoid orph$i\_$functionname (FILE * logFile) {";
|
|
$functionsrc .= $_;
|
|
$functionsrc .= "\n}\n";
|
|
$i++;
|
|
}
|
|
$functionsrc .= "/* End of automatically generated definitions */\n";
|
|
return $functionsrc;
|
|
}
|
|
|
|
# SCALAR create_orph_fortranfunctions( $prefix, $code )
|
|
# returns a string containing the definitions of the functions for the
|
|
# orphan regions.
|
|
sub create_orph_fortranfunctions
|
|
{
|
|
my ($prefix,$code,@defs,$orphan_parms);
|
|
($prefix,$code,$orphan_parms) = @_;
|
|
@defs = get_tag_values('ompts:orphan',$code);
|
|
|
|
#to remove space and put a single space
|
|
if($orphan_parms ne "")
|
|
{
|
|
$orphan_parms =~ s/[ \t]+//sg;
|
|
$orphan_parms =~ s/[ \t]+\n/\n/sg;
|
|
}
|
|
|
|
($orphanvarsdefs) = get_tag_values('ompts:orphan:vars',$code);
|
|
foreach (@varsdef) {
|
|
if (not /[^ \n$]*/){ $orphanvarsdefs = join("\n",$orphanvarsdef,$_);}
|
|
}
|
|
($functionname) = get_tag_values('ompts:testcode:functionname',$code);
|
|
my ( @result,$functionsrc, $i);
|
|
$functionsrc = "\n! Definitions of the orphan functions\n";
|
|
$i = 1;
|
|
foreach $_(@defs)
|
|
{
|
|
$functionsrc .= "\n SUBROUTINE orph$i\_$prefix\_$functionname\($orphan_parms\)\n ";
|
|
$functionsrc .= "INCLUDE \"omp_testsuite.f\"\n";
|
|
$functionsrc .= $orphanvarsdefs."\n";
|
|
$functionsrc .= $_;
|
|
$functionsrc .= "\n";
|
|
$functionsrc .= " END SUBROUTINE\n! End of definition\n\n";
|
|
$i++;
|
|
}
|
|
return $functionsrc;
|
|
}
|
|
|
|
# LIST orphan_regions2cfunctions( $prefix, @code )
|
|
# replaces orphan regions by functioncalls in C/C++.
|
|
sub orphan_regions2cfunctions
|
|
{
|
|
my ($code, $i, $functionname);
|
|
($code) = @_;
|
|
$i = 1;
|
|
($functionname) = get_tag_values('ompts:testcode:functionname',$code);
|
|
while( /\<ompts\:orphan\>(.*)\<\/ompts\:orphan\>/s) {
|
|
s#\<ompts\:orphan\>(.*?)\<\/ompts\:orphan\>#orph$i\_$functionname (logFile);#s;
|
|
$i++;
|
|
}
|
|
return $code;
|
|
}
|
|
|
|
# LIST orphan_regions2fortranfunctions( $prefix, @code )
|
|
# replaces orphan regions by functioncalls in fortran
|
|
sub orphan_regions2fortranfunctions
|
|
{
|
|
my ( $prefix, @code, $my_parms, $i, $functionname);
|
|
($prefix, ($code), $my_parms) = @_;
|
|
$i = 1;
|
|
($functionname) = get_tag_values('ompts:testcode:functionname',$code);
|
|
foreach $_(($code))
|
|
{
|
|
while( /\<ompts\:orphan\>(.*)\<\/ompts\:orphan\>/s)
|
|
{
|
|
s#\<ompts\:orphan\>(.*?)\<\/ompts\:orphan\># CALL orph$i\_$prefix\_$functionname\($my_parms\);#s;
|
|
$i++;
|
|
}
|
|
}
|
|
return ($code);
|
|
}
|
|
|
|
# SCALAR orph_functions_declarations( $prefix, $code )
|
|
# returns a sring including the declaration of the functions used
|
|
# in the orphan regions. The function names are generated using
|
|
# the $prefix as prefix for the functionname.
|
|
sub orph_functions_declarations
|
|
{
|
|
my ($prefix, $code);
|
|
($prefix, $code) = @_;
|
|
my ( @defs, $result );
|
|
|
|
# creating declarations for later used functions
|
|
$result .= "\n\n/* Declaration of the functions containing the code for the orphan regions */\n#include <stdio.h>\n";
|
|
@defs = get_tag_values('ompts:orphan',$code);
|
|
my ($functionname,$i);
|
|
($functionname) = get_tag_values('ompts:testcode:functionname',$code);
|
|
$i = 1;
|
|
foreach $_(@defs) {
|
|
$result .= "\nvoid orph$i\_$prefix\_$functionname ( FILE * logFile );";
|
|
$i++;
|
|
}
|
|
$result .= "\n\n/* End of declaration */\n\n";
|
|
return $result;
|
|
}
|
|
|
|
# SCALAR make_global_vars_definition( $code )
|
|
# returns a sring including the declaration for the vars needed to
|
|
# be declared global for the orphan region.
|
|
sub make_global_vars_def
|
|
{
|
|
my ( $code );
|
|
($code) = @_;
|
|
my ( @defs, $result, @tmp, @tmp2 ,$predefinitions);
|
|
|
|
# creating global declarations for the variables.
|
|
$result = "\n\n/* Declaration of the variables used in the orphan region. */\n";
|
|
|
|
# get all tags containing the variable definitions
|
|
@defs = get_tag_values('ompts:orphan:vars',$code);
|
|
foreach $_(@defs)
|
|
{
|
|
# cutting the different declarations in the same tag by the ';' as cuttmark
|
|
@tmp = split(/;/,$_);
|
|
foreach $_(@tmp)
|
|
{
|
|
# replacing newlines and double spaces
|
|
s/\n//gs;
|
|
s/ //gs;
|
|
# put the new declaration at the end of $result
|
|
if($_ ne ""){ $result .= "\n $_;"; }
|
|
}
|
|
}
|
|
$result .= "\n\n/* End of declaration. */\n\n";
|
|
return $result;
|
|
}
|
|
|
|
# SCALAR extern_vars_definition( $code )
|
|
# returns a sring including the declaration for the vars needed to
|
|
# be declared extern for the orphan region.
|
|
sub extern_vars_def
|
|
{
|
|
my ( $code );
|
|
($code) = @_;
|
|
my ( @defs, $result, @tmp, @tmp2 ,$predefinitions);
|
|
|
|
# creating declarations for the extern variables.
|
|
$result = "\n\n/* Declaration of the extern variables used in the orphan region. */\n";
|
|
# $result .= "\n#include <stdio.h>\n#include <omp.h>\n";
|
|
$result .= "\nextern FILE * logFile;";
|
|
|
|
# get all tags containing the variable definitions
|
|
@defs = get_tag_values('ompts:orphan:vars',$code);
|
|
foreach $_(@defs)
|
|
{
|
|
# cutting the different declarations in the same tag by the ';' as cuttmark
|
|
@tmp = split(/;/,$_);
|
|
foreach $_(@tmp)
|
|
{
|
|
# replacing newlines and double spaces
|
|
s/\n//gs;
|
|
s/ //gs;
|
|
# cutting off definitions
|
|
@tmp2 = split("=",$_);
|
|
# put the new declaration at the end of $result
|
|
$result .= "\nextern $tmp2[0];";
|
|
}
|
|
}
|
|
$result .= "\n\n/* End of declaration. */\n\n";
|
|
return $result;
|
|
}
|
|
|
|
sub leave_single_space
|
|
{
|
|
my($str);
|
|
($str)=@_;
|
|
if($str ne "")
|
|
{
|
|
$str =~ s/^[ \t]+/ /;
|
|
$str =~ s/[ \t]+\n$/\n/;
|
|
$str =~ s/[ \t]+//g;
|
|
}
|
|
return $str;
|
|
}
|
|
|
|
return 1;
|