mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-04-01 12:43:47 +00:00
[flang] IEEE_ARITHMETIC must imply USE IEEE_EXCEPTIONS
The intrinsic module IEEE_ARITHMETIC must incorporate the public names from the intrisic module IEEE_EXCEPTIONS. Rename IEEE_EXCEPTIONS to __Fortran_ieee_exceptions so that it won't clash with the nonintrinsic namespace, establish a new intrinic IEEE_EXCEPTIONS module that USEs it, and add a USE to IEEE_ARITHMETIC. Updated to use STREQUAL rather than ambiguous MATCHES in the CMakeLists.txt file. Differential Revision: https://reviews.llvm.org/D121490
This commit is contained in:
parent
47bac63d3f
commit
0d9b0f642b
@ -279,7 +279,8 @@ public:
|
||||
" CONCURRENT"_err_en_US,
|
||||
doConcurrentSourcePosition_);
|
||||
}
|
||||
if (name->symbol && fromScope(*name->symbol, "ieee_exceptions"s)) {
|
||||
if (name->symbol &&
|
||||
fromScope(*name->symbol, "__fortran_ieee_exceptions"s)) {
|
||||
if (name->source == "ieee_set_halting_mode") {
|
||||
SayWithDo(context_, currentStatementSourcePosition_,
|
||||
"IEEE_SET_HALTING_MODE is not allowed in DO "
|
||||
|
129
flang/module/__fortran_ieee_exceptions.f90
Normal file
129
flang/module/__fortran_ieee_exceptions.f90
Normal file
@ -0,0 +1,129 @@
|
||||
!===-- module/__fortran_ieee_exceptions.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
|
||||
!
|
||||
!===------------------------------------------------------------------------===!
|
||||
|
||||
! See Fortran 2018, clause 17
|
||||
! The content of the standard intrinsic IEEE_EXCEPTIONS module is packaged
|
||||
! here under another name so that IEEE_ARITHMETIC can USE it and export its
|
||||
! declarations without clashing with a non-intrinsic module in a program.
|
||||
|
||||
module __Fortran_ieee_exceptions
|
||||
|
||||
type :: 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 :: &
|
||||
ieee_invalid = ieee_flag_type(1), &
|
||||
ieee_overflow = ieee_flag_type(2), &
|
||||
ieee_divide_by_zero = ieee_flag_type(4), &
|
||||
ieee_underflow = ieee_flag_type(8), &
|
||||
ieee_inexact = ieee_flag_type(16), &
|
||||
ieee_denorm = ieee_flag_type(32) ! PGI extension
|
||||
|
||||
type(ieee_flag_type), parameter :: &
|
||||
ieee_usual(*) = [ &
|
||||
ieee_overflow, ieee_divide_by_zero, ieee_invalid ], &
|
||||
ieee_all(*) = [ &
|
||||
ieee_usual, ieee_underflow, ieee_inexact, ieee_denorm ]
|
||||
|
||||
type :: ieee_modes_type ! Fortran 2018, 17.7
|
||||
private
|
||||
end type ieee_modes_type
|
||||
|
||||
type :: ieee_status_type ! Fortran 2018, 17.7
|
||||
private
|
||||
end type ieee_status_type
|
||||
|
||||
private :: ieee_support_flag_2, ieee_support_flag_3, &
|
||||
ieee_support_flag_4, ieee_support_flag_8, ieee_support_flag_10, &
|
||||
ieee_support_flag_16
|
||||
interface ieee_support_flag
|
||||
module procedure :: ieee_support_flag, &
|
||||
ieee_support_flag_2, ieee_support_flag_3, &
|
||||
ieee_support_flag_4, ieee_support_flag_8, ieee_support_flag_10, &
|
||||
ieee_support_flag_16
|
||||
end interface
|
||||
|
||||
contains
|
||||
elemental subroutine ieee_get_flag(flag, flag_value)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
logical, intent(out) :: flag_value
|
||||
end subroutine ieee_get_flag
|
||||
|
||||
elemental subroutine ieee_get_halting_mode(flag, halting)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
logical, intent(out) :: halting
|
||||
end subroutine ieee_get_halting_mode
|
||||
|
||||
subroutine ieee_get_modes(modes)
|
||||
type(ieee_modes_type), intent(out) :: modes
|
||||
end subroutine ieee_get_modes
|
||||
|
||||
subroutine ieee_get_status(status)
|
||||
type(ieee_status_type), intent(out) :: status
|
||||
end subroutine ieee_get_status
|
||||
|
||||
pure subroutine ieee_set_flag(flag, flag_value)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
logical, intent(in) :: flag_value
|
||||
end subroutine ieee_set_flag
|
||||
|
||||
pure subroutine ieee_set_halting_mode(flag, halting)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
logical, intent(in) :: halting
|
||||
end subroutine ieee_set_halting_mode
|
||||
|
||||
subroutine ieee_set_modes(modes)
|
||||
type(ieee_modes_type), intent(in) :: modes
|
||||
end subroutine ieee_set_modes
|
||||
|
||||
subroutine ieee_set_status(status)
|
||||
type(ieee_status_type), intent(in) :: status
|
||||
end subroutine ieee_set_status
|
||||
|
||||
pure logical function ieee_support_flag(flag)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
ieee_support_flag = .true.
|
||||
end function
|
||||
pure logical function ieee_support_flag_2(flag, x)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
real(kind=2), intent(in) :: x(..)
|
||||
ieee_support_flag_2 = .true.
|
||||
end function
|
||||
pure logical function ieee_support_flag_3(flag, x)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
real(kind=3), intent(in) :: x(..)
|
||||
ieee_support_flag_3 = .true.
|
||||
end function
|
||||
pure logical function ieee_support_flag_4(flag, x)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
real(kind=4), intent(in) :: x(..)
|
||||
ieee_support_flag_4 = .true.
|
||||
end function
|
||||
pure logical function ieee_support_flag_8(flag, x)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
real(kind=8), intent(in) :: x(..)
|
||||
ieee_support_flag_8 = .true.
|
||||
end function
|
||||
pure logical function ieee_support_flag_10(flag, x)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
real(kind=10), intent(in) :: x(..)
|
||||
ieee_support_flag_10 = .true.
|
||||
end function
|
||||
pure logical function ieee_support_flag_16(flag, x)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
real(kind=16), intent(in) :: x(..)
|
||||
ieee_support_flag_16 = .true.
|
||||
end function
|
||||
|
||||
pure logical function ieee_support_halting(flag)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
end function ieee_support_halting
|
||||
|
||||
end module __Fortran_ieee_exceptions
|
@ -29,6 +29,11 @@ module ieee_arithmetic
|
||||
ieee_support_subnormal => __builtin_ieee_support_subnormal, &
|
||||
ieee_support_underflow_control => __builtin_ieee_support_underflow_control
|
||||
|
||||
! 17.1: "The module IEEE_ARITHMETIC behaves as if it contained a USE statement
|
||||
! for IEEE_EXCEPTIONS; everything that is public in IEEE_EXCEPTIONS is public
|
||||
! in IEEE_ARITHMETIC."
|
||||
use __Fortran_ieee_exceptions
|
||||
|
||||
implicit none
|
||||
|
||||
type :: ieee_class_type
|
||||
|
@ -6,120 +6,6 @@
|
||||
!
|
||||
!===------------------------------------------------------------------------===!
|
||||
|
||||
! See Fortran 2018, clause 17
|
||||
module ieee_exceptions
|
||||
|
||||
type :: 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 :: &
|
||||
ieee_invalid = ieee_flag_type(1), &
|
||||
ieee_overflow = ieee_flag_type(2), &
|
||||
ieee_divide_by_zero = ieee_flag_type(4), &
|
||||
ieee_underflow = ieee_flag_type(8), &
|
||||
ieee_inexact = ieee_flag_type(16), &
|
||||
ieee_denorm = ieee_flag_type(32) ! PGI extension
|
||||
|
||||
type(ieee_flag_type), parameter :: &
|
||||
ieee_usual(*) = [ &
|
||||
ieee_overflow, ieee_divide_by_zero, ieee_invalid ], &
|
||||
ieee_all(*) = [ &
|
||||
ieee_usual, ieee_underflow, ieee_inexact, ieee_denorm ]
|
||||
|
||||
type :: ieee_modes_type ! Fortran 2018, 17.7
|
||||
private
|
||||
end type ieee_modes_type
|
||||
|
||||
type :: ieee_status_type ! Fortran 2018, 17.7
|
||||
private
|
||||
end type ieee_status_type
|
||||
|
||||
private :: ieee_support_flag_2, ieee_support_flag_3, &
|
||||
ieee_support_flag_4, ieee_support_flag_8, ieee_support_flag_10, &
|
||||
ieee_support_flag_16
|
||||
interface ieee_support_flag
|
||||
module procedure :: ieee_support_flag, &
|
||||
ieee_support_flag_2, ieee_support_flag_3, &
|
||||
ieee_support_flag_4, ieee_support_flag_8, ieee_support_flag_10, &
|
||||
ieee_support_flag_16
|
||||
end interface
|
||||
|
||||
contains
|
||||
elemental subroutine ieee_get_flag(flag, flag_value)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
logical, intent(out) :: flag_value
|
||||
end subroutine ieee_get_flag
|
||||
|
||||
elemental subroutine ieee_get_halting_mode(flag, halting)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
logical, intent(out) :: halting
|
||||
end subroutine ieee_get_halting_mode
|
||||
|
||||
subroutine ieee_get_modes(modes)
|
||||
type(ieee_modes_type), intent(out) :: modes
|
||||
end subroutine ieee_get_modes
|
||||
|
||||
subroutine ieee_get_status(status)
|
||||
type(ieee_status_type), intent(out) :: status
|
||||
end subroutine ieee_get_status
|
||||
|
||||
pure subroutine ieee_set_flag(flag, flag_value)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
logical, intent(in) :: flag_value
|
||||
end subroutine ieee_set_flag
|
||||
|
||||
pure subroutine ieee_set_halting_mode(flag, halting)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
logical, intent(in) :: halting
|
||||
end subroutine ieee_set_halting_mode
|
||||
|
||||
subroutine ieee_set_modes(modes)
|
||||
type(ieee_modes_type), intent(in) :: modes
|
||||
end subroutine ieee_set_modes
|
||||
|
||||
subroutine ieee_set_status(status)
|
||||
type(ieee_status_type), intent(in) :: status
|
||||
end subroutine ieee_set_status
|
||||
|
||||
pure logical function ieee_support_flag(flag)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
ieee_support_flag = .true.
|
||||
end function
|
||||
pure logical function ieee_support_flag_2(flag, x)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
real(kind=2), intent(in) :: x(..)
|
||||
ieee_support_flag_2 = .true.
|
||||
end function
|
||||
pure logical function ieee_support_flag_3(flag, x)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
real(kind=3), intent(in) :: x(..)
|
||||
ieee_support_flag_3 = .true.
|
||||
end function
|
||||
pure logical function ieee_support_flag_4(flag, x)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
real(kind=4), intent(in) :: x(..)
|
||||
ieee_support_flag_4 = .true.
|
||||
end function
|
||||
pure logical function ieee_support_flag_8(flag, x)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
real(kind=8), intent(in) :: x(..)
|
||||
ieee_support_flag_8 = .true.
|
||||
end function
|
||||
pure logical function ieee_support_flag_10(flag, x)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
real(kind=10), intent(in) :: x(..)
|
||||
ieee_support_flag_10 = .true.
|
||||
end function
|
||||
pure logical function ieee_support_flag_16(flag, x)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
real(kind=16), intent(in) :: x(..)
|
||||
ieee_support_flag_16 = .true.
|
||||
end function
|
||||
|
||||
pure logical function ieee_support_halting(flag)
|
||||
type(ieee_flag_type), intent(in) :: flag
|
||||
end function ieee_support_halting
|
||||
|
||||
use __Fortran_ieee_exceptions
|
||||
end module ieee_exceptions
|
||||
|
@ -6,6 +6,7 @@ set(LLVM_LINK_COMPONENTS
|
||||
|
||||
set(MODULES
|
||||
"__fortran_builtins"
|
||||
"__fortran_ieee_exceptions"
|
||||
"__fortran_type_info"
|
||||
"ieee_arithmetic"
|
||||
"ieee_exceptions"
|
||||
@ -20,13 +21,17 @@ set(MODULES
|
||||
# Create module files directly from the top-level module source directory
|
||||
foreach(filename ${MODULES})
|
||||
set(base ${FLANG_INTRINSIC_MODULES_DIR}/${filename})
|
||||
if(${filename} MATCHES "__fortran_builtins")
|
||||
if(${filename} STREQUAL "__fortran_builtins")
|
||||
set(depends "")
|
||||
else()
|
||||
set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_builtins.mod)
|
||||
if(NOT ${filename} MATCHES "__fortran_type_info")
|
||||
if(NOT ${filename} STREQUAL "__fortran_type_info")
|
||||
set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_type_info.mod)
|
||||
endif()
|
||||
if(${filename} STREQUAL "ieee_arithmetic" OR
|
||||
${filename} STREQUAL "ieee_exceptions")
|
||||
set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_ieee_exceptions.mod)
|
||||
endif()
|
||||
endif()
|
||||
add_custom_command(OUTPUT ${base}.mod
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${FLANG_INTRINSIC_MODULES_DIR}
|
||||
|
Loading…
x
Reference in New Issue
Block a user