1#ifndef PROTEUS_LAMBDA_CALLSITE_H
2#define PROTEUS_LAMBDA_CALLSITE_H
6#include <llvm/ADT/DenseMap.h>
7#include <llvm/ADT/SmallVector.h>
8#include <llvm/IR/Constants.h>
9#include <llvm/IR/InstrTypes.h>
10#include <llvm/IR/LLVMContext.h>
11#include <llvm/IR/Metadata.h>
27 DenseMap<uint64_t, LambdaKernelArgLocationVec>;
29 DenseMap<uint64_t, DenseMap<uint32_t, LambdaKernelArgLocation>>;
32 DenseMap<uint64_t, LambdaCallsiteRuntimeConstants>;
39 LLVMContext &Ctx = CB.getContext();
40 auto *LambdaMD = ConstantAsMetadata::get(
41 ConstantInt::get(Type::getInt64Ty(Ctx),
LambdaID));
42 auto *IndexMD = ConstantAsMetadata::get(
45 MDNode::get(Ctx, {LambdaMD, IndexMD}));
48inline std::optional<std::pair<uint64_t, uint32_t>>
51 if (!Node || Node->getNumOperands() < 2)
54 auto *LambdaCAM = dyn_cast<ConstantAsMetadata>(Node->getOperand(0));
55 auto *IndexCAM = dyn_cast<ConstantAsMetadata>(Node->getOperand(1));
57 LambdaCAM ? dyn_cast<ConstantInt>(LambdaCAM->getValue()) :
nullptr;
59 IndexCAM ? dyn_cast<ConstantInt>(IndexCAM->getValue()) :
nullptr;
60 if (!LambdaCI || !IndexCI)
63 return std::make_pair(LambdaCI->getZExtValue(),
64 static_cast<uint32_t
>(IndexCI->getZExtValue()));
67inline std::optional<uint32_t>
70 if (!Metadata || Metadata->first != ExpectedLambdaID)
72 return Metadata->second;
76 const DenseMap<uint32_t, LambdaKernelArgLocation> &CallsiteLocations) {
78 if (CallsiteLocations.empty())
81 SmallVector<uint32_t, 8> Indices;
82 Indices.reserve(CallsiteLocations.size());
83 for (
const auto &KV : CallsiteLocations)
84 Indices.push_back(KV.first);
87 Ordered.reserve(Indices.size());
88 for (uint32_t Index : Indices) {
89 auto It = CallsiteLocations.find(Index);
90 if (It == CallsiteLocations.end())
92 Ordered.push_back(It->second);
uint64_t uint32_t CallsiteIndex
Definition CompilerInterfaceDevice.cpp:73
uint64_t LambdaID
Definition CompilerInterfaceDevice.cpp:72
Definition CompiledLibrary.h:8
Definition MemoryCache.h:27
void setLambdaCallsiteMetadata(CallBase &CB, uint64_t LambdaID, uint32_t CallsiteIndex)
Definition LambdaCallsite.h:37
constexpr char LambdaCallsiteMetadataName[]
Definition LambdaCallsite.h:34
DenseMap< uint64_t, DenseMap< uint32_t, LambdaKernelArgLocation > > LambdaCallsiteLocationMap
Definition LambdaCallsite.h:29
constexpr char LambdaSchemaMetadataName[]
Definition LambdaCallsite.h:35
DenseMap< uint64_t, LambdaKernelArgLocationVec > LambdaKernelArgLocationMap
Definition LambdaCallsite.h:27
RuntimeConstantType
Definition CompilerInterfaceTypes.h:20
@ NONE
Definition CompilerInterfaceTypes.h:22
std::optional< std::pair< uint64_t, uint32_t > > getLambdaCallsiteMetadata(const CallBase &CB)
Definition LambdaCallsite.h:49
std::optional< uint32_t > getLambdaCallsiteIndex(const CallBase &CB, uint64_t ExpectedLambdaID)
Definition LambdaCallsite.h:68
SmallVector< LambdaKernelArgLocation, 4 > LambdaKernelArgLocationVec
Definition LambdaCallsite.h:25
DenseMap< uint64_t, LambdaCallsiteRuntimeConstants > LambdaCallsiteRuntimeConstantsMap
Definition LambdaCallsite.h:32
SmallVector< RuntimeConstant, 8 > LambdaCallsiteRuntimeConstants
Definition LambdaCallsite.h:30
LambdaKernelArgLocationVec getOrderedLambdaKernelArgLocations(const DenseMap< uint32_t, LambdaKernelArgLocation > &CallsiteLocations)
Definition LambdaCallsite.h:75
Definition LambdaCallsite.h:19
int64_t Offset
Definition LambdaCallsite.h:21
RuntimeConstantType StorageType
Definition LambdaCallsite.h:22
uint32_t KernelArgIndex
Definition LambdaCallsite.h:20