10
0
mirror of https://gitlab.com/scemama/irpf90.git synced 2024-11-09 07:33:43 +01:00

Disallow provide, touch, soft_touch, provide_all in openMP

This commit is contained in:
Anthony Scemama 2014-05-23 22:34:09 +02:00
parent f6ff97f5c5
commit 6bdc7afde4
2 changed files with 37 additions and 8 deletions

View File

@ -852,6 +852,27 @@ def remove_ifdefs(text):
result.append(line) result.append(line)
return result return result
######################################################################
def check_OpenMP(text):
assert type(text) == list
result = []
inside_openmp = False
for line in text:
if type(line) == Openmp:
# Detect OpenMP blocks
buffer = line.text.lower().split()
if buffer[1] == "parallel":
inside_openmp = True
if buffer[1] == "end" and buffer[2] == "parallel":
inside_openmp = False
result.append(line)
if inside_openmp:
if type(line) in [ Provide_all, Provide, Touch, SoftTouch ]:
error.fail(line,type(line).str+" is not allowed in an OpenMP block.")
return result
###################################################################### ######################################################################
def create_preprocessed_text(filename): def create_preprocessed_text(filename):
file = open(filename,"r") file = open(filename,"r")
@ -869,6 +890,7 @@ def create_preprocessed_text(filename):
result = change_single_line_ifs(result) result = change_single_line_ifs(result)
result = process_old_style_do(result) result = process_old_style_do(result)
result = irp_simple_statements(result) result = irp_simple_statements(result)
result = check_OpenMP(result)
check_begin_end(result) check_begin_end(result)
return result return result

View File

@ -58,14 +58,8 @@ class Variable(object):
############################################################ ############################################################
def has_openmp(self): def has_openmp(self):
if '_has_openmp' not in self.__dict__: if '_has_openmp' not in self.__dict__:
buffer = None self._has_openmp = False
text = self.text self.builder()
result = False
for line in text:
if type(line) == Openmp:
result = True
break
self._has_openmp = result
return self._has_openmp return self._has_openmp
has_openmp = property(has_openmp) has_openmp = property(has_openmp)
@ -593,6 +587,7 @@ class Variable(object):
text = parsed_text.move_to_top(text,Implicit) text = parsed_text.move_to_top(text,Implicit)
text = parsed_text.move_to_top(text,Use) text = parsed_text.move_to_top(text,Use)
text = map(lambda x: x[1], text) text = map(lambda x: x[1], text)
inside_omp = False
for line in filter(lambda x: type(x) not in [ Begin_doc, End_doc, Doc], text): for line in filter(lambda x: type(x) not in [ Begin_doc, End_doc, Doc], text):
if type(line) == Begin_provider: if type(line) == Begin_provider:
result = [] result = []
@ -608,7 +603,19 @@ class Variable(object):
" call irp_set_timer(%d,(irp_rdtsc2-irp_rdtsc1))"%self.label ] " call irp_set_timer(%d,(irp_rdtsc2-irp_rdtsc1))"%self.label ]
result.append( "end subroutine bld_%s"%(name) ) result.append( "end subroutine bld_%s"%(name) )
break break
elif type(line) == Openmp:
# Detect OpenMP blocks
buffer = line.text.lower().split()
if buffer[1] == "parallel":
inside_omp = True
self._has_openmp = True
if buffer[1] == "end" and buffer[2] == "parallel":
inside_omp = False
result.append(line.text)
else: else:
# if inside_omp:
# if type(line) in [ Provide_all, Provide, Touch, SoftTouch ]:
# error.fail(line,str(type(line))+"is not allowed in an OpenMP block.")
result.append(line.text) result.append(line.text)
self._builder = result self._builder = result
return self._builder return self._builder