Proteus
Programmable JIT compilation and optimization for C/C++ using LLVM
Loading...
Searching...
No Matches
CppJitCompiler.h
Go to the documentation of this file.
1#ifndef PROTEUS_RUNTIME_FRONTEND_CPPJITCOMPILER_H
2#define PROTEUS_RUNTIME_FRONTEND_CPPJITCOMPILER_H
3
7
8#include <memory>
9#include <string>
10#include <vector>
11
12namespace llvm {
13class LLVMContext;
14class MemoryBuffer;
15class Module;
16} // namespace llvm
17
18namespace proteus {
19
20// Compiler-facing input assembled by CppJitModule.
24 const std::string &Code;
25 const std::vector<std::string> &ExtraArgs;
27 std::string DeviceArch;
28};
29
30// Transport object returned by the compiler layer before registration.
33
35 std::string Path;
36 std::unique_ptr<llvm::MemoryBuffer> ObjectBuffer;
37 std::unique_ptr<llvm::LLVMContext> Ctx;
38 std::unique_ptr<llvm::Module> Mod;
39
43
44 static CppJitArtifact sharedLibrary(std::string Path);
45 static CppJitArtifact deviceBinary(std::unique_ptr<llvm::MemoryBuffer> Obj);
46 static CppJitArtifact llvmIR(std::unique_ptr<llvm::LLVMContext> Ctx,
47 std::unique_ptr<llvm::Module> Mod);
48
49private:
51};
52
53// Abstract compiler interface used by CppJitModule.
55public:
56 static constexpr const char *FrontendOptLevelFlag = "-O3";
57
59 CppJitCompilerBackend Backend);
60 virtual ~CppJitCompiler() = default;
61 virtual CppJitArtifact compile(const CppJitCompileRequest &Request) = 0;
62};
63
65 const std::string &Code,
66 const std::vector<std::string> &ExtraArgs);
67std::unique_ptr<CppJitCompiler>
69
70std::unique_ptr<CppJitCompiler> createCppJitCompilerClang();
71#if PROTEUS_ENABLE_CUDA
72std::unique_ptr<CppJitCompiler> createCppJitCompilerNvcc();
73#endif
74
75} // namespace proteus
76
77#endif
Definition CppJitCompiler.h:54
static constexpr const char * FrontendOptLevelFlag
Definition CppJitCompiler.h:56
virtual ~CppJitCompiler()=default
static bool isBackendSupported(TargetModelType TM, CppJitCompilerBackend Backend)
Definition CppJitCompiler.cpp:11
virtual CppJitArtifact compile(const CppJitCompileRequest &Request)=0
Definition Hashing.h:22
Definition CompiledLibrary.h:7
Definition MemoryCache.h:27
TargetModelType
Definition TargetModel.h:8
std::unique_ptr< CppJitCompiler > createCppJitCompiler(const CppJitCompileRequest &Request)
Definition CppJitCompiler.cpp:66
CppJitCompilerBackend
Definition CppJitCompilerBackend.h:6
HashT computeCppJitModuleHash(TargetModelType TM, CppJitCompilerBackend Backend, const std::string &Code, const std::vector< std::string > &ExtraArgs)
Definition CppJitCompiler.cpp:54
std::unique_ptr< CppJitCompiler > createCppJitCompilerClang()
Definition CppJitCompilerClang.cpp:233
Definition CppJitCompiler.h:31
CppJitArtifact(CppJitArtifact &&)
static CppJitArtifact sharedLibrary(std::string Path)
Definition CppJitCompiler.cpp:30
Kind
Definition CppJitCompiler.h:32
std::unique_ptr< llvm::MemoryBuffer > ObjectBuffer
Definition CppJitCompiler.h:36
~CppJitArtifact()
Definition CppJitCompiler.cpp:25
std::string Path
Definition CppJitCompiler.h:35
std::unique_ptr< llvm::LLVMContext > Ctx
Definition CppJitCompiler.h:37
std::unique_ptr< llvm::Module > Mod
Definition CppJitCompiler.h:38
static CppJitArtifact llvmIR(std::unique_ptr< llvm::LLVMContext > Ctx, std::unique_ptr< llvm::Module > Mod)
Definition CppJitCompiler.cpp:45
static CppJitArtifact deviceBinary(std::unique_ptr< llvm::MemoryBuffer > Obj)
Definition CppJitCompiler.cpp:38
CppJitArtifact & operator=(CppJitArtifact &&)
Kind ArtifactKind
Definition CppJitCompiler.h:34
Definition CppJitCompiler.h:21
const std::vector< std::string > & ExtraArgs
Definition CppJitCompiler.h:25
const std::string & Code
Definition CppJitCompiler.h:24
std::string DeviceArch
Definition CppJitCompiler.h:27
const HashT & ModuleHash
Definition CppJitCompiler.h:26
CppJitCompilerBackend Backend
Definition CppJitCompiler.h:23
TargetModelType TargetModel
Definition CppJitCompiler.h:22