CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
161 lines
4.9 KiB
Fortran
161 lines
4.9 KiB
Fortran
!===-- module/iso_c_binding.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 18.2
|
|
|
|
module iso_c_binding
|
|
|
|
use __fortran_builtins, only: &
|
|
c_associated => __builtin_c_associated, &
|
|
c_funloc => __builtin_c_funloc, &
|
|
c_funptr => __builtin_c_funptr, &
|
|
c_f_pointer => __builtin_c_f_pointer, &
|
|
c_f_strpointer => __builtin_c_f_strpointer, &
|
|
c_loc => __builtin_c_loc, &
|
|
c_null_funptr => __builtin_c_null_funptr, &
|
|
c_null_ptr => __builtin_c_null_ptr, &
|
|
c_ptr => __builtin_c_ptr, &
|
|
c_sizeof => sizeof, &
|
|
f_c_string => __builtin_f_c_string, &
|
|
operator(==), operator(/=)
|
|
|
|
implicit none
|
|
|
|
! 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_f_strpointer, &
|
|
c_loc, c_null_funptr, c_null_ptr, c_ptr, c_sizeof, f_c_string, &
|
|
operator(==), operator(/=)
|
|
|
|
! Table 18.2 (in clause 18.3.1)
|
|
! TODO: Specialize (via macros?) for alternative targets
|
|
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, public :: &
|
|
c_int = c_int32_t, &
|
|
c_short = c_int16_t, &
|
|
#if defined(_WIN32)
|
|
c_long = c_int32_t, &
|
|
#else
|
|
c_long = c_int64_t, &
|
|
#endif
|
|
c_long_long = c_int64_t, &
|
|
c_signed_char = c_int8_t, &
|
|
c_size_t = kind(c_sizeof(1)), &
|
|
! Currently both gcc and clang define intmax_t to be 64 bit.
|
|
c_intmax_t = c_int64_t, &
|
|
c_intptr_t = c_size_t, &
|
|
c_ptrdiff_t = c_size_t
|
|
integer, parameter, public :: &
|
|
c_int_least8_t = c_int8_t, &
|
|
c_int_fast8_t = c_int8_t, &
|
|
c_int_least16_t = c_int16_t, &
|
|
#if defined(__linux__) && defined(__powerpc__)
|
|
c_int_fast16_t = c_long, &
|
|
#else
|
|
c_int_fast16_t = c_int16_t, &
|
|
#endif
|
|
c_int_least32_t = c_int32_t, &
|
|
#if defined(__linux__) && defined(__powerpc__)
|
|
c_int_fast32_t = c_long, &
|
|
#else
|
|
c_int_fast32_t = c_int32_t, &
|
|
#endif
|
|
c_int_least64_t = c_int64_t, &
|
|
c_int_fast64_t = c_int64_t, &
|
|
c_int_least128_t = c_int128_t, &
|
|
c_int_fast128_t = c_int128_t
|
|
|
|
integer, parameter, public :: &
|
|
c_float = 4, &
|
|
c_double = 8, &
|
|
#if defined(__x86_64__)
|
|
c_long_double = 10
|
|
#elif defined(_WIN32) && defined(__aarch64__)
|
|
c_long_double = 8
|
|
#else
|
|
c_long_double = 16
|
|
#endif
|
|
|
|
integer, parameter, public :: &
|
|
c_float_complex = c_float, &
|
|
c_double_complex = c_double, &
|
|
c_long_double_complex = c_long_double
|
|
|
|
integer, parameter, public :: c_bool = 1
|
|
integer, parameter, public :: c_char = 1
|
|
|
|
! C characters with special semantics
|
|
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, public :: &
|
|
c_float128 = 16, &
|
|
c_float128_complex = c_float128
|
|
integer, parameter, public :: &
|
|
c_uint8_t = 1, &
|
|
c_uint16_t = 2, &
|
|
c_uint32_t = 4, &
|
|
c_uint64_t = 8, &
|
|
c_uint128_t = 16
|
|
integer, parameter, public :: &
|
|
c_unsigned_char = c_uint8_t, &
|
|
c_unsigned_short = c_uint16_t, &
|
|
c_unsigned = c_uint32_t, &
|
|
#if defined(_WIN32)
|
|
c_unsigned_long = c_uint32_t, &
|
|
#else
|
|
c_unsigned_long = c_uint64_t, &
|
|
#endif
|
|
c_unsigned_long_long = c_uint64_t, &
|
|
#if defined(__powerpc__) || defined(_WIN32)
|
|
c_uintmax_t = c_uint64_t
|
|
#else
|
|
c_uintmax_t = c_uint128_t
|
|
#endif
|
|
integer, parameter, public :: &
|
|
c_uint_fast8_t = c_uint8_t, &
|
|
c_uint_fast16_t = c_uint16_t, &
|
|
c_uint_fast32_t = c_uint32_t, &
|
|
c_uint_fast64_t = c_uint64_t, &
|
|
c_uint_fast128_t = c_uint128_t
|
|
integer, parameter, public :: &
|
|
c_uint_least8_t = c_uint8_t, &
|
|
c_uint_least16_t = c_uint16_t, &
|
|
c_uint_least32_t = c_uint32_t, &
|
|
c_uint_least64_t = c_uint64_t, &
|
|
c_uint_least128_t = c_uint128_t
|
|
|
|
contains
|
|
|
|
subroutine c_f_procpointer(cptr, fptr)
|
|
type(c_funptr), intent(in) :: cptr
|
|
procedure(), pointer, intent(out) :: fptr
|
|
! TODO: implement
|
|
end subroutine c_f_procpointer
|
|
|
|
end module iso_c_binding
|