[Ada] CUDA: discover runtime types instead of hard-coding
authorGhjuvan Lacambre <lacambre@adacore.com>
Tue, 25 Aug 2020 10:16:24 +0000 (12:16 +0200)
committerPierre-Marie de Rodat <derodat@adacore.com>
Thu, 22 Oct 2020 12:11:27 +0000 (08:11 -0400)
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.

gcc/ada/exp_prag.adb
gcc/ada/rtsfind.ads

index d3c63f457a0456daf0c23619f97c97072e563243..1367884cef6f34b1f900e5fd20d080cf3b1823cf 100644 (file)
@@ -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 --
       ------------------
index 01f33a0e24616493376f13f8d3466003042b7354..cbcf52bdc8e1eb42908d81a0d20efca69e41cae7 100644 (file)
@@ -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,