From c6db43fa35b9d98d0eaa49bb9243e99aada49670 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 28 Feb 2018 14:31:02 +0000 Subject: [PATCH] i-cexten.ads (Float_128): New type. ada/ * libgnat/i-cexten.ads (Float_128): New type. c-family/ * c-ada-spec.c (dump_ada_node) : New case. : Deal specifically with _Float128/__float128. From-SVN: r258068 --- gcc/ada/ChangeLog | 4 ++++ gcc/ada/libgnat/i-cexten.ads | 9 +++++++++ gcc/c-family/ChangeLog | 5 +++++ gcc/c-family/c-ada-spec.c | 20 ++++++++++++++++---- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index e0e72a7d954..4d721f22f89 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,7 @@ +2018-02-28 Eric Botcazou + + * libgnat/i-cexten.ads (Float_128): New type. + 2018-02-02 Eric Botcazou * gcc-interface/decl.c (array_type_has_nonaliased_component): Return diff --git a/gcc/ada/libgnat/i-cexten.ads b/gcc/ada/libgnat/i-cexten.ads index 72f658b7174..8e770b5f859 100644 --- a/gcc/ada/libgnat/i-cexten.ads +++ b/gcc/ada/libgnat/i-cexten.ads @@ -72,6 +72,15 @@ package Interfaces.C.Extensions is pragma Convention (C_Pass_By_Copy, Signed_128); 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))); + + type Float_128 is record + low, high : unsigned_long_long; + end record; + pragma Convention (C_Pass_By_Copy, Float_128); + for Float_128'Alignment use unsigned_long_long'Alignment * 2; + -- Types for bitfields type Unsigned_1 is mod 2 ** 1; diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 7730c65fc48..950591c053e 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2018-02-28 Eric Botcazou + + * c-ada-spec.c (dump_ada_node) : New case. + : Deal specifically with _Float128/__float128. + 2018-02-28 Eric Botcazou * c-ada-spec.c (dump_ada_double_name) : New case. diff --git a/gcc/c-family/c-ada-spec.c b/gcc/c-family/c-ada-spec.c index 254c79db5b7..288a4611de0 100644 --- a/gcc/c-family/c-ada-spec.c +++ b/gcc/c-family/c-ada-spec.c @@ -2126,6 +2126,7 @@ dump_ada_node (pretty_printer *buffer, tree node, tree type, int spc, pp_string (buffer, "--- unexpected node: TREE_VEC"); return 0; + case NULLPTR_TYPE: case VOID_TYPE: if (package_prefix) { @@ -2151,8 +2152,20 @@ dump_ada_node (pretty_printer *buffer, tree node, tree type, int spc, dump_ada_enum_type (buffer, node, type, spc, true); break; - case INTEGER_TYPE: 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"))) + { + append_withs ("Interfaces.C.Extensions", false); + pp_string (buffer, "Extensions.Float_128"); + break; + } + /* fallthrough */ + + case INTEGER_TYPE: case FIXED_POINT_TYPE: case BOOLEAN_TYPE: if (TYPE_NAME (node)) @@ -2233,9 +2246,8 @@ dump_ada_node (pretty_printer *buffer, tree node, tree type, int spc, { if (TREE_CODE (node) == POINTER_TYPE && TREE_CODE (TREE_TYPE (node)) == INTEGER_TYPE - && !strcmp - (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME - (TREE_TYPE (node)))), "char")) + && id_equal (DECL_NAME (TYPE_NAME (TREE_TYPE (node))), + "char")) { if (!name_only) pp_string (buffer, "new "); -- 2.30.2