c-ada-spec.c (is_float128): New predicate extracted from...
authorEric Botcazou <ebotcazou@adacore.com>
Sun, 7 Apr 2019 10:34:19 +0000 (10:34 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sun, 7 Apr 2019 10:34:19 +0000 (10:34 +0000)
c-family/
* c-ada-spec.c (is_float128): New predicate extracted from...
(dump_ada_node) <COMPLEX_TYPE>: Use it to recognize __cfloat128.
<REAL_TYPE>: ...here.  Call it.
ada/
* libgnat/i-cexten.ads (CFloat_128): New type.

From-SVN: r270188

gcc/ada/ChangeLog
gcc/ada/libgnat/i-cexten.ads
gcc/c-family/ChangeLog
gcc/c-family/c-ada-spec.c

index 81b5db972c4239d60f38e2eb5c1c691816afc317..7e36b01e9b2ca22089c6f651ffef539c80ff96a6 100644 (file)
@@ -1,3 +1,7 @@
+2019-04-07  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * libgnat/i-cexten.ads (CFloat_128): New type.
+
 2019-03-22  Dmitriy Anisimkov  <anisimko@adacore.com>
 
        PR ada/89583
index bf396a4179756c43dc4f6b9e6fd8af2681aba270..d0a07474662a0c8d92674ebef48d43cf615ebe0a 100644 (file)
@@ -74,7 +74,7 @@ package Interfaces.C.Extensions is
    for Signed_128'Alignment use unsigned_long_long'Alignment * 2;
 
    --  128-bit floating-point type available on x86:
-   --  typedef long_double float_128 __attribute__ ((mode (TF)));
+   --  typedef float float_128 __attribute__ ((mode (TF)));
 
    type Float_128 is record
       low, high : unsigned_long_long;
@@ -82,6 +82,14 @@ package Interfaces.C.Extensions is
    pragma Convention (C_Pass_By_Copy, Float_128);
    for Float_128'Alignment use unsigned_long_long'Alignment * 2;
 
+   --  128-bit complex floating-point type available on x86:
+   --  typedef _Complex float cfloat_128 __attribute__ ((mode (TC)));
+
+   type CFloat_128 is record
+      re, im : Float_128;
+   end record;
+   pragma Convention (C_Pass_By_Copy, CFloat_128);
+
    --  Types for bitfields
 
    type Unsigned_1 is mod 2 ** 1;
index f94140359aac7e8e7601c0970f97968ba41dd7c5..c62395f2acf2c5d14d1904a289f27a64321bed68 100644 (file)
@@ -1,3 +1,9 @@
+2019-04-07  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * c-ada-spec.c (is_float128): New predicate extracted from...
+       (dump_ada_node) <COMPLEX_TYPE>: Use it to recognize __cfloat128.
+       <REAL_TYPE>: ...here.  Call it.
+
 2019-04-05  David Malcolm  <dmalcolm@redhat.com>
 
        PR c/89985
index e3ad86637640b9e2d5814ef1097ebd408ad49c60..2ca8bdaeaa306cfc4e291a31a2a2f1caff0e4d9d 100644 (file)
@@ -2014,6 +2014,22 @@ dump_ada_enum_type (pretty_printer *buffer, tree node, int spc)
     }
 }
 
+/* Return true if NODE is the __float128/_Float128 type.  */
+
+static bool
+is_float128 (tree node)
+{
+  if (!TYPE_NAME (node) || TREE_CODE (TYPE_NAME (node)) != TYPE_DECL)
+    return false;
+
+  tree name = DECL_NAME (TYPE_NAME (node));
+
+  if (IDENTIFIER_POINTER (name) [0] != '_')
+    return false;
+
+  return id_equal (name, "__float128") || id_equal (name, "_Float128");
+}
+
 static bool bitfield_used = false;
 
 /* Recursively dump in BUFFER Ada declarations corresponding to NODE of type
@@ -2067,7 +2083,13 @@ dump_ada_node (pretty_printer *buffer, tree node, tree type, int spc,
       break;
 
     case COMPLEX_TYPE:
-      pp_string (buffer, "<complex>");
+      if (is_float128 (TREE_TYPE (node)))
+       {
+         append_withs ("Interfaces.C.Extensions", false);
+         pp_string (buffer, "Extensions.CFloat_128");
+       }
+      else
+       pp_string (buffer, "<complex>");
       break;
 
     case ENUMERAL_TYPE:
@@ -2078,11 +2100,7 @@ dump_ada_node (pretty_printer *buffer, tree node, tree type, int spc,
       break;
 
     case REAL_TYPE:
-      if (TYPE_NAME (node)
-         && TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
-         && IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))) [0] == '_'
-         && (id_equal (DECL_NAME (TYPE_NAME (node)), "_Float128")
-             || id_equal (DECL_NAME (TYPE_NAME (node)), "__float128")))
+      if (is_float128 (node))
        {
          append_withs ("Interfaces.C.Extensions", false);
          pp_string (buffer, "Extensions.Float_128");