forked from ROCm/hcc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathompts_parser.pl
executable file
·167 lines (149 loc) · 6.27 KB
/
ompts_parser.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#!/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 occured!";
}
}
# 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);
}
}