[flang-commits] [flang] [flang][NFC] Refactor MODULE definitions to not accidentally leak symbols (PR #80833)

Michael Klemm via flang-commits flang-commits at lists.llvm.org
Tue Feb 6 05:42:14 PST 2024


https://github.com/mjklemm created https://github.com/llvm/llvm-project/pull/80833

This PR continues the work started with PR #79006, by setting visibility in MODULES to PRIVATE by default and explicitly exporting only the desired symbols.  `omp_lib` needs more work, as it should maybe be compiled from `omp_lib.f90` in `openmp/runtime/src/incluce/omp_lib.f90.var` instead of simply using an INCLUDE for `omp_lib.h`

>From a65a28aab600e42c5e37d7f75bffc591e600356d Mon Sep 17 00:00:00 2001
From: Michael Klemm <michael.klemm at amd.com>
Date: Mon, 5 Feb 2024 18:59:27 +0100
Subject: [PATCH 1/8] Rework ieee_features.mod

---
 flang/module/ieee_features.f90 | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/flang/module/ieee_features.f90 b/flang/module/ieee_features.f90
index aab3daf78af08..919cadc5ad6d0 100644
--- a/flang/module/ieee_features.f90
+++ b/flang/module/ieee_features.f90
@@ -9,13 +9,18 @@
 ! See Fortran 2018, clause 17.2
 
 module ieee_features
+  implicit none
 
-  type :: ieee_features_type
+  ! Set PRIVATE by default to explicitly only export what is meant
+  ! to be exported by this MODULE.
+  private
+
+  type, public :: ieee_features_type
     private
     integer(kind=1) :: feature = 0
   end type ieee_features_type
 
-  type(ieee_features_type), parameter :: &
+  type(ieee_features_type), parameter, public :: &
     ieee_datatype = ieee_features_type(1), &
     ieee_denormal = ieee_features_type(2), &
     ieee_divide = ieee_features_type(3), &

>From 60576e2c87234e49991a09b865bb5c70a7c646c4 Mon Sep 17 00:00:00 2001
From: Michael Klemm <michael.klemm at amd.com>
Date: Tue, 6 Feb 2024 11:28:01 +0100
Subject: [PATCH 2/8] Rework ieee_arithmetic.mod

---
 flang/module/ieee_arithmetic.f90 | 192 +++++++++++++++----------------
 1 file changed, 93 insertions(+), 99 deletions(-)

diff --git a/flang/module/ieee_arithmetic.f90 b/flang/module/ieee_arithmetic.f90
index 98f264f34152f..1da5610f13df6 100644
--- a/flang/module/ieee_arithmetic.f90
+++ b/flang/module/ieee_arithmetic.f90
@@ -40,12 +40,60 @@ module ieee_arithmetic
 
   implicit none
 
-  type :: ieee_class_type
+  ! Set PRIVATE by default to explicitly only export what is meant
+  ! to be exported by this MODULE.
+  private
+
+  ! Explicitly export the symbols from __fortran_builtins
+  public :: ieee_fma
+  public :: ieee_is_nan
+  public :: ieee_is_negative
+  public :: ieee_is_normal
+  public :: ieee_next_after
+  public :: ieee_next_down
+  public :: ieee_next_up
+  public :: ieee_scalb
+  public :: ieee_selected_real_kind
+  public :: ieee_support_datatype
+  public :: ieee_support_denormal
+  public :: ieee_support_divide
+  public :: ieee_support_inf
+  public :: ieee_support_io
+  public :: ieee_support_nan
+  public :: ieee_support_sqrt
+  public :: ieee_support_standard
+  public :: ieee_support_subnormal
+  public :: ieee_support_underflow_control
+
+  ! Explicitly export the symbols from __fortran_ieee_exceptions
+  public :: ieee_flag_type
+  public :: ieee_invalid
+  public :: ieee_overflow
+  public :: ieee_divide_by_zero
+  public :: ieee_underflow
+  public :: ieee_inexact
+  public :: ieee_denorm
+  public :: ieee_usual
+  public :: ieee_all
+  public :: ieee_modes_type
+  public :: ieee_status_type
+  public :: ieee_get_flag
+  public :: ieee_get_halting_mode
+  public :: ieee_get_modes
+  public :: ieee_get_status
+  public :: ieee_set_flag
+  public :: ieee_set_halting_mode
+  public :: ieee_set_modes
+  public :: ieee_set_status
+  public :: ieee_support_flag
+  public :: ieee_support_halting
+
+  type, public :: ieee_class_type
     private
     integer(kind=1) :: which = 0
   end type ieee_class_type
 
-  type(ieee_class_type), parameter :: &
+  type(ieee_class_type), parameter, public :: &
     ieee_signaling_nan = ieee_class_type(_FORTRAN_RUNTIME_IEEE_SIGNALING_NAN), &
     ieee_quiet_nan = ieee_class_type(_FORTRAN_RUNTIME_IEEE_QUIET_NAN), &
     ieee_negative_inf = ieee_class_type(_FORTRAN_RUNTIME_IEEE_NEGATIVE_INF), &
@@ -62,16 +110,16 @@ module ieee_arithmetic
     ieee_positive_inf = ieee_class_type(_FORTRAN_RUNTIME_IEEE_POSITIVE_INF), &
     ieee_other_value = ieee_class_type(_FORTRAN_RUNTIME_IEEE_OTHER_VALUE)
 
-  type(ieee_class_type), parameter :: &
+  type(ieee_class_type), parameter, public :: &
     ieee_negative_denormal = ieee_negative_subnormal, &
     ieee_positive_denormal = ieee_positive_subnormal
 
-  type :: ieee_round_type
+  type, public :: ieee_round_type
     private
     integer(kind=1) :: mode = 0
   end type ieee_round_type
 
-  type(ieee_round_type), parameter :: &
+  type(ieee_round_type), parameter, public :: &
     ieee_to_zero = ieee_round_type(_FORTRAN_RUNTIME_IEEE_TO_ZERO), &
     ieee_nearest = ieee_round_type(_FORTRAN_RUNTIME_IEEE_NEAREST), &
     ieee_up = ieee_round_type(_FORTRAN_RUNTIME_IEEE_UP), &
@@ -89,6 +137,8 @@ elemental logical function ieee_round_eq(x, y)
       type(ieee_round_type), intent(in) :: x, y
     end function ieee_round_eq
   end interface operator(==)
+  public :: operator(==)
+
   interface operator(/=)
     elemental logical function ieee_class_ne(x, y)
       import ieee_class_type
@@ -99,7 +149,7 @@ elemental logical function ieee_round_ne(x, y)
       type(ieee_round_type), intent(in) :: x, y
     end function ieee_round_ne
   end interface operator(/=)
-  private :: ieee_class_eq, ieee_round_eq, ieee_class_ne, ieee_round_ne
+  public :: operator(/=)
 
 ! Define specifics with 1 or 2 INTEGER, LOGICAL, or REAL arguments for
 ! generic G.
@@ -154,58 +204,6 @@ end function ieee_round_ne
   G(16,2) G(16,3) G(16,4) G(16,8) G(16,16)
 #endif
 
-! Set PRIVATE accessibility for specifics with 1 or 2 INTEGER, LOGICAL, or REAL
-! arguments for generic G.
-#define PRIVATE_I(G) private :: \
-  G##_i1, G##_i2, G##_i4, G##_i8, G##_i16
-#define PRIVATE_L(G) private :: \
-  G##_l1, G##_l2, G##_l4, G##_l8
-#if __x86_64__
-#define PRIVATE_R(G) private :: \
-  G##_a2, G##_a3, G##_a4, G##_a8, G##_a10, G##_a16
-#else
-#define PRIVATE_R(G) private :: \
-  G##_a2, G##_a3, G##_a4, G##_a8, G##_a16
-#endif
-#define PRIVATE_II(G) private :: \
-  G##_i1_i1, G##_i1_i2, G##_i1_i4, G##_i1_i8, G##_i1_i16, \
-  G##_i2_i1, G##_i2_i2, G##_i2_i4, G##_i2_i8, G##_i2_i16, \
-  G##_i4_i1, G##_i4_i2, G##_i4_i4, G##_i4_i8, G##_i4_i16, \
-  G##_i8_i1, G##_i8_i2, G##_i8_i4, G##_i8_i8, G##_i8_i16, \
-  G##_i16_i1, G##_i16_i2, G##_i16_i4, G##_i16_i8, G##_i16_i16
-#if __x86_64__
-#define PRIVATE_RI(G) private :: \
-  G##_a2_i1, G##_a2_i2, G##_a2_i4, G##_a2_i8, G##_a2_i16, \
-  G##_a3_i1, G##_a3_i2, G##_a3_i4, G##_a3_i8, G##_a3_i16, \
-  G##_a4_i1, G##_a4_i2, G##_a4_i4, G##_a4_i8, G##_a4_i16, \
-  G##_a8_i1, G##_a8_i2, G##_a8_i4, G##_a8_i8, G##_a8_i16, \
-  G##_a10_i1, G##_a10_i2, G##_a10_i4, G##_a10_i8, G##_a10_i16, \
-  G##_a16_i1, G##_a16_i2, G##_a16_i4, G##_a16_i8, G##_a16_i16
-#else
-#define PRIVATE_RI(G) private :: \
-  G##_a2_i1, G##_a2_i2, G##_a2_i4, G##_a2_i8, G##_a2_i16, \
-  G##_a3_i1, G##_a3_i2, G##_a3_i4, G##_a3_i8, G##_a3_i16, \
-  G##_a4_i1, G##_a4_i2, G##_a4_i4, G##_a4_i8, G##_a4_i16, \
-  G##_a8_i1, G##_a8_i2, G##_a8_i4, G##_a8_i8, G##_a8_i16, \
-  G##_a16_i1, G##_a16_i2, G##_a16_i4, G##_a16_i8, G##_a16_i16
-#endif
-#if __x86_64__
-#define PRIVATE_RR(G) private :: \
-  G##_a2_a2, G##_a2_a3, G##_a2_a4, G##_a2_a8, G##_a2_a10, G##_a2_a16, \
-  G##_a3_a2, G##_a3_a3, G##_a3_a4, G##_a3_a8, G##_a3_a10, G##_a3_a16, \
-  G##_a4_a2, G##_a4_a3, G##_a4_a4, G##_a4_a8, G##_a4_a10, G##_a4_a16, \
-  G##_a8_a2, G##_a8_a3, G##_a8_a4, G##_a8_a8, G##_a8_a10, G##_a8_a16, \
-  G##_a10_a2, G##_a10_a3, G##_a10_a4, G##_a10_a8, G##_a10_a10, G##_a10_a16, \
-  G##_a16_a2, G##_a16_a3, G##_a16_a4, G##_a16_a8, G##_a16_a10, G##_a16_a16
-#else
-#define PRIVATE_RR(G) private :: \
-  G##_a2_a2, G##_a2_a3, G##_a2_a4, G##_a2_a8, G##_a2_a16, \
-  G##_a3_a2, G##_a3_a3, G##_a3_a4, G##_a3_a8, G##_a3_a16, \
-  G##_a4_a2, G##_a4_a3, G##_a4_a4, G##_a4_a8, G##_a4_a16, \
-  G##_a8_a2, G##_a8_a3, G##_a8_a4, G##_a8_a8, G##_a8_a16, \
-  G##_a16_a2, G##_a16_a3, G##_a16_a4, G##_a16_a8, G##_a16_a16
-#endif
-
 #define IEEE_CLASS_R(XKIND) \
   elemental type(ieee_class_type) function ieee_class_a##XKIND(x); \
     import ieee_class_type; \
@@ -214,7 +212,7 @@ end function ieee_class_a##XKIND;
   interface ieee_class
     SPECIFICS_R(IEEE_CLASS_R)
   end interface ieee_class
-  PRIVATE_R(IEEE_CLASS)
+  public :: ieee_class
 #undef IEEE_CLASS_R
 
 #define IEEE_COPY_SIGN_RR(XKIND, YKIND) \
@@ -225,7 +223,7 @@ end function ieee_copy_sign_a##XKIND##_a##YKIND;
   interface ieee_copy_sign
     SPECIFICS_RR(IEEE_COPY_SIGN_RR)
   end interface ieee_copy_sign
-  PRIVATE_RR(IEEE_COPY_SIGN)
+  public :: ieee_copy_sign
 #undef IEEE_COPY_SIGN_RR
 
 #define IEEE_GET_ROUNDING_MODE_I(RKIND) \
@@ -241,7 +239,7 @@ subroutine ieee_get_rounding_mode_0(round_value)
     end subroutine ieee_get_rounding_mode_0
     SPECIFICS_I(IEEE_GET_ROUNDING_MODE_I)
   end interface ieee_get_rounding_mode
-  PRIVATE_I(IEEE_GET_ROUNDING_MODE)
+  public :: ieee_get_rounding_mode
 #undef IEEE_GET_ROUNDING_MODE_I
 
 #define IEEE_GET_UNDERFLOW_MODE_L(GKIND) \
@@ -251,7 +249,7 @@ end subroutine ieee_get_underflow_mode_l##GKIND;
   interface ieee_get_underflow_mode
     SPECIFICS_L(IEEE_GET_UNDERFLOW_MODE_L)
   end interface ieee_get_underflow_mode
-  PRIVATE_L(IEEE_GET_UNDERFLOW_MODE)
+  public ::  ieee_get_underflow_mode
 #undef IEEE_GET_UNDERFLOW_MODE_L
 
 ! When kind argument is present, kind(result) is value(kind), not kind(kind).
@@ -273,8 +271,7 @@ end function ieee_int_a##AKIND##_i##KKIND;
     SPECIFICS_R(IEEE_INT_R)
     SPECIFICS_RI(IEEE_INT_RI)
   end interface ieee_int
-  PRIVATE_R(IEEE_INT)
-  PRIVATE_RI(IEEE_INT)
+  public :: ieee_int
 #undef IEEE_INT_R
 #undef IEEE_INT_RI
 
@@ -285,7 +282,7 @@ end function ieee_is_finite_a##XKIND;
   interface ieee_is_finite
     SPECIFICS_R(IEEE_IS_FINITE_R)
   end interface ieee_is_finite
-  PRIVATE_R(IEEE_IS_FINITE)
+  public :: ieee_is_finite
 #undef IEEE_IS_FINITE_R
 
 #define IEEE_LOGB_R(XKIND) \
@@ -295,7 +292,7 @@ end function ieee_logb_a##XKIND;
   interface ieee_logb
     SPECIFICS_R(IEEE_LOGB_R)
   end interface ieee_logb
-  PRIVATE_R(IEEE_LOGB)
+  public :: ieee_logb
 #undef IEEE_LOGB_R
 
 #define IEEE_MAX_R(XKIND) \
@@ -305,7 +302,7 @@ end function ieee_max_a##XKIND;
   interface ieee_max
     SPECIFICS_R(IEEE_MAX_R)
   end interface ieee_max
-  PRIVATE_R(IEEE_MAX)
+  public :: ieee_max
 #undef IEEE_MAX_R
 
 #define IEEE_MAX_MAG_R(XKIND) \
@@ -315,7 +312,7 @@ end function ieee_max_mag_a##XKIND;
   interface ieee_max_mag
     SPECIFICS_R(IEEE_MAX_MAG_R)
   end interface ieee_max_mag
-  PRIVATE_R(IEEE_MAX_MAG)
+  public :: ieee_max_mag
 #undef IEEE_MAX_MAG_R
 
 #define IEEE_MAX_NUM_R(XKIND) \
@@ -325,7 +322,7 @@ end function ieee_max_num_a##XKIND;
   interface ieee_max_num
     SPECIFICS_R(IEEE_MAX_NUM_R)
   end interface ieee_max_num
-  PRIVATE_R(IEEE_MAX_NUM)
+  public :: ieee_max_num
 #undef IEEE_MAX_NUM_R
 
 #define IEEE_MAX_NUM_MAG_R(XKIND) \
@@ -335,7 +332,7 @@ end function ieee_max_num_mag_a##XKIND;
   interface ieee_max_num_mag
     SPECIFICS_R(IEEE_MAX_NUM_MAG_R)
   end interface ieee_max_num_mag
-  PRIVATE_R(IEEE_MAX_NUM_MAG)
+  public :: ieee_max_num_mag
 #undef IEEE_MAX_NUM_MAG_R
 
 #define IEEE_MIN_R(XKIND) \
@@ -345,7 +342,7 @@ end function ieee_min_a##XKIND;
   interface ieee_min
     SPECIFICS_R(IEEE_MIN_R)
   end interface ieee_min
-  PRIVATE_R(IEEE_MIN)
+  public :: ieee_min
 #undef IEEE_MIN_R
 
 #define IEEE_MIN_MAG_R(XKIND) \
@@ -355,7 +352,7 @@ end function ieee_min_mag_a##XKIND;
   interface ieee_min_mag
     SPECIFICS_R(IEEE_MIN_MAG_R)
   end interface ieee_min_mag
-  PRIVATE_R(IEEE_MIN_MAG)
+  public :: ieee_min_mag
 #undef IEEE_MIN_MAG_R
 
 #define IEEE_MIN_NUM_R(XKIND) \
@@ -365,7 +362,7 @@ end function ieee_min_num_a##XKIND;
   interface ieee_min_num
     SPECIFICS_R(IEEE_MIN_NUM_R)
   end interface ieee_min_num
-  PRIVATE_R(IEEE_MIN_NUM)
+  public :: ieee_min_num
 #undef IEEE_MIN_NUM_R
 
 #define IEEE_MIN_NUM_MAG_R(XKIND) \
@@ -375,7 +372,7 @@ end function ieee_min_num_mag_a##XKIND;
   interface ieee_min_num_mag
     SPECIFICS_R(IEEE_MIN_NUM_MAG_R)
   end interface ieee_min_num_mag
-  PRIVATE_R(IEEE_MIN_NUM_MAG)
+  public ::ieee_min_num_mag
 #undef IEEE_MIN_NUM_MAG_R
 
 #define IEEE_QUIET_EQ_R(AKIND) \
@@ -385,7 +382,7 @@ end function ieee_quiet_eq_a##AKIND;
   interface ieee_quiet_eq
     SPECIFICS_R(IEEE_QUIET_EQ_R)
   end interface ieee_quiet_eq
-  PRIVATE_R(IEEE_QUIET_EQ)
+  public :: ieee_quiet_eq
 #undef IEEE_QUIET_EQ_R
 
 #define IEEE_QUIET_GE_R(AKIND) \
@@ -395,7 +392,7 @@ end function ieee_quiet_ge_a##AKIND;
   interface ieee_quiet_ge
     SPECIFICS_R(IEEE_QUIET_GE_R)
   end interface ieee_quiet_ge
-  PRIVATE_R(IEEE_QUIET_GE)
+  public :: ieee_quiet_ge
 #undef IEEE_QUIET_GE_R
 
 #define IEEE_QUIET_GT_R(AKIND) \
@@ -405,7 +402,7 @@ end function ieee_quiet_gt_a##AKIND;
   interface ieee_quiet_gt
     SPECIFICS_R(IEEE_QUIET_GT_R)
   end interface ieee_quiet_gt
-  PRIVATE_R(IEEE_QUIET_GT)
+  public :: ieee_quiet_gt
 #undef IEEE_QUIET_GT_R
 
 #define IEEE_QUIET_LE_R(AKIND) \
@@ -415,7 +412,7 @@ end function ieee_quiet_le_a##AKIND;
   interface ieee_quiet_le
     SPECIFICS_R(IEEE_QUIET_LE_R)
   end interface ieee_quiet_le
-  PRIVATE_R(IEEE_QUIET_LE)
+  public :: ieee_quiet_le
 #undef IEEE_QUIET_LE_R
 
 #define IEEE_QUIET_LT_R(AKIND) \
@@ -425,7 +422,7 @@ end function ieee_quiet_lt_a##AKIND;
   interface ieee_quiet_lt
     SPECIFICS_R(IEEE_QUIET_LT_R)
   end interface ieee_quiet_lt
-  PRIVATE_R(IEEE_QUIET_LT)
+  public :: ieee_quiet_lt
 #undef IEEE_QUIET_LT_R
 
 #define IEEE_QUIET_NE_R(AKIND) \
@@ -435,7 +432,7 @@ end function ieee_quiet_ne_a##AKIND;
   interface ieee_quiet_ne
     SPECIFICS_R(IEEE_QUIET_NE_R)
   end interface ieee_quiet_ne
-  PRIVATE_R(IEEE_QUIET_NE)
+  public :: ieee_quiet_ne
 #undef IEEE_QUIET_NE_R
 
 ! When kind argument is present, kind(result) is value(kind), not kind(kind).
@@ -464,10 +461,7 @@ end function ieee_real_a##AKIND##_i##KKIND;
     SPECIFICS_II(IEEE_REAL_II)
     SPECIFICS_RI(IEEE_REAL_RI)
   end interface ieee_real
-  PRIVATE_I(IEEE_REAL)
-  PRIVATE_R(IEEE_REAL)
-  PRIVATE_II(IEEE_REAL)
-  PRIVATE_RI(IEEE_REAL)
+  public :: ieee_real
 #undef IEEE_REAL_I
 #undef IEEE_REAL_R
 #undef IEEE_REAL_II
@@ -481,7 +475,7 @@ end function ieee_rem_a##XKIND##_a##YKIND;
   interface ieee_rem
     SPECIFICS_RR(IEEE_REM_RR)
   end interface ieee_rem
-  PRIVATE_RR(IEEE_REM)
+  public :: ieee_rem
 #undef IEEE_REM_RR
 
 #define IEEE_RINT_R(XKIND) \
@@ -493,7 +487,7 @@ end function ieee_rint_a##XKIND;
   interface ieee_rint
     SPECIFICS_R(IEEE_RINT_R)
   end interface ieee_rint
-  PRIVATE_R(IEEE_RINT)
+  public :: ieee_rint
 #undef IEEE_RINT_R
 
 #define IEEE_SET_ROUNDING_MODE_I(RKIND) \
@@ -509,7 +503,7 @@ subroutine ieee_set_rounding_mode_0(round_value)
     end subroutine ieee_set_rounding_mode_0
     SPECIFICS_I(IEEE_SET_ROUNDING_MODE_I)
   end interface ieee_set_rounding_mode
-  PRIVATE_I(IEEE_SET_ROUNDING_MODE)
+  public :: ieee_set_rounding_mode
 #undef IEEE_SET_ROUNDING_MODE_I
 
 #define IEEE_SET_UNDERFLOW_MODE_L(GKIND) \
@@ -519,7 +513,7 @@ end subroutine ieee_set_underflow_mode_l##GKIND;
   interface ieee_set_underflow_mode
     SPECIFICS_L(IEEE_SET_UNDERFLOW_MODE_L)
   end interface ieee_set_underflow_mode
-  PRIVATE_L(IEEE_SET_UNDERFLOW_MODE)
+  public :: ieee_set_underflow_mode
 #undef IEEE_SET_UNDERFLOW_MODE_L
 
 #define IEEE_SIGNALING_EQ_R(AKIND) \
@@ -529,7 +523,7 @@ end function ieee_signaling_eq_a##AKIND;
   interface ieee_signaling_eq
     SPECIFICS_R(IEEE_SIGNALING_EQ_R)
   end interface ieee_signaling_eq
-  PRIVATE_R(IEEE_SIGNALING_EQ)
+  public :: ieee_signaling_eq
 #undef IEEE_SIGNALING_EQ_R
 
 #define IEEE_SIGNALING_GE_R(AKIND) \
@@ -539,7 +533,7 @@ end function ieee_signaling_ge_a##AKIND;
   interface ieee_signaling_ge
     SPECIFICS_R(IEEE_SIGNALING_GE_R)
   end interface ieee_signaling_ge
-  PRIVATE_R(IEEE_SIGNALING_GE)
+  public :: ieee_signaling_ge
 #undef IEEE_SIGNALING_GE_R
 
 #define IEEE_SIGNALING_GT_R(AKIND) \
@@ -549,7 +543,7 @@ end function ieee_signaling_gt_a##AKIND;
   interface ieee_signaling_gt
     SPECIFICS_R(IEEE_SIGNALING_GT_R)
   end interface ieee_signaling_gt
-  PRIVATE_R(IEEE_SIGNALING_GT)
+  public :: ieee_signaling_gt
 #undef IEEE_SIGNALING_GT_R
 
 #define IEEE_SIGNALING_LE_R(AKIND) \
@@ -559,7 +553,7 @@ end function ieee_signaling_le_a##AKIND;
   interface ieee_signaling_le
     SPECIFICS_R(IEEE_SIGNALING_LE_R)
   end interface ieee_signaling_le
-  PRIVATE_R(IEEE_SIGNALING_LE)
+  public :: ieee_signaling_le
 #undef IEEE_SIGNALING_LE_R
 
 #define IEEE_SIGNALING_LT_R(AKIND) \
@@ -569,7 +563,7 @@ end function ieee_signaling_lt_a##AKIND;
   interface ieee_signaling_lt
     SPECIFICS_R(IEEE_SIGNALING_LT_R)
   end interface ieee_signaling_lt
-  PRIVATE_R(IEEE_SIGNALING_LT)
+  public :: ieee_signaling_lt
 #undef IEEE_SIGNALING_LT_R
 
 #define IEEE_SIGNALING_NE_R(AKIND) \
@@ -579,7 +573,7 @@ end function ieee_signaling_ne_a##AKIND;
   interface ieee_signaling_ne
     SPECIFICS_R(IEEE_SIGNALING_NE_R)
   end interface ieee_signaling_ne
-  PRIVATE_R(IEEE_SIGNALING_NE)
+  public :: ieee_signaling_ne
 #undef IEEE_SIGNALING_NE_R
 
 #define IEEE_SIGNBIT_R(XKIND) \
@@ -589,7 +583,7 @@ end function ieee_signbit_a##XKIND;
   interface ieee_signbit
     SPECIFICS_R(IEEE_SIGNBIT_R)
   end interface ieee_signbit
-  PRIVATE_R(IEEE_SIGNBIT)
+  public :: ieee_signbit
 #undef IEEE_SIGNBIT_R
 
 #define IEEE_SUPPORT_ROUNDING_R(XKIND) \
@@ -605,18 +599,18 @@ pure logical function ieee_support_rounding_0(round_value)
     end function ieee_support_rounding_0
     SPECIFICS_R(IEEE_SUPPORT_ROUNDING_R)
   end interface ieee_support_rounding
-  PRIVATE_R(IEEE_SUPPORT_ROUNDING)
+  public :: ieee_support_rounding
 #undef IEEE_SUPPORT_ROUNDING_R
 
 #define IEEE_UNORDERED_RR(XKIND, YKIND) \
- elemental logical function ieee_unordered_a##XKIND##_a##YKIND(x, y); \
+  elemental logical function ieee_unordered_a##XKIND##_a##YKIND(x, y); \
     real(XKIND), intent(in) :: x; \
     real(YKIND), intent(in) :: y; \
   end function ieee_unordered_a##XKIND##_a##YKIND;
   interface ieee_unordered
     SPECIFICS_RR(IEEE_UNORDERED_RR)
   end interface ieee_unordered
-  PRIVATE_RR(IEEE_UNORDERED)
+  public :: ieee_unordered
 #undef IEEE_UNORDERED_RR
 
 #define IEEE_VALUE_R(XKIND) \
@@ -628,7 +622,7 @@ end function ieee_value_a##XKIND;
   interface ieee_value
     SPECIFICS_R(IEEE_VALUE_R)
   end interface ieee_value
-  PRIVATE_R(IEEE_VALUE)
+  public :: ieee_value
 #undef IEEE_VALUE_R
 
 end module ieee_arithmetic

>From 9d60fe0f0bb4f9bda28a2dd068267071148ea010 Mon Sep 17 00:00:00 2001
From: Michael Klemm <michael.klemm at amd.com>
Date: Tue, 6 Feb 2024 12:06:36 +0100
Subject: [PATCH 3/8] Rework __fortran_ieee_exceptions.mod

---
 flang/module/__fortran_ieee_exceptions.f90 | 32 +++++++++++++++-------
 1 file changed, 22 insertions(+), 10 deletions(-)

diff --git a/flang/module/__fortran_ieee_exceptions.f90 b/flang/module/__fortran_ieee_exceptions.f90
index 047064a7bc8aa..6a7a39bb2bf1e 100644
--- a/flang/module/__fortran_ieee_exceptions.f90
+++ b/flang/module/__fortran_ieee_exceptions.f90
@@ -14,13 +14,18 @@
 include '../include/flang/Runtime/magic-numbers.h'
 
 module __fortran_ieee_exceptions
+  implicit none
 
-  type :: ieee_flag_type ! Fortran 2018, 17.2 & 17.3
+  ! Set PRIVATE by default to explicitly only export what is meant
+  ! to be exported by this MODULE.
+  private
+
+  type, public :: ieee_flag_type ! Fortran 2018, 17.2 & 17.3
     private
     integer(kind=1) :: flag = 0
   end type ieee_flag_type
 
-  type(ieee_flag_type), parameter :: &
+  type(ieee_flag_type), parameter, public :: &
     ieee_invalid = ieee_flag_type(_FORTRAN_RUNTIME_IEEE_INVALID), &
     ieee_overflow = ieee_flag_type(_FORTRAN_RUNTIME_IEEE_OVERFLOW), &
     ieee_divide_by_zero = &
@@ -29,16 +34,16 @@
     ieee_inexact = ieee_flag_type(_FORTRAN_RUNTIME_IEEE_INEXACT), &
     ieee_denorm = ieee_flag_type(_FORTRAN_RUNTIME_IEEE_DENORM) ! extension
 
-  type(ieee_flag_type), parameter :: &
+  type(ieee_flag_type), parameter, public :: &
     ieee_usual(*) = [ ieee_overflow, ieee_divide_by_zero, ieee_invalid ], &
     ieee_all(*) = [ ieee_usual, ieee_underflow, ieee_inexact ]
 
-  type :: ieee_modes_type ! Fortran 2018, 17.7
+  type, public :: ieee_modes_type ! Fortran 2018, 17.7
     private ! opaque fenv.h femode_t data
     integer(kind=4) :: __data(_FORTRAN_RUNTIME_IEEE_FEMODE_T_EXTENT)
   end type ieee_modes_type
 
-  type :: ieee_status_type ! Fortran 2018, 17.7
+  type, public :: ieee_status_type ! Fortran 2018, 17.7
     private ! opaque fenv.h fenv_t data
     integer(kind=4) :: __data(_FORTRAN_RUNTIME_IEEE_FENV_T_EXTENT)
   end type ieee_status_type
@@ -56,6 +61,7 @@
 
 ! Set PRIVATE accessibility for specifics with 1 LOGICAL or REAL argument for
 ! generic G.
+#if 0
 #define PRIVATE_L(G) private :: \
   G##_l1, G##_l2, G##_l4, G##_l8
 #if __x86_64__
@@ -65,6 +71,7 @@
 #define PRIVATE_R(G) private :: \
   G##_a2, G##_a3, G##_a4, G##_a8, G##_a16
 #endif
+#endif
 
 #define IEEE_GET_FLAG_L(FVKIND) \
   elemental subroutine ieee_get_flag_l##FVKIND(flag, flag_value); \
@@ -75,7 +82,7 @@ end subroutine ieee_get_flag_l##FVKIND;
   interface ieee_get_flag
     SPECIFICS_L(IEEE_GET_FLAG_L)
   end interface ieee_get_flag
-  PRIVATE_L(IEEE_GET_FLAG)
+  public :: ieee_get_flag
 #undef IEEE_GET_FLAG_L
 
 #define IEEE_GET_HALTING_MODE_L(HKIND) \
@@ -87,7 +94,7 @@ end subroutine ieee_get_halting_mode_l##HKIND;
   interface ieee_get_halting_mode
     SPECIFICS_L(IEEE_GET_HALTING_MODE_L)
   end interface ieee_get_halting_mode
-  PRIVATE_L(IEEE_GET_HALTING_MODE)
+  public :: ieee_get_halting_mode
 #undef IEEE_GET_HALTING_MODE_L
 
   interface ieee_get_modes
@@ -96,6 +103,7 @@ pure subroutine ieee_get_modes_0(modes)
       type(ieee_modes_type), intent(out) :: modes
     end subroutine ieee_get_modes_0
   end interface
+  public :: ieee_get_modes
 
   interface ieee_get_status
     pure subroutine ieee_get_status_0(status)
@@ -103,6 +111,7 @@ pure subroutine ieee_get_status_0(status)
       type(ieee_status_type), intent(out) :: status
     end subroutine ieee_get_status_0
   end interface
+  public :: ieee_get_status
 
 #define IEEE_SET_FLAG_L(FVKIND) \
   elemental subroutine ieee_set_flag_l##FVKIND(flag, flag_value); \
@@ -113,7 +122,7 @@ end subroutine ieee_set_flag_l##FVKIND;
   interface ieee_set_flag
     SPECIFICS_L(IEEE_SET_FLAG_L)
   end interface ieee_set_flag
-  PRIVATE_L(IEEE_SET_FLAG)
+  public :: ieee_set_flag
 #undef IEEE_SET_FLAG_L
 
 #define IEEE_SET_HALTING_MODE_L(HKIND) \
@@ -125,7 +134,7 @@ end subroutine ieee_set_halting_mode_l##HKIND;
   interface ieee_set_halting_mode
     SPECIFICS_L(IEEE_SET_HALTING_MODE_L)
   end interface ieee_set_halting_mode
-  PRIVATE_L(IEEE_SET_HALTING_MODE)
+  public :: ieee_set_halting_mode
 #undef IEEE_SET_HALTING_MODE_L
 
   interface ieee_set_modes
@@ -134,6 +143,7 @@ subroutine ieee_set_modes_0(modes)
       type(ieee_modes_type), intent(in) :: modes
     end subroutine ieee_set_modes_0
   end interface
+  public :: ieee_set_modes
 
   interface ieee_set_status
     subroutine ieee_set_status_0(status)
@@ -141,6 +151,7 @@ subroutine ieee_set_status_0(status)
       type(ieee_status_type), intent(in) :: status
     end subroutine ieee_set_status_0
   end interface
+  public :: ieee_set_status
 
 #define IEEE_SUPPORT_FLAG_R(XKIND) \
   pure logical function ieee_support_flag_a##XKIND(flag, x); \
@@ -155,7 +166,7 @@ pure logical function ieee_support_flag_0(flag)
     end function ieee_support_flag_0
     SPECIFICS_R(IEEE_SUPPORT_FLAG_R)
   end interface ieee_support_flag
-  PRIVATE_R(IEEE_SUPPORT_FLAG)
+  public :: ieee_support_flag
 #undef IEEE_SUPPORT_FLAG_R
 
   interface ieee_support_halting
@@ -164,5 +175,6 @@ pure logical function ieee_support_halting_0(flag)
       type(ieee_flag_type), intent(in) :: flag
     end function ieee_support_halting_0
   end interface
+  public :: ieee_support_halting
 
 end module __fortran_ieee_exceptions

>From e1d2bbf4900347ff6869d691f87b79af61575205 Mon Sep 17 00:00:00 2001
From: Michael Klemm <michael.klemm at amd.com>
Date: Tue, 6 Feb 2024 13:59:39 +0100
Subject: [PATCH 4/8] Rework __fortran_builtins.mod

---
 flang/module/__fortran_builtins.f90 | 68 +++++++++++++++++++++--------
 1 file changed, 49 insertions(+), 19 deletions(-)

diff --git a/flang/module/__fortran_builtins.f90 b/flang/module/__fortran_builtins.f90
index 0566ae6327d76..62b20103221ad 100644
--- a/flang/module/__fortran_builtins.f90
+++ b/flang/module/__fortran_builtins.f90
@@ -11,52 +11,60 @@
 ! to USE the standard intrinsic modules in order to access the
 ! standard names of the procedures.
 module __fortran_builtins
+  implicit none
+
+  ! Set PRIVATE by default to explicitly only export what is meant
+  ! to be exported by this MODULE.
+  private
 
   intrinsic :: __builtin_c_loc
+
   intrinsic :: __builtin_c_f_pointer
+  public :: __builtin_c_f_pointer
+
   intrinsic :: sizeof ! extension
+  public :: sizeof
 
   intrinsic :: selected_int_kind
-  private :: selected_int_kind
-  integer, parameter, private :: int64 = selected_int_kind(18)
+  integer, parameter :: int64 = selected_int_kind(18)
 
-  type, bind(c) :: __builtin_c_ptr
+  type, bind(c), public :: __builtin_c_ptr
     integer(kind=int64), private :: __address
   end type
 
-  type, bind(c) :: __builtin_c_funptr
+  type, bind(c), public :: __builtin_c_funptr
     integer(kind=int64), private :: __address
   end type
 
-  type :: __builtin_event_type
+  type, public :: __builtin_event_type
     integer(kind=int64), private :: __count
   end type
 
-  type :: __builtin_notify_type
+  type, public :: __builtin_notify_type
     integer(kind=int64), private :: __count
   end type
 
-  type :: __builtin_lock_type
+  type, public :: __builtin_lock_type
     integer(kind=int64), private :: __count
   end type
 
-  type :: __builtin_team_type
+  type, public :: __builtin_team_type
     integer(kind=int64), private :: __id
   end type
 
-  integer, parameter :: __builtin_atomic_int_kind = selected_int_kind(18)
-  integer, parameter :: &
+  integer, parameter, public :: __builtin_atomic_int_kind = selected_int_kind(18)
+  integer, parameter, public :: &
     __builtin_atomic_logical_kind = __builtin_atomic_int_kind
 
-  procedure(type(__builtin_c_ptr)) :: __builtin_c_loc
+  procedure(type(__builtin_c_ptr)), public :: __builtin_c_loc
 
-  type :: __builtin_dim3
+  type, public :: __builtin_dim3
     integer :: x=1, y=1, z=1
   end type
-  type(__builtin_dim3) :: &
+  type(__builtin_dim3), public :: &
     __builtin_threadIdx, __builtin_blockDim, __builtin_blockIdx, &
     __builtin_gridDim
-  integer, parameter :: __builtin_warpsize = 32
+  integer, parameter, public :: __builtin_warpsize = 32
 
   intrinsic :: __builtin_fma
   intrinsic :: __builtin_ieee_is_nan, __builtin_ieee_is_negative, &
@@ -71,8 +79,21 @@
     __builtin_ieee_support_nan, __builtin_ieee_support_sqrt, &
     __builtin_ieee_support_standard, __builtin_ieee_support_subnormal, &
     __builtin_ieee_support_underflow_control
+  public :: __builtin_fma
+  public :: __builtin_ieee_is_nan, __builtin_ieee_is_negative, &
+    __builtin_ieee_is_normal
+  public :: __builtin_ieee_next_after, __builtin_ieee_next_down, &
+    __builtin_ieee_next_up
+  public :: scale ! for ieee_scalb
+  public :: __builtin_ieee_selected_real_kind
+  public :: __builtin_ieee_support_datatype, &
+    __builtin_ieee_support_denormal, __builtin_ieee_support_divide, &
+    __builtin_ieee_support_inf, __builtin_ieee_support_io, &
+    __builtin_ieee_support_nan, __builtin_ieee_support_sqrt, &
+    __builtin_ieee_support_standard, __builtin_ieee_support_subnormal, &
+    __builtin_ieee_support_underflow_control
 
-  type, private :: __force_derived_type_instantiations
+  type :: __force_derived_type_instantiations
     type(__builtin_c_ptr) :: c_ptr
     type(__builtin_c_funptr) :: c_funptr
     type(__builtin_event_type) :: event_type
@@ -81,25 +102,34 @@
   end type
 
   intrinsic :: __builtin_compiler_options, __builtin_compiler_version
+  public :: __builtin_compiler_options, __builtin_compiler_version
 
   interface operator(==)
     module procedure __builtin_c_ptr_eq
   end interface
+  public :: operator(==)
+
   interface operator(/=)
     module procedure __builtin_c_ptr_eq
   end interface
+  public :: operator(/=)
 
   interface __builtin_c_associated
     module procedure c_associated_c_ptr
     module procedure c_associated_c_funptr
   end interface
-  private :: c_associated_c_ptr, c_associated_c_funptr
+  public :: __builtin_c_associated
+!  private :: c_associated_c_ptr, c_associated_c_funptr
 
-  type(__builtin_c_ptr), parameter :: __builtin_c_null_ptr = __builtin_c_ptr(0)
-  type(__builtin_c_funptr), parameter :: &
+  type(__builtin_c_ptr), parameter, public :: __builtin_c_null_ptr = __builtin_c_ptr(0)
+  type(__builtin_c_funptr), parameter, public :: &
     __builtin_c_null_funptr = __builtin_c_funptr(0)
 
-contains
+  public :: __builtin_c_ptr_eq
+  public :: __builtin_c_ptr_ne
+  public :: __builtin_c_funloc
+
+  contains
 
   elemental logical function __builtin_c_ptr_eq(x, y)
     type(__builtin_c_ptr), intent(in) :: x, y

>From c2abfdcd41dcbebb9d62e4e13f106787ce98dc66 Mon Sep 17 00:00:00 2001
From: Michael Klemm <michael.klemm at amd.com>
Date: Tue, 6 Feb 2024 14:03:32 +0100
Subject: [PATCH 5/8] Rework __fortran_type_info.mod

---
 flang/module/__fortran_type_info.f90 | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/flang/module/__fortran_type_info.f90 b/flang/module/__fortran_type_info.f90
index 9dc8b3de724e8..5f2273de1e3d1 100644
--- a/flang/module/__fortran_type_info.f90
+++ b/flang/module/__fortran_type_info.f90
@@ -15,7 +15,10 @@
 
   use, intrinsic :: __fortran_builtins, &
     only: __builtin_c_ptr, __builtin_c_funptr
+  implicit none
 
+  ! Set PRIVATE by default to explicitly only export what is meant
+  ! to be exported by this MODULE.
   private
 
   integer, parameter :: int64 = selected_int_kind(18)

>From 6c57aa11f40f1e9e318b995a2ce75a3717749bd6 Mon Sep 17 00:00:00 2001
From: Michael Klemm <michael.klemm at amd.com>
Date: Tue, 6 Feb 2024 14:17:56 +0100
Subject: [PATCH 6/8] Rework __cuda_builtins.f90

---
 flang/module/__cuda_builtins.f90 | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/flang/module/__cuda_builtins.f90 b/flang/module/__cuda_builtins.f90
index 50e0d2682ef30..63a661e565e41 100644
--- a/flang/module/__cuda_builtins.f90
+++ b/flang/module/__cuda_builtins.f90
@@ -16,4 +16,16 @@
     blockIdx => __builtin_blockIdx, &
     gridDim => __builtin_gridDim, &
     warpsize => __builtin_warpsize
+
+  implicit none
+
+  ! Set PRIVATE by default to explicitly only export what is meant
+  ! to be exported by this MODULE.
+  private
+
+  public :: threadIdx, &
+    blockDim, &
+    blockIdx, &
+    gridDim, &
+    warpsize
 end module

>From dc873e3a23913c109b3be130992d463b00ea1a28 Mon Sep 17 00:00:00 2001
From: Michael Klemm <michael.klemm at amd.com>
Date: Tue, 6 Feb 2024 14:28:43 +0100
Subject: [PATCH 7/8] Rework ieee_exceptions.mod

---
 flang/module/ieee_exceptions.f90 | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/flang/module/ieee_exceptions.f90 b/flang/module/ieee_exceptions.f90
index e9ededb8ee165..b509dd2391d8f 100644
--- a/flang/module/ieee_exceptions.f90
+++ b/flang/module/ieee_exceptions.f90
@@ -8,4 +8,9 @@
 
 module ieee_exceptions
   use __fortran_ieee_exceptions
+
+  implicit none
+
+  ! Because this MODULE simply re-exports an internal MODULE file,
+  ! we do not use PRIVATE in here.
 end module ieee_exceptions

>From b6dff22b1661fcf9b6a3f574977bd253c0d346ca Mon Sep 17 00:00:00 2001
From: Michael Klemm <michael.klemm at amd.com>
Date: Tue, 6 Feb 2024 14:30:33 +0100
Subject: [PATCH 8/8] Rework __ppc_types.mod

---
 flang/module/__ppc_types.f90 | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/flang/module/__ppc_types.f90 b/flang/module/__ppc_types.f90
index d446556b53999..7a7c7898ebf80 100644
--- a/flang/module/__ppc_types.f90
+++ b/flang/module/__ppc_types.f90
@@ -7,7 +7,12 @@
 !===------------------------------------------------------------------------===!
 
 module __ppc_types
+  implicit none
+
+  ! Set PRIVATE by default to explicitly only export what is meant
+  ! to be exported by this MODULE.
   private
+
   ! Definition of derived-types that represent PowerPC vector types.
   type __builtin_ppc_intrinsic_vector(element_category, element_kind)
     integer, kind :: element_category, element_kind



More information about the flang-commits mailing list