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,