[flang-commits] [flang] [flang] Do not leak intrinsics used by ISO_C_BINDING and ISO_FORTRAN_ENV (PR #79006)
Michael Klemm via flang-commits
flang-commits at lists.llvm.org
Mon Jan 22 09:29:38 PST 2024
https://github.com/mjklemm updated https://github.com/llvm/llvm-project/pull/79006
>From f85e4e216d6b7cb693150354977181a2cd61a13e Mon Sep 17 00:00:00 2001
From: Michael Klemm <michael.klemm at amd.com>
Date: Mon, 22 Jan 2024 17:40:29 +0100
Subject: [PATCH 1/3] Do not leak intrinsics used in the MODULE
---
flang/module/iso_c_binding.f90 | 4 ++++
flang/module/iso_fortran_env.f90 | 11 ++++++++++-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/flang/module/iso_c_binding.f90 b/flang/module/iso_c_binding.f90
index a34c1d84afbf149..b2cfe0908b7aa5d 100644
--- a/flang/module/iso_c_binding.f90
+++ b/flang/module/iso_c_binding.f90
@@ -22,6 +22,10 @@ module iso_c_binding
c_sizeof => sizeof, &
operator(==), operator(/=)
+ ! Do not leak these intrinsics into the USEing code.
+ private :: kind
+ private :: achar
+
! Table 18.2 (in clause 18.3.1)
! TODO: Specialize (via macros?) for alternative targets
integer, parameter :: &
diff --git a/flang/module/iso_fortran_env.f90 b/flang/module/iso_fortran_env.f90
index cd3c06f8c75660a..038abc41706af65 100644
--- a/flang/module/iso_fortran_env.f90
+++ b/flang/module/iso_fortran_env.f90
@@ -24,7 +24,16 @@ module iso_fortran_env
compiler_version => __builtin_compiler_version
implicit none
- private count
+
+ ! Do not leak these intrinsics into the USEing code.
+ private :: count
+ private :: selected_char_kind
+ private :: selected_int_kind
+ private :: merge
+ private :: digits
+ private :: int
+ private :: selected_real_kind
+ private :: real
! TODO: Use PACK([x],test) in place of the array constructor idiom
! [(x, integer::j=1,COUNT([test]))] below once PACK() can be folded.
>From e30f351b3dfb82dd4db5f1692095346b0dda25ac Mon Sep 17 00:00:00 2001
From: Michael Klemm <michael.klemm at amd.com>
Date: Mon, 22 Jan 2024 17:40:45 +0100
Subject: [PATCH 2/3] Add "implicit none"
---
flang/module/iso_c_binding.f90 | 2 ++
1 file changed, 2 insertions(+)
diff --git a/flang/module/iso_c_binding.f90 b/flang/module/iso_c_binding.f90
index b2cfe0908b7aa5d..39d64b23c30a3f5 100644
--- a/flang/module/iso_c_binding.f90
+++ b/flang/module/iso_c_binding.f90
@@ -22,6 +22,8 @@ module iso_c_binding
c_sizeof => sizeof, &
operator(==), operator(/=)
+ implicit none
+
! Do not leak these intrinsics into the USEing code.
private :: kind
private :: achar
>From 0278017c16f46c586fbb34077ae5b4f05198e10c Mon Sep 17 00:00:00 2001
From: Michael Klemm <michael.klemm at amd.com>
Date: Mon, 22 Jan 2024 18:29:27 +0100
Subject: [PATCH 3/3] Turn logic around (as per @rzurob suggestion)
---
flang/module/iso_c_binding.f90 | 50 +++++++++++++--------
flang/module/iso_fortran_env.f90 | 74 +++++++++++++++++---------------
2 files changed, 70 insertions(+), 54 deletions(-)
diff --git a/flang/module/iso_c_binding.f90 b/flang/module/iso_c_binding.f90
index 39d64b23c30a3f5..69f77057e4516b2 100644
--- a/flang/module/iso_c_binding.f90
+++ b/flang/module/iso_c_binding.f90
@@ -24,19 +24,30 @@ module iso_c_binding
implicit none
- ! Do not leak these intrinsics into the USEing code.
- private :: kind
- private :: achar
+ ! Set PRIVATE by default to explicitly only export what is meant
+ ! to be exported by this MODULE.
+ private
+
+ public :: c_associated, &
+ c_funloc, &
+ c_funptr, &
+ c_f_pointer, &
+ c_loc, &
+ c_null_funptr, &
+ c_null_ptr, &
+ c_ptr, &
+ c_sizeof, &
+ operator(==), operator(/=)
! Table 18.2 (in clause 18.3.1)
! TODO: Specialize (via macros?) for alternative targets
- integer, parameter :: &
+ integer, parameter, public :: &
c_int8_t = 1, &
c_int16_t = 2, &
c_int32_t = 4, &
c_int64_t = 8, &
c_int128_t = 16 ! anticipating future addition
- integer, parameter :: &
+ integer, parameter, public :: &
c_int = c_int32_t, &
c_short = c_int16_t, &
c_long = c_int64_t, &
@@ -46,7 +57,7 @@ module iso_c_binding
c_intmax_t = c_int128_t, &
c_intptr_t = c_size_t, &
c_ptrdiff_t = c_size_t
- integer, parameter :: &
+ integer, parameter, public :: &
c_int_least8_t = c_int8_t, &
c_int_fast8_t = c_int8_t, &
c_int_least16_t = c_int16_t, &
@@ -58,7 +69,7 @@ module iso_c_binding
c_int_least128_t = c_int128_t, &
c_int_fast128_t = c_int128_t
- integer, parameter :: &
+ integer, parameter, public :: &
c_float = 4, &
c_double = 8, &
#if __x86_64__
@@ -67,30 +78,31 @@ module iso_c_binding
c_long_double = 16
#endif
- integer, parameter :: &
+ integer, parameter, public :: &
c_float_complex = c_float, &
c_double_complex = c_double, &
c_long_double_complex = c_long_double
- integer, parameter :: c_bool = 1
- integer, parameter :: c_char = 1
+ integer, parameter, public :: c_bool = 1
+ integer, parameter, public :: c_char = 1
! C characters with special semantics
- character(kind=c_char, len=1), parameter :: c_null_char = achar(0)
- character(kind=c_char, len=1), parameter :: c_alert = achar(7)
- character(kind=c_char, len=1), parameter :: c_backspace = achar(8)
- character(kind=c_char, len=1), parameter :: c_form_feed = achar(12)
- character(kind=c_char, len=1), parameter :: c_new_line = achar(10)
- character(kind=c_char, len=1), parameter :: c_carriage_return = achar(13)
- character(kind=c_char, len=1), parameter :: c_horizontal_tab = achar(9)
- character(kind=c_char, len=1), parameter :: c_vertical_tab = achar(11)
+ character(kind=c_char, len=1), parameter, public :: c_null_char = achar(0)
+ character(kind=c_char, len=1), parameter, public :: c_alert = achar(7)
+ character(kind=c_char, len=1), parameter, public :: c_backspace = achar(8)
+ character(kind=c_char, len=1), parameter, public :: c_form_feed = achar(12)
+ character(kind=c_char, len=1), parameter, public :: c_new_line = achar(10)
+ character(kind=c_char, len=1), parameter, public :: c_carriage_return = achar(13)
+ character(kind=c_char, len=1), parameter, public :: c_horizontal_tab = achar(9)
+ character(kind=c_char, len=1), parameter, public :: c_vertical_tab = achar(11)
interface c_f_procpointer
module procedure c_f_procpointer
end interface
+ public :: c_f_procpointer
! gfortran extensions
- integer, parameter :: &
+ integer, parameter, public :: &
c_float128 = 16, &
c_float128_complex = c_float128
diff --git a/flang/module/iso_fortran_env.f90 b/flang/module/iso_fortran_env.f90
index 038abc41706af65..a616cfbf26fe67b 100644
--- a/flang/module/iso_fortran_env.f90
+++ b/flang/module/iso_fortran_env.f90
@@ -25,29 +25,33 @@ module iso_fortran_env
implicit none
- ! Do not leak these intrinsics into the USEing code.
- private :: count
- private :: selected_char_kind
- private :: selected_int_kind
- private :: merge
- private :: digits
- private :: int
- private :: selected_real_kind
- private :: real
+ ! Set PRIVATE by default to explicitly only export what is meant
+ ! to be exported by this MODULE.
+ private
+
+ public :: event_type, &
+ notify_type, &
+ lock_type, &
+ team_type, &
+ atomic_int_kind, &
+ atomic_logical_kind, &
+ compiler_options, &
+ compiler_version
+
! TODO: Use PACK([x],test) in place of the array constructor idiom
! [(x, integer::j=1,COUNT([test]))] below once PACK() can be folded.
- integer, parameter, private :: &
+ integer, parameter :: &
selectedASCII = selected_char_kind('ASCII'), &
selectedUCS_2 = selected_char_kind('UCS-2'), &
selectedUnicode = selected_char_kind('ISO_10646')
- integer, parameter :: character_kinds(*) = [ &
+ integer, parameter, public :: character_kinds(*) = [ &
[(selectedASCII, integer :: j=1, count([selectedASCII >= 0]))], &
[(selectedUCS_2, integer :: j=1, count([selectedUCS_2 >= 0]))], &
[(selectedUnicode, integer :: j=1, count([selectedUnicode >= 0]))]]
- integer, parameter, private :: &
+ integer, parameter :: &
selectedInt8 = selected_int_kind(2), &
selectedInt16 = selected_int_kind(4), &
selectedInt32 = selected_int_kind(9), &
@@ -63,7 +67,7 @@ module iso_fortran_env
selectedInt64 >= 0), &
safeInt128 = merge(selectedInt128, selected_int_kind(0), &
selectedInt128 >= 0)
- integer, parameter :: &
+ integer, parameter, public :: &
int8 = merge(selectedInt8, merge(-2, -1, selectedInt8 >= 0), &
digits(int(0,kind=safeInt8)) == 7), &
int16 = merge(selectedInt16, merge(-2, -1, selectedInt16 >= 0), &
@@ -75,7 +79,7 @@ module iso_fortran_env
int128 = merge(selectedInt128, merge(-2, -1, selectedInt128 >= 0), &
digits(int(0,kind=safeInt128)) == 127)
- integer, parameter :: integer_kinds(*) = [ &
+ integer, parameter, public :: integer_kinds(*) = [ &
selected_int_kind(0), &
((selected_int_kind(k), &
integer :: j=1, count([selected_int_kind(k) >= 0 .and. &
@@ -83,15 +87,15 @@ module iso_fortran_env
selected_int_kind(k-1)])), &
integer :: k=1, 39)]
- integer, parameter :: &
+ integer, parameter, public :: &
logical8 = int8, logical16 = int16, logical32 = int32, logical64 = int64
- integer, parameter :: logical_kinds(*) = [ &
+ integer, parameter, public :: logical_kinds(*) = [ &
[(logical8, integer :: j=1, count([logical8 >= 0]))], &
[(logical16, integer :: j=1, count([logical16 >= 0]))], &
[(logical32, integer :: j=1, count([logical32 >= 0]))], &
[(logical64, integer :: j=1, count([logical64 >= 0]))]]
- integer, parameter, private :: &
+ integer, parameter :: &
selectedReal16 = selected_real_kind(3, 4), & ! IEEE half
selectedBfloat16 = selected_real_kind(2, 37), & ! truncated IEEE single
selectedReal32 = selected_real_kind(6, 37), & ! IEEE single
@@ -113,7 +117,7 @@ module iso_fortran_env
selectedReal64x2 >= 0), &
safeReal128 = merge(selectedReal128, selected_real_kind(0,0), &
selectedReal128 >= 0)
- integer, parameter :: &
+ integer, parameter, public :: &
real16 = merge(selectedReal16, merge(-2, -1, selectedReal16 >= 0), &
digits(real(0,kind=safeReal16)) == 11), &
bfloat16 = merge(selectedBfloat16, merge(-2, -1, selectedBfloat16 >= 0), &
@@ -129,7 +133,7 @@ module iso_fortran_env
real128 = merge(selectedReal128, merge(-2, -1, selectedReal128 >= 0), &
digits(real(0,kind=safeReal128)) == 113)
- integer, parameter :: real_kinds(*) = [ &
+ integer, parameter, public :: real_kinds(*) = [ &
[(real16, integer :: j=1, count([real16 >= 0]))], &
[(bfloat16, integer :: j=1, count([bfloat16 >= 0]))], &
[(real32, integer :: j=1, count([real32 >= 0]))], &
@@ -138,27 +142,27 @@ module iso_fortran_env
[(real64x2, integer :: j=1, count([real64x2 >= 0]))], &
[(real128, integer :: j=1, count([real128 >= 0]))]]
- integer, parameter :: current_team = -1, initial_team = -2, parent_team = -3
+ integer, parameter, public :: current_team = -1, initial_team = -2, parent_team = -3
- integer, parameter :: output_unit = FORTRAN_DEFAULT_OUTPUT_UNIT
- integer, parameter :: input_unit = FORTRAN_DEFAULT_INPUT_UNIT
- integer, parameter :: error_unit = FORTRAN_ERROR_UNIT
- integer, parameter :: iostat_end = FORTRAN_RUNTIME_IOSTAT_END
- integer, parameter :: iostat_eor = FORTRAN_RUNTIME_IOSTAT_EOR
- integer, parameter :: iostat_inquire_internal_unit = &
+ integer, parameter, public :: output_unit = FORTRAN_DEFAULT_OUTPUT_UNIT
+ integer, parameter, public :: input_unit = FORTRAN_DEFAULT_INPUT_UNIT
+ integer, parameter, public :: error_unit = FORTRAN_ERROR_UNIT
+ integer, parameter, public :: iostat_end = FORTRAN_RUNTIME_IOSTAT_END
+ integer, parameter, public :: iostat_eor = FORTRAN_RUNTIME_IOSTAT_EOR
+ integer, parameter, public :: iostat_inquire_internal_unit = &
FORTRAN_RUNTIME_IOSTAT_INQUIRE_INTERNAL_UNIT
- integer, parameter :: character_storage_size = 8
- integer, parameter :: file_storage_size = 8
- integer, parameter :: numeric_storage_size = 32
+ integer, parameter, public :: character_storage_size = 8
+ integer, parameter, public :: file_storage_size = 8
+ integer, parameter, public :: numeric_storage_size = 32
- integer, parameter :: stat_failed_image = FORTRAN_RUNTIME_STAT_FAILED_IMAGE
- integer, parameter :: stat_locked = FORTRAN_RUNTIME_STAT_LOCKED
- integer, parameter :: &
+ integer, parameter, public :: stat_failed_image = FORTRAN_RUNTIME_STAT_FAILED_IMAGE
+ integer, parameter, public :: stat_locked = FORTRAN_RUNTIME_STAT_LOCKED
+ integer, parameter, public :: &
stat_locked_other_image = FORTRAN_RUNTIME_STAT_LOCKED_OTHER_IMAGE
- integer, parameter :: stat_stopped_image = FORTRAN_RUNTIME_STAT_STOPPED_IMAGE
- integer, parameter :: stat_unlocked = FORTRAN_RUNTIME_STAT_UNLOCKED
- integer, parameter :: &
+ integer, parameter, public :: stat_stopped_image = FORTRAN_RUNTIME_STAT_STOPPED_IMAGE
+ integer, parameter, public :: stat_unlocked = FORTRAN_RUNTIME_STAT_UNLOCKED
+ integer, parameter, public :: &
stat_unlocked_failed_image = FORTRAN_RUNTIME_STAT_UNLOCKED_FAILED_IMAGE
end module iso_fortran_env
More information about the flang-commits
mailing list