[flang-commits] [flang] 50f7c40 - [flang][OpenMP] Fix integer kind handling for omp_lib.h entry points (#218836)
via flang-commits
flang-commits at lists.llvm.org
Thu Sep 3 03:06:59 PDT 2026
Author: shivaramaarao
Date: 2026-09-03T15:36:55+05:30
New Revision: 50f7c40b113a06242965feec71909595f97fe522
URL: https://github.com/llvm/llvm-project/commit/50f7c40b113a06242965feec71909595f97fe522
DIFF: https://github.com/llvm/llvm-project/commit/50f7c40b113a06242965feec71909595f97fe522.diff
LOG: [flang][OpenMP] Fix integer kind handling for omp_lib.h entry points (#218836)
Replace bind(c) interface definitions for OpenMP/KMP routines that take
integer arguments with external declarations in omp_lib.h. The strict
interfaces caused Flang to fail intrinsic resolution when callers passed
integer arguments whose kind differed from omp_integer_kind.
Added a regression test that includes omp_lib.h and exercises these
routines with integer kinds 1, 2, 4, and 8.
Added:
flang/test/Lower/OpenMP/omp-lib-header-integer-wrappers.f90
Modified:
openmp/module/omp_lib.h.var
Removed:
################################################################################
diff --git a/flang/test/Lower/OpenMP/omp-lib-header-integer-wrappers.f90 b/flang/test/Lower/OpenMP/omp-lib-header-integer-wrappers.f90
new file mode 100644
index 0000000000000..f36a6a778be60
--- /dev/null
+++ b/flang/test/Lower/OpenMP/omp-lib-header-integer-wrappers.f90
@@ -0,0 +1,238 @@
+! REQUIRES: openmp_runtime
+
+! RUN: %flang_fc1 -emit-hlfir %openmp_flags %s -o - 2>&1 | FileCheck %s
+! RUN: %flang_fc1 -emit-fir %openmp_flags %s -o - 2>&1 | FileCheck %s
+!
+! Test that omp_lib intrinsic procedures accept integer arguments of
diff erent
+! kinds, rather than failing intrinsic resolution due to argument type mismatches.
+
+program main
+
+ include "omp_lib.h"
+
+ integer(1) :: i1 = 1_1
+ integer(2) :: i2 = 2_2
+ integer(4) :: i4 = 4_4
+ integer(8) :: i8 = 8_8
+ integer(omp_integer_kind) :: ires
+ integer(omp_sched_kind) :: sched_kind
+ integer(kmp_affinity_mask_kind) :: mask
+
+ call omp_set_num_threads(i1)
+ call omp_set_num_threads(i2)
+ call omp_set_num_threads(i4)
+ call omp_set_num_threads(i8)
+
+ call omp_set_max_active_levels(i1)
+ call omp_set_max_active_levels(i2)
+ call omp_set_max_active_levels(i4)
+ call omp_set_max_active_levels(i8)
+
+ call omp_set_default_device(i1)
+ call omp_set_default_device(i2)
+ call omp_set_default_device(i4)
+ call omp_set_default_device(i8)
+
+ call omp_set_num_teams(i1)
+ call omp_set_num_teams(i2)
+ call omp_set_num_teams(i4)
+ call omp_set_num_teams(i8)
+
+ call omp_set_teams_thread_limit(i1)
+ call omp_set_teams_thread_limit(i2)
+ call omp_set_teams_thread_limit(i4)
+ call omp_set_teams_thread_limit(i8)
+
+ call kmp_set_stacksize(i1)
+ call kmp_set_stacksize(i2)
+ call kmp_set_stacksize(i4)
+ call kmp_set_stacksize(i8)
+
+ call kmp_set_blocktime(i1)
+ call kmp_set_blocktime(i2)
+ call kmp_set_blocktime(i4)
+ call kmp_set_blocktime(i8)
+
+ call kmp_set_library(i1)
+ call kmp_set_library(i2)
+ call kmp_set_library(i4)
+ call kmp_set_library(i8)
+
+ call kmp_set_disp_num_buffers(i1)
+ call kmp_set_disp_num_buffers(i2)
+ call kmp_set_disp_num_buffers(i4)
+ call kmp_set_disp_num_buffers(i8)
+
+ ires = omp_get_ancestor_thread_num(i1)
+ ires = omp_get_ancestor_thread_num(i2)
+ ires = omp_get_ancestor_thread_num(i4)
+ ires = omp_get_ancestor_thread_num(i8)
+
+ ires = omp_get_team_size(i1)
+ ires = omp_get_team_size(i2)
+ ires = omp_get_team_size(i4)
+ ires = omp_get_team_size(i8)
+
+ ires = omp_get_place_num_procs(i1)
+ ires = omp_get_place_num_procs(i2)
+ ires = omp_get_place_num_procs(i4)
+ ires = omp_get_place_num_procs(i8)
+
+ call omp_set_schedule(omp_sched_static, i1)
+ call omp_set_schedule(omp_sched_static, i2)
+ call omp_set_schedule(omp_sched_static, i4)
+ call omp_set_schedule(omp_sched_static, i8)
+
+ call omp_get_schedule(sched_kind, i1)
+ call omp_get_schedule(sched_kind, i2)
+ call omp_get_schedule(sched_kind, i4)
+ call omp_get_schedule(sched_kind, i8)
+
+ ires = omp_pause_resource(omp_pause_soft, i1)
+ ires = omp_pause_resource(omp_pause_soft, i2)
+ ires = omp_pause_resource(omp_pause_soft, i4)
+ ires = omp_pause_resource(omp_pause_soft, i8)
+
+ call kmp_create_affinity_mask(mask)
+ ires = kmp_set_affinity_mask_proc(i1, mask)
+ ires = kmp_set_affinity_mask_proc(i2, mask)
+ ires = kmp_set_affinity_mask_proc(i4, mask)
+ ires = kmp_set_affinity_mask_proc(i8, mask)
+
+ ires = kmp_unset_affinity_mask_proc(i1, mask)
+ ires = kmp_unset_affinity_mask_proc(i2, mask)
+ ires = kmp_unset_affinity_mask_proc(i4, mask)
+ ires = kmp_unset_affinity_mask_proc(i8, mask)
+
+ ires = kmp_get_affinity_mask_proc(i1, mask)
+ ires = kmp_get_affinity_mask_proc(i2, mask)
+ ires = kmp_get_affinity_mask_proc(i4, mask)
+ ires = kmp_get_affinity_mask_proc(i8, mask)
+
+ block
+ integer(4) :: ids4(1)
+ integer(8) :: ids8(1)
+ integer(4) :: parts4(1)
+ integer(8) :: parts8(1)
+ call omp_get_place_proc_ids(i4, ids4)
+ call omp_get_place_proc_ids(i8, ids8)
+ call omp_get_partition_place_nums(parts4)
+ call omp_get_partition_place_nums(parts8)
+ end block
+end program
+
+!CHECK-NOT: not yet implemented: intrinsic: omp_set_max_active_levels
+!CHECK-NOT: not yet implemented: intrinsic: omp_set_default_device
+!CHECK-NOT: not yet implemented: intrinsic: omp_set_num_teams
+!CHECK-NOT: not yet implemented: intrinsic: omp_set_teams_thread_limit
+!CHECK-NOT: not yet implemented: intrinsic: kmp_set_stacksize
+!CHECK-NOT: not yet implemented: intrinsic: kmp_set_blocktime
+!CHECK-NOT: not yet implemented: intrinsic: kmp_set_library
+!CHECK-NOT: not yet implemented: intrinsic: kmp_set_disp_num_buffers
+!CHECK-NOT: not yet implemented: intrinsic: omp_get_ancestor_thread_num
+!CHECK-NOT: not yet implemented: intrinsic: omp_get_team_size
+!CHECK-NOT: not yet implemented: intrinsic: omp_get_place_num_procs
+!CHECK-NOT: not yet implemented: intrinsic: omp_set_schedule
+!CHECK-NOT: not yet implemented: intrinsic: omp_get_schedule
+!CHECK-NOT: not yet implemented: intrinsic: omp_pause_resource
+!CHECK-NOT: not yet implemented: intrinsic: kmp_set_affinity_mask_proc
+!CHECK-NOT: not yet implemented: intrinsic: kmp_unset_affinity_mask_proc
+!CHECK-NOT: not yet implemented: intrinsic: kmp_get_affinity_mask_proc
+!CHECK-NOT: not yet implemented: intrinsic: omp_get_place_proc_ids
+!CHECK-NOT: not yet implemented: intrinsic: omp_get_partition_place_nums
+!CHECK-NOT: undefined reference
+
+!CHECK: fir.call @_QPomp_set_num_threads
+!CHECK: fir.call @_QPomp_set_num_threads
+!CHECK: fir.call @_QPomp_set_num_threads
+!CHECK: fir.call @_QPomp_set_num_threads
+
+!CHECK: fir.call @_QPomp_set_max_active_levels
+!CHECK: fir.call @_QPomp_set_max_active_levels
+!CHECK: fir.call @_QPomp_set_max_active_levels
+!CHECK: fir.call @_QPomp_set_max_active_levels
+
+!CHECK: fir.call @_QPomp_set_default_device
+!CHECK: fir.call @_QPomp_set_default_device
+!CHECK: fir.call @_QPomp_set_default_device
+!CHECK: fir.call @_QPomp_set_default_device
+
+!CHECK: fir.call @_QPomp_set_num_teams
+!CHECK: fir.call @_QPomp_set_num_teams
+!CHECK: fir.call @_QPomp_set_num_teams
+!CHECK: fir.call @_QPomp_set_num_teams
+
+!CHECK: fir.call @_QPomp_set_teams_thread_limit
+!CHECK: fir.call @_QPomp_set_teams_thread_limit
+!CHECK: fir.call @_QPomp_set_teams_thread_limit
+!CHECK: fir.call @_QPomp_set_teams_thread_limit
+
+!CHECK: fir.call @_QPkmp_set_stacksize
+!CHECK: fir.call @_QPkmp_set_stacksize
+!CHECK: fir.call @_QPkmp_set_stacksize
+!CHECK: fir.call @_QPkmp_set_stacksize
+
+!CHECK: fir.call @_QPkmp_set_blocktime
+!CHECK: fir.call @_QPkmp_set_blocktime
+!CHECK: fir.call @_QPkmp_set_blocktime
+!CHECK: fir.call @_QPkmp_set_blocktime
+
+!CHECK: fir.call @_QPkmp_set_library
+!CHECK: fir.call @_QPkmp_set_library
+!CHECK: fir.call @_QPkmp_set_library
+!CHECK: fir.call @_QPkmp_set_library
+
+!CHECK: fir.call @_QPkmp_set_disp_num_buffers
+!CHECK: fir.call @_QPkmp_set_disp_num_buffers
+!CHECK: fir.call @_QPkmp_set_disp_num_buffers
+!CHECK: fir.call @_QPkmp_set_disp_num_buffers
+
+!CHECK: fir.call @_QPomp_get_ancestor_thread_num
+!CHECK: fir.call @_QPomp_get_ancestor_thread_num
+!CHECK: fir.call @_QPomp_get_ancestor_thread_num
+!CHECK: fir.call @_QPomp_get_ancestor_thread_num
+
+!CHECK: fir.call @_QPomp_get_team_size
+!CHECK: fir.call @_QPomp_get_team_size
+!CHECK: fir.call @_QPomp_get_team_size
+!CHECK: fir.call @_QPomp_get_team_size
+
+!CHECK: fir.call @_QPomp_get_place_num_procs
+!CHECK: fir.call @_QPomp_get_place_num_procs
+!CHECK: fir.call @_QPomp_get_place_num_procs
+!CHECK: fir.call @_QPomp_get_place_num_procs
+
+!CHECK: fir.call @_QPomp_set_schedule
+!CHECK: fir.call @_QPomp_set_schedule
+!CHECK: fir.call @_QPomp_set_schedule
+!CHECK: fir.call @_QPomp_set_schedule
+
+!CHECK: fir.call @_QPomp_get_schedule
+!CHECK: fir.call @_QPomp_get_schedule
+!CHECK: fir.call @_QPomp_get_schedule
+!CHECK: fir.call @_QPomp_get_schedule
+
+!CHECK: fir.call @_QPomp_pause_resource
+!CHECK: fir.call @_QPomp_pause_resource
+!CHECK: fir.call @_QPomp_pause_resource
+!CHECK: fir.call @_QPomp_pause_resource
+
+!CHECK: fir.call @_QPkmp_set_affinity_mask_proc
+!CHECK: fir.call @_QPkmp_set_affinity_mask_proc
+!CHECK: fir.call @_QPkmp_set_affinity_mask_proc
+!CHECK: fir.call @_QPkmp_set_affinity_mask_proc
+
+!CHECK: fir.call @_QPkmp_unset_affinity_mask_proc
+!CHECK: fir.call @_QPkmp_unset_affinity_mask_proc
+!CHECK: fir.call @_QPkmp_unset_affinity_mask_proc
+!CHECK: fir.call @_QPkmp_unset_affinity_mask_proc
+
+!CHECK: fir.call @_QPkmp_get_affinity_mask_proc
+!CHECK: fir.call @_QPkmp_get_affinity_mask_proc
+!CHECK: fir.call @_QPkmp_get_affinity_mask_proc
+!CHECK: fir.call @_QPkmp_get_affinity_mask_proc
+
+!CHECK: fir.call @_QPomp_get_place_proc_ids
+!CHECK: fir.call @_QPomp_get_place_proc_ids
+!CHECK: fir.call @_QPomp_get_partition_place_nums
+!CHECK: fir.call @_QPomp_get_partition_place_nums
diff --git a/openmp/module/omp_lib.h.var b/openmp/module/omp_lib.h.var
index 5e1996e31fe0a..96ce262df3f43 100644
--- a/openmp/module/omp_lib.h.var
+++ b/openmp/module/omp_lib.h.var
@@ -340,17 +340,40 @@
integer(kind=omp_interop_rc_kind)omp_irc_other
parameter(omp_irc_other=-6)
+ integer(kind=omp_integer_kind) kmp_get_affinity_mask_proc
+ external kmp_get_affinity_mask_proc
+ integer(kind=omp_integer_kind) kmp_set_affinity_mask_proc
+ external kmp_set_affinity_mask_proc
+ external kmp_set_blocktime
+ external kmp_set_disp_num_buffers
+ external kmp_set_library
+ external kmp_set_stacksize
+ integer (kind=omp_integer_kind) kmp_unset_affinity_mask_proc
+ external kmp_unset_affinity_mask_proc
+ integer(kind=omp_integer_kind) omp_get_ancestor_thread_num
+ external omp_get_ancestor_thread_num
+ external omp_get_partition_place_nums
+ integer(kind=omp_integer_kind) omp_get_place_num_procs
+ external omp_get_place_num_procs
+ external omp_get_schedule
+ integer(kind=omp_integer_kind) omp_get_team_size
+ external omp_get_team_size
+ integer(kind=omp_pause_resource_kind) omp_pause_resource
+ external omp_pause_resource
+ external omp_set_default_device
+ external omp_set_max_active_levels
+ external omp_set_num_teams
+ external omp_set_num_threads
+ external omp_set_schedule
+ external omp_set_teams_thread_limit
+ external omp_get_place_proc_ids
+
interface
! ***
! *** omp_* entry points
! ***
- subroutine omp_set_num_threads(num_threads) bind(c)
- import
- integer (kind=omp_integer_kind), value :: num_threads
- end subroutine omp_set_num_threads
-
subroutine omp_set_dynamic(dynamic_threads) bind(c)
import
logical (kind=omp_logical_kind), value :: dynamic_threads
@@ -406,11 +429,6 @@
integer (kind=omp_integer_kind) omp_get_thread_limit
end function omp_get_thread_limit
- 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
@@ -426,30 +444,6 @@
integer (kind=omp_integer_kind) omp_get_active_level
end function omp_get_active_level
- function omp_get_ancestor_thread_num(level) bind(c)
- import
- integer (kind=omp_integer_kind) omp_get_ancestor_thread_num
- integer (kind=omp_integer_kind), value :: level
- end function omp_get_ancestor_thread_num
-
- function omp_get_team_size(level) bind(c)
- import
- integer (kind=omp_integer_kind) omp_get_team_size
- integer (kind=omp_integer_kind), value :: level
- end function omp_get_team_size
-
- subroutine omp_set_schedule(kind, chunk_size) bind(c)
- import
- integer (kind=omp_sched_kind), value :: kind
- integer (kind=omp_integer_kind), value :: chunk_size
- end subroutine omp_set_schedule
-
- subroutine omp_get_schedule(kind, chunk_size) bind(c)
- import
- integer (kind=omp_sched_kind) kind
- integer (kind=omp_integer_kind) chunk_size
- end subroutine omp_get_schedule
-
function omp_get_proc_bind() bind(c)
import
integer (kind=omp_proc_bind_kind) omp_get_proc_bind
@@ -460,18 +454,6 @@
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) 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
@@ -482,11 +464,6 @@
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) place_nums(*)
- end subroutine omp_get_partition_place_nums
-
function omp_get_wtime() bind(c)
double precision omp_get_wtime
end function omp_get_wtime
@@ -500,11 +477,6 @@
integer (kind=omp_integer_kind) omp_get_default_device
end function omp_get_default_device
- 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_num_devices() bind(c)
import
integer (kind=omp_integer_kind) omp_get_num_devices
@@ -535,13 +507,6 @@
integer (kind=omp_integer_kind) omp_get_device_num
end function omp_get_device_num
- 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
@@ -729,21 +694,11 @@
integer (kind=kmp_size_t_kind) :: omp_capture_affinity
end function omp_capture_affinity
- subroutine omp_set_num_teams(num_teams) bind(c)
- import
- integer (kind=omp_integer_kind), value :: num_teams
- end subroutine omp_set_num_teams
-
function omp_get_max_teams() bind(c)
import
integer (kind=omp_integer_kind) omp_get_max_teams
end function omp_get_max_teams
- subroutine omp_set_teams_thread_limit(thread_limit) bind(c)
- import
- integer (kind=omp_integer_kind), value :: thread_limit
- end subroutine omp_set_teams_thread_limit
-
function omp_get_teams_thread_limit() bind(c)
import
integer (kind=omp_integer_kind) omp_get_teams_thread_limit
@@ -1030,21 +985,11 @@
! *** kmp_* entry points
! ***
- subroutine kmp_set_stacksize(size) bind(c)
- import
- integer (kind=omp_integer_kind), value :: size
- end subroutine kmp_set_stacksize
-
subroutine kmp_set_stacksize_s(size) bind(c)
import
integer (kind=kmp_size_t_kind), value :: size
end subroutine kmp_set_stacksize_s
- subroutine kmp_set_blocktime(msec) bind(c)
- import
- integer (kind=omp_integer_kind), value :: msec
- end subroutine kmp_set_blocktime
-
subroutine kmp_set_library_serial() bind(c)
end subroutine kmp_set_library_serial
@@ -1054,11 +999,6 @@
subroutine kmp_set_library_throughput() bind(c)
end subroutine kmp_set_library_throughput
- subroutine kmp_set_library(libnum) bind(c)
- import
- integer (kind=omp_integer_kind), value :: libnum
- end subroutine kmp_set_library
-
subroutine kmp_set_defaults(string)
character (len=*) :: string
end subroutine kmp_set_defaults
@@ -1083,11 +1023,6 @@
integer (kind=omp_integer_kind) kmp_get_library
end function kmp_get_library
- subroutine kmp_set_disp_num_buffers(num) bind(c)
- import
- integer (kind=omp_integer_kind), value :: num
- end subroutine kmp_set_disp_num_buffers
-
function kmp_set_affinity(mask) bind(c)
import
integer (kind=omp_integer_kind) kmp_set_affinity
@@ -1115,27 +1050,6 @@
integer (kind=kmp_affinity_mask_kind) mask
end subroutine kmp_destroy_affinity_mask
- function kmp_set_affinity_mask_proc(proc, mask) bind(c)
- import
- integer (kind=omp_integer_kind) kmp_set_affinity_mask_proc
- integer (kind=omp_integer_kind), value :: proc
- integer (kind=kmp_affinity_mask_kind) mask
- end function kmp_set_affinity_mask_proc
-
- function kmp_unset_affinity_mask_proc(proc, mask) bind(c)
- import
- integer (kind=omp_integer_kind) kmp_unset_affinity_mask_proc
- integer (kind=omp_integer_kind), value :: proc
- integer (kind=kmp_affinity_mask_kind) mask
- end function kmp_unset_affinity_mask_proc
-
- function kmp_get_affinity_mask_proc(proc, mask) bind(c)
- import
- integer (kind=omp_integer_kind) kmp_get_affinity_mask_proc
- integer (kind=omp_integer_kind), value :: proc
- integer (kind=kmp_affinity_mask_kind) mask
- end function kmp_get_affinity_mask_proc
-
function kmp_malloc(size) bind(c)
import
integer (kind=kmp_pointer_kind) kmp_malloc
More information about the flang-commits
mailing list