1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | #ifndef LLVM_CLANG_LIB_CODEGEN_ADDRESS_H |
15 | #define LLVM_CLANG_LIB_CODEGEN_ADDRESS_H |
16 | |
17 | #include "llvm/IR/Constants.h" |
18 | #include "clang/AST/CharUnits.h" |
19 | |
20 | namespace clang { |
21 | namespace CodeGen { |
22 | |
23 | |
24 | class Address { |
25 | llvm::Value *Pointer; |
26 | CharUnits Alignment; |
27 | public: |
28 | Address(llvm::Value *pointer, CharUnits alignment) |
29 | : Pointer(pointer), Alignment(alignment) { |
30 | (0) . __assert_fail ("(!alignment.isZero() || pointer == nullptr) && \"creating valid address with invalid alignment\"", "/home/seafit/code_projects/clang_source/clang/lib/CodeGen/Address.h", 31, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert((!alignment.isZero() || pointer == nullptr) && |
31 | (0) . __assert_fail ("(!alignment.isZero() || pointer == nullptr) && \"creating valid address with invalid alignment\"", "/home/seafit/code_projects/clang_source/clang/lib/CodeGen/Address.h", 31, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "creating valid address with invalid alignment"); |
32 | } |
33 | |
34 | static Address invalid() { return Address(nullptr, CharUnits()); } |
35 | bool isValid() const { return Pointer != nullptr; } |
36 | |
37 | llvm::Value *getPointer() const { |
38 | assert(isValid()); |
39 | return Pointer; |
40 | } |
41 | |
42 | |
43 | llvm::PointerType *getType() const { |
44 | return llvm::cast<llvm::PointerType>(getPointer()->getType()); |
45 | } |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | llvm::Type *getElementType() const { |
52 | return getType()->getElementType(); |
53 | } |
54 | |
55 | |
56 | unsigned getAddressSpace() const { |
57 | return getType()->getAddressSpace(); |
58 | } |
59 | |
60 | |
61 | llvm::StringRef getName() const { |
62 | return getPointer()->getName(); |
63 | } |
64 | |
65 | |
66 | CharUnits getAlignment() const { |
67 | assert(isValid()); |
68 | return Alignment; |
69 | } |
70 | }; |
71 | |
72 | |
73 | |
74 | class ConstantAddress : public Address { |
75 | public: |
76 | ConstantAddress(llvm::Constant *pointer, CharUnits alignment) |
77 | : Address(pointer, alignment) {} |
78 | |
79 | static ConstantAddress invalid() { |
80 | return ConstantAddress(nullptr, CharUnits()); |
81 | } |
82 | |
83 | llvm::Constant *getPointer() const { |
84 | return llvm::cast<llvm::Constant>(Address::getPointer()); |
85 | } |
86 | |
87 | ConstantAddress getBitCast(llvm::Type *ty) const { |
88 | return ConstantAddress(llvm::ConstantExpr::getBitCast(getPointer(), ty), |
89 | getAlignment()); |
90 | } |
91 | |
92 | ConstantAddress getElementBitCast(llvm::Type *ty) const { |
93 | return getBitCast(ty->getPointerTo(getAddressSpace())); |
94 | } |
95 | |
96 | static bool isaImpl(Address addr) { |
97 | return llvm::isa<llvm::Constant>(addr.getPointer()); |
98 | } |
99 | static ConstantAddress castImpl(Address addr) { |
100 | return ConstantAddress(llvm::cast<llvm::Constant>(addr.getPointer()), |
101 | addr.getAlignment()); |
102 | } |
103 | }; |
104 | |
105 | } |
106 | |
107 | |
108 | template <class U> inline U cast(CodeGen::Address addr) { |
109 | return U::castImpl(addr); |
110 | } |
111 | template <class U> inline bool isa(CodeGen::Address addr) { |
112 | return U::isaImpl(addr); |
113 | } |
114 | |
115 | } |
116 | |
117 | #endif |
118 | |