[Ada] Generate minimally correct C/C++ binding for stddef.h

Message ID 11793214.ApSfGmZ2J8@arcturus.home
State New
Headers show
Series
  • [Ada] Generate minimally correct C/C++ binding for stddef.h
Related show

Commit Message

Eric Botcazou Feb. 28, 2018, 2:31 p.m.
This was broken when the default was changed to C11/C++11.

Tested on x86_64-suse-linux, applied on the mainline.


2018-02-28  Eric Botcazou  <ebotcazou@adacore.com>

ada/
	* libgnat/i-cexten.ads (Float_128): New type.

c-family/
	* c-ada-spec.c (dump_ada_node) <NULLPTR_TYPE>: New case.
	<REAL_TYPE>: Deal specifically with _Float128/__float128.

-- 
Eric Botcazou

Patch

Index: ada/libgnat/i-cexten.ads
===================================================================
--- ada/libgnat/i-cexten.ads	(revision 257983)
+++ ada/libgnat/i-cexten.ads	(working copy)
@@ -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;
Index: c-family/c-ada-spec.c
===================================================================
--- c-family/c-ada-spec.c	(revision 258067)
+++ c-family/c-ada-spec.c	(working copy)
@@ -2126,6 +2126,7 @@  dump_ada_node (pretty_printer *buffer, tree node,
       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,
 	dump_ada_enum_type (buffer, node, type, spc, true);
       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")))
+	{
+	  append_withs ("Interfaces.C.Extensions", false);
+	  pp_string (buffer, "Extensions.Float_128");
+	  break;
+	}
+      /* fallthrough */
+
     case INTEGER_TYPE:
-    case REAL_TYPE:
     case FIXED_POINT_TYPE:
     case BOOLEAN_TYPE:
       if (TYPE_NAME (node))
@@ -2233,9 +2246,8 @@  dump_ada_node (pretty_printer *buffer, tree node,
 	    {
 	      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 ");