1 !===-- module/__fortran_builtins.f90 ---------------------------------------===!
3 ! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 ! See https://llvm.org/LICENSE.txt for license information.
5 ! SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 !===------------------------------------------------------------------------===!
9 #
include '../include/flang/Runtime/magic-numbers.h'
11 ! These naming shenanigans prevent names from Fortran intrinsic modules
12 ! from being usable on INTRINSIC statements, and force the program
13 ! to USE the standard intrinsic modules in order to access the
14 ! standard names of the procedures.
15 module __fortran_builtins
18 ! Set PRIVATE by default to explicitly only export what is meant
19 ! to be exported by this MODULE.
22 intrinsic :: __builtin_c_loc
23 public
:: __builtin_c_loc
25 intrinsic :: __builtin_c_f_pointer
26 public
:: __builtin_c_f_pointer
28 intrinsic :: sizeof
! extension
31 intrinsic :: selected_int_kind
32 integer, parameter :: int64
= selected_int_kind(18)
34 type, bind(c
), public
:: __builtin_c_ptr
35 integer(kind
=int64
), private
:: __address
38 type, bind(c
), public
:: __builtin_c_funptr
39 integer(kind
=int64
), private
:: __address
42 type, public
:: __builtin_event_type
43 integer(kind
=int64
), private
:: __count
46 type, public
:: __builtin_notify_type
47 integer(kind
=int64
), private
:: __count
50 type, public
:: __builtin_lock_type
51 integer(kind
=int64
), private
:: __count
54 type, public
:: __builtin_ieee_flag_type
55 integer(kind
=1), private
:: flag
= 0
58 type(__builtin_ieee_flag_type
), parameter, public
:: &
59 __builtin_ieee_invalid
= &
60 __builtin_ieee_flag_type(_FORTRAN_RUNTIME_IEEE_INVALID
), &
61 __builtin_ieee_overflow
= &
62 __builtin_ieee_flag_type(_FORTRAN_RUNTIME_IEEE_OVERFLOW
), &
63 __builtin_ieee_divide_by_zero
= &
64 __builtin_ieee_flag_type(_FORTRAN_RUNTIME_IEEE_DIVIDE_BY_ZERO
), &
65 __builtin_ieee_underflow
= &
66 __builtin_ieee_flag_type(_FORTRAN_RUNTIME_IEEE_UNDERFLOW
), &
67 __builtin_ieee_inexact
= &
68 __builtin_ieee_flag_type(_FORTRAN_RUNTIME_IEEE_INEXACT
), &
69 __builtin_ieee_denorm
= & ! extension
70 __builtin_ieee_flag_type(_FORTRAN_RUNTIME_IEEE_DENORM
)
72 type, public
:: __builtin_ieee_round_type
73 integer(kind
=1), private
:: mode
= 0
76 type(__builtin_ieee_round_type
), parameter, public
:: &
77 __builtin_ieee_to_zero
= &
78 __builtin_ieee_round_type(_FORTRAN_RUNTIME_IEEE_TO_ZERO
), &
79 __builtin_ieee_nearest
= &
80 __builtin_ieee_round_type(_FORTRAN_RUNTIME_IEEE_NEAREST
), &
82 __builtin_ieee_round_type(_FORTRAN_RUNTIME_IEEE_UP
), &
83 __builtin_ieee_down
= &
84 __builtin_ieee_round_type(_FORTRAN_RUNTIME_IEEE_DOWN
), &
85 __builtin_ieee_away
= &
86 __builtin_ieee_round_type(_FORTRAN_RUNTIME_IEEE_AWAY
), &
87 __builtin_ieee_other
= &
88 __builtin_ieee_round_type(_FORTRAN_RUNTIME_IEEE_OTHER
)
90 type, public
:: __builtin_team_type
91 integer(kind
=int64
), private
:: __id
94 integer, parameter, public
:: __builtin_atomic_int_kind
= selected_int_kind(18)
95 integer, parameter, public
:: &
96 __builtin_atomic_logical_kind
= __builtin_atomic_int_kind
98 type, public
:: __builtin_dim3
99 integer :: x
=1, y
=1, z
=1
101 type(__builtin_dim3
), public
:: &
102 __builtin_threadIdx
, __builtin_blockDim
, __builtin_blockIdx
, &
104 integer, parameter, public
:: __builtin_warpsize
= 32
106 type, public
, bind(c
) :: __builtin_c_devptr
107 type(__builtin_c_ptr
) :: cptr
110 intrinsic :: __builtin_fma
111 intrinsic :: __builtin_ieee_int
112 intrinsic :: __builtin_ieee_is_nan
, __builtin_ieee_is_negative
, &
113 __builtin_ieee_is_normal
114 intrinsic :: __builtin_ieee_next_after
, __builtin_ieee_next_down
, &
115 __builtin_ieee_next_up
116 intrinsic :: scale
! for ieee_scalb
117 intrinsic :: __builtin_ieee_real
118 intrinsic :: __builtin_ieee_selected_real_kind
119 intrinsic :: __builtin_ieee_support_datatype
, &
120 __builtin_ieee_support_denormal
, __builtin_ieee_support_divide
, &
121 __builtin_ieee_support_flag
, __builtin_ieee_support_halting
, &
122 __builtin_ieee_support_inf
, __builtin_ieee_support_io
, &
123 __builtin_ieee_support_nan
, __builtin_ieee_support_rounding
, &
124 __builtin_ieee_support_sqrt
, &
125 __builtin_ieee_support_standard
, __builtin_ieee_support_subnormal
, &
126 __builtin_ieee_support_underflow_control
127 public
:: __builtin_fma
128 public
:: __builtin_ieee_int
129 public
:: __builtin_ieee_is_nan
, __builtin_ieee_is_negative
, &
130 __builtin_ieee_is_normal
131 public
:: __builtin_ieee_next_after
, __builtin_ieee_next_down
, &
132 __builtin_ieee_next_up
133 public
:: __builtin_ieee_real
134 public
:: scale
! for ieee_scalb
135 public
:: __builtin_ieee_selected_real_kind
136 public
:: __builtin_ieee_support_datatype
, &
137 __builtin_ieee_support_denormal
, __builtin_ieee_support_divide
, &
138 __builtin_ieee_support_flag
, __builtin_ieee_support_halting
, &
139 __builtin_ieee_support_inf
, __builtin_ieee_support_io
, &
140 __builtin_ieee_support_nan
, __builtin_ieee_support_rounding
, &
141 __builtin_ieee_support_sqrt
, &
142 __builtin_ieee_support_standard
, __builtin_ieee_support_subnormal
, &
143 __builtin_ieee_support_underflow_control
145 type :: __force_derived_type_instantiations
146 type(__builtin_c_ptr
) :: c_ptr
147 type(__builtin_c_funptr
) :: c_funptr
148 type(__builtin_event_type
) :: event_type
149 type(__builtin_lock_type
) :: lock_type
150 type(__builtin_team_type
) :: team_type
153 intrinsic :: __builtin_compiler_options
, __builtin_compiler_version
154 public
:: __builtin_compiler_options
, __builtin_compiler_version
156 interface operator(==)
157 module procedure __builtin_c_ptr_eq
159 public
:: operator(==)
161 interface operator(/=)
162 module procedure __builtin_c_ptr_ne
164 public
:: operator(/=)
166 interface __builtin_c_associated
167 module procedure c_associated_c_ptr
168 module procedure c_associated_c_funptr
170 public
:: __builtin_c_associated
171 ! private :: c_associated_c_ptr, c_associated_c_funptr
173 type(__builtin_c_ptr
), parameter, public
:: __builtin_c_null_ptr
= __builtin_c_ptr(0)
174 type(__builtin_c_funptr
), parameter, public
:: &
175 __builtin_c_null_funptr
= __builtin_c_funptr(0)
177 public
:: __builtin_c_ptr_eq
178 public
:: __builtin_c_ptr_ne
179 public
:: __builtin_c_funloc
183 elemental
logical function __builtin_c_ptr_eq(x
, y
)
184 type(__builtin_c_ptr
), intent(in
) :: x
, y
185 __builtin_c_ptr_eq
= x
%__address
== y
%__address
188 elemental
logical function __builtin_c_ptr_ne(x
, y
)
189 type(__builtin_c_ptr
), intent(in
) :: x
, y
190 __builtin_c_ptr_ne
= x
%__address
/= y
%__address
193 ! Semantics has some special-case code that allows c_funloc()
194 ! to appear in a specification expression and exempts it
195 ! from the requirement that "x" be a pure dummy procedure.
196 pure
function __builtin_c_funloc(x
)
197 type(__builtin_c_funptr
) :: __builtin_c_funloc
199 __builtin_c_funloc
= __builtin_c_funptr(loc(x
))
202 pure
logical function c_associated_c_ptr(c_ptr_1
, c_ptr_2
)
203 type(__builtin_c_ptr
), intent(in
) :: c_ptr_1
204 type(__builtin_c_ptr
), intent(in
), optional
:: c_ptr_2
205 if (c_ptr_1
%__address
== __builtin_c_null_ptr
%__address
) then
206 c_associated_c_ptr
= .false
.
207 else if (present(c_ptr_2
)) then
208 c_associated_c_ptr
= c_ptr_1
%__address
== c_ptr_2
%__address
210 c_associated_c_ptr
= .true
.
212 end function c_associated_c_ptr
214 pure
logical function c_associated_c_funptr(c_ptr_1
, c_ptr_2
)
215 type(__builtin_c_funptr
), intent(in
) :: c_ptr_1
216 type(__builtin_c_funptr
), intent(in
), optional
:: c_ptr_2
217 if (c_ptr_1
%__address
== __builtin_c_null_ptr
%__address
) then
218 c_associated_c_funptr
= .false
.
219 else if (present(c_ptr_2
)) then
220 c_associated_c_funptr
= c_ptr_1
%__address
== c_ptr_2
%__address
222 c_associated_c_funptr
= .true
.
224 end function c_associated_c_funptr