The CUDA bindings change very frequently, sometimes changing the
underlying representation of types. In order to reduce the amount of
work needed in the compiler on each CUDA update, we make GNAT infer the
types it needs instead of hard-coding them.

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

        * exp_prag.adb (Get_Launch_Kernel_Arg_Type): New function.
        (Build_Shared_Memory_Declaration): Use
        Get_Launch_Kernel_Arg_Type.
        (Build_Stream_Declaration): Use Get_Launch_Kernel_Arg_Type.
        * rtsfind.ads: Remove RO_IC_Unsigned_Long_Long.
diff --git a/gcc/ada/exp_prag.adb b/gcc/ada/exp_prag.adb
--- a/gcc/ada/exp_prag.adb
+++ b/gcc/ada/exp_prag.adb
@@ -748,6 +748,10 @@ package body Exp_Prag is
       --  type of which is Integer, the value of which is Init_Val if present
       --  and 0 otherwise.
 
+      function Get_Launch_Kernel_Arg_Type (N : Positive) return Entity_Id;
+      --  Returns the type of the Nth argument of the Launch_Kernel CUDA
+      --  runtime function.
+
       function To_Addresses (Elmts : Elist_Id) return List_Id;
       --  Returns a new list containing each element of Elmts wrapped in an
       --  'address attribute reference. When passed No_Elist, returns an empty
@@ -910,7 +914,7 @@ package body Exp_Prag is
            (Decl_Id     => Decl_Id,
             Init_Val    => Init_Val,
             Typ         =>
-              New_Occurrence_Of (RTE (RO_IC_Unsigned_Long_Long), Loc),
+              New_Occurrence_Of (Get_Launch_Kernel_Arg_Type (5), Loc),
             Default_Val => Make_Integer_Literal (Loc, 0));
       end Build_Shared_Memory_Declaration;
 
@@ -948,10 +952,25 @@ package body Exp_Prag is
          return Build_Simple_Declaration_With_Default
            (Decl_Id     => Decl_Id,
             Init_Val    => Init_Val,
-            Typ         => New_Occurrence_Of (RTE (RE_Stream_T), Loc),
+            Typ         =>
+              New_Occurrence_Of (Get_Launch_Kernel_Arg_Type (6), Loc),
             Default_Val => Make_Null (Loc));
       end Build_Stream_Declaration;
 
+      --------------------------------
+      -- Get_Launch_Kernel_Arg_Type --
+      --------------------------------
+
+      function Get_Launch_Kernel_Arg_Type (N : Positive) return Entity_Id is
+         Argument : Entity_Id := First_Entity (RTE (RE_Launch_Kernel));
+      begin
+         for J in 2 .. N loop
+            Argument := Next_Entity (Argument);
+         end loop;
+
+         return Etype (Argument);
+      end Get_Launch_Kernel_Arg_Type;
+
       ------------------
       -- To_Addresses --
       ------------------


diff --git a/gcc/ada/rtsfind.ads b/gcc/ada/rtsfind.ads
--- a/gcc/ada/rtsfind.ads
+++ b/gcc/ada/rtsfind.ads
@@ -731,7 +731,6 @@ package Rtsfind is
      RE_Unsigned_128,                    -- Interfaces
 
      RO_IC_Unsigned,                     -- Interfaces.C
-     RO_IC_Unsigned_Long_Long,           -- Interfaces.C
 
      RE_Chars_Ptr,                       -- Interfaces.C.Strings
      RE_New_Char_Array,                  -- Interfaces.C.Strings
@@ -2380,7 +2379,6 @@ package Rtsfind is
      RE_Unsigned_128                     => Interfaces,
 
      RO_IC_Unsigned                      => Interfaces_C,
-     RO_IC_Unsigned_Long_Long            => Interfaces_C,
 
      RE_Chars_Ptr                        => Interfaces_C_Strings,
      RE_New_Char_Array                   => Interfaces_C_Strings,


Reply via email to