[flang][OpenMP] Compile proper omp_lib.mod from the openmp/src/include sources (#80874)

This PR changes the build system to use use the sources for the module
`omp_lib` and the `omp_lib.h` include file from the `openmp` runtime
project and not from a separate copy of these files. This will greatly
reduce potential for inconsistencies when adding features to the OpenMP
runtime implementation.

When the OpenMP subproject is not configured, this PR also disables the
corresponding LIT tests with a "REQUIRES" directive at the beginning of
the OpenMP test files.

---------

Co-authored-by: Valentin Clement (バレンタイン クレメン) <clementval@gmail.com>
This commit is contained in:
Michael Klemm
2024-03-20 13:47:26 +01:00
committed by GitHub
parent 254bfe955a
commit fb5fd2d82f
73 changed files with 577 additions and 650 deletions

View File

@@ -1,13 +0,0 @@
!===-- module/omp_lib.f90 --------------------------------------------------===!
!
! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
! See https://llvm.org/LICENSE.txt for license information.
! SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
!
!===------------------------------------------------------------------------===!
module omp_lib
include "omp_lib.h"
end module omp_lib

View File

@@ -1,454 +0,0 @@
!===-- module/omp_lib.h ------------------------------------------*- F90 -*-===!
!
! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
! See https://llvm.org/LICENSE.txt for license information.
! SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
!
!===------------------------------------------------------------------------===!
!dir$ free
integer, parameter :: omp_integer_kind = selected_int_kind(9) ! 32-bit int
integer, parameter :: omp_logical_kind = 1 ! C_BOOL
integer, parameter :: omp_sched_kind = omp_integer_kind
integer, parameter :: omp_proc_bind_kind = omp_integer_kind
integer, parameter :: omp_pause_resource_kind = omp_integer_kind
integer, parameter :: omp_sync_hint_kind = omp_integer_kind
integer, parameter :: omp_lock_hint_kind = omp_sync_hint_kind
integer, parameter :: omp_event_handle_kind = omp_integer_kind
integer, parameter :: omp_alloctrait_key_kind = omp_integer_kind
integer, parameter :: omp_alloctrait_val_kind = omp_integer_kind
integer, parameter :: omp_allocator_handle_kind = omp_integer_kind
integer, parameter :: omp_memspace_handle_kind = omp_integer_kind
integer, parameter :: omp_lock_kind = int_ptr_kind()
integer, parameter :: omp_nest_lock_kind = int_ptr_kind()
integer, parameter :: omp_depend_kind = omp_integer_kind
integer(kind=omp_sched_kind), parameter :: &
omp_sched_static = 1, &
omp_sched_dynamic = 2, &
omp_sched_guided = 3, &
omp_sched_auto = 4
integer(kind=omp_proc_bind_kind), parameter :: &
omp_proc_bind_false = 0, &
omp_proc_bind_true = 1, &
omp_proc_bind_master = 2, &
omp_proc_bind_close = 3, &
omp_proc_bind_spread = 4
integer(kind=omp_pause_resource_kind), parameter :: &
omp_pause_soft = 1, &
omp_pause_hard = 2
integer(kind=omp_sync_hint_kind), parameter :: &
omp_sync_hint_none = 0, &
omp_sync_hint_uncontended = 1, &
omp_sync_hint_contended = 2, &
omp_sync_hint_nonspeculative = 4, &
omp_sync_hint_speculative = 8
integer(kind=omp_lock_hint_kind), parameter :: &
omp_lock_hint_none = omp_sync_hint_none, &
omp_lock_hint_uncontended = omp_sync_hint_uncontended, &
omp_lock_hint_contended = omp_sync_hint_contended, &
omp_lock_hint_nonspeculative = omp_sync_hint_nonspeculative, &
omp_lock_hint_speculative = omp_sync_hint_speculative
integer(kind=omp_event_handle_kind), parameter :: &
omp_allow_completion_event = 0, &
omp_task_fulfill_event = 1
integer(kind=omp_alloctrait_key_kind), parameter :: &
omp_atk_sync_hint = 1, &
omp_atk_alignment = 2, &
omp_atk_access = 3, &
omp_atk_pool_size = 4, &
omp_atk_fallback = 5, &
omp_atk_fb_data = 6, &
omp_atk_pinned = 7, &
omp_atk_partition = 8
integer(kind=omp_alloctrait_val_kind), parameter :: &
omp_atv_false = 0, &
omp_atv_true = 1, &
omp_atv_default = 2, &
omp_atv_contended = 3, &
omp_atv_uncontended = 4, &
omp_atv_sequential = 5, &
omp_atv_private = 6, &
omp_atv_all = 7, &
omp_atv_thread = 8, &
omp_atv_pteam = 9, &
omp_atv_cgroup = 10, &
omp_atv_default_mem_fb = 11, &
omp_atv_null_fb = 12, &
omp_atv_abort_fb = 13, &
omp_atv_allocator_fb = 14, &
omp_atv_environment = 15, &
omp_atv_nearest = 16, &
omp_atv_blocked = 17, &
omp_atv_interleaved = 18
type, bind(c) :: omp_alloctrait
integer(kind=omp_alloctrait_key_kind) :: key, value
end type omp_alloctrait
integer(kind=omp_allocator_handle_kind), parameter :: omp_null_allocator = 0
integer(kind=omp_memspace_handle_kind), parameter :: &
omp_default_mem_space = 0, &
omp_large_cap_mem_space = 0, &
omp_const_mem_space = 0, &
omp_high_bw_mem_space = 0, &
omp_low_lat_mem_space = 0, &
omp_default_mem_alloc = 1, &
omp_large_cap_mem_alloc = omp_default_mem_alloc, &
omp_const_mem_alloc = 1, &
omp_high_bw_mem_alloc = 1, &
omp_low_lat_mem_alloc = 1, &
omp_thread_mem_alloc = omp_atv_thread, &
omp_pteam_mem_alloc = omp_atv_pteam, &
omp_cgroup_mem_alloc = omp_atv_cgroup
integer(kind=omp_integer_kind), parameter :: openmp_version = 200805
interface
subroutine omp_set_num_threads(nthreads) bind(c)
import
integer(kind=omp_integer_kind), value :: nthreads
end subroutine omp_set_num_threads
function omp_get_num_threads() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_num_threads
end function omp_get_num_threads
function omp_get_max_threads() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_max_threads
end function omp_get_max_threads
function omp_get_thread_num() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_thread_num
end function omp_get_thread_num
function omp_get_num_procs() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_num_procs
end function omp_get_num_procs
function omp_in_parallel() bind(c)
import
logical(kind=omp_logical_kind) :: omp_in_parallel
end function omp_in_parallel
subroutine omp_set_dynamic(enable) bind(c)
import
logical(kind=omp_logical_kind), value :: enable
end subroutine omp_set_dynamic
function omp_get_dynamic() bind(c)
import
logical(kind=omp_logical_kind) :: omp_get_dynamic
end function omp_get_dynamic
function omp_get_cancelation() bind(c)
import
logical(kind=omp_logical_kind) :: omp_get_cancelation
end function omp_get_cancelation
subroutine omp_set_nested(enable) bind(c)
import
logical(kind=omp_logical_kind), value :: enable
end subroutine omp_set_nested
function omp_get_nested() bind(c)
import
logical(kind=omp_logical_kind) ::omp_get_nested
end function omp_get_nested
subroutine omp_set_schedule(kind, modifier) bind(c)
import
integer(kind=omp_integer_kind), value :: kind, modifier
end subroutine omp_set_schedule
subroutine omp_get_schedule(kind, modifier) bind(c)
import
integer(kind=omp_integer_kind), intent(out) :: kind, modifier
end subroutine omp_get_schedule
function omp_get_thread_limit() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_thread_limit
end function omp_get_thread_limit
function omp_get_supported_active_levels() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_supported_active_levels
end function omp_get_supported_active_levels
subroutine omp_set_max_active_levels(max_levels) bind(c)
import
integer(kind=omp_integer_kind), value :: max_levels
end subroutine omp_set_max_active_levels
function omp_get_max_active_levels() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_max_active_levels
end function omp_get_max_active_levels
function omp_get_level() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_level
end function omp_get_level
function omp_get_ancestor_thread_num(level) bind(c)
import
integer(kind=omp_integer_kind), value :: level
integer(kind=omp_integer_kind) :: omp_get_ancestor_thread_num
end function omp_get_ancestor_thread_num
function omp_get_team_size(level) bind(c)
import
integer(kind=omp_integer_kind), value :: level
integer(kind=omp_integer_kind) :: omp_get_team_size
end function omp_get_team_size
function omp_get_active_level() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_active_level
end function omp_get_active_level
function omp_in_final() bind(c)
import
logical(kind=omp_logical_kind) :: omp_in_final
end function omp_in_final
function omp_get_proc_bind() bind(c)
import
integer(kind=omp_proc_bind_kind) :: omp_get_proc_bind
end function omp_get_proc_bind
function omp_get_num_places() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_num_places
end function omp_get_num_places
function omp_get_place_num_procs(place_num) bind(c)
import
integer(kind=omp_integer_kind), value :: place_num
integer(kind=omp_integer_kind) omp_get_place_num_procs
end function omp_get_place_num_procs
subroutine omp_get_place_proc_ids(place_num, ids) bind(c)
import
integer(kind=omp_integer_kind), value :: place_num
integer(kind=omp_integer_kind), intent(out) :: ids(*)
end subroutine omp_get_place_proc_ids
function omp_get_place_num() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_place_num
end function omp_get_place_num
function omp_get_partition_num_places() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_partition_num_places
end function omp_get_partition_num_places
subroutine omp_get_partition_place_nums(place_nums) bind(c)
import
integer(kind=omp_integer_kind), intent(out) :: place_nums(*)
end subroutine omp_get_partition_place_nums
subroutine omp_set_affinity_format(format) bind(c)
import
character(len=*), intent(in) :: format
end subroutine omp_set_affinity_format
function omp_get_affinity_format(buffer) bind(c)
import
character(len=*), intent(out) :: buffer
integer(kind=omp_integer_kind) :: omp_get_affinity_format
end function omp_get_affinity_format
subroutine omp_display_affinity(format) bind(c)
import
character(len=*), intent(in) :: format
end subroutine omp_display_affinity
function omp_capture_affinity(buffer, format) bind(c)
import
character(len=*), intent(out) :: buffer
character(len=*), intent(in) :: format
integer(kind=omp_integer_kind) omp_capture_affinity
end function omp_capture_affinity
subroutine omp_set_default_device(device_num) bind(c)
import
integer(kind=omp_integer_kind), value :: device_num
end subroutine omp_set_default_device
function omp_get_default_device() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_default_device
end function omp_get_default_device
function omp_get_num_devices() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_num_devices
end function omp_get_num_devices
function omp_get_device_num() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_device_num
end function omp_get_device_num
function omp_get_num_teams() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_num_teams
end function omp_get_num_teams
function omp_get_team_num() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_team_num
end function omp_get_team_num
function omp_is_initial_device() bind(c)
import
integer(kind=omp_logical_kind) :: omp_is_initial_device ! TODO: should this be LOGICAL?
end function omp_is_initial_device
function omp_get_initial_device() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_initial_device
end function omp_get_initial_device
function omp_get_max_task_priority() bind(c)
import
integer(kind=omp_integer_kind) :: omp_get_max_task_priority
end function omp_get_max_task_priority
function omp_pause_resource(kind, device_num) bind(c)
import
integer(kind=omp_pause_resource_kind), value :: kind
integer(kind=omp_integer_kind), value :: device_num
integer(kind=omp_integer_kind) :: omp_pause_resource
end function omp_pause_resource
function omp_pause_resource_all(kind) bind(c)
import
integer(kind=omp_pause_resource_kind), value :: kind
integer(kind=omp_integer_kind) :: omp_pause_resource_all
end function omp_pause_resource_all
! Lock routines
subroutine omp_init_lock(lockvar) bind(c, name="omp_init_lock_")
import
integer(kind=omp_lock_kind), intent(out) :: lockvar
end subroutine omp_init_lock
subroutine omp_init_lock_with_hint(lockvar, hint) bind(c, name="omp_init_lock_with_hint_")
import
integer(kind=omp_lock_kind), intent(out) :: lockvar
integer(kind=omp_sync_hint_kind), value :: hint
end subroutine omp_init_lock_with_hint
subroutine omp_destroy_lock(lockvar) bind(c, name="omp_destroy_lock_")
import
integer(kind=omp_lock_kind), intent(inout) :: lockvar
end subroutine omp_destroy_lock
subroutine omp_set_lock(lockvar) bind(c, name="omp_set_lock_")
import
integer(kind=omp_lock_kind), intent(inout) :: lockvar
end subroutine omp_set_lock
subroutine omp_unset_lock(lockvar) bind(c, name="omp_unset_lock_")
import
integer(kind=omp_lock_kind), intent(inout) :: lockvar
end subroutine omp_unset_lock
function omp_test_lock(lockvar) bind(c, name="omp_test_lock_")
import
integer(kind=omp_lock_kind), intent(inout) :: lockvar
logical(kind=omp_logical_kind) :: omp_test_lock
end function omp_test_lock
subroutine omp_init_nest_lock(lockvar) bind(c, name="omp_init_nest_lock_")
import
integer(kind=omp_nest_lock_kind), intent(out) :: lockvar
end subroutine omp_init_nest_lock
subroutine omp_init_nest_lock_with_hint(lockvar, hint) bind(c, name="omp_init_nest_lock_with_hint_")
import
integer(kind=omp_nest_lock_kind), intent(out) :: lockvar
integer(kind=omp_sync_hint_kind), value :: hint
end subroutine omp_init_nest_lock_with_hint
subroutine omp_destroy_nest_lock(lockvar) bind(c, name="omp_destroy_nest_lock_")
import
integer(kind=omp_nest_lock_kind), intent(inout) :: lockvar
end subroutine omp_destroy_nest_lock
subroutine omp_set_nest_lock(lockvar) bind(c, name="omp_set_nest_lock_")
import
integer(kind=omp_nest_lock_kind), intent(inout) :: lockvar
end subroutine omp_set_nest_lock
subroutine omp_unset_nest_lock(lockvar) bind(c, name="omp_unset_nest_lock_")
import
integer(kind=omp_nest_lock_kind), intent(inout) :: lockvar
end subroutine omp_unset_nest_lock
function omp_test_nest_lock(lockvar) bind(c, name="omp_test_nest_lock_")
import
integer(kind=omp_integer_kind) :: omp_test_nest_lock
integer(kind=omp_nest_lock_kind), intent(inout) :: lockvar
end function omp_test_nest_lock
! Timing routines
function omp_get_wtime() bind(c)
double precision omp_get_wtime
end function omp_get_wtime
function omp_get_wtick() bind(c)
double precision omp_get_wtick
end function omp_get_wtick
! Event routine
subroutine omp_fullfill_event(event) bind(c) ! TODO: is this the correct spelling?
import
integer(kind=omp_event_handle_kind) :: event
end subroutine omp_fullfill_event
! Device Memory Routines
! Memory Management Routines
function omp_init_allocator(memspace, ntraits, traits) bind(c)
import
integer(kind=omp_memspace_handle_kind), value :: memspace
integer, value :: ntraits
type(omp_alloctrait), intent(in) :: traits(*)
integer(kind=omp_allocator_handle_kind) :: omp_init_allocator
end function omp_init_allocator
subroutine omp_destroy_allocator(allocator) bind(c)
import
integer(kind=omp_allocator_handle_kind), value :: allocator
end subroutine omp_destroy_allocator
subroutine omp_set_default_allocator(allocator) bind(c)
import
integer(kind=omp_allocator_handle_kind), value :: allocator
end subroutine omp_set_default_allocator
function omp_get_default_allocator() bind(c)
import
integer(kind=omp_allocator_handle_kind) :: omp_get_default_allocator
end function omp_get_default_allocator
end interface

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! Verify that the omp_lib.h header is found and included correctly. This header file should be available at a path:
! * relative to the driver, that's
! * known the driver.
@@ -7,11 +9,11 @@
! This should just work
! RUN: not rm omp_lib.h
! RUN: %flang -fsyntax-only -fopenmp %s 2>&1
! RUN: %flang -cpp -fsyntax-only -fopenmp %s 2>&1
! Create an empty omp_lib.h header that _does not_ define omp_default_mem_alloc - this should lead to semantic errors
! RUN: touch omp_lib.h
! RUN: not %flang -fsyntax-only -fopenmp %s 2>&1 | FileCheck %s
! RUN: not %flang -cpp -fsyntax-only -fopenmp %s 2>&1 | FileCheck %s
! RUN: rm omp_lib.h
! CHECK: error: Must have INTEGER type, but is REAL(4)

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fopenmp %s -o - | FileCheck %s
! This test checks the lowering of atomic capture

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: bbc --use-desc-for-alloc=false -fopenmp -emit-fir -hlfir=false %s -o - | FileCheck %s
! This test checks the lowering of atomic read

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! This test checks lowering of atomic and atomic update constructs
! RUN: bbc --use-desc-for-alloc=false -fopenmp -emit-fir -hlfir=false %s -o - | FileCheck %s
! RUN: %flang_fc1 -mllvm --use-desc-for-alloc=false -emit-fir -flang-deprecated-no-hlfir -fopenmp %s -o - | FileCheck %s

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: bbc --use-desc-for-alloc=false -fopenmp -emit-fir -hlfir=false %s -o - | FileCheck %s
! This test checks the lowering of atomic write

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
!RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fopenmp %s -o - | FileCheck %s --check-prefixes="OMPDialect"
!RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fopenmp %s -o - | fir-opt --fir-to-llvm-ir | FileCheck %s --check-prefix="OMPDialect"
!RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fopenmp %s -o - | fir-opt --fir-to-llvm-ir | tco | FileCheck %s --check-prefix="LLVMIR"

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
!RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fopenmp %s -o - | FileCheck %s --check-prefixes="FIRDialect,OMPDialect"
!RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fopenmp %s -o - | fir-opt --cfg-conversion-on-func-opt | fir-opt --fir-to-llvm-ir | FileCheck %s --check-prefixes="OMPDialect,LLVMDialect"
@@ -38,16 +40,16 @@ end subroutine omp_parallel_sections
subroutine omp_parallel_sections_allocate(x, y)
use omp_lib
integer, intent(inout) :: x, y
!FIRDialect: %[[allocator_1:.*]] = arith.constant 1 : i32
!FIRDialect: %[[allocator_2:.*]] = arith.constant 1 : i32
!LLVMDialect: %[[allocator_1:.*]] = llvm.mlir.constant(1 : i32) : i32
!LLVMDialect: %[[allocator_2:.*]] = llvm.mlir.constant(1 : i32) : i32
!FIRDialect: %[[allocator_1:.*]] = arith.constant 4 : i64
!FIRDialect: %[[allocator_2:.*]] = arith.constant 4 : i64
!LLVMDialect: %[[allocator_1:.*]] = llvm.mlir.constant(4 : i64) : i64
!LLVMDialect: %[[allocator_2:.*]] = llvm.mlir.constant(4 : i64) : i64
!OMPDialect: omp.parallel allocate(
!FIRDialect: %[[allocator_2]] : i32 -> %{{.*}} : !fir.ref<i32>) {
!LLVMDialect: %[[allocator_2]] : i32 -> %{{.*}} : !llvm.ptr) {
!FIRDialect: %[[allocator_2]] : i64 -> %{{.*}} : !fir.ref<i32>) {
!LLVMDialect: %[[allocator_2]] : i64 -> %{{.*}} : !llvm.ptr) {
!OMPDialect: omp.sections allocate(
!FIRDialect: %[[allocator_1]] : i32 -> %{{.*}} : !fir.ref<i32>) {
!LLVMDialect: %[[allocator_1]] : i32 -> %{{.*}} : !llvm.ptr) {
!FIRDialect: %[[allocator_1]] : i64 -> %{{.*}} : !fir.ref<i32>) {
!LLVMDialect: %[[allocator_1]] : i64 -> %{{.*}} : !llvm.ptr) {
!$omp parallel sections allocate(omp_high_bw_mem_alloc: x)
!OMPDialect: omp.section {
!$omp section

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
!RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fopenmp %s -o - | FileCheck %s --check-prefixes="FIRDialect,OMPDialect"
!RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fopenmp %s -o - | fir-opt --fir-to-llvm-ir | FileCheck %s --check-prefixes="LLVMDialect,OMPDialect"
@@ -153,8 +155,8 @@ subroutine parallel_allocate()
use omp_lib
integer :: x
!OMPDialect: omp.parallel allocate(
!FIRDialect: %{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>
!LLVMDialect: %{{.+}} : i32 -> %{{.+}} : !llvm.ptr
!FIRDialect: %{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>
!LLVMDialect: %{{.+}} : i64 -> %{{.+}} : !llvm.ptr
!OMPDialect: ) {
!$omp parallel allocate(omp_high_bw_mem_alloc: x) private(x)
!FIRDialect: arith.addi
@@ -195,8 +197,8 @@ subroutine parallel_multiple_clauses(alpha, num_threads)
!$omp end parallel
!OMPDialect: omp.parallel if({{.*}} : i1) num_threads({{.*}} : i32) allocate(
!FIRDialect: %{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>
!LLVMDialect: %{{.+}} : i32 -> %{{.+}} : !llvm.ptr
!FIRDialect: %{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>
!LLVMDialect: %{{.+}} : i64 -> %{{.+}} : !llvm.ptr
!OMPDialect: ) {
!$omp parallel num_threads(num_threads) if(alpha .le. 0) allocate(omp_high_bw_mem_alloc: alpha) private(alpha)
!FIRDialect: fir.call

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! This test checks the lowering of OpenMP sections construct with several clauses present
! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fopenmp %s -o - | FileCheck %s
@@ -5,8 +7,8 @@
!CHECK: func @_QQmain() attributes {fir.bindc_name = "sample"} {
!CHECK: %[[COUNT:.*]] = fir.address_of(@_QFEcount) : !fir.ref<i32>
!CHECK: %[[ETA:.*]] = fir.alloca f32 {bindc_name = "eta", uniq_name = "_QFEeta"}
!CHECK: %[[CONST_1:.*]] = arith.constant 1 : i32
!CHECK: omp.sections allocate(%[[CONST_1]] : i32 -> %0 : !fir.ref<i32>) {
!CHECK: %[[CONST_1:.*]] = arith.constant 4 : i64
!CHECK: omp.sections allocate(%[[CONST_1]] : i64 -> %0 : !fir.ref<i32>) {
!CHECK: omp.section {
!CHECK: %[[PRIVATE_ETA:.*]] = fir.alloca f32 {bindc_name = "eta", pinned, uniq_name = "_QFEeta"}
!CHECK: %[[PRIVATE_DOUBLE_COUNT:.*]] = fir.alloca i32 {bindc_name = "double_count", pinned, uniq_name = "_QFEdouble_count"}

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
!RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fopenmp %s -o - | FileCheck %s
!RUN: bbc -emit-fir -hlfir=false -fopenmp %s -o - | FileCheck %s
@@ -55,7 +57,7 @@ subroutine single_allocate()
integer :: x
!CHECK: omp.parallel {
!$omp parallel
!CHECK: omp.single allocate(%{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>) {
!CHECK: omp.single allocate(%{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>) {
!$omp single allocate(omp_high_bw_mem_alloc: x) private(x)
!CHECK: arith.addi
x = x + 12

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
!RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fopenmp %s -o - | FileCheck %s
!CHECK-LABEL: func @_QPomp_task_simple() {
@@ -63,7 +65,7 @@ end subroutine omp_task_priority
subroutine task_allocate()
use omp_lib
integer :: x
!CHECK: omp.task allocate(%{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>) {
!CHECK: omp.task allocate(%{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>) {
!$omp task allocate(omp_high_bw_mem_alloc: x) private(x)
!CHECK: arith.addi
x = x + 12
@@ -217,7 +219,7 @@ subroutine task_multiple_clauses()
integer :: x, y, z
logical :: buzz
!CHECK: omp.task if(%{{.+}}) final(%{{.+}}) priority(%{{.+}}) allocate(%{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>) {
!CHECK: omp.task if(%{{.+}}) final(%{{.+}}) priority(%{{.+}}) allocate(%{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>) {
!$omp task if(buzz) final(buzz) priority(z) allocate(omp_high_bw_mem_alloc: x) private(x) firstprivate(y)
!CHECK: %[[x_priv:.+]] = fir.alloca i32

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
!RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fopenmp %s -o - | FileCheck %s
!CHECK-LABEL: @_QPomp_taskgroup
@@ -5,9 +7,9 @@ subroutine omp_taskgroup
use omp_lib
integer :: allocated_x
!CHECK-DAG: %{{.*}} = fir.alloca i32 {bindc_name = "allocated_x", uniq_name = "_QFomp_taskgroupEallocated_x"}
!CHECK-DAG: %{{.*}} = arith.constant 1 : i32
!CHECK-DAG: %{{.*}} = arith.constant 4 : i64
!CHECK: omp.taskgroup allocate(%{{.*}} : i32 -> %0 : !fir.ref<i32>)
!CHECK: omp.taskgroup allocate(%{{.*}} : i64 -> %0 : !fir.ref<i32>)
!$omp taskgroup allocate(omp_high_bw_mem_alloc: allocated_x)
!$omp task
!CHECK: fir.call @_QPwork() {{.*}}: () -> ()

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %flang_fc1 -emit-fir -fopenmp %s -o - | FileCheck %s
! CHECK-LABEL: func @_QPteams_simple
@@ -104,8 +106,9 @@ end subroutine teams_threadlimit
subroutine teams_allocate()
use omp_lib
integer :: x
integer :: y
! CHECK: omp.teams
! CHECK-SAME: allocate(%{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>)
! CHECK-SAME: allocate(%{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>)
!$omp teams allocate(omp_high_bw_mem_alloc: x) private(x)
! CHECK: arith.addi
x = x + 12

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! This test checks the lowering of atomic capture
! RUN: bbc -fopenmp -emit-hlfir %s -o - | FileCheck %s

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: bbc -fopenmp -emit-hlfir %s -o - | FileCheck %s
! This test checks the lowering of atomic read

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! This test checks lowering of atomic and atomic update constructs
! RUN: bbc -fopenmp -emit-hlfir %s -o - | FileCheck %s
! RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: bbc -fopenmp -emit-hlfir %s -o - | FileCheck %s
! This test checks the lowering of atomic write
@@ -21,8 +23,8 @@
!CHECK: %[[Z_VAL:.*]] = fir.load %[[Z_DECL]]#0 : !fir.ref<i32>
!CHECK: %[[C2:.*]] = arith.constant 2 : i32
!CHECK: %[[Z_DIV_2:.*]] = arith.divsi %[[Z_VAL]], %[[C2]] : i32
!CHECK: %172 = arith.addi %[[TEN_X]], %[[Z_DIV_2]] : i32
!CHECK: omp.atomic.write %163#1 = %172 hint(speculative) memory_order(release) : !fir.ref<i32>, i32
!CHECK: %[[ADD_RES:.*]] = arith.addi %[[TEN_X]], %[[Z_DIV_2]] : i32
!CHECK: omp.atomic.write %[[Y_DECL]]#1 = %[[ADD_RES]] hint(speculative) memory_order(release) : !fir.ref<i32>, i32
program OmpAtomicWrite
use omp_lib

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
!CHECK: omp.critical.declare @help2

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - 2>&1 | FileCheck %s
! RUN: bbc -fopenmp -emit-hlfir -o - %s 2>&1 | FileCheck %s
! RUN: %flang_fc1 -emit-fir -fopenmp %s -o - 2>&1 | FileCheck %s

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
!===============================================================================
@@ -37,12 +39,12 @@ end subroutine omp_parallel_sections
subroutine omp_parallel_sections_allocate(x, y)
use omp_lib
integer, intent(inout) :: x, y
!CHECK: %[[allocator_1:.*]] = arith.constant 1 : i32
!CHECK: %[[allocator_2:.*]] = arith.constant 1 : i32
!CHECK: %[[allocator_1:.*]] = arith.constant 4 : i64
!CHECK: %[[allocator_2:.*]] = arith.constant 4 : i64
!CHECK: omp.parallel allocate(
!CHECK: %[[allocator_2]] : i32 -> %{{.*}} : !fir.ref<i32>) {
!CHECK: %[[allocator_2]] : i64 -> %{{.*}} : !fir.ref<i32>) {
!CHECK: omp.sections allocate(
!CHECK: %[[allocator_1]] : i32 -> %{{.*}} : !fir.ref<i32>) {
!CHECK: %[[allocator_1]] : i64 -> %{{.*}} : !fir.ref<i32>) {
!$omp parallel sections allocate(omp_high_bw_mem_alloc: x)
!CHECK: omp.section {
!$omp section

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
!CHECK-LABEL: func @_QPparallel_simple
@@ -152,7 +154,7 @@ subroutine parallel_allocate()
use omp_lib
integer :: x
!CHECK: omp.parallel allocate(
!CHECK: %{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>
!CHECK: %{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>
!CHECK: ) {
!$omp parallel allocate(omp_high_bw_mem_alloc: x) private(x)
!CHECK: arith.addi
@@ -193,7 +195,7 @@ subroutine parallel_multiple_clauses(alpha, num_threads)
!$omp end parallel
!CHECK: omp.parallel if({{.*}} : i1) num_threads({{.*}} : i32) allocate(
!CHECK: %{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>
!CHECK: %{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>
!CHECK: ) {
!$omp parallel num_threads(num_threads) if(alpha .le. 0) allocate(omp_high_bw_mem_alloc: alpha) private(alpha)
!CHECK: fir.call

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! This test checks the lowering of OpenMP sections construct with several clauses present
! RUN: %flang_fc1 -flang-experimental-hlfir -emit-hlfir -fopenmp %s -o - | FileCheck %s
@@ -7,8 +9,8 @@
!CHECK: %[[COUNT:.*]] = fir.address_of(@_QFEcount) : !fir.ref<i32>
!CHECK: %[[COUNT_DECL:.*]]:2 = hlfir.declare %[[COUNT]] {uniq_name = "_QFEcount"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
!CHECK: %[[ETA:.*]] = fir.alloca f32 {bindc_name = "eta", uniq_name = "_QFEeta"}
!CHECK: %[[CONST_1:.*]] = arith.constant 1 : i32
!CHECK: omp.sections allocate(%[[CONST_1]] : i32 -> %[[COUNT_DECL]]#1 : !fir.ref<i32>) {
!CHECK: %[[CONST_1:.*]] = arith.constant 4 : i64
!CHECK: omp.sections allocate(%[[CONST_1]] : i64 -> %[[COUNT_DECL]]#1 : !fir.ref<i32>) {
!CHECK: omp.section {
!CHECK: %[[PRIVATE_ETA:.*]] = fir.alloca f32 {bindc_name = "eta", pinned, uniq_name = "_QFEeta"}
!CHECK: %[[PRIVATE_ETA_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_ETA]] {uniq_name = "_QFEeta"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
!RUN: bbc -emit-hlfir -fopenmp %s -o - | FileCheck %s
@@ -57,7 +59,7 @@ subroutine single_allocate()
integer :: x
!CHECK: omp.parallel {
!$omp parallel
!CHECK: omp.single allocate(%{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>) {
!CHECK: omp.single allocate(%{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>) {
!$omp single allocate(omp_high_bw_mem_alloc: x) private(x)
!CHECK: arith.addi
x = x + 12

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
!CHECK-LABEL: func @_QPomp_task_simple() {
@@ -63,7 +65,7 @@ end subroutine omp_task_priority
subroutine task_allocate()
use omp_lib
integer :: x
!CHECK: omp.task allocate(%{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>) {
!CHECK: omp.task allocate(%{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>) {
!$omp task allocate(omp_high_bw_mem_alloc: x) private(x)
!CHECK: arith.addi
x = x + 12
@@ -225,7 +227,7 @@ subroutine task_multiple_clauses()
integer :: x, y, z
logical :: buzz
!CHECK: omp.task if(%{{.+}}) final(%{{.+}}) priority(%{{.+}}) allocate(%{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>) {
!CHECK: omp.task if(%{{.+}}) final(%{{.+}}) priority(%{{.+}}) allocate(%{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>) {
!$omp task if(buzz) final(buzz) priority(z) allocate(omp_high_bw_mem_alloc: x) private(x) firstprivate(y)
!CHECK: %[[X_PRIV_ALLOCA:.+]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFtask_multiple_clausesEx"}

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
!CHECK-LABEL: @_QPomp_taskgroup
@@ -6,9 +8,9 @@ use omp_lib
integer :: allocated_x
!CHECK: %[[ALLOC_X_REF:.*]] = fir.alloca i32 {bindc_name = "allocated_x", uniq_name = "_QFomp_taskgroupEallocated_x"}
!CHECK-NEXT: %[[ALLOC_X_DECL:.*]]:2 = hlfir.declare %[[ALLOC_X_REF]] {uniq_name = "_QFomp_taskgroupEallocated_x"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
!CHECK: %[[C1:.*]] = arith.constant 1 : i32
!CHECK: %[[C4:.*]] = arith.constant 4 : i64
!CHECK: omp.taskgroup allocate(%[[C1]] : i32 -> %[[ALLOC_X_DECL]]#1 : !fir.ref<i32>)
!CHECK: omp.taskgroup allocate(%[[C4]] : i64 -> %[[ALLOC_X_DECL]]#1 : !fir.ref<i32>)
!$omp taskgroup allocate(omp_high_bw_mem_alloc: allocated_x)
!$omp task
!CHECK: fir.call @_QPwork() {{.*}}: () -> ()

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
! CHECK-LABEL: func @_QPteams_simple
@@ -105,7 +107,7 @@ subroutine teams_allocate()
use omp_lib
integer :: x
! CHECK: omp.teams
! CHECK-SAME: allocate(%{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>)
! CHECK-SAME: allocate(%{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>)
!$omp teams allocate(omp_high_bw_mem_alloc: x) private(x)
! CHECK: arith.addi
x = x + 12

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! Simple test for lowering of OpenMP Threadprivate Directive with HLFIR.
!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %flang_fc1 -fopenmp -fdebug-dump-parse-tree %s | FileCheck %s
! Ensures associated declarative OMP allocations in the specification
! part are kept there

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %flang_fc1 -fopenmp -fdebug-dump-parse-tree %s | FileCheck %s
! RUN: %flang_fc1 -fopenmp -fdebug-unparse %s | FileCheck %s --check-prefix="UNPARSE"
! Ensures associated declarative OMP allocations are nested in their
@@ -36,8 +38,8 @@ end program allocate_tree
!CHECK-NEXT: | | | | | Designator -> DataRef -> Name =
!CHECK-NEXT: | | | AllocateStmt
!UNPARSE: !$OMP ALLOCATE (w) ALLOCATOR(1_4)
!UNPARSE-NEXT: !$OMP ALLOCATE (xarray) ALLOCATOR(1_4)
!UNPARSE-NEXT: !$OMP ALLOCATE (zarray) ALLOCATOR(1_4)
!UNPARSE: !$OMP ALLOCATE (w) ALLOCATOR(3_8)
!UNPARSE-NEXT: !$OMP ALLOCATE (xarray) ALLOCATOR(2_8)
!UNPARSE-NEXT: !$OMP ALLOCATE (zarray) ALLOCATOR(1_8)
!UNPARSE-NEXT: !$OMP ALLOCATE
!UNPARSE-NEXT: ALLOCATE(w, xarray(4_4), zarray(t,z))

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %flang_fc1 -fdebug-unparse-no-sema -fopenmp %s | FileCheck --ignore-case %s
! RUN: %flang_fc1 -fdebug-dump-parse-tree -fopenmp %s | FileCheck --check-prefix="PARSE-TREE" %s
! Checks the parsing of Openmp 5.0 Target Device constructs

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.2
! The allocate clause's allocator modifier must be of type allocator_handle

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! Check OpenMP Allocate directive
use omp_lib

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.0
! 2.11.3 allocate Directive

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.0
! 2.11.3 allocate Directive

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.0
! 2.11.3 allocate Directive

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.0
! 2.11.3 allocate Directive

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.0
! 2.11.3 allocate Directive

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.0
! 2.11.3 allocate Directive

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.0
! 2.11.3 allocate Directive

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.0
! 2.11.3 allocate Directive

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.0
! 2.11.3 allocate Directive

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.2
! 6.7 allocators construct

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.2
! 6.7 allocators construct

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.2
! 6.7 allocators construct

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.2
! Inherited from 2.11.3 allocate Directive

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.2
! Inherited from 2.11.3 allocate directive

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.2
! Inherited from 2.11.3 allocate directive

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! Semantic checks on hint clauses, as they appear on atomic constructs

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! Semantic checks for OpenMP 5.0 standard 2.17.7 atomic Construct.

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Atomic construct

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Atomic construct

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Atomic construct

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang -fopenmp
! This tests the various semantics related to the clauses of various OpenMP atomic constructs

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
use omp_lib
! Check OpenMP clause validity for the following directives:

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! Semantic checks on hint clauses, as they appear on critical construct

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.1
! Check OpenMP construct validity for the following directives:

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! Check OpenMP 5.0 - 2.17.8 flush Construct

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! Semantic checks for various assignments related to atomic constructs

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang -fopenmp
! OpenMP version 5.0.0
! 2.13.3 parallel sections Construct

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
use omp_lib
!2.11.4 Allocate Clause

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang -fopenmp
! OpenMP version 5.0.0
! 2.8.1 sections construct

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang -fopenmp
! OpenMP Version 5.0

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang -fopenmp
use omp_lib

View File

@@ -1,3 +1,5 @@
! REQUIRES: openmp_runtime
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 5.1
! Check OpenMP construct validity for the following directives:

View File

@@ -200,6 +200,10 @@ result = lit_config.params.get("LIBPGMATH")
if result:
config.environment["LIBPGMATH"] = True
# Determine if OpenMP runtime was built (enable OpenMP tests via REQUIRES in test file)
if config.have_openmp_rtl:
config.available_features.add("openmp_runtime")
# Add features and substitutions to test F128 math support.
# %f128-lib substitution may be used to generate check prefixes
# for LIT tests checking for F128 library support.

View File

@@ -25,6 +25,7 @@ config.cc = "@CMAKE_C_COMPILER@"
config.osx_sysroot = path(r"@CMAKE_OSX_SYSROOT@")
config.targets_to_build = "@TARGETS_TO_BUILD@"
config.default_sysroot = "@DEFAULT_SYSROOT@"
config.have_openmp_rtl = ("@LLVM_TOOL_OPENMP_BUILD@" == "TRUE")
config.flang_runtime_f128_math_lib = "@FLANG_RUNTIME_F128_MATH_LIB@"
import lit.llvm

View File

@@ -17,7 +17,6 @@ set(MODULES
"ieee_features"
"iso_c_binding"
"iso_fortran_env"
"omp_lib"
"__fortran_builtins"
"__fortran_type_info"
)
@@ -59,6 +58,7 @@ if (NOT CMAKE_CROSSCOMPILING)
endif()
endif()
# TODO: We may need to flag this with conditional, in case Flang is built w/o OpenMP support
add_custom_command(OUTPUT ${base}.mod
COMMAND ${CMAKE_COMMAND} -E make_directory ${FLANG_INTRINSIC_MODULES_DIR}
COMMAND flang-new -cpp -fsyntax-only ${opts} -module-dir ${FLANG_INTRINSIC_MODULES_DIR}
@@ -71,6 +71,30 @@ if (NOT CMAKE_CROSSCOMPILING)
list(APPEND MODULE_FILES ${base}.mod ${base}.f18.mod)
install(FILES ${base}.mod ${base}.f18.mod DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang")
endforeach()
# Special case for omp_lib.mod, because its source comes from openmp/runtime/src/include.
# It also produces two module files: omp_lib.mod and omp_lib_kinds.mod. Compile these
# files only if OpenMP support has been configured.
if (LLVM_TOOL_OPENMP_BUILD)
message(STATUS "OpenMP runtime support enabled via LLVM_ENABLED_PROJECTS, building omp_lib.mod")
set(base ${FLANG_INTRINSIC_MODULES_DIR}/omp_lib)
add_custom_command(OUTPUT ${base}.mod ${base}_kinds.mod
COMMAND ${CMAKE_COMMAND} -E make_directory ${FLANG_INTRINSIC_MODULES_DIR}
COMMAND flang-new -cpp -fsyntax-only ${opts} -module-dir ${FLANG_INTRINSIC_MODULES_DIR}
${CMAKE_BINARY_DIR}/projects/openmp/runtime/src/omp_lib.F90
DEPENDS flang-new ${FLANG_INTRINSIC_MODULES_DIR}/iso_c_binding.mod ${CMAKE_BINARY_DIR}/projects/openmp/runtime/src/omp_lib.F90 ${depends}
)
add_custom_command(OUTPUT ${base}.f18.mod
DEPENDS ${base}.mod
COMMAND ${CMAKE_COMMAND} -E copy ${base}.mod ${base}.f18.mod)
add_custom_command(OUTPUT ${base}_kinds.f18.mod
DEPENDS ${base}.mod
COMMAND ${CMAKE_COMMAND} -E copy ${base}_kinds.mod ${base}_kinds.f18.mod)
list(APPEND MODULE_FILES ${base}.mod ${base}.f18.mod ${base}_kinds.mod ${base}_kinds.f18.mod)
install(FILES ${base}.mod ${base}.f18.mod ${base}_kinds.mod ${base}_kinds.f18.mod DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang")
else()
message(STATUS "Not building omp_lib.mod, no OpenMP runtime in LLVM_ENABLED_PROJECTS")
endif()
endif()
add_custom_target(module_files ALL DEPENDS ${MODULE_FILES})
@@ -87,5 +111,11 @@ if (NOT WIN32)
endif()
# TODO Move this to a more suitable location
file(COPY ${FLANG_SOURCE_DIR}/module/omp_lib.h DESTINATION "${CMAKE_BINARY_DIR}/include/flang/OpenMP/" FILE_PERMISSIONS OWNER_READ OWNER_WRITE)
install(FILES ${CMAKE_BINARY_DIR}/include/flang/OpenMP/omp_lib.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang/OpenMP")
# Copy the generated omp_lib.h header file, if OpenMP support has been configured.
if (LLVM_TOOL_OPENMP_BUILD)
message(STATUS "OpenMP runtime support enabled via LLVM_ENABLED_PROJECTS, building omp_lib.h")
file(COPY ${CMAKE_BINARY_DIR}/projects/openmp/runtime/src/omp_lib.h DESTINATION "${CMAKE_BINARY_DIR}/include/flang/OpenMP/" FILE_PERMISSIONS OWNER_READ OWNER_WRITE)
install(FILES ${CMAKE_BINARY_DIR}/include/flang/OpenMP/omp_lib.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang/OpenMP")
else()
message(STATUS "Not copying omp_lib.h, no OpenMP runtime in LLVM_ENABLED_PROJECTS")
endif()

View File

@@ -425,6 +425,15 @@ if(runtimes)
# together in a single CMake invocation.
set(extra_deps "")
if("openmp" IN_LIST LLVM_ENABLE_RUNTIMES)
if (${LLVM_TOOL_FLANG_BUILD})
message(STATUS "Configuring build of omp_lib.mod and omp_lib_kinds.mod via flang-new")
set(LIBOMP_FORTRAN_MODULES_COMPILER "${CMAKE_BINARY_DIR}/bin/flang-new")
set(LIBOMP_MODULES_INSTALL_PATH "${CMAKE_INSTALL_INCLUDEDIR}/flang")
# TODO: This is a workaround until flang becomes a first-class project
# in llvm/CMakeList.txt. Until then, this line ensures that flang-new is
# built before "openmp" is built as a runtime project.
list(APPEND extra_deps "flang-new")
endif()
foreach(dep opt llvm-link llvm-extract clang clang-offload-packager)
if(TARGET ${dep} AND OPENMP_ENABLE_LIBOMPTARGET)
list(APPEND extra_deps ${dep})

View File

@@ -316,9 +316,25 @@ endif()
# Building the Fortran module files
# One compilation step creates both omp_lib.mod and omp_lib_kinds.mod
if(${LIBOMP_FORTRAN_MODULES})
configure_file(${LIBOMP_INC_DIR}/omp_lib.h.var omp_lib.h @ONLY)
configure_file(${LIBOMP_INC_DIR}/omp_lib.f90.var omp_lib.f90 @ONLY)
configure_file(${LIBOMP_INC_DIR}/omp_lib.h.var omp_lib.h @ONLY)
configure_file(${LIBOMP_INC_DIR}/omp_lib.F90.var omp_lib.F90 @ONLY)
set(BUILD_FORTRAN_MODULES False)
if (NOT ${LIBOMP_FORTRAN_MODULES_COMPILER} STREQUAL "")
# If libomp is built as an LLVM runtime and the flang compiler is available,
# compile the Fortran module files.
message(STATUS "configuring openmp to build Fortran module files using ${LIBOMP_FORTRAN_MODULES_COMPILER}")
set(LIBOMP_FORTRAN_SOURCE_FILE omp_lib.F90)
add_custom_target(libomp-mod ALL DEPENDS omp_lib.mod omp_lib_kinds.mod)
add_custom_command(
OUTPUT omp_lib.mod omp_lib_kinds.mod
COMMAND ${LIBOMP_FORTRAN_MODULES_COMPILER} -cpp -fsyntax-only ${LIBOMP_FORTRAN_SOURCE_FILE}
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${LIBOMP_FORTRAN_SOURCE_FILE}
${CMAKE_CURRENT_BINARY_DIR}/omp_lib.h
)
set(BUILD_FORTRAN_MODULES True)
elseif(${LIBOMP_FORTRAN_MODULES})
# The following requests explicit building of the Fortran module files
# Workaround for gfortran to build modules with the
# omp_sched_monotonic integer parameter
if (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
@@ -327,7 +343,7 @@ if(${LIBOMP_FORTRAN_MODULES})
add_custom_target(libomp-mod ALL DEPENDS omp_lib.mod omp_lib_kinds.mod)
libomp_get_fflags(LIBOMP_CONFIGURED_FFLAGS)
if(CMAKE_Fortran_COMPILER_SUPPORTS_F90)
set(LIBOMP_FORTRAN_SOURCE_FILE omp_lib.f90)
set(LIBOMP_FORTRAN_SOURCE_FILE omp_lib.F90)
else()
message(FATAL_ERROR "Fortran module build requires Fortran 90 compiler")
endif()
@@ -339,6 +355,7 @@ if(${LIBOMP_FORTRAN_MODULES})
${CMAKE_CURRENT_BINARY_DIR}/omp_lib.h
)
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES omp_lib${CMAKE_C_OUTPUT_EXTENSION})
set(BUILD_FORTRAN_MODULES True)
endif()
# Move files to exports/ directory if requested
@@ -412,11 +429,15 @@ if(${LIBOMP_OMPT_SUPPORT})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/omp-tools.h DESTINATION ${LIBOMP_HEADERS_INSTALL_PATH} RENAME ompt.h)
set(LIBOMP_OMP_TOOLS_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE)
endif()
if(${LIBOMP_FORTRAN_MODULES})
if(${BUILD_FORTRAN_MODULES})
set (destination ${LIBOMP_HEADERS_INSTALL_PATH})
if (NOT ${LIBOMP_MODULES_INSTALL_PATH} STREQUAL "")
set (destination ${LIBOMP_MODULES_INSTALL_PATH})
endif()
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/omp_lib.h
${CMAKE_CURRENT_BINARY_DIR}/omp_lib.mod
${CMAKE_CURRENT_BINARY_DIR}/omp_lib_kinds.mod
DESTINATION ${LIBOMP_HEADERS_INSTALL_PATH}
DESTINATION ${destination}
)
endif()

View File

@@ -14,37 +14,42 @@
use, intrinsic :: iso_c_binding
integer, parameter :: omp_integer_kind = c_int
integer, parameter :: omp_logical_kind = 4
integer, parameter :: omp_real_kind = c_float
integer, parameter :: kmp_double_kind = c_double
integer, parameter :: omp_lock_kind = c_intptr_t
integer, parameter :: omp_nest_lock_kind = c_intptr_t
integer, parameter :: omp_sched_kind = omp_integer_kind
integer, parameter :: omp_proc_bind_kind = omp_integer_kind
integer, parameter :: kmp_pointer_kind = c_intptr_t
integer, parameter :: kmp_size_t_kind = c_size_t
integer, parameter :: kmp_affinity_mask_kind = c_intptr_t
integer, parameter :: kmp_cancel_kind = omp_integer_kind
integer, parameter :: omp_sync_hint_kind = omp_integer_kind
integer, parameter :: omp_lock_hint_kind = omp_sync_hint_kind
integer, parameter :: omp_control_tool_kind = omp_integer_kind
integer, parameter :: omp_control_tool_result_kind = omp_integer_kind
integer, parameter :: omp_allocator_handle_kind = c_intptr_t
integer, parameter :: omp_memspace_handle_kind = c_intptr_t
integer, parameter :: omp_alloctrait_key_kind = omp_integer_kind
integer, parameter :: omp_alloctrait_val_kind = c_intptr_t
integer, parameter :: omp_interop_kind = c_intptr_t
integer, parameter :: omp_interop_fr_kind = omp_integer_kind
! Set PRIVATE by default to explicitly only export what is meant
! to be exported by this MODULE.
private
integer, parameter, public :: omp_integer_kind = c_int
integer, parameter, public :: omp_logical_kind = 4
integer, parameter, public :: omp_real_kind = c_float
integer, parameter, public :: kmp_double_kind = c_double
integer, parameter, public :: omp_lock_kind = c_intptr_t
integer, parameter, public :: omp_nest_lock_kind = c_intptr_t
integer, parameter, public :: omp_sched_kind = omp_integer_kind
integer, parameter, public :: omp_proc_bind_kind = omp_integer_kind
integer, parameter, public :: kmp_pointer_kind = c_intptr_t
integer, parameter, public :: kmp_size_t_kind = c_size_t
integer, parameter, public :: kmp_affinity_mask_kind = c_intptr_t
integer, parameter, public :: kmp_cancel_kind = omp_integer_kind
integer, parameter, public :: omp_sync_hint_kind = omp_integer_kind
integer, parameter, public :: omp_lock_hint_kind = omp_sync_hint_kind
integer, parameter, public :: omp_control_tool_kind = omp_integer_kind
integer, parameter, public :: omp_control_tool_result_kind = omp_integer_kind
integer, parameter, public :: omp_allocator_handle_kind = c_intptr_t
integer, parameter, public :: omp_memspace_handle_kind = c_intptr_t
integer, parameter, public :: omp_alloctrait_key_kind = omp_integer_kind
integer, parameter, public :: omp_alloctrait_val_kind = c_intptr_t
integer, parameter, public :: omp_interop_kind = c_intptr_t
integer, parameter, public :: omp_interop_fr_kind = omp_integer_kind
type omp_alloctrait
integer(kind=omp_alloctrait_key_kind) key
integer(kind=omp_alloctrait_val_kind) value
end type omp_alloctrait
public :: omp_alloctrait
integer, parameter :: omp_pause_resource_kind = omp_integer_kind
integer, parameter :: omp_depend_kind = c_intptr_t
integer, parameter :: omp_event_handle_kind = c_intptr_t
integer, parameter, public :: omp_pause_resource_kind = omp_integer_kind
integer, parameter, public :: omp_depend_kind = c_intptr_t
integer, parameter, public :: omp_event_handle_kind = c_intptr_t
end module omp_lib_kinds
@@ -52,119 +57,151 @@
use omp_lib_kinds
integer (kind=omp_integer_kind), parameter :: openmp_version = @LIBOMP_OMP_YEAR_MONTH@
integer (kind=omp_integer_kind), parameter :: kmp_version_major = @LIBOMP_VERSION_MAJOR@
integer (kind=omp_integer_kind), parameter :: kmp_version_minor = @LIBOMP_VERSION_MINOR@
integer (kind=omp_integer_kind), parameter :: kmp_version_build = @LIBOMP_VERSION_BUILD@
! Set PRIVATE by default to explicitly only export what is meant
! to be exported by this MODULE.
private
! Re-export definitions in omp_lib_kinds
public :: omp_integer_kind
public :: omp_logical_kind
public :: omp_real_kind
public :: kmp_double_kind
public :: omp_lock_kind
public :: omp_nest_lock_kind
public :: omp_sched_kind
public :: omp_proc_bind_kind
public :: kmp_pointer_kind
public :: kmp_size_t_kind
public :: kmp_affinity_mask_kind
public :: kmp_cancel_kind
public :: omp_sync_hint_kind
public :: omp_lock_hint_kind
public :: omp_control_tool_kind
public :: omp_control_tool_result_kind
public :: omp_allocator_handle_kind
public :: omp_memspace_handle_kind
public :: omp_alloctrait_key_kind
public :: omp_alloctrait_val_kind
public :: omp_interop_kind
public :: omp_interop_fr_kind
public :: omp_alloctrait
public :: omp_pause_resource_kind
public :: omp_depend_kind
public :: omp_event_handle_kind
integer (kind=omp_integer_kind), parameter, public :: openmp_version = @LIBOMP_OMP_YEAR_MONTH@
integer (kind=omp_integer_kind), parameter, public :: kmp_version_major = @LIBOMP_VERSION_MAJOR@
integer (kind=omp_integer_kind), parameter, public :: kmp_version_minor = @LIBOMP_VERSION_MINOR@
integer (kind=omp_integer_kind), parameter, public :: kmp_version_build = @LIBOMP_VERSION_BUILD@
character(*) kmp_build_date
parameter( kmp_build_date = '@LIBOMP_BUILD_DATE@' )
integer(kind=omp_sched_kind), parameter :: omp_sched_static = 1
integer(kind=omp_sched_kind), parameter :: omp_sched_dynamic = 2
integer(kind=omp_sched_kind), parameter :: omp_sched_guided = 3
integer(kind=omp_sched_kind), parameter :: omp_sched_auto = 4
integer(kind=omp_sched_kind), parameter :: omp_sched_monotonic = int(Z'80000000', kind=omp_sched_kind)
integer(kind=omp_sched_kind), parameter, public :: omp_sched_static = 1
integer(kind=omp_sched_kind), parameter, public :: omp_sched_dynamic = 2
integer(kind=omp_sched_kind), parameter, public :: omp_sched_guided = 3
integer(kind=omp_sched_kind), parameter, public :: omp_sched_auto = 4
integer(kind=omp_sched_kind), parameter, public :: omp_sched_monotonic = int(Z'80000000', kind=omp_sched_kind)
integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_false = 0
integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_true = 1
integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_master = 2
integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_close = 3
integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_spread = 4
integer (kind=omp_proc_bind_kind), parameter, public :: omp_proc_bind_false = 0
integer (kind=omp_proc_bind_kind), parameter, public :: omp_proc_bind_true = 1
integer (kind=omp_proc_bind_kind), parameter, public :: omp_proc_bind_master = 2
integer (kind=omp_proc_bind_kind), parameter, public :: omp_proc_bind_close = 3
integer (kind=omp_proc_bind_kind), parameter, public :: omp_proc_bind_spread = 4
integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_parallel = 1
integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_loop = 2
integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_sections = 3
integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_taskgroup = 4
integer (kind=kmp_cancel_kind), parameter, public :: kmp_cancel_parallel = 1
integer (kind=kmp_cancel_kind), parameter, public :: kmp_cancel_loop = 2
integer (kind=kmp_cancel_kind), parameter, public :: kmp_cancel_sections = 3
integer (kind=kmp_cancel_kind), parameter, public :: kmp_cancel_taskgroup = 4
integer (kind=omp_sync_hint_kind), parameter :: omp_sync_hint_none = 0
integer (kind=omp_sync_hint_kind), parameter :: omp_sync_hint_uncontended = 1
integer (kind=omp_sync_hint_kind), parameter :: omp_sync_hint_contended = 2
integer (kind=omp_sync_hint_kind), parameter :: omp_sync_hint_nonspeculative = 4
integer (kind=omp_sync_hint_kind), parameter :: omp_sync_hint_speculative = 8
integer (kind=omp_lock_hint_kind), parameter :: omp_lock_hint_none = omp_sync_hint_none
integer (kind=omp_lock_hint_kind), parameter :: omp_lock_hint_uncontended = omp_sync_hint_uncontended
integer (kind=omp_lock_hint_kind), parameter :: omp_lock_hint_contended = omp_sync_hint_contended
integer (kind=omp_lock_hint_kind), parameter :: omp_lock_hint_nonspeculative = omp_sync_hint_nonspeculative
integer (kind=omp_lock_hint_kind), parameter :: omp_lock_hint_speculative = omp_sync_hint_speculative
integer (kind=omp_lock_hint_kind), parameter :: kmp_lock_hint_hle = 65536
integer (kind=omp_lock_hint_kind), parameter :: kmp_lock_hint_rtm = 131072
integer (kind=omp_lock_hint_kind), parameter :: kmp_lock_hint_adaptive = 262144
integer (kind=omp_sync_hint_kind), parameter, public :: omp_sync_hint_none = 0
integer (kind=omp_sync_hint_kind), parameter, public :: omp_sync_hint_uncontended = 1
integer (kind=omp_sync_hint_kind), parameter, public :: omp_sync_hint_contended = 2
integer (kind=omp_sync_hint_kind), parameter, public :: omp_sync_hint_nonspeculative = 4
integer (kind=omp_sync_hint_kind), parameter, public :: omp_sync_hint_speculative = 8
integer (kind=omp_lock_hint_kind), parameter, public :: omp_lock_hint_none = omp_sync_hint_none
integer (kind=omp_lock_hint_kind), parameter, public :: omp_lock_hint_uncontended = omp_sync_hint_uncontended
integer (kind=omp_lock_hint_kind), parameter, public :: omp_lock_hint_contended = omp_sync_hint_contended
integer (kind=omp_lock_hint_kind), parameter, public :: omp_lock_hint_nonspeculative = omp_sync_hint_nonspeculative
integer (kind=omp_lock_hint_kind), parameter, public :: omp_lock_hint_speculative = omp_sync_hint_speculative
integer (kind=omp_lock_hint_kind), parameter, public :: kmp_lock_hint_hle = 65536
integer (kind=omp_lock_hint_kind), parameter, public :: kmp_lock_hint_rtm = 131072
integer (kind=omp_lock_hint_kind), parameter, public :: kmp_lock_hint_adaptive = 262144
integer (kind=omp_control_tool_kind), parameter :: omp_control_tool_start = 1
integer (kind=omp_control_tool_kind), parameter :: omp_control_tool_pause = 2
integer (kind=omp_control_tool_kind), parameter :: omp_control_tool_flush = 3
integer (kind=omp_control_tool_kind), parameter :: omp_control_tool_end = 4
integer (kind=omp_control_tool_kind), parameter, public :: omp_control_tool_start = 1
integer (kind=omp_control_tool_kind), parameter, public :: omp_control_tool_pause = 2
integer (kind=omp_control_tool_kind), parameter, public :: omp_control_tool_flush = 3
integer (kind=omp_control_tool_kind), parameter, public :: omp_control_tool_end = 4
integer (kind=omp_control_tool_result_kind), parameter :: omp_control_tool_notool = -2
integer (kind=omp_control_tool_result_kind), parameter :: omp_control_tool_nocallback = -1
integer (kind=omp_control_tool_result_kind), parameter :: omp_control_tool_success = 0
integer (kind=omp_control_tool_result_kind), parameter :: omp_control_tool_ignored = 1
integer (kind=omp_control_tool_result_kind), parameter, public :: omp_control_tool_notool = -2
integer (kind=omp_control_tool_result_kind), parameter, public :: omp_control_tool_nocallback = -1
integer (kind=omp_control_tool_result_kind), parameter, public :: omp_control_tool_success = 0
integer (kind=omp_control_tool_result_kind), parameter, public :: omp_control_tool_ignored = 1
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_sync_hint = 1
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_alignment = 2
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_access = 3
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_pool_size = 4
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_fallback = 5
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_fb_data = 6
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_pinned = 7
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_partition = 8
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_sync_hint = 1
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_alignment = 2
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_access = 3
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_pool_size = 4
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_fallback = 5
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_fb_data = 6
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_pinned = 7
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_partition = 8
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_default = -1
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_false = 0
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_true = 1
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_contended = 3
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_uncontended = 4
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_serialized = 5
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_sequential = omp_atv_serialized
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_private = 6
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_all = 7
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_thread = 8
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_pteam = 9
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_cgroup = 10
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_default_mem_fb = 11
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_null_fb = 12
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_abort_fb = 13
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_allocator_fb = 14
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_environment = 15
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_nearest = 16
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_blocked = 17
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_interleaved = 18
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_default = -1
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_false = 0
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_true = 1
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_contended = 3
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_uncontended = 4
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_serialized = 5
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_sequential = omp_atv_serialized
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_private = 6
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_all = 7
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_thread = 8
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_pteam = 9
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_cgroup = 10
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_default_mem_fb = 11
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_null_fb = 12
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_abort_fb = 13
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_allocator_fb = 14
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_environment = 15
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_nearest = 16
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_blocked = 17
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_interleaved = 18
integer (kind=omp_allocator_handle_kind), parameter :: omp_null_allocator = 0
integer (kind=omp_allocator_handle_kind), parameter :: omp_default_mem_alloc = 1
integer (kind=omp_allocator_handle_kind), parameter :: omp_large_cap_mem_alloc = 2
integer (kind=omp_allocator_handle_kind), parameter :: omp_const_mem_alloc = 3
integer (kind=omp_allocator_handle_kind), parameter :: omp_high_bw_mem_alloc = 4
integer (kind=omp_allocator_handle_kind), parameter :: omp_low_lat_mem_alloc = 5
integer (kind=omp_allocator_handle_kind), parameter :: omp_cgroup_mem_alloc = 6
integer (kind=omp_allocator_handle_kind), parameter :: omp_pteam_mem_alloc = 7
integer (kind=omp_allocator_handle_kind), parameter :: omp_thread_mem_alloc = 8
integer (kind=omp_allocator_handle_kind), parameter :: llvm_omp_target_host_mem_alloc = 100
integer (kind=omp_allocator_handle_kind), parameter :: llvm_omp_target_shared_mem_alloc = 101
integer (kind=omp_allocator_handle_kind), parameter :: llvm_omp_target_device_mem_alloc = 102
integer (kind=omp_allocator_handle_kind), parameter, public :: omp_null_allocator = 0
integer (kind=omp_allocator_handle_kind), parameter, public :: omp_default_mem_alloc = 1
integer (kind=omp_allocator_handle_kind), parameter, public :: omp_large_cap_mem_alloc = 2
integer (kind=omp_allocator_handle_kind), parameter, public :: omp_const_mem_alloc = 3
integer (kind=omp_allocator_handle_kind), parameter, public :: omp_high_bw_mem_alloc = 4
integer (kind=omp_allocator_handle_kind), parameter, public :: omp_low_lat_mem_alloc = 5
integer (kind=omp_allocator_handle_kind), parameter, public :: omp_cgroup_mem_alloc = 6
integer (kind=omp_allocator_handle_kind), parameter, public :: omp_pteam_mem_alloc = 7
integer (kind=omp_allocator_handle_kind), parameter, public :: omp_thread_mem_alloc = 8
integer (kind=omp_allocator_handle_kind), parameter, public :: llvm_omp_target_host_mem_alloc = 100
integer (kind=omp_allocator_handle_kind), parameter, public :: llvm_omp_target_shared_mem_alloc = 101
integer (kind=omp_allocator_handle_kind), parameter, public :: llvm_omp_target_device_mem_alloc = 102
integer (kind=omp_memspace_handle_kind), parameter :: omp_default_mem_space = 0
integer (kind=omp_memspace_handle_kind), parameter :: omp_large_cap_mem_space = 1
integer (kind=omp_memspace_handle_kind), parameter :: omp_const_mem_space = 2
integer (kind=omp_memspace_handle_kind), parameter :: omp_high_bw_mem_space = 3
integer (kind=omp_memspace_handle_kind), parameter :: omp_low_lat_mem_space = 4
integer (kind=omp_memspace_handle_kind), parameter :: llvm_omp_target_host_mem_space = 100
integer (kind=omp_memspace_handle_kind), parameter :: llvm_omp_target_shared_mem_space = 101
integer (kind=omp_memspace_handle_kind), parameter :: llvm_omp_target_device_mem_space = 102
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_default_mem_space = 0
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_large_cap_mem_space = 1
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_const_mem_space = 2
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_high_bw_mem_space = 3
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_low_lat_mem_space = 4
integer (kind=omp_memspace_handle_kind), parameter, public :: llvm_omp_target_host_mem_space = 100
integer (kind=omp_memspace_handle_kind), parameter, public :: llvm_omp_target_shared_mem_space = 101
integer (kind=omp_memspace_handle_kind), parameter, public :: llvm_omp_target_device_mem_space = 102
integer (kind=omp_pause_resource_kind), parameter :: omp_pause_resume = 0
integer (kind=omp_pause_resource_kind), parameter :: omp_pause_soft = 1
integer (kind=omp_pause_resource_kind), parameter :: omp_pause_hard = 2
integer (kind=omp_pause_resource_kind), parameter, public :: omp_pause_resume = 0
integer (kind=omp_pause_resource_kind), parameter, public :: omp_pause_soft = 1
integer (kind=omp_pause_resource_kind), parameter, public :: omp_pause_hard = 2
integer (kind=omp_interop_fr_kind), parameter :: omp_ifr_cuda = 1
integer (kind=omp_interop_fr_kind), parameter :: omp_ifr_cuda_driver = 2
integer (kind=omp_interop_fr_kind), parameter :: omp_ifr_opencl = 3
integer (kind=omp_interop_fr_kind), parameter :: omp_ifr_sycl = 4
integer (kind=omp_interop_fr_kind), parameter :: omp_ifr_hip = 5
integer (kind=omp_interop_fr_kind), parameter :: omp_ifr_level_zero = 6
integer (kind=omp_interop_fr_kind), parameter :: omp_ifr_last = 7
integer (kind=omp_interop_fr_kind), parameter, public :: omp_ifr_cuda = 1
integer (kind=omp_interop_fr_kind), parameter, public :: omp_ifr_cuda_driver = 2
integer (kind=omp_interop_fr_kind), parameter, public :: omp_ifr_opencl = 3
integer (kind=omp_interop_fr_kind), parameter, public :: omp_ifr_sycl = 4
integer (kind=omp_interop_fr_kind), parameter, public :: omp_ifr_hip = 5
integer (kind=omp_interop_fr_kind), parameter, public :: omp_ifr_level_zero = 6
integer (kind=omp_interop_fr_kind), parameter, public :: omp_ifr_last = 7
integer (kind=omp_interop_kind), parameter :: omp_interop_none = 0
integer (kind=omp_interop_kind), parameter, public :: omp_interop_none = 0
interface
@@ -392,82 +429,102 @@
end subroutine omp_fulfill_event
subroutine omp_init_lock(svar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_init_lock
!DIR$ ENDIF
#endif
use omp_lib_kinds
integer (kind=omp_lock_kind) svar
end subroutine omp_init_lock
subroutine omp_destroy_lock(svar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_destroy_lock
!DIR$ ENDIF
#endif
use omp_lib_kinds
integer (kind=omp_lock_kind) svar
end subroutine omp_destroy_lock
subroutine omp_set_lock(svar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_set_lock
!DIR$ ENDIF
#endif
use omp_lib_kinds
integer (kind=omp_lock_kind) svar
end subroutine omp_set_lock
subroutine omp_unset_lock(svar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_unset_lock
!DIR$ ENDIF
#endif
use omp_lib_kinds
integer (kind=omp_lock_kind) svar
end subroutine omp_unset_lock
function omp_test_lock(svar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_test_lock
!DIR$ ENDIF
#endif
use omp_lib_kinds
logical (kind=omp_logical_kind) omp_test_lock
integer (kind=omp_lock_kind) svar
end function omp_test_lock
subroutine omp_init_nest_lock(nvar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_init_nest_lock
!DIR$ ENDIF
#endif
use omp_lib_kinds
integer (kind=omp_nest_lock_kind) nvar
end subroutine omp_init_nest_lock
subroutine omp_destroy_nest_lock(nvar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_destroy_nest_lock
!DIR$ ENDIF
#endif
use omp_lib_kinds
integer (kind=omp_nest_lock_kind) nvar
end subroutine omp_destroy_nest_lock
subroutine omp_set_nest_lock(nvar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_set_nest_lock
!DIR$ ENDIF
#endif
use omp_lib_kinds
integer (kind=omp_nest_lock_kind) nvar
end subroutine omp_set_nest_lock
subroutine omp_unset_nest_lock(nvar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_unset_nest_lock
!DIR$ ENDIF
#endif
use omp_lib_kinds
integer (kind=omp_nest_lock_kind) nvar
end subroutine omp_unset_nest_lock
function omp_test_nest_lock(nvar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_test_nest_lock
!DIR$ ENDIF
#endif
use omp_lib_kinds
integer (kind=omp_integer_kind) omp_test_nest_lock
integer (kind=omp_nest_lock_kind) nvar
@@ -568,20 +625,20 @@
end subroutine omp_display_env
function omp_target_alloc(size, device_num) bind(c)
use omp_lib_kinds
use, intrinsic :: iso_c_binding, only: c_ptr, c_size_t, c_int
type(c_ptr) omp_target_alloc
integer(c_size_t), value :: size
integer(c_int), value :: device_num
end function omp_target_alloc
subroutine omp_target_free(device_ptr, device_num) bind(c)
use omp_lib_kinds
use, intrinsic :: iso_c_binding, only: c_ptr, c_int
type(c_ptr), value :: device_ptr
integer(c_int), value :: device_num
end subroutine omp_target_free
function omp_target_is_present(ptr, device_num) bind(c)
use omp_lib_kinds
use, intrinsic :: iso_c_binding, only: c_ptr, c_int
integer(c_int) omp_target_is_present
type(c_ptr), value :: ptr
integer(c_int), value :: device_num
@@ -589,7 +646,7 @@
function omp_target_memcpy(dst, src, length, dst_offset, src_offset, &
dst_device_num, src_device_num) bind(c)
use omp_lib_kinds
use, intrinsic :: iso_c_binding, only: c_ptr, c_size_t, c_int
integer(c_int) omp_target_memcpy
type(c_ptr), value :: dst, src
integer(c_size_t), value :: length, dst_offset, src_offset
@@ -599,7 +656,7 @@
function omp_target_memcpy_rect(dst, src, element_size, num_dims, &
volume, dst_offsets, src_offsets, dst_dimensions, &
src_dimensions, dst_device_num, src_device_num) bind(c)
use omp_lib_kinds
use, intrinsic :: iso_c_binding, only: c_ptr, c_size_t, c_int
integer(c_int) omp_target_memcpy_rect
type(c_ptr), value :: dst, src
integer(c_size_t), value :: element_size
@@ -612,6 +669,7 @@
src_offset, dst_device_num, src_device_num, depobj_count, &
depobj_list) bind(c)
use omp_lib_kinds
use, intrinsic :: iso_c_binding, only: c_ptr, c_size_t, c_int
integer(c_int) omp_target_memcpy_async
type(c_ptr), value :: dst, src
integer(c_size_t), value :: length, dst_offset, src_offset
@@ -625,6 +683,7 @@
src_dimensions, dst_device_num, src_device_num, depobj_count, &
depobj_list) bind(c)
use omp_lib_kinds
use, intrinsic :: iso_c_binding, only: c_ptr, c_size_t, c_int
integer(c_int) omp_target_memcpy_rect_async
type(c_ptr), value :: dst, src
integer(c_size_t), value :: element_size
@@ -646,8 +705,8 @@
function omp_target_memset_async(ptr, val, count, device_num, &
depobj_count, depobj_list) bind(c)
use, intrinsic :: iso_c_binding, only : c_ptr, c_int, c_size_t
use omp_lib_kinds
use, intrinsic :: iso_c_binding, only : c_ptr, c_int, c_size_t
type(c_ptr) :: omp_target_memset_async
type(c_ptr), value :: ptr
integer(c_int), value :: val
@@ -659,7 +718,7 @@
function omp_target_associate_ptr(host_ptr, device_ptr, size, &
device_offset, device_num) bind(c)
use omp_lib_kinds
use, intrinsic :: iso_c_binding, only: c_ptr, c_size_t, c_int
integer(c_int) omp_target_associate_ptr
type(c_ptr), value :: host_ptr, device_ptr
integer(c_size_t), value :: size, device_offset
@@ -667,21 +726,20 @@
end function omp_target_associate_ptr
function omp_get_mapped_ptr(ptr, device_num) bind(c)
use omp_lib_kinds
use, intrinsic :: iso_c_binding, only: c_ptr, c_int
type(c_ptr) omp_get_mapped_ptr
type(c_ptr), value :: ptr
integer(c_int), value :: device_num
end function omp_get_mapped_ptr
function omp_target_disassociate_ptr(ptr, device_num) bind(c)
use omp_lib_kinds
use, intrinsic :: iso_c_binding, only: c_ptr, c_int
integer(c_int) omp_target_disassociate_ptr
type(c_ptr), value :: ptr
integer(c_int), value :: device_num
end function omp_target_disassociate_ptr
function omp_target_is_accessible(ptr, size, device_num) bind(c)
use omp_lib_kinds
use, intrinsic :: iso_c_binding, only : c_ptr, c_size_t, c_int
integer(c_int) omp_target_is_accessible
type(c_ptr), value :: ptr
@@ -900,4 +958,124 @@
end interface
! make the above routine definitions public
public :: omp_set_num_threads
public :: omp_set_dynamic
public :: omp_set_nested
public :: omp_get_num_threads
public :: omp_get_max_threads
public :: omp_get_thread_num
public :: omp_get_num_procs
public :: omp_in_parallel
public :: omp_in_final
public :: omp_get_dynamic
public :: omp_get_nested
public :: omp_get_thread_limit
public :: omp_set_max_active_levels
public :: omp_get_max_active_levels
public :: omp_get_level
public :: omp_get_active_level
public :: omp_get_ancestor_thread_num
public :: omp_get_team_size
public :: omp_set_schedule
public :: omp_get_schedule
public :: omp_get_proc_bind
public :: omp_get_num_places
public :: omp_get_place_num_procs
public :: omp_get_place_proc_ids
public :: omp_get_place_num
public :: omp_get_partition_num_places
public :: omp_get_partition_place_nums
public :: omp_get_wtime
public :: omp_get_wtick
public :: omp_get_default_device
public :: omp_set_default_device
public :: omp_get_num_devices
public :: omp_get_num_teams
public :: omp_get_team_num
public :: omp_get_cancellation
public :: omp_is_initial_device
public :: omp_get_initial_device
public :: omp_get_device_num
public :: omp_pause_resource
public :: omp_pause_resource_all
public :: omp_get_supported_active_levels
public :: omp_fulfill_event
public :: omp_init_lock
public :: omp_destroy_lock
public :: omp_set_lock
public :: omp_unset_lock
public :: omp_test_lock
public :: omp_init_nest_lock
public :: omp_destroy_nest_lock
public :: omp_set_nest_lock
public :: omp_unset_nest_lock
public :: omp_test_nest_lock
public :: omp_get_max_task_priority
public :: omp_init_lock_with_hint
public :: omp_init_nest_lock_with_hint
public :: omp_control_tool
public :: omp_init_allocator
public :: omp_destroy_allocator
public :: omp_set_default_allocator
public :: omp_get_default_allocator
public :: omp_set_affinity_format
public :: omp_get_affinity_format
public :: omp_display_affinity
public :: omp_capture_affinity
public :: omp_set_num_teams
public :: omp_get_max_teams
public :: omp_set_teams_thread_limit
public :: omp_get_teams_thread_limit
public :: omp_display_env
public :: omp_target_alloc
public :: omp_target_free
public :: omp_target_is_present
public :: omp_target_memcpy
public :: omp_target_memcpy_rect
public :: omp_target_memcpy_async
public :: omp_target_memcpy_rect_async
public :: omp_target_memset
public :: omp_target_memset_async
public :: omp_target_associate_ptr
public :: omp_get_mapped_ptr
public :: omp_target_disassociate_ptr
public :: omp_target_is_accessible
public :: omp_alloc
public :: omp_aligned_alloc
public :: omp_calloc
public :: omp_aligned_calloc
public :: omp_realloc
public :: omp_free
public :: omp_in_explicit_task
public :: kmp_set_stacksize
public :: kmp_set_stacksize_s
public :: kmp_set_blocktime
public :: kmp_set_library_serial
public :: kmp_set_library_turnaround
public :: kmp_set_library_throughput
public :: kmp_set_library
public :: kmp_set_defaults
public :: kmp_get_stacksize
public :: kmp_get_stacksize_s
public :: kmp_get_blocktime
public :: kmp_get_library
public :: kmp_set_disp_num_buffers
public :: kmp_set_affinity
public :: kmp_get_affinity
public :: kmp_get_affinity_max_proc
public :: kmp_create_affinity_mask
public :: kmp_destroy_affinity_mask
public :: kmp_set_affinity_mask_proc
public :: kmp_unset_affinity_mask_proc
public :: kmp_get_affinity_mask_proc
public :: kmp_malloc
public :: kmp_aligned_malloc
public :: kmp_calloc
public :: kmp_realloc
public :: kmp_free
public :: kmp_set_warnings_on
public :: kmp_set_warnings_off
public :: kmp_get_cancellation_status
end module omp_lib

View File

@@ -486,82 +486,102 @@
end subroutine omp_fulfill_event
subroutine omp_init_lock(svar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_init_lock
!DIR$ ENDIF
#endif
import
integer (kind=omp_lock_kind) svar
end subroutine omp_init_lock
subroutine omp_destroy_lock(svar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_destroy_lock
!DIR$ ENDIF
#endif
import
integer (kind=omp_lock_kind) svar
end subroutine omp_destroy_lock
subroutine omp_set_lock(svar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_set_lock
!DIR$ ENDIF
#endif
import
integer (kind=omp_lock_kind) svar
end subroutine omp_set_lock
subroutine omp_unset_lock(svar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_unset_lock
!DIR$ ENDIF
#endif
import
integer (kind=omp_lock_kind) svar
end subroutine omp_unset_lock
function omp_test_lock(svar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_test_lock
!DIR$ ENDIF
#endif
import
logical (kind=omp_logical_kind) omp_test_lock
integer (kind=omp_lock_kind) svar
end function omp_test_lock
subroutine omp_init_nest_lock(nvar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_init_nest_lock
!DIR$ ENDIF
#endif
import
integer (kind=omp_nest_lock_kind) nvar
end subroutine omp_init_nest_lock
subroutine omp_destroy_nest_lock(nvar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_destroy_nest_lock
!DIR$ ENDIF
#endif
import
integer (kind=omp_nest_lock_kind) nvar
end subroutine omp_destroy_nest_lock
subroutine omp_set_nest_lock(nvar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_set_nest_lock
!DIR$ ENDIF
#endif
import
integer (kind=omp_nest_lock_kind) nvar
end subroutine omp_set_nest_lock
subroutine omp_unset_nest_lock(nvar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_unset_nest_lock
!DIR$ ENDIF
#endif
import
integer (kind=omp_nest_lock_kind) nvar
end subroutine omp_unset_nest_lock
function omp_test_nest_lock(nvar) bind(c)
#ifdef __INTEL_COMPILER
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_test_nest_lock
!DIR$ ENDIF
#endif
import
integer (kind=omp_integer_kind) omp_test_nest_lock
integer (kind=omp_nest_lock_kind) nvar
@@ -990,6 +1010,7 @@
end subroutine kmp_set_warnings_off
end interface
#ifdef __INTEL_COMPILER
!DIR$ IF DEFINED (__INTEL_OFFLOAD)
!DIR$ IF(__INTEL_COMPILER.LT.1900)
@@ -1158,3 +1179,4 @@
!$omp declare target(omp_init_nest_lock_with_hint )
!DIR$ ENDIF
!DIR$ ENDIF
#endif