1#ifndef PROTEUS_CPPFRONTEND_HPP
2#define PROTEUS_CPPFRONTEND_HPP
12struct CompiledLibrary;
19 std::unique_ptr<HashT> ModuleHash;
20 std::vector<std::string> ExtraArgs;
23 static constexpr const char *FrontendOptLevelFlag =
"-O3";
26 std::unique_ptr<CompiledLibrary> Library;
27 bool IsCompiled =
false;
39 const std::string &TemplateCode;
40 std::string InstanceName;
41 std::unique_ptr<CppJitModule> InstanceModule;
42 std::string EntryFuncName;
43 void *FuncPtr =
nullptr;
45 CodeInstance(
TargetModelType TargetModel,
const std::string &TemplateCode,
46 const std::string &InstanceName)
47 : TargetModel(TargetModel), TemplateCode(TemplateCode),
48 InstanceName(InstanceName) {
49 EntryFuncName =
"__jit_instance_" + this->InstanceName;
53 EntryFuncName.begin(), EntryFuncName.end(),
54 [](
char C) { return C ==
'<' || C ==
'>' || C ==
','; },
'$');
58 template <
class T>
constexpr std::string_view typeName() {
64 auto B =
P.find(
"[T = ") + 5;
65 auto E =
P.rfind(
']');
66 return P.substr(
B,
E -
B);
67#elif defined(__GNUC__)
70 auto B =
P.find(
"with T = ") + 9;
71 auto E =
P.find(
';',
B);
72 return P.substr(
B,
E -
B);
73#elif defined(_MSC_VER)
76 auto B =
P.find(
"type_name<") + 10;
77 auto E =
P.find(
">(void)",
B);
78 return P.substr(
B,
B -
E);
84 template <
typename RetT,
typename...
ArgT, std::size_t...
I>
85 std::string buildFunctionEntry(std::index_sequence<I...>) {
90 << EntryFuncName <<
"(";
91 ((
OS << (
I ?
", " :
"")
93 std::decay_t<std::tuple_element_t<
I, std::tuple<ArgT...>>>>()
99 ((
ArgList += (
I == 0 ?
"" :
", ") + (
"Arg" + std::to_string(
I))), ...);
101 if constexpr (!std::is_void_v<RetT>) {
104 OS << InstanceName <<
"(";
105 ((
OS << (
I == 0 ?
"" :
", ") <<
"Arg" << std::to_string(
I)), ...);
111 template <
typename RetOrSig,
typename...
ArgT> std::string buildCode() {
113 std::index_sequence_for<
ArgT...>{});
116 std::string_view
To) {
120 while ((
Pos =
S.find(
From,
Pos)) != std::string::npos) {
136 template <
typename RetT,
typename...
ArgT>
void compile() {
139 std::make_unique<CppJitModule>(TargetModel,
InstanceCode);
140 InstanceModule->compile();
142 FuncPtr = InstanceModule->getFunctionAddress(EntryFuncName);
145 template <
typename...
ArgT>
148 if (!InstanceModule) {
152 void *
Ptrs[
sizeof...(ArgT)] = {(
void *)&
Args...};
154 return InstanceModule->launch(FuncPtr, GridDim, BlockDim,
Ptrs,
ShmemSize,
160 static_assert(!std::is_function_v<RetOrSig>,
161 "Function signature type is not yet supported");
163 if (!InstanceModule) {
167 if constexpr (std::is_void_v<RetOrSig>)
170 return InstanceModule->Dispatch.run<
RetOrSig(
ArgT...)>(FuncPtr,
175 struct CompilationResult {
177 std::unique_ptr<LLVMContext> Ctx;
178 std::unique_ptr<Module> Mod;
180 ~CompilationResult();
183 void *getFunctionAddress(
const std::string &Name);
193 const std::vector<std::string> &ExtraArgs = {});
195 const std::vector<std::string> &ExtraArgs = {});
210 template <
typename...
ArgT>
212 std::string InstanceName =
FuncName +
"<";
215 (
First ?
"" :
",") + std::string(std::forward<ArgT>(
Args)),
221 return CodeInstance{TargetModel, Code, InstanceName};
225 template <
typename RetT,
typename...
ArgT>
230 : M(M), FuncPtr(FuncPtr) {}
233 if constexpr (std::is_void_v<RetT>) {
234 M.Dispatch.template run<RetT(
ArgT...)>(FuncPtr,
235 std::forward<ArgT>(
Args)...);
237 return M.Dispatch.template run<RetT(
ArgT...)>(
238 FuncPtr, std::forward<ArgT>(
Args)...);
244 template <
typename RetT,
typename...
ArgT>
247 void *FuncPtr =
nullptr;
249 : M(M), FuncPtr(FuncPtr) {
250 static_assert(std::is_void_v<RetT>,
"Kernel function must return void");
255 void *
Ptrs[
sizeof...(ArgT)] = {(
void *)&
Args...};
260 template <
typename Sig>
268 void *FuncPtr = getFunctionAddress(Name);
280 void *FuncPtr = getFunctionAddress(Name);
char int void ** Args
Definition CompilerInterfaceHost.cpp:20
Definition CppJitModule.hpp:15
void compile()
Definition CppJitModule.cpp:240
void compileCppToDynamicLibrary()
Definition CppJitModule.cpp:48
auto instantiate(const std::string &FuncName, ArgT... Args)
Definition CppJitModule.hpp:211
FunctionHandle< Sig > getFunction(const std::string &Name)
Definition CppJitModule.hpp:261
CompiledLibrary & getLibrary()
Definition CppJitModule.hpp:200
KernelHandle< Sig > getKernel(const std::string &Name)
Definition CppJitModule.hpp:273
CompilationResult compileCppToIR()
Definition CppJitModule.cpp:135
Definition Dispatcher.hpp:60
Definition ObjectCacheChain.cpp:26
TargetModelType
Definition TargetModel.hpp:12
static int Pos
Definition JitInterface.hpp:105
bool isHostTargetModel(TargetModelType TargetModel)
Definition TargetModel.hpp:53
void reportFatalError(const llvm::Twine &Reason, const char *FILE, unsigned Line)
Definition Error.cpp:14
T getRuntimeConstantValue(void *Arg)
Definition CompilerInterfaceRuntimeConstantInfo.h:113
Definition Dispatcher.hpp:19
Definition CompiledLibrary.hpp:18
FunctionHandle(CppJitModule &M, void *FuncPtr)
Definition CppJitModule.hpp:229
void * FuncPtr
Definition CppJitModule.hpp:228
CppJitModule & M
Definition CppJitModule.hpp:227
RetT run(ArgT... Args)
Definition CppJitModule.hpp:232
Definition CppJitModule.hpp:224
auto launch(LaunchDims GridDim, LaunchDims BlockDim, uint64_t ShmemSize, void *Stream, ArgT... Args)
Definition CppJitModule.hpp:253
KernelHandle(CppJitModule &M, void *FuncPtr)
Definition CppJitModule.hpp:248
CppJitModule & M
Definition CppJitModule.hpp:246
Definition CppJitModule.hpp:243