1#ifndef PROTEUS_PASS_HELPERS_H
2#define PROTEUS_PASS_HELPERS_H
8#include <llvm/ADT/SetVector.h>
9#include <llvm/Demangle/Demangle.h>
10#include <llvm/IR/Module.h>
11#include <llvm/TargetParser/Triple.h>
13#define DEBUG_TYPE "proteus-pass"
16 if (isDebugOutputEnabled()) { \
26#elif PROTEUS_ENABLE_CUDA
53 auto GetEnvVar = []() {
54 const char *EnvValue = std::getenv(
"PROTEUS_DEBUG_OUTPUT");
55 return EnvValue ?
static_cast<bool>(std::stoi(EnvValue)) :
false;
58 static bool IsEnabled = GetEnvVar();
63 Triple TargetTriple(M.getTargetTriple());
65 <<
"TargetTriple " << M.getTargetTriple() <<
"\n");
66 if (TargetTriple.isNVPTX() || TargetTriple.isAMDGCN())
73 llvm::sys::fs::UniqueID ID;
74 if (
auto EC = llvm::sys::fs::getUniqueID(M.getSourceFileName(), ID))
78 llvm::raw_svector_ostream OutStr(Out);
79 OutStr << llvm::format(
"%x_%x", ID.getDevice(), ID.getFile());
81 return std::string(Out);
88#if PROTEUS_ENABLE_CUDA
89#if LLVM_VERSION_MAJOR >= 20
90 return (F->getCallingConv() == CallingConv::PTX_Kernel);
92 const Module &M = *F->getParent();
93 auto GetDeviceKernels = [&M]() {
94 SmallPtrSet<Function *, 16> Kernels;
95 NamedMDNode *MD = M.getNamedMetadata(
"nvvm.annotations");
100 for (
auto *Op : MD->operands()) {
101 if (Op->getNumOperands() < 2)
103 MDString *KindID = dyn_cast<MDString>(Op->getOperand(1));
104 if (!KindID || KindID->getString() !=
"kernel")
108 mdconst::dyn_extract_or_null<Function>(Op->getOperand(0));
112 Kernels.insert(KernelFn);
120 static DenseMap<const Module *, SmallPtrSet<Function *, 16>> KernelCache;
121 auto It = KernelCache.find(&M);
122 if (It == KernelCache.end())
123 It = KernelCache.insert({&M, GetDeviceKernels()}).first;
124 const auto &KernelSet = It->second;
125 if (KernelSet.contains(F))
132#if PROTEUS_ENABLE_HIP
133 return (F->getCallingConv() == CallingConv::AMDGPU_KERNEL);
168 const DenseMap<Value *, GlobalVariable *> &StubToKernelMap, Function &Fn) {
169 if (StubToKernelMap.contains(&Fn))
constexpr char const * LaunchFunctionName
Definition Helpers.h:33
#define DEBUG(x)
Definition Helpers.h:14
constexpr char const * RegisterFunctionName
Definition Helpers.h:32
constexpr char const * RegisterVarName
Definition Helpers.h:34
constexpr char const * RegisterFatBinaryName
Definition Helpers.h:35
static llvm::raw_ostream & logs(const std::string &Name)
Definition Logger.h:19
Definition CompiledLibrary.h:7
bool isDeviceKernelHostStub(const DenseMap< Value *, GlobalVariable * > &StubToKernelMap, Function &Fn)
Definition Helpers.h:167
Definition MemoryCache.h:26
@ END
Definition CompilerInterfaceTypes.h:35
@ BEGIN
Definition CompilerInterfaceTypes.h:21
bool isDeviceKernel(const Function *F)
Definition Helpers.h:84
void reportFatalError(const llvm::Twine &Reason, const char *FILE, unsigned Line)
Definition Error.cpp:14
std::string getUniqueFileID(Module &M)
Definition Helpers.h:72
bool isDebugOutputEnabled()
Definition Helpers.h:52
bool isDeviceCompilation(Module &M)
Definition Helpers.h:62
static bool isEqual(const RuntimeConstantInfo &LHS, const RuntimeConstantInfo &RHS)
Definition Helpers.h:160
static unsigned getHashValue(const RuntimeConstantInfo &Val)
Definition Helpers.h:156
static RuntimeConstantInfo getEmptyKey()
Definition Helpers.h:146
static RuntimeConstantInfo getTombstoneKey()
Definition Helpers.h:151
std::string ModuleIR
Definition Helpers.h:44
SmallSetVector< RuntimeConstantInfo, 16 > ConstantArgs
Definition Helpers.h:43
ModuleInfo(const Module &M)
Definition Helpers.h:49
const Module & M
Definition Helpers.h:48
int32_t Pos
Definition CompilerInterfaceRuntimeConstantInfo.h:20
RuntimeConstantType Type
Definition CompilerInterfaceRuntimeConstantInfo.h:19
Definition CompilerInterfaceRuntimeConstantInfo.h:60
RuntimeConstantArgInfo ArgInfo
Definition CompilerInterfaceRuntimeConstantInfo.h:61