[flang-commits] [flang] [flang][WIP] Refactor ISO_FORTRAN_ENV to move kind arrays to global symbols (PR #89416)
Michael Klemm via flang-commits
flang-commits at lists.llvm.org
Fri Apr 19 09:42:34 PDT 2024
https://github.com/mjklemm created https://github.com/llvm/llvm-project/pull/89416
This PR resolves issue https://github.com/llvm/llvm-project/issues/89403 by turning the constant implied-shape shape arrays for `integer-kinds`, `real-kinds`, and `logical_kinds` into regular arrays. That way, they can be accessed using variable indexes.
>From 9a21084aec2a0cb1275cfd00f5bf7356850cc2d7 Mon Sep 17 00:00:00 2001
From: Michael Klemm <michael.klemm at amd.com>
Date: Fri, 19 Apr 2024 07:20:10 +0200
Subject: [PATCH] Make integer_kinds, real_kinds, logical_kinds proper arrays
(ie., global symbols)
---
flang/module/__fortran_builtin_kinds.f90 | 119 +++++++++++++++++++++++
flang/module/iso_fortran_env.f90 | 118 ++++++----------------
flang/tools/f18/CMakeLists.txt | 19 +++-
3 files changed, 168 insertions(+), 88 deletions(-)
create mode 100644 flang/module/__fortran_builtin_kinds.f90
diff --git a/flang/module/__fortran_builtin_kinds.f90 b/flang/module/__fortran_builtin_kinds.f90
new file mode 100644
index 00000000000000..a35e7784f765bd
--- /dev/null
+++ b/flang/module/__fortran_builtin_kinds.f90
@@ -0,0 +1,119 @@
+!===-- module/__fortran_bultin_kinds.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 __fortran_builtin_kinds
+ implicit none
+ private
+
+ ! INTEGER types
+ integer, parameter, public :: &
+ selectedInt8 = selected_int_kind(2), &
+ selectedInt16 = selected_int_kind(4), &
+ selectedInt32 = selected_int_kind(9), &
+ selectedInt64 = selected_int_kind(18),&
+ selectedInt128 = selected_int_kind(38), &
+ safeInt8 = merge(selectedInt8, selected_int_kind(0), &
+ selectedInt8 >= 0), &
+ safeInt16 = merge(selectedInt16, selected_int_kind(0), &
+ selectedInt16 >= 0), &
+ safeInt32 = merge(selectedInt32, selected_int_kind(0), &
+ selectedInt32 >= 0), &
+ safeInt64 = merge(selectedInt64, selected_int_kind(0), &
+ selectedInt64 >= 0), &
+ safeInt128 = merge(selectedInt128, selected_int_kind(0), &
+ selectedInt128 >= 0)
+
+ 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), &
+ digits(int(0,kind=safeInt16)) == 15), &
+ int32 = merge(selectedInt32, merge(-2, -1, selectedInt32 >= 0), &
+ digits(int(0,kind=safeInt32)) == 31), &
+ int64 = merge(selectedInt64, merge(-2, -1, selectedInt64 >= 0), &
+ digits(int(0,kind=safeInt64)) == 63), &
+ int128 = merge(selectedInt128, merge(-2, -1, selectedInt128 >= 0), &
+ digits(int(0,kind=safeInt128)) == 127)
+
+ integer, parameter, dimension(*) :: __builtin_integer_kinds_init = [ &
+ selected_int_kind(0), &
+ [(pack([selected_int_kind(k)], &
+ selected_int_kind(k) >= 0 .and. &
+ selected_int_kind(k) /= selected_int_kind(k-1)), &
+ integer :: k=1, 39)]]
+
+ integer, dimension(size(__builtin_integer_kinds_init)), public :: &
+ __builtin_integer_kinds = __builtin_integer_kinds_init
+
+ ! LOGICAL TYPES
+ integer, parameter, public :: &
+ logical8 = int8, logical16 = int16, logical32 = int32, logical64 = int64
+
+ integer, parameter, dimension(*), public :: __builtin_logical_kinds_init = [ &
+ pack([logical8], logical8 >= 0), &
+ pack([logical16], logical16 >= 0), &
+ pack([logical32], logical32 >= 0), &
+ pack([logical64], logical64 >= 0) &
+ ]
+
+ integer, dimension(size(__builtin_logical_kinds_init)), public :: &
+ __builtin_logical_kinds = __builtin_logical_kinds_init
+
+ ! REAL types
+ integer, parameter, public :: &
+ 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
+ selectedReal64 = selected_real_kind(15, 307), & ! IEEE double
+ selectedReal80 = selected_real_kind(18, 4931), & ! 80x87 extended
+ selectedReal64x2 = selected_real_kind(31, 307), & ! "double-double"
+ selectedReal128 = selected_real_kind(33, 4931), & ! IEEE quad
+ safeReal16 = merge(selectedReal16, selected_real_kind(0,0), &
+ selectedReal16 >= 0), &
+ safeBfloat16 = merge(selectedBfloat16, selected_real_kind(0,0), &
+ selectedBfloat16 >= 0), &
+ safeReal32 = merge(selectedReal32, selected_real_kind(0,0), &
+ selectedReal32 >= 0), &
+ safeReal64 = merge(selectedReal64, selected_real_kind(0,0), &
+ selectedReal64 >= 0), &
+ safeReal80 = merge(selectedReal80, selected_real_kind(0,0), &
+ selectedReal80 >= 0), &
+ safeReal64x2 = merge(selectedReal64x2, selected_real_kind(0,0), &
+ selectedReal64x2 >= 0), &
+ safeReal128 = merge(selectedReal128, selected_real_kind(0,0), &
+ selectedReal128 >= 0)
+
+ 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), &
+ digits(real(0,kind=safeBfloat16)) == 8), &
+ real32 = merge(selectedReal32, merge(-2, -1, selectedReal32 >= 0), &
+ digits(real(0,kind=safeReal32)) == 24), &
+ real64 = merge(selectedReal64, merge(-2, -1, selectedReal64 >= 0), &
+ digits(real(0,kind=safeReal64)) == 53), &
+ real80 = merge(selectedReal80, merge(-2, -1, selectedReal80 >= 0), &
+ digits(real(0,kind=safeReal80)) == 64), &
+ real64x2 = merge(selectedReal64x2, merge(-2, -1, selectedReal64x2 >= 0), &
+ digits(real(0,kind=safeReal64x2)) == 106), &
+ real128 = merge(selectedReal128, merge(-2, -1, selectedReal128 >= 0), &
+ digits(real(0,kind=safeReal128)) == 113)
+
+ integer, parameter, dimension(*) :: __builtin_real_kinds_par = [ &
+ pack([real16], real16 >= 0), &
+ pack([bfloat16], bfloat16 >= 0), &
+ pack([real32], real32 >= 0), &
+ pack([real64], real64 >= 0), &
+ pack([real80], real80 >= 0), &
+ pack([real64x2], real64x2 >= 0), &
+ pack([real128], real128 >= 0) &
+ ]
+ integer, dimension(size(__builtin_real_kinds_par)), public :: &
+ __builtin_real_kinds = __builtin_real_kinds_par
+
+end module __fortran_builtin_kinds
\ No newline at end of file
diff --git a/flang/module/iso_fortran_env.f90 b/flang/module/iso_fortran_env.f90
index 6ca98e518aeac5..f751ba03f7bac6 100644
--- a/flang/module/iso_fortran_env.f90
+++ b/flang/module/iso_fortran_env.f90
@@ -22,6 +22,23 @@ module iso_fortran_env
compiler_options => __builtin_compiler_options, &
compiler_version => __builtin_compiler_version
+ use __fortran_builtin_kinds, only: &
+ selectedInt8, selectedInt16, selectedInt32, selectedInt64, selectedInt128, &
+ safeInt8, safeInt16, safeInt32, safeInt64, safeInt128, &
+ int8, int16, int32, int64, int128, &
+ logical8, logical16, logical32, logical64, &
+ selectedReal16, selectedBfloat16, selectedReal32, &
+ selectedReal64, selectedReal80, selectedReal64x2, &
+ selectedReal128, &
+ safeReal16, safeBfloat16, safeReal32, &
+ safeReal64, safeReal80, safeReal64x2, &
+ safeReal128, &
+ real16, bfloat16, real32, real64, &
+ real80, real64x2, real128, &
+ integer_kinds => __builtin_integer_kinds, &
+ real_kinds => __builtin_real_kinds, &
+ logical_kinds => __builtin_logical_kinds
+
implicit none
private
@@ -38,95 +55,22 @@ module iso_fortran_env
pack([selectedUCS_2], selectedUCS_2 >= 0), &
pack([selectedUnicode], selectedUnicode >= 0)]
- integer, parameter :: &
- selectedInt8 = selected_int_kind(2), &
- selectedInt16 = selected_int_kind(4), &
- selectedInt32 = selected_int_kind(9), &
- selectedInt64 = selected_int_kind(18),&
- selectedInt128 = selected_int_kind(38), &
- safeInt8 = merge(selectedInt8, selected_int_kind(0), &
- selectedInt8 >= 0), &
- safeInt16 = merge(selectedInt16, selected_int_kind(0), &
- selectedInt16 >= 0), &
- safeInt32 = merge(selectedInt32, selected_int_kind(0), &
- selectedInt32 >= 0), &
- safeInt64 = merge(selectedInt64, selected_int_kind(0), &
- selectedInt64 >= 0), &
- safeInt128 = merge(selectedInt128, selected_int_kind(0), &
- selectedInt128 >= 0)
- 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), &
- digits(int(0,kind=safeInt16)) == 15), &
- int32 = merge(selectedInt32, merge(-2, -1, selectedInt32 >= 0), &
- digits(int(0,kind=safeInt32)) == 31), &
- int64 = merge(selectedInt64, merge(-2, -1, selectedInt64 >= 0), &
- digits(int(0,kind=safeInt64)) == 63), &
- int128 = merge(selectedInt128, merge(-2, -1, selectedInt128 >= 0), &
- digits(int(0,kind=safeInt128)) == 127)
-
- integer, parameter, public :: integer_kinds(*) = [ &
- selected_int_kind(0), &
- [(pack([selected_int_kind(k)], &
- selected_int_kind(k) >= 0 .and. &
- selected_int_kind(k) /= selected_int_kind(k-1)), &
- integer :: k=1, 39)]]
+ public :: selectedInt8, selectedInt16, selectedInt32, selectedInt64, selectedInt128, &
+ safeInt8, safeInt16, safeInt32, safeInt64, safeInt128, &
+ int8, int16, int32, int64, int128
- integer, parameter, public :: &
- logical8 = int8, logical16 = int16, logical32 = int32, logical64 = int64
- integer, parameter, public :: logical_kinds(*) = [ &
- pack([logical8], logical8 >= 0), &
- pack([logical16], logical16 >= 0), &
- pack([logical32], logical32 >= 0), &
- pack([logical64], logical64 >= 0)]
+ public :: logical8, logical16, logical32, logical64
- 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
- selectedReal64 = selected_real_kind(15, 307), & ! IEEE double
- selectedReal80 = selected_real_kind(18, 4931), & ! 80x87 extended
- selectedReal64x2 = selected_real_kind(31, 307), & ! "double-double"
- selectedReal128 = selected_real_kind(33, 4931), & ! IEEE quad
- safeReal16 = merge(selectedReal16, selected_real_kind(0,0), &
- selectedReal16 >= 0), &
- safeBfloat16 = merge(selectedBfloat16, selected_real_kind(0,0), &
- selectedBfloat16 >= 0), &
- safeReal32 = merge(selectedReal32, selected_real_kind(0,0), &
- selectedReal32 >= 0), &
- safeReal64 = merge(selectedReal64, selected_real_kind(0,0), &
- selectedReal64 >= 0), &
- safeReal80 = merge(selectedReal80, selected_real_kind(0,0), &
- selectedReal80 >= 0), &
- safeReal64x2 = merge(selectedReal64x2, selected_real_kind(0,0), &
- selectedReal64x2 >= 0), &
- safeReal128 = merge(selectedReal128, selected_real_kind(0,0), &
- selectedReal128 >= 0)
- 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), &
- digits(real(0,kind=safeBfloat16)) == 8), &
- real32 = merge(selectedReal32, merge(-2, -1, selectedReal32 >= 0), &
- digits(real(0,kind=safeReal32)) == 24), &
- real64 = merge(selectedReal64, merge(-2, -1, selectedReal64 >= 0), &
- digits(real(0,kind=safeReal64)) == 53), &
- real80 = merge(selectedReal80, merge(-2, -1, selectedReal80 >= 0), &
- digits(real(0,kind=safeReal80)) == 64), &
- real64x2 = merge(selectedReal64x2, merge(-2, -1, selectedReal64x2 >= 0), &
- digits(real(0,kind=safeReal64x2)) == 106), &
- real128 = merge(selectedReal128, merge(-2, -1, selectedReal128 >= 0), &
- digits(real(0,kind=safeReal128)) == 113)
-
- integer, parameter, public :: real_kinds(*) = [ &
- pack([real16], real16 >= 0), &
- pack([bfloat16], bfloat16 >= 0), &
- pack([real32], real32 >= 0), &
- pack([real64], real64 >= 0), &
- pack([real80], real80 >= 0), &
- pack([real64x2], real64x2 >= 0), &
- pack([real128], real128 >= 0)]
+ public :: selectedReal16, selectedBfloat16, selectedReal32, &
+ selectedReal64, selectedReal80, selectedReal64x2, &
+ selectedReal128, &
+ safeReal16, safeBfloat16, safeReal32, &
+ safeReal64, safeReal80, safeReal64x2, &
+ safeReal128, &
+ real16, bfloat16, real32, real64, &
+ real80, real64x2, real128
+
+ public :: integer_kinds, real_kinds, logical_kinds
integer, parameter, public :: current_team = -1, &
initial_team = -2, &
diff --git a/flang/tools/f18/CMakeLists.txt b/flang/tools/f18/CMakeLists.txt
index dda3b6887be89a..ebf3c7168a8b57 100644
--- a/flang/tools/f18/CMakeLists.txt
+++ b/flang/tools/f18/CMakeLists.txt
@@ -4,8 +4,10 @@ set(LLVM_LINK_COMPONENTS
Support
)
+# This is the list of module files to be generated when building Flang
set(MODULES
"__fortran_builtins"
+ "__fortran_builtin_kinds"
"__fortran_ieee_exceptions"
"__fortran_type_info"
"__ppc_types"
@@ -19,6 +21,12 @@ set(MODULES
"iso_fortran_env"
)
+# This is the subset of modules that also have an implementation and
+# thus need to be compiled and linked into the runtime libraries.
+set(MODULES_WITH_IMPLEMENTATION
+ "__fortran_builtin_kinds"
+)
+
# Create module files directly from the top-level module source directory.
# If CMAKE_CROSSCOMPILING, then the newly built flang-new executable was
# cross compiled, and thus can't be executed on the build system and thus
@@ -52,13 +60,22 @@ if (NOT CMAKE_CROSSCOMPILING)
# Do not compile PPC module if the target is not available.
continue()
endif()
+ endif()
+
+ # Some modules have an implementation part that needs to be added to the
+ # FortranRuntime library.
+ set(compile_with "-fsyntax-only")
+ set(include_in_link FALSE)
+ if(${filename} IN_LIST MODULES_WITH_IMPLEMENTATION)
+ set(compile_with "-c")
+ set(include_in_link TRUE)
endif()
set(base ${FLANG_INTRINSIC_MODULES_DIR}/${filename})
# 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}
+ COMMAND flang-new -cpp ${compile_with} ${opts} -module-dir ${FLANG_INTRINSIC_MODULES_DIR}
${FLANG_SOURCE_DIR}/module/${filename}.f90
DEPENDS flang-new ${FLANG_SOURCE_DIR}/module/${filename}.f90 ${FLANG_SOURCE_DIR}/module/__fortran_builtins.f90 ${depends}
)
More information about the flang-commits
mailing list