@@ -28,6 +28,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
2828#ifndef LIBCAF_GFORTRAN_DESCRIPTOR_H
2929#define LIBCAF_GFORTRAN_DESCRIPTOR_H
3030
31+ #include "libcaf-version-def.h"
32+
3133#include <stdint.h> /* For int32_t. */
3234
3335/* GNU Fortran's array descriptor. Keep in sync with libgfortran.h. To be
@@ -47,34 +49,64 @@ typedef struct descriptor_dimension
4749}
4850descriptor_dimension ;
4951
52+ #ifdef GCC_GE_8
53+ typedef struct dtype_type
54+ {
55+ size_t elem_len ;
56+ int version ;
57+ signed char rank ;
58+ signed char type ;
59+ signed short attribute ;
60+ }
61+ dtype_type ;
62+ #endif
63+
5064typedef struct gfc_descriptor_t {
5165 void * base_addr ;
5266 size_t offset ;
53- ptrdiff_t dtype ;
5467#ifdef GCC_GE_8
68+ dtype_type dtype ;
5569 ptrdiff_t span ;
70+ #else
71+ ptrdiff_t dtype ;
5672#endif
5773 descriptor_dimension dim [];
5874} gfc_descriptor_t ;
5975
76+ #ifdef GCC_GE_8
6077
61- #define GFC_MAX_DIMENSIONS 7
78+ #define GFC_MAX_DIMENSIONS 15
79+ #define GFC_DTYPE_RANK_MASK 0x0F
80+ #define GFC_DTYPE_TYPE_SHIFT 4
81+ #define GFC_DTYPE_TYPE_MASK 0x70
82+ #define GFC_DTYPE_SIZE_SHIFT 7
83+
84+ #define GFC_DESCRIPTOR_RANK (desc ) (desc)->dtype.rank
85+ #define GFC_DESCRIPTOR_TYPE (desc ) (desc)->dtype.type
86+ #define GFC_DESCRIPTOR_SIZE (desc ) (desc)->dtype.elem_len
87+ #define GFC_DTYPE_TYPE_SIZE (desc ) (( ((desc)->dtype.type << GFC_DTYPE_TYPE_SHIFT) \
88+ | ((desc)->dtype.elem_len << GFC_DTYPE_SIZE_SHIFT) ) & GFC_DTYPE_TYPE_SIZE_MASK)
6289
90+ #else
91+
92+ #define GFC_MAX_DIMENSIONS 7
6393#define GFC_DTYPE_RANK_MASK 0x07
6494#define GFC_DTYPE_TYPE_SHIFT 3
6595#define GFC_DTYPE_TYPE_MASK 0x38
6696#define GFC_DTYPE_SIZE_SHIFT 6
97+
6798#define GFC_DESCRIPTOR_RANK (desc ) ((desc)->dtype & GFC_DTYPE_RANK_MASK)
6899#define GFC_DESCRIPTOR_TYPE (desc ) (((desc)->dtype & GFC_DTYPE_TYPE_MASK) \
69100 >> GFC_DTYPE_TYPE_SHIFT)
70101#define GFC_DESCRIPTOR_SIZE (desc ) ((desc)->dtype >> GFC_DTYPE_SIZE_SHIFT)
102+ #define GFC_DTYPE_TYPE_SIZE (desc ) ((desc)->dtype & GFC_DTYPE_TYPE_SIZE_MASK)
103+
104+ #endif
71105
72106#define GFC_DTYPE_SIZE_MASK \
73107 ((~((ptrdiff_t) 0) >> GFC_DTYPE_SIZE_SHIFT) << GFC_DTYPE_SIZE_SHIFT)
74108#define GFC_DTYPE_TYPE_SIZE_MASK (GFC_DTYPE_SIZE_MASK | GFC_DTYPE_TYPE_MASK)
75109
76- #define GFC_DTYPE_TYPE_SIZE (desc ) ((desc)->dtype & GFC_DTYPE_TYPE_SIZE_MASK)
77-
78110#define GFC_DTYPE_INTEGER_1 ((BT_INTEGER << GFC_DTYPE_TYPE_SHIFT) \
79111 | (sizeof(int8_t) << GFC_DTYPE_SIZE_SHIFT))
80112#define GFC_DTYPE_INTEGER_2 ((BT_INTEGER << GFC_DTYPE_TYPE_SHIFT) \
@@ -136,11 +168,14 @@ typedef struct gfc_descriptor_t {
136168 receives in the dtype component its gf_descriptor_t argument for character(kind=c_char)
137169 and logical(kind=c_bool) data:
138170*/
139- #define GFC_DTYPE_CHARACTER 48
140171
141- #if 0
172+ #ifdef GCC_GE_8
173+
142174#define GFC_DTYPE_CHARACTER ((BT_CHARACTER << GFC_DTYPE_TYPE_SHIFT) \
143175 | (sizeof(char) << GFC_DTYPE_SIZE_SHIFT))
176+
177+ #else
178+ #define GFC_DTYPE_CHARACTER 48
144179#endif
145180
146181
0 commit comments