1ec8f4a38SAtmn Patel //===--------------------- rtl.cpp - Remote RTL Plugin --------------------===//
2ec8f4a38SAtmn Patel //
3ec8f4a38SAtmn Patel // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ec8f4a38SAtmn Patel // See https://llvm.org/LICENSE.txt for license information.
5ec8f4a38SAtmn Patel // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ec8f4a38SAtmn Patel //
7ec8f4a38SAtmn Patel //===----------------------------------------------------------------------===//
8ec8f4a38SAtmn Patel //
9ec8f4a38SAtmn Patel // RTL for Host.
10ec8f4a38SAtmn Patel //
11ec8f4a38SAtmn Patel //===----------------------------------------------------------------------===//
12ec8f4a38SAtmn Patel 
13ec8f4a38SAtmn Patel #include <cstddef>
14ec8f4a38SAtmn Patel #include <memory>
15ec8f4a38SAtmn Patel #include <string>
16ec8f4a38SAtmn Patel 
17ec8f4a38SAtmn Patel #include "Client.h"
18ec8f4a38SAtmn Patel #include "Utils.h"
19ec8f4a38SAtmn Patel #include "omptarget.h"
20ec8f4a38SAtmn Patel #include "omptargetplugin.h"
21ec8f4a38SAtmn Patel 
22ec8f4a38SAtmn Patel #define TARGET_NAME RPC
23ec8f4a38SAtmn Patel #define DEBUG_PREFIX "Target " GETNAME(TARGET_NAME) " RTL"
24ec8f4a38SAtmn Patel 
25ec8f4a38SAtmn Patel RemoteClientManager *Manager;
26ec8f4a38SAtmn Patel 
initRPC()27ec8f4a38SAtmn Patel __attribute__((constructor(101))) void initRPC() {
28ec8f4a38SAtmn Patel   DP("Init RPC library!\n");
29ec8f4a38SAtmn Patel 
30*21e92612SAtmn Patel   Manager = new RemoteClientManager();
31ec8f4a38SAtmn Patel }
32ec8f4a38SAtmn Patel 
deinitRPC()33ec8f4a38SAtmn Patel __attribute__((destructor(101))) void deinitRPC() {
34ec8f4a38SAtmn Patel   Manager->shutdown(); // TODO: Error handle shutting down
35ec8f4a38SAtmn Patel   DP("Deinit RPC library!\n");
36ec8f4a38SAtmn Patel   delete Manager;
37ec8f4a38SAtmn Patel }
38ec8f4a38SAtmn Patel 
39ec8f4a38SAtmn Patel // Exposed library API function
40ec8f4a38SAtmn Patel #ifdef __cplusplus
41ec8f4a38SAtmn Patel extern "C" {
42ec8f4a38SAtmn Patel #endif
43ec8f4a38SAtmn Patel 
__tgt_rtl_register_lib(__tgt_bin_desc * Desc)44ec8f4a38SAtmn Patel int32_t __tgt_rtl_register_lib(__tgt_bin_desc *Desc) {
45ec8f4a38SAtmn Patel   return Manager->registerLib(Desc);
46ec8f4a38SAtmn Patel }
47ec8f4a38SAtmn Patel 
__tgt_rtl_unregister_lib(__tgt_bin_desc * Desc)48ec8f4a38SAtmn Patel int32_t __tgt_rtl_unregister_lib(__tgt_bin_desc *Desc) {
49ec8f4a38SAtmn Patel   return Manager->unregisterLib(Desc);
50ec8f4a38SAtmn Patel }
51ec8f4a38SAtmn Patel 
__tgt_rtl_is_valid_binary(__tgt_device_image * Image)52ec8f4a38SAtmn Patel int32_t __tgt_rtl_is_valid_binary(__tgt_device_image *Image) {
53ec8f4a38SAtmn Patel   return Manager->isValidBinary(Image);
54ec8f4a38SAtmn Patel }
55ec8f4a38SAtmn Patel 
__tgt_rtl_number_of_devices()56ec8f4a38SAtmn Patel int32_t __tgt_rtl_number_of_devices() { return Manager->getNumberOfDevices(); }
57ec8f4a38SAtmn Patel 
__tgt_rtl_init_device(int32_t DeviceId)58ec8f4a38SAtmn Patel int32_t __tgt_rtl_init_device(int32_t DeviceId) {
59ec8f4a38SAtmn Patel   return Manager->initDevice(DeviceId);
60ec8f4a38SAtmn Patel }
61ec8f4a38SAtmn Patel 
__tgt_rtl_init_requires(int64_t RequiresFlags)62ec8f4a38SAtmn Patel int64_t __tgt_rtl_init_requires(int64_t RequiresFlags) {
63ec8f4a38SAtmn Patel   return Manager->initRequires(RequiresFlags);
64ec8f4a38SAtmn Patel }
65ec8f4a38SAtmn Patel 
__tgt_rtl_load_binary(int32_t DeviceId,__tgt_device_image * Image)66ec8f4a38SAtmn Patel __tgt_target_table *__tgt_rtl_load_binary(int32_t DeviceId,
67ec8f4a38SAtmn Patel                                           __tgt_device_image *Image) {
68ec8f4a38SAtmn Patel   return Manager->loadBinary(DeviceId, (__tgt_device_image *)Image);
69ec8f4a38SAtmn Patel }
70ec8f4a38SAtmn Patel 
__tgt_rtl_is_data_exchangable(int32_t SrcDevId,int32_t DstDevId)71ec8f4a38SAtmn Patel int32_t __tgt_rtl_is_data_exchangable(int32_t SrcDevId, int32_t DstDevId) {
72ec8f4a38SAtmn Patel   return Manager->isDataExchangeable(SrcDevId, DstDevId);
73ec8f4a38SAtmn Patel }
74ec8f4a38SAtmn Patel 
__tgt_rtl_data_alloc(int32_t DeviceId,int64_t Size,void * HstPtr,int32_t Kind)752468fdd9SGeorge Rokos void *__tgt_rtl_data_alloc(int32_t DeviceId, int64_t Size, void *HstPtr,
76*21e92612SAtmn Patel                            int32_t Kind) {
77*21e92612SAtmn Patel   if (Kind != TARGET_ALLOC_DEFAULT) {
782468fdd9SGeorge Rokos     REPORT("Invalid target data allocation kind or requested allocator not "
792468fdd9SGeorge Rokos            "implemented yet\n");
802468fdd9SGeorge Rokos     return NULL;
812468fdd9SGeorge Rokos   }
822468fdd9SGeorge Rokos 
83ec8f4a38SAtmn Patel   return Manager->dataAlloc(DeviceId, Size, HstPtr);
84ec8f4a38SAtmn Patel }
85ec8f4a38SAtmn Patel 
__tgt_rtl_data_submit(int32_t DeviceId,void * TgtPtr,void * HstPtr,int64_t Size)86ec8f4a38SAtmn Patel int32_t __tgt_rtl_data_submit(int32_t DeviceId, void *TgtPtr, void *HstPtr,
87ec8f4a38SAtmn Patel                               int64_t Size) {
88*21e92612SAtmn Patel   return Manager->dataSubmit(DeviceId, TgtPtr, HstPtr, Size);
89ec8f4a38SAtmn Patel }
90ec8f4a38SAtmn Patel 
__tgt_rtl_data_retrieve(int32_t DeviceId,void * HstPtr,void * TgtPtr,int64_t Size)91ec8f4a38SAtmn Patel int32_t __tgt_rtl_data_retrieve(int32_t DeviceId, void *HstPtr, void *TgtPtr,
92ec8f4a38SAtmn Patel                                 int64_t Size) {
93*21e92612SAtmn Patel   return Manager->dataRetrieve(DeviceId, HstPtr, TgtPtr, Size);
94ec8f4a38SAtmn Patel }
95ec8f4a38SAtmn Patel 
__tgt_rtl_data_delete(int32_t DeviceId,void * TgtPtr)96ec8f4a38SAtmn Patel int32_t __tgt_rtl_data_delete(int32_t DeviceId, void *TgtPtr) {
97ec8f4a38SAtmn Patel   return Manager->dataDelete(DeviceId, TgtPtr);
98ec8f4a38SAtmn Patel }
99ec8f4a38SAtmn Patel 
__tgt_rtl_data_exchange(int32_t SrcDevId,void * SrcPtr,int32_t DstDevId,void * DstPtr,int64_t Size)100ec8f4a38SAtmn Patel int32_t __tgt_rtl_data_exchange(int32_t SrcDevId, void *SrcPtr,
101ec8f4a38SAtmn Patel                                 int32_t DstDevId, void *DstPtr, int64_t Size) {
102*21e92612SAtmn Patel   return Manager->dataExchange(SrcDevId, SrcPtr, DstDevId, DstPtr, Size);
103ec8f4a38SAtmn Patel }
104ec8f4a38SAtmn Patel 
105ec8f4a38SAtmn Patel 
__tgt_rtl_run_target_region(int32_t DeviceId,void * TgtEntryPtr,void ** TgtArgs,ptrdiff_t * TgtOffsets,int32_t ArgNum)106ec8f4a38SAtmn Patel int32_t __tgt_rtl_run_target_region(int32_t DeviceId, void *TgtEntryPtr,
107ec8f4a38SAtmn Patel                                     void **TgtArgs, ptrdiff_t *TgtOffsets,
108ec8f4a38SAtmn Patel                                     int32_t ArgNum) {
109*21e92612SAtmn Patel   return Manager->runTargetRegion(DeviceId, TgtEntryPtr, TgtArgs, TgtOffsets,
110*21e92612SAtmn Patel                                   ArgNum);
111ec8f4a38SAtmn Patel }
112ec8f4a38SAtmn Patel 
__tgt_rtl_run_target_team_region(int32_t DeviceId,void * TgtEntryPtr,void ** TgtArgs,ptrdiff_t * TgtOffsets,int32_t ArgNum,int32_t TeamNum,int32_t ThreadLimit,uint64_t LoopTripCount)113ec8f4a38SAtmn Patel int32_t __tgt_rtl_run_target_team_region(int32_t DeviceId, void *TgtEntryPtr,
114ec8f4a38SAtmn Patel                                          void **TgtArgs, ptrdiff_t *TgtOffsets,
115ec8f4a38SAtmn Patel                                          int32_t ArgNum, int32_t TeamNum,
116ec8f4a38SAtmn Patel                                          int32_t ThreadLimit,
117ec8f4a38SAtmn Patel                                          uint64_t LoopTripCount) {
118*21e92612SAtmn Patel   return Manager->runTargetTeamRegion(DeviceId, TgtEntryPtr, TgtArgs,
119*21e92612SAtmn Patel                                       TgtOffsets, ArgNum, TeamNum, ThreadLimit,
120*21e92612SAtmn Patel                                       LoopTripCount);
121ec8f4a38SAtmn Patel }
122ec8f4a38SAtmn Patel 
123ec8f4a38SAtmn Patel // Exposed library API function
124ec8f4a38SAtmn Patel #ifdef __cplusplus
125ec8f4a38SAtmn Patel }
126ec8f4a38SAtmn Patel #endif
127