Proteus
Programmable JIT compilation and optimization for C/C++ using LLVM
Loading...
Searching...
No Matches
LambdaCallsite.h
Go to the documentation of this file.
1#ifndef PROTEUS_LAMBDA_CALLSITE_H
2#define PROTEUS_LAMBDA_CALLSITE_H
3
5
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>
12
13#include <optional>
14
15namespace proteus {
16
17using namespace llvm;
18
24
25using LambdaKernelArgLocationVec = SmallVector<LambdaKernelArgLocation, 4>;
27 DenseMap<uint64_t, LambdaKernelArgLocationVec>;
29 DenseMap<uint64_t, DenseMap<uint32_t, LambdaKernelArgLocation>>;
30using LambdaCallsiteRuntimeConstants = SmallVector<RuntimeConstant, 8>;
32 DenseMap<uint64_t, LambdaCallsiteRuntimeConstants>;
33
34inline constexpr char LambdaCallsiteMetadataName[] = "proteus.lambda_callsite";
35inline constexpr char LambdaSchemaMetadataName[] = "proteus.lambda_schema";
36
37inline void setLambdaCallsiteMetadata(CallBase &CB, uint64_t LambdaID,
38 uint32_t CallsiteIndex) {
39 LLVMContext &Ctx = CB.getContext();
40 auto *LambdaMD = ConstantAsMetadata::get(
41 ConstantInt::get(Type::getInt64Ty(Ctx), LambdaID));
42 auto *IndexMD = ConstantAsMetadata::get(
43 ConstantInt::get(Type::getInt32Ty(Ctx), CallsiteIndex));
44 CB.setMetadata(LambdaCallsiteMetadataName,
45 MDNode::get(Ctx, {LambdaMD, IndexMD}));
46}
47
48inline std::optional<std::pair<uint64_t, uint32_t>>
49getLambdaCallsiteMetadata(const CallBase &CB) {
50 auto *Node = CB.getMetadata(LambdaCallsiteMetadataName);
51 if (!Node || Node->getNumOperands() < 2)
52 return std::nullopt;
53
54 auto *LambdaCAM = dyn_cast<ConstantAsMetadata>(Node->getOperand(0));
55 auto *IndexCAM = dyn_cast<ConstantAsMetadata>(Node->getOperand(1));
56 auto *LambdaCI =
57 LambdaCAM ? dyn_cast<ConstantInt>(LambdaCAM->getValue()) : nullptr;
58 auto *IndexCI =
59 IndexCAM ? dyn_cast<ConstantInt>(IndexCAM->getValue()) : nullptr;
60 if (!LambdaCI || !IndexCI)
61 return std::nullopt;
62
63 return std::make_pair(LambdaCI->getZExtValue(),
64 static_cast<uint32_t>(IndexCI->getZExtValue()));
65}
66
67inline std::optional<uint32_t>
68getLambdaCallsiteIndex(const CallBase &CB, uint64_t ExpectedLambdaID) {
69 auto Metadata = getLambdaCallsiteMetadata(CB);
70 if (!Metadata || Metadata->first != ExpectedLambdaID)
71 return std::nullopt;
72 return Metadata->second;
73}
74
76 const DenseMap<uint32_t, LambdaKernelArgLocation> &CallsiteLocations) {
78 if (CallsiteLocations.empty())
79 return Ordered;
80
81 SmallVector<uint32_t, 8> Indices;
82 Indices.reserve(CallsiteLocations.size());
83 for (const auto &KV : CallsiteLocations)
84 Indices.push_back(KV.first);
85 llvm::sort(Indices);
86
87 Ordered.reserve(Indices.size());
88 for (uint32_t Index : Indices) {
89 auto It = CallsiteLocations.find(Index);
90 if (It == CallsiteLocations.end())
91 continue;
92 Ordered.push_back(It->second);
93 }
94
95 return Ordered;
96}
97
98} // namespace proteus
99
100#endif
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