| !===-- module/__fortran_type_info.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 |
| ! |
| !===------------------------------------------------------------------------===! |
| |
| ! Fortran definitions of runtime type description schemata. |
| ! See flang/runtime/type-info.h for C++ perspective. |
| ! The Semantics phase of the compiler requires the module file of this module |
| ! in order to generate description tables for all other derived types. |
| |
| module __Fortran_type_info |
| |
| use __Fortran_builtins, only: __builtin_c_ptr, __builtin_c_funptr |
| |
| private |
| |
| integer, parameter :: int64 = selected_int_kind(18) |
| |
| type :: DerivedType |
| ! "TBP" bindings appear first. Inherited bindings, with overrides already |
| ! applied, appear in the initial entries in the same order as they |
| ! appear in the parent type's bindings, if any. They are followed |
| ! by new local bindings in alphabetic order of theing binding names. |
| type(Binding), pointer, contiguous :: binding(:) |
| character(len=:), pointer :: name |
| integer(kind=int64) :: sizeInBytes |
| ! Instances of parameterized derived types use the "uninstantiated" |
| ! component to point to the pristine original definition. |
| type(DerivedType), pointer :: uninstantiated |
| integer(kind=int64), pointer, contiguous :: kindParameter(:) ! values of instance |
| integer(1), pointer, contiguous :: lenParameterKind(:) ! INTEGER kinds of LEN types |
| ! Data components appear in component order. |
| ! The parent component, if any, appears explicitly and first. |
| type(Component), pointer, contiguous :: component(:) ! data components |
| type(ProcPtrComponent), pointer, contiguous :: procptr(:) ! procedure pointers |
| ! Special bindings of the ancestral types are not duplicated here. |
| ! Bindings are in ascending order of their "which" code values. |
| type(SpecialBinding), pointer, contiguous :: special(:) |
| ! A little-endian bit set of SpecialBinding::Which codes present in "special" |
| integer(4) :: specialBitSet |
| integer(1) :: hasParent |
| integer(1) :: noInitializationNeeded ! 1 if no component w/ init |
| integer(1) :: noDestructionNeeded ! 1 if no component w/ dealloc/final |
| integer(1) :: noFinalizationNeeded ! 1 if nothing finalizaable |
| integer(1) :: __padding0(4) |
| end type |
| |
| type :: Binding |
| type(__builtin_c_funptr) :: proc |
| character(len=:), pointer :: name |
| end type |
| |
| ! Array bounds and type parameters of components are deferred |
| ! (for allocatables and pointers), explicit constants, or |
| ! taken from LEN type parameters for automatic components. |
| enum, bind(c) ! Value::Genre |
| enumerator :: Deferred = 1, Explicit = 2, LenParameter = 3 |
| end enum |
| |
| type, bind(c) :: Value |
| integer(1) :: genre ! Value::Genre |
| integer(1) :: __padding0(7) |
| integer(kind=int64) :: value |
| end type |
| |
| enum, bind(c) ! Component::Genre |
| enumerator :: Data = 1, Pointer = 2, Allocatable = 3, Automatic = 4 |
| end enum |
| |
| enum, bind(c) ! common::TypeCategory |
| enumerator :: CategoryInteger = 0, CategoryReal = 1, & |
| CategoryComplex = 2, CategoryCharacter = 3, & |
| CategoryLogical = 4, CategoryDerived = 5 |
| end enum |
| |
| type :: Component ! data components, incl. object pointers |
| character(len=:), pointer :: name |
| integer(1) :: genre ! Component::Genre |
| integer(1) :: category |
| integer(1) :: kind |
| integer(1) :: rank |
| integer(1) :: __padding0(4) |
| integer(kind=int64) :: offset |
| type(Value) :: characterLen ! for category == Character |
| type(DerivedType), pointer :: derived ! for category == Derived |
| type(Value), pointer, contiguous :: lenValue(:) ! (SIZE(derived%lenParameterKind)) |
| type(Value), pointer, contiguous :: bounds(:, :) ! (2, rank): lower, upper |
| type(__builtin_c_ptr) :: initialization |
| end type |
| |
| type :: ProcPtrComponent ! procedure pointer components |
| character(len=:), pointer :: name |
| integer(kind=int64) :: offset |
| type(__builtin_c_funptr) :: initialization |
| end type |
| |
| enum, bind(c) ! SpecialBinding::Which |
| enumerator :: ScalarAssignment = 1, ElementalAssignment = 2 |
| enumerator :: ReadFormatted = 3, ReadUnformatted = 4 |
| enumerator :: WriteFormatted = 5, WriteUnformatted = 6 |
| enumerator :: ElementalFinal = 7, AssumedRankFinal = 8 |
| enumerator :: ScalarFinal = 9 ! higher-rank final procedures follow |
| end enum |
| |
| type, bind(c) :: SpecialBinding |
| integer(1) :: which ! SpecialBinding::Which |
| integer(1) :: isArgDescriptorSet |
| integer(1) :: __padding0(6) |
| type(__builtin_c_funptr) :: proc |
| end type |
| |
| end module |