Proteus
Programmable JIT compilation and optimization for C/C++ using LLVM
Loading...
Searching...
No Matches
Helpers.h
Go to the documentation of this file.
1#ifndef PROTEUS_PASS_HELPERS_H
2#define PROTEUS_PASS_HELPERS_H
3
4#include <llvm/ADT/SetVector.h>
5#include <llvm/Demangle/Demangle.h>
6#include <llvm/IR/Module.h>
7#include <llvm/TargetParser/Triple.h>
8
9#include "proteus/Error.h"
10#include "proteus/Logger.hpp"
11
12#define DEBUG_TYPE "proteus-pass"
13#ifdef PROTEUS_ENABLE_DEBUG
14#define DEBUG(x) x
15#else
16#define DEBUG(x)
17#endif
18
19#if PROTEUS_ENABLE_HIP
20constexpr char const *RegisterFunctionName = "__hipRegisterFunction";
21constexpr char const *LaunchFunctionName = "hipLaunchKernel";
22constexpr char const *RegisterVarName = "__hipRegisterVar";
23constexpr char const *RegisterFatBinaryName = "__hipRegisterFatBinary";
24#elif PROTEUS_ENABLE_CUDA
25constexpr char const *RegisterFunctionName = "__cudaRegisterFunction";
26constexpr char const *LaunchFunctionName = "cudaLaunchKernel";
27constexpr char const *RegisterVarName = "__cudaRegisterVar";
28constexpr char const *RegisterFatBinaryName = "__cudaRegisterFatBinary";
29#else
30constexpr char const *RegisterFunctionName = nullptr;
31constexpr char const *LaunchFunctionName = nullptr;
32constexpr char const *RegisterVarName = nullptr;
33constexpr char const *RegisterFatBinaryName = nullptr;
34#endif
35
36namespace proteus {
37
38using namespace llvm;
39
41 SmallSetVector<int, 16> ConstantArgs;
42 std::string ModuleIR;
43};
44
45struct ModuleInfo {
46 const Module &M;
47 ModuleInfo(const Module &M) : M(M) {}
48};
49
50bool inline isDeviceCompilation(Module &M) {
51 Triple TargetTriple(M.getTargetTriple());
52 DEBUG(Logger::logs("proteus-pass")
53 << "TargetTriple " << M.getTargetTriple() << "\n");
54 if (TargetTriple.isNVPTX() || TargetTriple.isAMDGCN())
55 return true;
56
57 return false;
58}
59
60inline std::string getUniqueFileID(Module &M) {
61 llvm::sys::fs::UniqueID ID;
62 if (auto EC = llvm::sys::fs::getUniqueID(M.getSourceFileName(), ID))
63 PROTEUS_FATAL_ERROR("Could not get unique id for source file " +
64 EC.message());
65
66 SmallString<64> Out;
67 llvm::raw_svector_ostream OutStr(Out);
68 OutStr << llvm::format("%x_%x", ID.getDevice(), ID.getFile());
69
70 return std::string(Out);
71}
72
73} // namespace proteus
74
75#endif
#define PROTEUS_FATAL_ERROR(x)
Definition Error.h:4
constexpr char const * LaunchFunctionName
Definition Helpers.h:31
#define DEBUG(x)
Definition Helpers.h:16
constexpr char const * RegisterFunctionName
Definition Helpers.h:30
constexpr char const * RegisterVarName
Definition Helpers.h:32
constexpr char const * RegisterFatBinaryName
Definition Helpers.h:33
static llvm::raw_ostream & logs(const std::string &Name)
Definition Logger.hpp:19
Definition Dispatcher.cpp:14
std::string getUniqueFileID(Module &M)
Definition Helpers.h:60
bool isDeviceCompilation(Module &M)
Definition Helpers.h:50
Definition Helpers.h:40
SmallSetVector< int, 16 > ConstantArgs
Definition Helpers.h:41
std::string ModuleIR
Definition Helpers.h:42
Definition Helpers.h:45
ModuleInfo(const Module &M)
Definition Helpers.h:47
const Module & M
Definition Helpers.h:46