Proteus
Programmable JIT compilation and optimization for C/C++ using LLVM
Loading...
Searching...
No Matches
VarStorage.hpp
Go to the documentation of this file.
1#ifndef PROTEUS_FRONTEND_VARSTORAGE_HPP
2#define PROTEUS_FRONTEND_VARSTORAGE_HPP
3
4#include <llvm/IR/IRBuilder.h>
5#include <llvm/IR/Module.h>
6
7namespace proteus {
8using namespace llvm;
9
11
12protected:
14
15public:
17 virtual ~VarStorage() = default;
18
19 virtual Value *getSlot() const = 0;
20 // Load/store the logical value represented by this storage.
21 virtual Value *loadValue() const = 0;
22 virtual void storeValue(Value *Val) = 0;
23 virtual Type *getAllocatedType() const = 0;
24 virtual Type *getValueType() const = 0;
25 virtual std::unique_ptr<VarStorage> clone() const = 0;
26};
27
28class ScalarStorage : public VarStorage {
29
30 AllocaInst *Slot = nullptr;
31
32public:
34 : VarStorage(IRB), Slot(Slot) {}
35 std::unique_ptr<VarStorage> clone() const override {
36 return std::make_unique<ScalarStorage>(Slot, IRB);
37 }
38
39 Value *getSlot() const override;
40 Value *loadValue() const override;
41 void storeValue(Value *Val) override;
42 Type *getAllocatedType() const override;
43 Type *getValueType() const override;
44};
45
46class PointerStorage : public VarStorage {
47
48 AllocaInst *PtrSlot = nullptr;
49 Type *PointerElemTy = nullptr;
50
51public:
52 PointerStorage(AllocaInst *PtrSlot, IRBuilderBase &IRB, Type *PointerElemTy)
53 : VarStorage(IRB), PtrSlot(PtrSlot), PointerElemTy(PointerElemTy) {}
54 PointerStorage(Value *PtrSlot, IRBuilderBase &IRB, Type *PointerElemTy)
55 : VarStorage(IRB), PtrSlot(dyn_cast<AllocaInst>(PtrSlot)),
56 PointerElemTy(PointerElemTy) {}
57 std::unique_ptr<VarStorage> clone() const override {
58 return std::make_unique<PointerStorage>(PtrSlot, IRB, PointerElemTy);
59 }
60
61 Value *getSlot() const override;
62 // Load/store the pointee value through the pointer stored in PtrSlot.
63 Value *loadValue() const override;
64 void storeValue(Value *Val) override;
65 // Load/store the pointer value itself from/to PtrSlot.
66 Value *loadPointer() const;
67 void storePointer(Value *Ptr);
68 Type *getAllocatedType() const override;
69 Type *getValueType() const override;
70};
71
72class ArrayStorage : public VarStorage {
73
74 Value *BasePointer = nullptr;
75 ArrayType *ArrayTy = nullptr;
76
77public:
78 ArrayStorage(Value *BasePointer, IRBuilderBase &IRB, ArrayType *ArrayTy)
79 : VarStorage(IRB), BasePointer(BasePointer), ArrayTy(ArrayTy) {}
80 std::unique_ptr<VarStorage> clone() const override {
81 return std::make_unique<ArrayStorage>(BasePointer, IRB, ArrayTy);
82 }
83 Value *getSlot() const override;
84 Value *loadValue() const override;
85 void storeValue(Value *Val) override;
86 Type *getAllocatedType() const override;
87 Type *getValueType() const override;
88};
89
90} // namespace proteus
91
92#endif
Definition VarStorage.hpp:72
ArrayStorage(Value *BasePointer, IRBuilderBase &IRB, ArrayType *ArrayTy)
Definition VarStorage.hpp:78
Type * getValueType() const override
Definition VarStorage.cpp:59
Value * getSlot() const override
Definition VarStorage.cpp:46
std::unique_ptr< VarStorage > clone() const override
Definition VarStorage.hpp:80
Type * getAllocatedType() const override
Definition VarStorage.cpp:57
void storeValue(Value *Val) override
Definition VarStorage.cpp:52
Value * loadValue() const override
Definition VarStorage.cpp:48
Definition VarStorage.hpp:46
void storePointer(Value *Ptr)
Definition VarStorage.cpp:38
Type * getAllocatedType() const override
Definition VarStorage.cpp:40
void storeValue(Value *Val) override
Definition VarStorage.cpp:28
Value * getSlot() const override
Definition VarStorage.cpp:20
Value * loadPointer() const
Definition VarStorage.cpp:34
Value * loadValue() const override
Definition VarStorage.cpp:23
PointerStorage(Value *PtrSlot, IRBuilderBase &IRB, Type *PointerElemTy)
Definition VarStorage.hpp:54
Type * getValueType() const override
Definition VarStorage.cpp:44
PointerStorage(AllocaInst *PtrSlot, IRBuilderBase &IRB, Type *PointerElemTy)
Definition VarStorage.hpp:52
std::unique_ptr< VarStorage > clone() const override
Definition VarStorage.hpp:57
Definition VarStorage.hpp:28
Type * getAllocatedType() const override
Definition VarStorage.cpp:14
Value * getSlot() const override
Definition VarStorage.cpp:6
void storeValue(Value *Val) override
Definition VarStorage.cpp:12
Type * getValueType() const override
Definition VarStorage.cpp:18
std::unique_ptr< VarStorage > clone() const override
Definition VarStorage.hpp:35
Value * loadValue() const override
Definition VarStorage.cpp:8
ScalarStorage(AllocaInst *Slot, IRBuilderBase &IRB)
Definition VarStorage.hpp:33
Definition VarStorage.hpp:10
IRBuilderBase & IRB
Definition VarStorage.hpp:13
virtual Value * loadValue() const =0
virtual Value * getSlot() const =0
virtual std::unique_ptr< VarStorage > clone() const =0
virtual Type * getAllocatedType() const =0
virtual void storeValue(Value *Val)=0
virtual ~VarStorage()=default
virtual Type * getValueType() const =0
VarStorage(IRBuilderBase &IRB)
Definition VarStorage.hpp:16
Definition Helpers.h:138
Definition StorageCache.cpp:24
T getRuntimeConstantValue(void *Arg)
Definition CompilerInterfaceRuntimeConstantInfo.h:114