Index: flang/include/flang/ISO_Fortran_binding.h =================================================================== --- flang/include/flang/ISO_Fortran_binding.h +++ flang/include/flang/ISO_Fortran_binding.h @@ -43,7 +43,8 @@ typedef signed char CFI_type_t; /* These codes are required to be macros (i.e., #ifdef will work). * They are not required to be distinct, but neither are they required - * to have had their synonyms combined. + * to have had their synonyms combined. Codes marked as extensions may be + * place holders for as yet unimplemented types. */ #define CFI_type_signed_char 1 #define CFI_type_short 2 @@ -60,27 +61,35 @@ #define CFI_type_int_least16_t 13 #define CFI_type_int_least32_t 14 #define CFI_type_int_least64_t 15 -#define CFI_type_int_least128_t 16 +#define CFI_type_int_least128_t 16 /* extension */ #define CFI_type_int_fast8_t 17 #define CFI_type_int_fast16_t 18 #define CFI_type_int_fast32_t 19 #define CFI_type_int_fast64_t 20 -#define CFI_type_int_fast128_t 21 +#define CFI_type_int_fast128_t 21 /* extension */ #define CFI_type_intmax_t 22 #define CFI_type_intptr_t 23 #define CFI_type_ptrdiff_t 24 -#define CFI_type_float 25 -#define CFI_type_double 26 -#define CFI_type_long_double 27 -#define CFI_type_float_Complex 28 -#define CFI_type_double_Complex 29 -#define CFI_type_long_double_Complex 30 -#define CFI_type_Bool 31 -#define CFI_type_char 32 -#define CFI_type_cptr 33 -#define CFI_type_struct 34 -#define CFI_type_char16_t 35 /* extension: char16_t */ -#define CFI_type_char32_t 36 /* extension: char32_t */ +#define CFI_type_half_float 25 /* extension: kind=2 */ +#define CFI_type_bfloat 26 /* extension: kind=3 */ +#define CFI_type_float 27 +#define CFI_type_double 28 +#define CFI_type_extended_double 29 /* extension: kind=10 */ +#define CFI_type_long_double 30 +#define CFI_type_float128 31 /* extension: kind=16 */ +#define CFI_type_half_float_Complex 32 /* extension: kind=2 */ +#define CFI_type_bfloat_Complex 33 /* extension: kind=3 */ +#define CFI_type_float_Complex 34 +#define CFI_type_double_Complex 35 +#define CFI_type_extended_double_Complex 36 /* extension: kind=10 */ +#define CFI_type_long_double_Complex 37 +#define CFI_type_float128_Complex 38 /* extension: kind=16 */ +#define CFI_type_Bool 39 +#define CFI_type_char 40 +#define CFI_type_cptr 41 +#define CFI_type_struct 42 +#define CFI_type_char16_t 43 /* extension */ +#define CFI_type_char32_t 44 /* extension */ #define CFI_TYPE_LAST CFI_type_char32_t #define CFI_type_other (-1) // must be negative Index: flang/include/flang/Runtime/type-code.h =================================================================== --- flang/include/flang/Runtime/type-code.h +++ flang/include/flang/Runtime/type-code.h @@ -33,11 +33,11 @@ return raw_ >= CFI_type_signed_char && raw_ <= CFI_type_ptrdiff_t; } constexpr bool IsReal() const { - return raw_ >= CFI_type_float && raw_ <= CFI_type_long_double; + return raw_ >= CFI_type_half_float && raw_ <= CFI_type_float128; } constexpr bool IsComplex() const { - return raw_ >= CFI_type_float_Complex && - raw_ <= CFI_type_long_double_Complex; + return raw_ >= CFI_type_half_float_Complex && + raw_ <= CFI_type_float128_Complex; } constexpr bool IsCharacter() const { return raw_ == CFI_type_char || raw_ == CFI_type_char16_t || Index: flang/runtime/ISO_Fortran_binding.cpp =================================================================== --- flang/runtime/ISO_Fortran_binding.cpp +++ flang/runtime/ISO_Fortran_binding.cpp @@ -178,24 +178,48 @@ case CFI_type_ptrdiff_t: minElemLen = sizeof(std::ptrdiff_t); break; + case CFI_type_half_float: + minElemLen = 2; + break; + case CFI_type_bfloat: + minElemLen = 2; + break; case CFI_type_float: minElemLen = sizeof(float); break; case CFI_type_double: minElemLen = sizeof(double); break; + case CFI_type_extended_double: + minElemLen = 10; + break; case CFI_type_long_double: minElemLen = sizeof(long double); break; + case CFI_type_float128: + minElemLen = 16; + break; + case CFI_type_half_float_Complex: + minElemLen = 2 * MinElemLen(CFI_type_half_float); + break; + case CFI_type_bfloat_Complex: + minElemLen = 2 * MinElemLen(CFI_type_bfloat); + break; case CFI_type_float_Complex: minElemLen = 2 * sizeof(float); break; case CFI_type_double_Complex: minElemLen = 2 * sizeof(double); break; + case CFI_type_extended_double_Complex: + minElemLen = 2 * MinElemLen(CFI_type_extended_double); + break; case CFI_type_long_double_Complex: minElemLen = 2 * sizeof(long double); break; + case CFI_type_float128_Complex: + minElemLen = 2 * MinElemLen(CFI_type_float128); + break; case CFI_type_Bool: minElemLen = 1; break; Index: flang/runtime/type-code.cpp =================================================================== --- flang/runtime/type-code.cpp +++ flang/runtime/type-code.cpp @@ -33,6 +33,12 @@ break; case TypeCategory::Real: switch (kind) { + case 2: + raw_ = CFI_type_half_float; + break; + case 3: + raw_ = CFI_type_bfloat; + break; case 4: raw_ = CFI_type_float; break; @@ -40,8 +46,10 @@ raw_ = CFI_type_double; break; case 10: + raw_ = CFI_type_extended_double; + break; case 16: - raw_ = CFI_type_long_double; + raw_ = CFI_type_float128; break; } break; @@ -107,26 +115,42 @@ return std::make_pair(TypeCategory::Integer, 8); case CFI_type_int128_t: return std::make_pair(TypeCategory::Integer, 16); + case CFI_type_half_float: + return std::make_pair(TypeCategory::Real, 2); + case CFI_type_bfloat: + return std::make_pair(TypeCategory::Real, 3); case CFI_type_float: return std::make_pair(TypeCategory::Real, 4); case CFI_type_double: return std::make_pair(TypeCategory::Real, 8); + case CFI_type_extended_double: + return std::make_pair(TypeCategory::Real, 10); case CFI_type_long_double: #if __x86_64__ return std::make_pair(TypeCategory::Real, 10); #else return std::make_pair(TypeCategory::Real, 16); #endif + case CFI_type_float128: + return std::make_pair(TypeCategory::Real, 16); + case CFI_type_half_float_Complex: + return std::make_pair(TypeCategory::Complex, 2); + case CFI_type_bfloat_Complex: + return std::make_pair(TypeCategory::Complex, 3); case CFI_type_float_Complex: return std::make_pair(TypeCategory::Complex, 4); case CFI_type_double_Complex: return std::make_pair(TypeCategory::Complex, 8); + case CFI_type_extended_double_Complex: + return std::make_pair(TypeCategory::Complex, 10); case CFI_type_long_double_Complex: #if __x86_64__ return std::make_pair(TypeCategory::Complex, 10); #else return std::make_pair(TypeCategory::Complex, 16); #endif + case CFI_type_float128_Complex: + return std::make_pair(TypeCategory::Complex, 16); case CFI_type_char: return std::make_pair(TypeCategory::Character, 1); case CFI_type_char16_t: Index: flang/test/Fir/convert-to-llvm.fir =================================================================== --- flang/test/Fir/convert-to-llvm.fir +++ flang/test/Fir/convert-to-llvm.fir @@ -1573,7 +1573,7 @@ } // CHECK-LABEL: llvm.func @embox_typecode1 -// CHECK: %[[TYPE_CODE_F32:.*]] = llvm.mlir.constant(25 : i32) : i32 +// CHECK: %[[TYPE_CODE_F32:.*]] = llvm.mlir.constant(27 : i32) : i32 // CHECK: %[[TYPE_CODE_F32_I8:.*]] = llvm.trunc %[[TYPE_CODE_I64]] : i32 to i8 // CHECK: %{{.*}} = llvm.insertvalue %[[TYPE_CODE_F32_I8]], %{{.*}}[4 : i32] : !llvm.struct<(ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})> @@ -1583,7 +1583,7 @@ } // CHECK-LABEL: llvm.func @embox_typecode2 -// CHECK: %[[TYPE_CODE_F128:.*]] = llvm.mlir.constant(27 : i32) : i32 +// CHECK: %[[TYPE_CODE_F128:.*]] = llvm.mlir.constant(30 : i32) : i32 // CHECK: %[[TYPE_CODE_F128_I8:.*]] = llvm.trunc %[[TYPE_CODE_F128]] : i32 to i8 // CHECK: %{{.*}} = llvm.insertvalue %[[TYPE_CODE_F128_I8]], %{{.*}}[4 : i32] : !llvm.struct<(ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})> @@ -1593,7 +1593,7 @@ } // CHECK-LABEL: llvm.func @embox_typecode3 -// CHECK: %[[TYPE_CODE_CPLX4:.*]] = llvm.mlir.constant(28 : i32) : i32 +// CHECK: %[[TYPE_CODE_CPLX4:.*]] = llvm.mlir.constant(34 : i32) : i32 // CHECK: %[[TYPE_CODE_CPLX4_I8:.*]] = llvm.trunc %[[TYPE_CODE_F128]] : i32 to i8 // CHECK: %{{.*}} = llvm.insertvalue %[[TYPE_CODE_CPLX4_I8]], %{{.*}}[4 : i32] : !llvm.struct<(ptr>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})> @@ -1603,7 +1603,7 @@ } // CHECK-LABEL: llvm.func @embox_typecode4 -// CHECK: %[[TYPE_CODE_I64:.*]] = llvm.mlir.constant(31 : i32) : i32 +// CHECK: %[[TYPE_CODE_I64:.*]] = llvm.mlir.constant(39 : i32) : i32 // CHECK: %[[TYPE_CODE_I64_I8:.*]] = llvm.trunc %[[TYPE_CODE_I64]] : i32 to i8 // CHECK: %{{.*}} = llvm.insertvalue %[[TYPE_CODE_I64_I8]], %{{.*}}[4 : i32] : !llvm.struct<(ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})> @@ -1623,7 +1623,7 @@ // CHECK: llvm.mlir.global extern_weak @_QMtest_dinitE.dt.tseq() : i8 // CHECK-LABEL: llvm.func @embox1 -// CHECK: %[[TYPE_CODE:.*]] = llvm.mlir.constant(34 : i32) : i32 +// CHECK: %[[TYPE_CODE:.*]] = llvm.mlir.constant(42 : i32) : i32 // CHECK: %[[TYPE_CODE_I8:.*]] = llvm.trunc %[[TYPE_CODE]] : i32 to i8 // CHECK: %{{.*}} = llvm.insertvalue %[[TYPE_CODE_I8]], %{{.*}}[4 : i32] : !llvm.struct<(ptr>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, ptr, array<1 x i{{.*}}>)> // CHECK: %[[F18ADDENDUM:.*]] = llvm.mlir.constant(1 : i32) : i32 @@ -1810,7 +1810,7 @@ // CHECK: %[[ARR:.*]] = llvm.alloca %[[ARR_SIZE]] x f64 {bindc_name = "arr", in_type = !fir.array, operand_segment_sizes = dense<[0, 2]> : vector<2xi32>, uniq_name = "_QFsbEarr"} : (i64) -> !llvm.ptr // CHECK: %[[BOX0:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<2 x array<3 x i64>>)> // CHECK: %[[ELEM_LEN:.*]] = llvm.mlir.constant(8 : i32) : i32 -// CHECK: %[[TYPE_CODE:.*]] = llvm.mlir.constant(26 : i32) : i32 +// CHECK: %[[TYPE_CODE:.*]] = llvm.mlir.constant(28 : i32) : i32 // CHECK: %[[ELEM_LEN_I64:.*]] = llvm.sext %[[ELEM_LEN]] : i32 to i64 // CHECK: %[[BOX1:.*]] = llvm.insertvalue %[[ELEM_LEN_I64]], %[[BOX0]][1 : i32] : !llvm.struct<(ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<2 x array<3 x i64>>)> // CHECK: %[[VERSION:.*]] = llvm.mlir.constant(20180515 : i32) : i32 @@ -2086,7 +2086,7 @@ //CHECK: %[[EIGHTY:.*]] = llvm.mlir.constant(80 : index) : i64 //CHECK: %[[RBOX:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)> //CHECK: %[[ELEM_SIZE:.*]] = llvm.mlir.constant(4 : i32) : i32 -//CHECK: %[[FLOAT_TYPE:.*]] = llvm.mlir.constant(25 : i32) : i32 +//CHECK: %[[FLOAT_TYPE:.*]] = llvm.mlir.constant(27 : i32) : i32 //CHECK: %[[ELEM_SIZE_I64:.*]] = llvm.sext %[[ELEM_SIZE]] : i32 to i64 //CHECK: %[[RBOX_TMP1:.*]] = llvm.insertvalue %[[ELEM_SIZE_I64]], %[[RBOX]][1 : i32] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)> //CHECK: %[[CFI_VERSION:.*]] = llvm.mlir.constant(20180515 : i32) : i32 @@ -2163,7 +2163,7 @@ //CHECK: %[[RESULT_STRIDE:.*]] = llvm.mlir.constant(9 : i64) : i64 //CHECK: %[[COMPONENT_OFFSET_1:.*]] = llvm.mlir.constant(1 : i64) : i64 //CHECK: %[[ELEM_SIZE:.*]] = llvm.mlir.constant(7 : i64) : i64 -//CHECK: %[[TYPE_CHAR:.*]] = llvm.mlir.constant(32 : i32) : i32 +//CHECK: %[[TYPE_CHAR:.*]] = llvm.mlir.constant(40 : i32) : i32 //CHECK: %[[RBOX_TMP1:.*]] = llvm.insertvalue %[[ELEM_SIZE]], %{{.*}}[1 : i32] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)> //CHECK: %[[RBOX_TMP2:.*]] = llvm.insertvalue %{{.*}}, %[[RBOX_TMP1]][2 : i32] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)> //CHECK: %[[RANK:.*]] = llvm.mlir.constant(1 : i32) : i32