1a7c4f320SJonas Hahnfeld //===-------- interface.cpp - Target independent OpenMP target RTL --------===//
2a7c4f320SJonas Hahnfeld //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a7c4f320SJonas Hahnfeld //
7a7c4f320SJonas Hahnfeld //===----------------------------------------------------------------------===//
8a7c4f320SJonas Hahnfeld //
9a7c4f320SJonas Hahnfeld // Implementation of the interface to be used by Clang during the codegen of a
10a7c4f320SJonas Hahnfeld // target region.
11a7c4f320SJonas Hahnfeld //
12a7c4f320SJonas Hahnfeld //===----------------------------------------------------------------------===//
13a7c4f320SJonas Hahnfeld
14a7c4f320SJonas Hahnfeld #include "device.h"
15758b8499SJohannes Doerfert #include "omptarget.h"
16a7c4f320SJonas Hahnfeld #include "private.h"
17a7c4f320SJonas Hahnfeld #include "rtl.h"
18a7c4f320SJonas Hahnfeld
19a7c4f320SJonas Hahnfeld #include <cassert>
20ae209397SJoseph Huber #include <cstdio>
219f49676aSDimitry Andric #include <cstdlib>
221b4a666bSAlexandre Eichenberger #include <mutex>
231b4a666bSAlexandre Eichenberger
241b4a666bSAlexandre Eichenberger ////////////////////////////////////////////////////////////////////////////////
259e9c9182SGheorghe-Teodor Bercea /// adds requires flags
__tgt_register_requires(int64_t Flags)26d27d0a67SJoseph Huber EXTERN void __tgt_register_requires(int64_t Flags) {
27e007b328SGiorgis Georgakoudis TIMESCOPE();
28d27d0a67SJoseph Huber PM->RTLs.registerRequires(Flags);
291b4a666bSAlexandre Eichenberger }
30a7c4f320SJonas Hahnfeld
31a7c4f320SJonas Hahnfeld ////////////////////////////////////////////////////////////////////////////////
32a7c4f320SJonas Hahnfeld /// adds a target shared library to the target execution image
__tgt_register_lib(__tgt_bin_desc * Desc)33d27d0a67SJoseph Huber EXTERN void __tgt_register_lib(__tgt_bin_desc *Desc) {
34e007b328SGiorgis Georgakoudis TIMESCOPE();
35d27d0a67SJoseph Huber std::call_once(PM->RTLs.InitFlag, &RTLsTy::loadRTLs, &PM->RTLs);
36683719bcSAtmn for (auto &RTL : PM->RTLs.AllRTLs) {
37683719bcSAtmn if (RTL.register_lib) {
38d27d0a67SJoseph Huber if ((*RTL.register_lib)(Desc) != OFFLOAD_SUCCESS) {
39683719bcSAtmn DP("Could not register library with %s", RTL.RTLName.c_str());
40683719bcSAtmn }
41683719bcSAtmn }
42683719bcSAtmn }
43d27d0a67SJoseph Huber PM->RTLs.registerLib(Desc);
44a7c4f320SJonas Hahnfeld }
45a7c4f320SJonas Hahnfeld
46a7c4f320SJonas Hahnfeld ////////////////////////////////////////////////////////////////////////////////
47313c5239SJose M Monsalve Diaz /// Initialize all available devices without registering any image
__tgt_init_all_rtls()48313c5239SJose M Monsalve Diaz EXTERN void __tgt_init_all_rtls() { PM->RTLs.initAllRTLs(); }
49313c5239SJose M Monsalve Diaz
50313c5239SJose M Monsalve Diaz ////////////////////////////////////////////////////////////////////////////////
51a7c4f320SJonas Hahnfeld /// unloads a target shared library
__tgt_unregister_lib(__tgt_bin_desc * Desc)52d27d0a67SJoseph Huber EXTERN void __tgt_unregister_lib(__tgt_bin_desc *Desc) {
53e007b328SGiorgis Georgakoudis TIMESCOPE();
54d27d0a67SJoseph Huber PM->RTLs.unregisterLib(Desc);
55683719bcSAtmn for (auto &RTL : PM->RTLs.UsedRTLs) {
56683719bcSAtmn if (RTL->unregister_lib) {
57d27d0a67SJoseph Huber if ((*RTL->unregister_lib)(Desc) != OFFLOAD_SUCCESS) {
58683719bcSAtmn DP("Could not register library with %s", RTL->RTLName.c_str());
59683719bcSAtmn }
60683719bcSAtmn }
61683719bcSAtmn }
62a7c4f320SJonas Hahnfeld }
63a7c4f320SJonas Hahnfeld
64a7c4f320SJonas Hahnfeld /// creates host-to-target data mapping, stores it in the
65a7c4f320SJonas Hahnfeld /// libomptarget.so internal structure (an entry in a stack of data maps)
66a7c4f320SJonas Hahnfeld /// and passes the data to the device.
__tgt_target_data_begin_mapper(ident_t * Loc,int64_t DeviceId,int32_t ArgNum,void ** ArgsBase,void ** Args,int64_t * ArgSizes,int64_t * ArgTypes,map_var_info_t * ArgNames,void ** ArgMappers)67d27d0a67SJoseph Huber EXTERN void __tgt_target_data_begin_mapper(ident_t *Loc, int64_t DeviceId,
68d27d0a67SJoseph Huber int32_t ArgNum, void **ArgsBase,
69d27d0a67SJoseph Huber void **Args, int64_t *ArgSizes,
70d27d0a67SJoseph Huber int64_t *ArgTypes,
71d27d0a67SJoseph Huber map_var_info_t *ArgNames,
72d27d0a67SJoseph Huber void **ArgMappers) {
73d27d0a67SJoseph Huber TIMESCOPE_WITH_IDENT(Loc);
74a0da2468SGeorge Rokos DP("Entering data begin region for device %" PRId64 " with %d mappings\n",
75d27d0a67SJoseph Huber DeviceId, ArgNum);
76d27d0a67SJoseph Huber if (checkDeviceAndCtors(DeviceId, Loc)) {
77d27d0a67SJoseph Huber DP("Not offloading to device %" PRId64 "\n", DeviceId);
78a7c4f320SJonas Hahnfeld return;
79a7c4f320SJonas Hahnfeld }
80a7c4f320SJonas Hahnfeld
81d27d0a67SJoseph Huber DeviceTy &Device = *PM->Devices[DeviceId];
82a7c4f320SJonas Hahnfeld
83fe5d51a4SJoseph Huber if (getInfoLevel() & OMP_INFOTYPE_KERNEL_ARGS)
84d27d0a67SJoseph Huber printKernelArguments(Loc, DeviceId, ArgNum, ArgSizes, ArgTypes, ArgNames,
85d27d0a67SJoseph Huber "Entering OpenMP data region");
86a0da2468SGeorge Rokos #ifdef OMPTARGET_DEBUG
87d27d0a67SJoseph Huber for (int I = 0; I < ArgNum; ++I) {
88a0da2468SGeorge Rokos DP("Entry %2d: Base=" DPxMOD ", Begin=" DPxMOD ", Size=%" PRId64
895378c6a4SJoseph Huber ", Type=0x%" PRIx64 ", Name=%s\n",
90d27d0a67SJoseph Huber I, DPxPTR(ArgsBase[I]), DPxPTR(Args[I]), ArgSizes[I], ArgTypes[I],
91d27d0a67SJoseph Huber (ArgNames) ? getNameFromMapping(ArgNames[I]).c_str() : "unknown");
92a0da2468SGeorge Rokos }
93a0da2468SGeorge Rokos #endif
94a7c4f320SJonas Hahnfeld
95758b8499SJohannes Doerfert AsyncInfoTy AsyncInfo(Device);
96d27d0a67SJoseph Huber int Rc = targetDataBegin(Loc, Device, ArgNum, ArgsBase, Args, ArgSizes,
97d27d0a67SJoseph Huber ArgTypes, ArgNames, ArgMappers, AsyncInfo);
98d27d0a67SJoseph Huber if (Rc == OFFLOAD_SUCCESS)
99d27d0a67SJoseph Huber Rc = AsyncInfo.synchronize();
100d27d0a67SJoseph Huber handleTargetOutcome(Rc == OFFLOAD_SUCCESS, Loc);
101a7c4f320SJonas Hahnfeld }
102a7c4f320SJonas Hahnfeld
__tgt_target_data_begin_nowait_mapper(ident_t * Loc,int64_t DeviceId,int32_t ArgNum,void ** ArgsBase,void ** Args,int64_t * ArgSizes,int64_t * ArgTypes,map_var_info_t * ArgNames,void ** ArgMappers,int32_t DepNum,void * DepList,int32_t NoAliasDepNum,void * NoAliasDepList)10397e55cfeSJoseph Huber EXTERN void __tgt_target_data_begin_nowait_mapper(
104d27d0a67SJoseph Huber ident_t *Loc, int64_t DeviceId, int32_t ArgNum, void **ArgsBase,
105d27d0a67SJoseph Huber void **Args, int64_t *ArgSizes, int64_t *ArgTypes, map_var_info_t *ArgNames,
106d27d0a67SJoseph Huber void **ArgMappers, int32_t DepNum, void *DepList, int32_t NoAliasDepNum,
107d27d0a67SJoseph Huber void *NoAliasDepList) {
108d27d0a67SJoseph Huber TIMESCOPE_WITH_IDENT(Loc);
109a7c4f320SJonas Hahnfeld
110d27d0a67SJoseph Huber __tgt_target_data_begin_mapper(Loc, DeviceId, ArgNum, ArgsBase, Args,
111d27d0a67SJoseph Huber ArgSizes, ArgTypes, ArgNames, ArgMappers);
112a7c4f320SJonas Hahnfeld }
113a7c4f320SJonas Hahnfeld
114a7c4f320SJonas Hahnfeld /// passes data from the target, releases target memory and destroys
115a7c4f320SJonas Hahnfeld /// the host-target mapping (top entry from the stack of data maps)
116a7c4f320SJonas Hahnfeld /// created by the last __tgt_target_data_begin.
__tgt_target_data_end_mapper(ident_t * Loc,int64_t DeviceId,int32_t ArgNum,void ** ArgsBase,void ** Args,int64_t * ArgSizes,int64_t * ArgTypes,map_var_info_t * ArgNames,void ** ArgMappers)117d27d0a67SJoseph Huber EXTERN void __tgt_target_data_end_mapper(ident_t *Loc, int64_t DeviceId,
118d27d0a67SJoseph Huber int32_t ArgNum, void **ArgsBase,
119d27d0a67SJoseph Huber void **Args, int64_t *ArgSizes,
120d27d0a67SJoseph Huber int64_t *ArgTypes,
121d27d0a67SJoseph Huber map_var_info_t *ArgNames,
122d27d0a67SJoseph Huber void **ArgMappers) {
123d27d0a67SJoseph Huber TIMESCOPE_WITH_IDENT(Loc);
124d27d0a67SJoseph Huber DP("Entering data end region with %d mappings\n", ArgNum);
125d27d0a67SJoseph Huber if (checkDeviceAndCtors(DeviceId, Loc)) {
126d27d0a67SJoseph Huber DP("Not offloading to device %" PRId64 "\n", DeviceId);
127a7c4f320SJonas Hahnfeld return;
128a7c4f320SJonas Hahnfeld }
129a7c4f320SJonas Hahnfeld
130d27d0a67SJoseph Huber DeviceTy &Device = *PM->Devices[DeviceId];
131a7c4f320SJonas Hahnfeld
132fe5d51a4SJoseph Huber if (getInfoLevel() & OMP_INFOTYPE_KERNEL_ARGS)
133d27d0a67SJoseph Huber printKernelArguments(Loc, DeviceId, ArgNum, ArgSizes, ArgTypes, ArgNames,
134d27d0a67SJoseph Huber "Exiting OpenMP data region");
135a0da2468SGeorge Rokos #ifdef OMPTARGET_DEBUG
136d27d0a67SJoseph Huber for (int I = 0; I < ArgNum; ++I) {
137a0da2468SGeorge Rokos DP("Entry %2d: Base=" DPxMOD ", Begin=" DPxMOD ", Size=%" PRId64
1385378c6a4SJoseph Huber ", Type=0x%" PRIx64 ", Name=%s\n",
139d27d0a67SJoseph Huber I, DPxPTR(ArgsBase[I]), DPxPTR(Args[I]), ArgSizes[I], ArgTypes[I],
140d27d0a67SJoseph Huber (ArgNames) ? getNameFromMapping(ArgNames[I]).c_str() : "unknown");
141a0da2468SGeorge Rokos }
142a0da2468SGeorge Rokos #endif
143a7c4f320SJonas Hahnfeld
144758b8499SJohannes Doerfert AsyncInfoTy AsyncInfo(Device);
145d27d0a67SJoseph Huber int Rc = targetDataEnd(Loc, Device, ArgNum, ArgsBase, Args, ArgSizes,
146d27d0a67SJoseph Huber ArgTypes, ArgNames, ArgMappers, AsyncInfo);
147d27d0a67SJoseph Huber if (Rc == OFFLOAD_SUCCESS)
148d27d0a67SJoseph Huber Rc = AsyncInfo.synchronize();
149d27d0a67SJoseph Huber handleTargetOutcome(Rc == OFFLOAD_SUCCESS, Loc);
150a7c4f320SJonas Hahnfeld }
151a7c4f320SJonas Hahnfeld
__tgt_target_data_end_nowait_mapper(ident_t * Loc,int64_t DeviceId,int32_t ArgNum,void ** ArgsBase,void ** Args,int64_t * ArgSizes,int64_t * ArgTypes,map_var_info_t * ArgNames,void ** ArgMappers,int32_t DepNum,void * DepList,int32_t NoAliasDepNum,void * NoAliasDepList)15297e55cfeSJoseph Huber EXTERN void __tgt_target_data_end_nowait_mapper(
153d27d0a67SJoseph Huber ident_t *Loc, int64_t DeviceId, int32_t ArgNum, void **ArgsBase,
154d27d0a67SJoseph Huber void **Args, int64_t *ArgSizes, int64_t *ArgTypes, map_var_info_t *ArgNames,
155d27d0a67SJoseph Huber void **ArgMappers, int32_t DepNum, void *DepList, int32_t NoAliasDepNum,
156d27d0a67SJoseph Huber void *NoAliasDepList) {
157d27d0a67SJoseph Huber TIMESCOPE_WITH_IDENT(Loc);
158140ab574SGeorge Rokos
159d27d0a67SJoseph Huber __tgt_target_data_end_mapper(Loc, DeviceId, ArgNum, ArgsBase, Args, ArgSizes,
160d27d0a67SJoseph Huber ArgTypes, ArgNames, ArgMappers);
161140ab574SGeorge Rokos }
162140ab574SGeorge Rokos
__tgt_target_data_update_mapper(ident_t * Loc,int64_t DeviceId,int32_t ArgNum,void ** ArgsBase,void ** Args,int64_t * ArgSizes,int64_t * ArgTypes,map_var_info_t * ArgNames,void ** ArgMappers)163d27d0a67SJoseph Huber EXTERN void __tgt_target_data_update_mapper(ident_t *Loc, int64_t DeviceId,
164d27d0a67SJoseph Huber int32_t ArgNum, void **ArgsBase,
165d27d0a67SJoseph Huber void **Args, int64_t *ArgSizes,
166d27d0a67SJoseph Huber int64_t *ArgTypes,
167d27d0a67SJoseph Huber map_var_info_t *ArgNames,
168d27d0a67SJoseph Huber void **ArgMappers) {
169d27d0a67SJoseph Huber TIMESCOPE_WITH_IDENT(Loc);
170d27d0a67SJoseph Huber DP("Entering data update with %d mappings\n", ArgNum);
171d27d0a67SJoseph Huber if (checkDeviceAndCtors(DeviceId, Loc)) {
172d27d0a67SJoseph Huber DP("Not offloading to device %" PRId64 "\n", DeviceId);
173a7c4f320SJonas Hahnfeld return;
174a7c4f320SJonas Hahnfeld }
175a7c4f320SJonas Hahnfeld
176fe5d51a4SJoseph Huber if (getInfoLevel() & OMP_INFOTYPE_KERNEL_ARGS)
177d27d0a67SJoseph Huber printKernelArguments(Loc, DeviceId, ArgNum, ArgSizes, ArgTypes, ArgNames,
178d27d0a67SJoseph Huber "Updating OpenMP data");
179fe5d51a4SJoseph Huber
180d27d0a67SJoseph Huber DeviceTy &Device = *PM->Devices[DeviceId];
181758b8499SJohannes Doerfert AsyncInfoTy AsyncInfo(Device);
182d27d0a67SJoseph Huber int Rc = targetDataUpdate(Loc, Device, ArgNum, ArgsBase, Args, ArgSizes,
183d27d0a67SJoseph Huber ArgTypes, ArgNames, ArgMappers, AsyncInfo);
184d27d0a67SJoseph Huber if (Rc == OFFLOAD_SUCCESS)
185d27d0a67SJoseph Huber Rc = AsyncInfo.synchronize();
186d27d0a67SJoseph Huber handleTargetOutcome(Rc == OFFLOAD_SUCCESS, Loc);
187a7c4f320SJonas Hahnfeld }
188a7c4f320SJonas Hahnfeld
__tgt_target_data_update_nowait_mapper(ident_t * Loc,int64_t DeviceId,int32_t ArgNum,void ** ArgsBase,void ** Args,int64_t * ArgSizes,int64_t * ArgTypes,map_var_info_t * ArgNames,void ** ArgMappers,int32_t DepNum,void * DepList,int32_t NoAliasDepNum,void * NoAliasDepList)18997e55cfeSJoseph Huber EXTERN void __tgt_target_data_update_nowait_mapper(
190d27d0a67SJoseph Huber ident_t *Loc, int64_t DeviceId, int32_t ArgNum, void **ArgsBase,
191d27d0a67SJoseph Huber void **Args, int64_t *ArgSizes, int64_t *ArgTypes, map_var_info_t *ArgNames,
192d27d0a67SJoseph Huber void **ArgMappers, int32_t DepNum, void *DepList, int32_t NoAliasDepNum,
193d27d0a67SJoseph Huber void *NoAliasDepList) {
194d27d0a67SJoseph Huber TIMESCOPE_WITH_IDENT(Loc);
195a7c4f320SJonas Hahnfeld
196d27d0a67SJoseph Huber __tgt_target_data_update_mapper(Loc, DeviceId, ArgNum, ArgsBase, Args,
197d27d0a67SJoseph Huber ArgSizes, ArgTypes, ArgNames, ArgMappers);
198a7c4f320SJonas Hahnfeld }
199a7c4f320SJonas Hahnfeld
200ad23e4d8SJoseph Huber /// Implements a kernel entry that executes the target region on the specified
201ad23e4d8SJoseph Huber /// device.
202ad23e4d8SJoseph Huber ///
203ad23e4d8SJoseph Huber /// \param Loc Source location associated with this target region.
204ad23e4d8SJoseph Huber /// \param DeviceId The device to execute this region, -1 indicated the default.
205ad23e4d8SJoseph Huber /// \param NumTeams Number of teams to launch the region with, -1 indicates a
206ad23e4d8SJoseph Huber /// non-teams region and 0 indicates it was unspecified.
207ad23e4d8SJoseph Huber /// \param ThreadLimit Limit to the number of threads to use in the kernel
208ad23e4d8SJoseph Huber /// launch, 0 indicates it was unspecified.
209ad23e4d8SJoseph Huber /// \param HostPtr The pointer to the host function registered with the kernel.
210ad23e4d8SJoseph Huber /// \param Args All arguments to this kernel launch (see struct definition).
__tgt_target_kernel(ident_t * Loc,int64_t DeviceId,int32_t NumTeams,int32_t ThreadLimit,void * HostPtr,__tgt_kernel_arguments * Args)211ad23e4d8SJoseph Huber EXTERN int __tgt_target_kernel(ident_t *Loc, int64_t DeviceId, int32_t NumTeams,
212ad23e4d8SJoseph Huber int32_t ThreadLimit, void *HostPtr,
213ad23e4d8SJoseph Huber __tgt_kernel_arguments *Args) {
214ad23e4d8SJoseph Huber TIMESCOPE_WITH_IDENT(Loc);
2159cd1e222SJohannes Doerfert DP("Entering target region with entry point " DPxMOD " and device Id %" PRId64
2169cd1e222SJohannes Doerfert "\n",
217d27d0a67SJoseph Huber DPxPTR(HostPtr), DeviceId);
218ad23e4d8SJoseph Huber if (Args->Version != 1) {
219ad23e4d8SJoseph Huber DP("Unexpected ABI version: %d\n", Args->Version);
220ad23e4d8SJoseph Huber }
221d27d0a67SJoseph Huber if (checkDeviceAndCtors(DeviceId, Loc)) {
222d27d0a67SJoseph Huber DP("Not offloading to device %" PRId64 "\n", DeviceId);
2232187cbf5SYe Luo return OMP_TGT_FAIL;
224140ab574SGeorge Rokos }
225140ab574SGeorge Rokos
226fe5d51a4SJoseph Huber if (getInfoLevel() & OMP_INFOTYPE_KERNEL_ARGS)
227ad23e4d8SJoseph Huber printKernelArguments(Loc, DeviceId, Args->NumArgs, Args->ArgSizes,
228ad23e4d8SJoseph Huber Args->ArgTypes, Args->ArgNames,
229d27d0a67SJoseph Huber "Entering OpenMP kernel");
230140ab574SGeorge Rokos #ifdef OMPTARGET_DEBUG
231ad23e4d8SJoseph Huber for (int I = 0; I < Args->NumArgs; ++I) {
232140ab574SGeorge Rokos DP("Entry %2d: Base=" DPxMOD ", Begin=" DPxMOD ", Size=%" PRId64
2335378c6a4SJoseph Huber ", Type=0x%" PRIx64 ", Name=%s\n",
234ad23e4d8SJoseph Huber I, DPxPTR(Args->ArgBasePtrs[I]), DPxPTR(Args->ArgPtrs[I]),
235ad23e4d8SJoseph Huber Args->ArgSizes[I], Args->ArgTypes[I],
236ad23e4d8SJoseph Huber (Args->ArgNames) ? getNameFromMapping(Args->ArgNames[I]).c_str()
237ad23e4d8SJoseph Huber : "unknown");
238140ab574SGeorge Rokos }
239140ab574SGeorge Rokos #endif
240140ab574SGeorge Rokos
241ad23e4d8SJoseph Huber bool IsTeams = NumTeams != -1;
242ad23e4d8SJoseph Huber if (!IsTeams)
243ad23e4d8SJoseph Huber NumTeams = 0;
244ad23e4d8SJoseph Huber
245d27d0a67SJoseph Huber DeviceTy &Device = *PM->Devices[DeviceId];
246758b8499SJohannes Doerfert AsyncInfoTy AsyncInfo(Device);
247ad23e4d8SJoseph Huber int Rc = target(Loc, Device, HostPtr, Args->NumArgs, Args->ArgBasePtrs,
248ad23e4d8SJoseph Huber Args->ArgPtrs, Args->ArgSizes, Args->ArgTypes, Args->ArgNames,
249*c9353eb4SJoseph Huber Args->ArgMappers, NumTeams, ThreadLimit, Args->Tripcount,
250*c9353eb4SJoseph Huber IsTeams, AsyncInfo);
251d27d0a67SJoseph Huber if (Rc == OFFLOAD_SUCCESS)
252d27d0a67SJoseph Huber Rc = AsyncInfo.synchronize();
253d27d0a67SJoseph Huber handleTargetOutcome(Rc == OFFLOAD_SUCCESS, Loc);
254ad23e4d8SJoseph Huber assert(Rc == OFFLOAD_SUCCESS && "__tgt_target_kernel unexpected failure!");
2552187cbf5SYe Luo return OMP_TGT_SUCCESS;
256140ab574SGeorge Rokos }
257140ab574SGeorge Rokos
__tgt_target_kernel_nowait(ident_t * Loc,int64_t DeviceId,int32_t NumTeams,int32_t ThreadLimit,void * HostPtr,__tgt_kernel_arguments * Args,int32_t DepNum,void * DepList,int32_t NoAliasDepNum,void * NoAliasDepList)258ad23e4d8SJoseph Huber EXTERN int __tgt_target_kernel_nowait(
259ad23e4d8SJoseph Huber ident_t *Loc, int64_t DeviceId, int32_t NumTeams, int32_t ThreadLimit,
260ad23e4d8SJoseph Huber void *HostPtr, __tgt_kernel_arguments *Args, int32_t DepNum, void *DepList,
261ad23e4d8SJoseph Huber int32_t NoAliasDepNum, void *NoAliasDepList) {
262d27d0a67SJoseph Huber TIMESCOPE_WITH_IDENT(Loc);
263140ab574SGeorge Rokos
264ad23e4d8SJoseph Huber return __tgt_target_kernel(Loc, DeviceId, NumTeams, ThreadLimit, HostPtr,
265ad23e4d8SJoseph Huber Args);
266a7c4f320SJonas Hahnfeld }
267a7c4f320SJonas Hahnfeld
2682c7a8eafSMichael Kruse // Get the current number of components for a user-defined mapper.
__tgt_mapper_num_components(void * RtMapperHandle)269d27d0a67SJoseph Huber EXTERN int64_t __tgt_mapper_num_components(void *RtMapperHandle) {
270e007b328SGiorgis Georgakoudis TIMESCOPE();
271d27d0a67SJoseph Huber auto *MapperComponentsPtr = (struct MapperComponentsTy *)RtMapperHandle;
272d27d0a67SJoseph Huber int64_t Size = MapperComponentsPtr->Components.size();
2732c7a8eafSMichael Kruse DP("__tgt_mapper_num_components(Handle=" DPxMOD ") returns %" PRId64 "\n",
274d27d0a67SJoseph Huber DPxPTR(RtMapperHandle), Size);
275d27d0a67SJoseph Huber return Size;
2762c7a8eafSMichael Kruse }
2772c7a8eafSMichael Kruse
2782c7a8eafSMichael Kruse // Push back one component for a user-defined mapper.
__tgt_push_mapper_component(void * RtMapperHandle,void * Base,void * Begin,int64_t Size,int64_t Type,void * Name)279d27d0a67SJoseph Huber EXTERN void __tgt_push_mapper_component(void *RtMapperHandle, void *Base,
280d27d0a67SJoseph Huber void *Begin, int64_t Size, int64_t Type,
281d27d0a67SJoseph Huber void *Name) {
282e007b328SGiorgis Georgakoudis TIMESCOPE();
2832c7a8eafSMichael Kruse DP("__tgt_push_mapper_component(Handle=" DPxMOD
2842c7a8eafSMichael Kruse ") adds an entry (Base=" DPxMOD ", Begin=" DPxMOD ", Size=%" PRId64
285e4eaf9d8SJoseph Huber ", Type=0x%" PRIx64 ", Name=%s).\n",
286d27d0a67SJoseph Huber DPxPTR(RtMapperHandle), DPxPTR(Base), DPxPTR(Begin), Size, Type,
287d27d0a67SJoseph Huber (Name) ? getNameFromMapping(Name).c_str() : "unknown");
288d27d0a67SJoseph Huber auto *MapperComponentsPtr = (struct MapperComponentsTy *)RtMapperHandle;
2892c7a8eafSMichael Kruse MapperComponentsPtr->Components.push_back(
290d27d0a67SJoseph Huber MapComponentInfoTy(Base, Begin, Size, Type, Name));
2912c7a8eafSMichael Kruse }
2922c7a8eafSMichael Kruse
__tgt_set_info_flag(uint32_t NewInfoLevel)2932b6f2008SJoseph Huber EXTERN void __tgt_set_info_flag(uint32_t NewInfoLevel) {
29459b68490SJoseph Huber std::atomic<uint32_t> &InfoLevel = getInfoLevelInternal();
2952b6f2008SJoseph Huber InfoLevel.store(NewInfoLevel);
2962b6f2008SJoseph Huber for (auto &R : PM->RTLs.AllRTLs) {
2972b6f2008SJoseph Huber if (R.set_info_flag)
2982b6f2008SJoseph Huber R.set_info_flag(NewInfoLevel);
2992b6f2008SJoseph Huber }
3002b6f2008SJoseph Huber }
301d2f85d09SJose M Monsalve Diaz
__tgt_print_device_info(int64_t DeviceId)302d27d0a67SJoseph Huber EXTERN int __tgt_print_device_info(int64_t DeviceId) {
303d27d0a67SJoseph Huber return PM->Devices[DeviceId]->printDeviceInfo(
304d27d0a67SJoseph Huber PM->Devices[DeviceId]->RTLDeviceID);
305d2f85d09SJose M Monsalve Diaz }
306