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 <memory>
5
6namespace llvm {
7class Value;
8class IRBuilderBase;
9class Type;
10class ArrayType;
11} // namespace llvm
12
13namespace proteus {
14using namespace llvm;
15
17
18protected:
20
21public:
23 virtual ~VarStorage() = default;
24
25 virtual Value *getSlot() const = 0;
26 // Load/store the logical value represented by this storage.
27 virtual Value *loadValue() const = 0;
28 virtual void storeValue(Value *Val) = 0;
29 virtual Type *getSlotType() const = 0;
30 virtual Type *getAllocatedType() const = 0;
31 virtual Type *getValueType() const = 0;
32 virtual std::unique_ptr<VarStorage> clone() const = 0;
33};
34
35class ScalarStorage : public VarStorage {
36 Value *Slot = nullptr;
37
38public:
40 : VarStorage(IRB), Slot(Slot) {}
41 std::unique_ptr<VarStorage> clone() const override {
42 return std::make_unique<ScalarStorage>(Slot, IRB);
43 }
44
45 Value *getSlot() const override;
46 Value *loadValue() const override;
47 void storeValue(Value *Val) override;
48 Type *getSlotType() const override;
49 Type *getAllocatedType() const override;
50 Type *getValueType() const override;
51};
52
53class PointerStorage : public VarStorage {
54
55 Value *PtrSlot = nullptr;
56 Type *PointerElemTy = nullptr;
57
58public:
59 PointerStorage(Value *PtrSlot, IRBuilderBase &IRB, Type *PointerElemTy)
60 : VarStorage(IRB), PtrSlot(PtrSlot), PointerElemTy(PointerElemTy) {}
61 std::unique_ptr<VarStorage> clone() const override {
62 return std::make_unique<PointerStorage>(PtrSlot, IRB, PointerElemTy);
63 }
64
65 Value *getSlot() const override;
66 // Load/store the pointee value through the pointer stored in PtrSlot.
67 Value *loadValue() const override;
68 void storeValue(Value *Val) override;
69 // Load/store the pointer value itself from/to PtrSlot.
70 Value *loadPointer() const;
71 void storePointer(Value *Ptr);
72 Type *getSlotType() const override;
73 Type *getAllocatedType() const override;
74 Type *getValueType() const override;
75};
76
77class ArrayStorage : public VarStorage {
78
79 Value *BasePointer = nullptr;
80 ArrayType *ArrayTy = nullptr;
81
82public:
83 ArrayStorage(Value *BasePointer, IRBuilderBase &IRB, ArrayType *ArrayTy)
84 : VarStorage(IRB), BasePointer(BasePointer), ArrayTy(ArrayTy) {}
85 std::unique_ptr<VarStorage> clone() const override {
86 return std::make_unique<ArrayStorage>(BasePointer, IRB, ArrayTy);
87 }
88 Value *getSlot() const override;
89 Value *loadValue() const override;
90 void storeValue(Value *Val) override;
91 Type *getSlotType() const override;
92 Type *getAllocatedType() const override;
93 Type *getValueType() const override;
94};
95
96} // namespace proteus
97
98#endif
Definition VarStorage.hpp:77
ArrayStorage(Value *BasePointer, IRBuilderBase &IRB, ArrayType *ArrayTy)
Definition VarStorage.hpp:83
Type * getValueType() const override
Definition VarStorage.cpp:72
Value * getSlot() const override
Definition VarStorage.cpp:58
std::unique_ptr< VarStorage > clone() const override
Definition VarStorage.hpp:85
Type * getAllocatedType() const override
Definition VarStorage.cpp:70
Type * getSlotType() const override
Definition VarStorage.cpp:68
void storeValue(Value *Val) override
Definition VarStorage.cpp:64
Value * loadValue() const override
Definition VarStorage.cpp:60
Definition VarStorage.hpp:53
void storePointer(Value *Ptr)
Definition VarStorage.cpp:47
Type * getAllocatedType() const override
Definition VarStorage.cpp:49
void storeValue(Value *Val) override
Definition VarStorage.cpp:37
Value * getSlot() const override
Definition VarStorage.cpp:27
Value * loadPointer() const
Definition VarStorage.cpp:43
Value * loadValue() const override
Definition VarStorage.cpp:32
PointerStorage(Value *PtrSlot, IRBuilderBase &IRB, Type *PointerElemTy)
Definition VarStorage.hpp:59
Type * getValueType() const override
Definition VarStorage.cpp:56
Type * getSlotType() const override
Definition VarStorage.cpp:29
std::unique_ptr< VarStorage > clone() const override
Definition VarStorage.hpp:61
Definition VarStorage.hpp:35
Type * getAllocatedType() const override
Definition VarStorage.cpp:18
Value * getSlot() const override
Definition VarStorage.cpp:8
ScalarStorage(Value *Slot, IRBuilderBase &IRB)
Definition VarStorage.hpp:39
void storeValue(Value *Val) override
Definition VarStorage.cpp:14
Type * getValueType() const override
Definition VarStorage.cpp:25
Type * getSlotType() const override
Definition VarStorage.cpp:16
std::unique_ptr< VarStorage > clone() const override
Definition VarStorage.hpp:41
Value * loadValue() const override
Definition VarStorage.cpp:10
Definition VarStorage.hpp:16
IRBuilderBase & IRB
Definition VarStorage.hpp:19
virtual Value * loadValue() const =0
virtual Type * getSlotType() 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:22
Definition Helpers.h:141
Definition ObjectCacheChain.cpp:26
T getRuntimeConstantValue(void *Arg)
Definition CompilerInterfaceRuntimeConstantInfo.h:113