[flang-commits] [flang] e43b2e4 - [flang] "CFI" types for Fortran REAL and COMPLEX kinds 2, 3, 10, 16

V Donaldson via flang-commits flang-commits at lists.llvm.org
Fri Jan 14 11:06:38 PST 2022


Author: V Donaldson
Date: 2022-01-14T11:06:18-08:00
New Revision: e43b2e4f480b507a1d3eb9a5f3b294c0599eed73

URL: https://github.com/llvm/llvm-project/commit/e43b2e4f480b507a1d3eb9a5f3b294c0599eed73
DIFF: https://github.com/llvm/llvm-project/commit/e43b2e4f480b507a1d3eb9a5f3b294c0599eed73.diff

LOG: [flang] "CFI" types for Fortran REAL and COMPLEX kinds 2, 3, 10, 16

Add additional "CFI" types for Fortran REAL and COMPLEX kinds 2, 3, 10, 16 to allow their use in Fortran descriptors.

Added: 
    

Modified: 
    flang/include/flang/ISO_Fortran_binding.h
    flang/include/flang/Runtime/type-code.h
    flang/runtime/ISO_Fortran_binding.cpp
    flang/runtime/type-code.cpp
    flang/test/Fir/convert-to-llvm.fir

Removed: 
    


################################################################################
diff  --git a/flang/include/flang/ISO_Fortran_binding.h b/flang/include/flang/ISO_Fortran_binding.h
index 7689eee130248..dbfc882c37edf 100644
--- a/flang/include/flang/ISO_Fortran_binding.h
+++ b/flang/include/flang/ISO_Fortran_binding.h
@@ -43,7 +43,8 @@ typedef unsigned char CFI_attribute_t;
 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 @@ typedef signed char CFI_type_t;
 #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_ptr
diff _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
 

diff  --git a/flang/include/flang/Runtime/type-code.h b/flang/include/flang/Runtime/type-code.h
index b64167e0b67af..d2d504ef947e5 100644
--- a/flang/include/flang/Runtime/type-code.h
+++ b/flang/include/flang/Runtime/type-code.h
@@ -33,11 +33,11 @@ class TypeCode {
     return raw_ >= CFI_type_signed_char && raw_ <= CFI_type_ptr
diff _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 ||

diff  --git a/flang/runtime/ISO_Fortran_binding.cpp b/flang/runtime/ISO_Fortran_binding.cpp
index 0a385ec3187ad..1e5da86d8b4c9 100644
--- a/flang/runtime/ISO_Fortran_binding.cpp
+++ b/flang/runtime/ISO_Fortran_binding.cpp
@@ -178,24 +178,48 @@ static constexpr std::size_t MinElemLen(CFI_type_t type) {
   case CFI_type_ptr
diff _t:
     minElemLen = sizeof(std::ptr
diff _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;

diff  --git a/flang/runtime/type-code.cpp b/flang/runtime/type-code.cpp
index d09959b3d927c..7acff93deac1c 100644
--- a/flang/runtime/type-code.cpp
+++ b/flang/runtime/type-code.cpp
@@ -33,6 +33,12 @@ TypeCode::TypeCode(TypeCategory f, int kind) {
     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 @@ TypeCode::TypeCode(TypeCategory f, int kind) {
       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 @@ TypeCode::GetCategoryAndKind() const {
     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:

diff  --git a/flang/test/Fir/convert-to-llvm.fir b/flang/test/Fir/convert-to-llvm.fir
index 49fbad673ba9e..9b4961a974a47 100644
--- a/flang/test/Fir/convert-to-llvm.fir
+++ b/flang/test/Fir/convert-to-llvm.fir
@@ -1573,7 +1573,7 @@ func @embox_typecode1(%arg0: !fir.ref<f32>) {
 }
 
 // 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<f32>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>
 
@@ -1583,7 +1583,7 @@ func @embox_typecode2(%arg0: !fir.ref<f128>) {
 }
 
 // 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<f128>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>
 
@@ -1593,7 +1593,7 @@ func @embox_typecode3(%arg0: !fir.ref<!fir.complex<4>>) {
 }
 
 // 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<struct<(f32, f32)>>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>
 
@@ -1603,7 +1603,7 @@ func @embox_typecode4(%arg0: !fir.ref<!fir.logical<1>>) {
 }
 
 // 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<i8>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>
 
@@ -1623,7 +1623,7 @@ func @embox1(%arg0: !fir.ref<!fir.type<_QMtest_dinitTtseq{i:i32}>>) {
 
 // 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<struct<"_QMtest_dinitTtseq", (i32)>>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, ptr<i{{.*}}>, array<1 x i{{.*}}>)>
 // CHECK:         %[[F18ADDENDUM:.*]] = llvm.mlir.constant(1 : i32) : i32
@@ -1810,7 +1810,7 @@ func private @_QPxb(!fir.box<!fir.array<?x?xf64>>)
 // CHECK:         %[[ARR:.*]] = llvm.alloca %[[ARR_SIZE]] x f64 {bindc_name = "arr", in_type = !fir.array<?x?xf64>, operand_segment_sizes = dense<[0, 2]> : vector<2xi32>, uniq_name = "_QFsbEarr"} : (i64) -> !llvm.ptr<f64>
 // CHECK:         %[[BOX0:.*]] = llvm.mlir.undef : !llvm.struct<(ptr<f64>, 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<f64>, 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 @@ func @test_rebox_1(%arg0: !fir.box<!fir.array<?x?xf32>>) {
 //CHECK:    %[[EIGHTY:.*]] = llvm.mlir.constant(80 : index) : i64
 //CHECK:    %[[RBOX:.*]] = llvm.mlir.undef : !llvm.struct<(ptr<f32>, 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<f32>, 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 @@ func @foo(%arg0: !fir.box<!fir.array<?x!fir.type<t{i:i32,c:!fir.char<1,10>}>>>)
 //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<i8>, 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<i8>, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
 //CHECK:   %[[RANK:.*]] = llvm.mlir.constant(1 : i32) : i32


        


More information about the flang-commits mailing list