LLVM 22.0.0git
CSKYConstantPoolValue.h
Go to the documentation of this file.
1//===-- CSKYConstantPoolValue.h - CSKY constantpool value -----*- C++ -*---===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the CSKY specific constantpool value class.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_TARGET_CSKY_CONSTANTPOOLVALUE_H
14#define LLVM_TARGET_CSKY_CONSTANTPOOLVALUE_H
15
16#include "llvm/ADT/StringRef.h"
20#include <cstddef>
21
22namespace llvm {
23
24class BlockAddress;
25class Constant;
26class GlobalValue;
27class LLVMContext;
29
42
43/// CSKYConstantPoolValue - CSKY specific constantpool value. This is used to
44/// represent PC-relative displacement between the address of the load
45/// instruction and the constant being loaded, i.e. (&GV-(LPIC+8)).
47protected:
48 CSKYCP::CSKYCPKind Kind; // Kind of constant.
49 unsigned PCAdjust; // Extra adjustment if constantpool is pc-relative.
52
53 unsigned LabelId = 0;
54
57 unsigned ID = 0);
58
59public:
60 const char *getModifierText() const;
61 unsigned getPCAdjustment() const { return PCAdjust; }
64 unsigned getLabelID() const { return LabelId; }
65
66 bool isGlobalValue() const { return Kind == CSKYCP::CPValue; }
67 bool isExtSymbol() const { return Kind == CSKYCP::CPExtSymbol; }
68 bool isBlockAddress() const { return Kind == CSKYCP::CPBlockAddress; }
69 bool isMachineBasicBlock() const {
71 }
72 bool isJT() const { return Kind == CSKYCP::CPJT; }
73 bool isConstPool() const { return Kind == CSKYCP::CPConstPool; }
74
76 Align Alignment) override;
77
79
80 void print(raw_ostream &O) const override;
81
82 bool equals(const CSKYConstantPoolValue *A) const {
83 return this->LabelId == A->LabelId && this->PCAdjust == A->PCAdjust &&
84 this->Modifier == A->Modifier;
85 }
86
87 template <typename Derived>
89 const std::vector<MachineConstantPoolEntry> &Constants = CP->getConstants();
90 for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
91 if (Constants[i].isMachineConstantPoolEntry() &&
92 Constants[i].getAlign() >= Alignment) {
93 auto *CPV =
94 static_cast<CSKYConstantPoolValue *>(Constants[i].Val.MachineCPVal);
95 if (Derived *APC = dyn_cast<Derived>(CPV))
96 if (cast<Derived>(this)->equals(APC))
97 return i;
98 }
99 }
100
101 return -1;
102 }
103};
104
105/// CSKY-specific constant pool values for Constants,
106/// Functions, and BlockAddresses.
107class CSKYConstantPoolConstant : public CSKYConstantPoolValue {
108 const Constant *CVal; // Constant being loaded.
109
110 CSKYConstantPoolConstant(const Constant *C, Type *Ty, CSKYCP::CSKYCPKind Kind,
112 bool AddCurrentAddress, unsigned ID);
113
114public:
115 static CSKYConstantPoolConstant *
118 unsigned ID = 0);
119 static CSKYConstantPoolConstant *
122 bool AddCurrentAddress, unsigned ID = 0);
123 const GlobalValue *getGV() const;
124 const BlockAddress *getBlockAddress() const;
125 const Constant *getConstantPool() const;
126
128 Align Alignment) override;
130 void print(raw_ostream &O) const override;
131
132 bool equals(const CSKYConstantPoolConstant *A) const {
133 return CVal == A->CVal && CSKYConstantPoolValue::equals(A);
134 }
135
136 static bool classof(const CSKYConstantPoolValue *APV) {
137 return APV->isGlobalValue() || APV->isBlockAddress() || APV->isConstPool();
138 }
139};
140
141/// CSKYConstantPoolSymbol - CSKY-specific constantpool values for external
142/// symbols.
143class CSKYConstantPoolSymbol : public CSKYConstantPoolValue {
144 const std::string S; // ExtSymbol being loaded.
145
146 CSKYConstantPoolSymbol(Type *Ty, const char *S, unsigned PCAdjust,
148 bool AddCurrentAddress);
149
150public:
151 static CSKYConstantPoolSymbol *Create(Type *Ty, const char *S,
152 unsigned PCAdjust,
154
155 StringRef getSymbol() const { return S; }
156
158 Align Alignment) override;
160 void print(raw_ostream &O) const override;
161
162 bool equals(const CSKYConstantPoolSymbol *A) const {
163 return S == A->S && CSKYConstantPoolValue::equals(A);
164 }
165
166 static bool classof(const CSKYConstantPoolValue *ACPV) {
167 return ACPV->isExtSymbol();
168 }
169};
170
171/// CSKYConstantPoolMBB - CSKY-specific constantpool value of a machine basic
172/// block.
173class CSKYConstantPoolMBB : public CSKYConstantPoolValue {
174 const MachineBasicBlock *MBB; // Machine basic block.
175
176 CSKYConstantPoolMBB(Type *Ty, const MachineBasicBlock *Mbb, unsigned PCAdjust,
178
179public:
180 static CSKYConstantPoolMBB *Create(Type *Ty, const MachineBasicBlock *Mbb,
181 unsigned PCAdjust);
182
183 const MachineBasicBlock *getMBB() const { return MBB; }
184
186 Align Alignment) override;
188 void print(raw_ostream &O) const override;
189
190 bool equals(const CSKYConstantPoolMBB *A) const {
191 return MBB == A->MBB && CSKYConstantPoolValue::equals(A);
192 }
193
194 static bool classof(const CSKYConstantPoolValue *ACPV) {
195 return ACPV->isMachineBasicBlock();
196 }
197};
198
199/// CSKY-specific constantpool value of a jump table.
200class CSKYConstantPoolJT : public CSKYConstantPoolValue {
201 signed JTI; // Machine basic block.
202
203 CSKYConstantPoolJT(Type *Ty, int JTIndex, unsigned PCAdj,
205
206public:
207 static CSKYConstantPoolJT *Create(Type *Ty, int JTI, unsigned PCAdj,
209
210 signed getJTI() { return JTI; }
211
213 Align Alignment) override;
215 void print(raw_ostream &O) const override;
216
217 bool equals(const CSKYConstantPoolJT *A) const {
218 return JTI == A->JTI && CSKYConstantPoolValue::equals(A);
219 }
220
221 static bool classof(const CSKYConstantPoolValue *ACPV) {
222 return ACPV->isJT();
223 }
224};
225
226} // namespace llvm
227
228#endif
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
The address of a basic block.
Definition Constants.h:899
const GlobalValue * getGV() const
int getExistingMachineCPValue(MachineConstantPool *CP, Align Alignment) override
void addSelectionDAGCSEId(FoldingSetNodeID &ID) override
void print(raw_ostream &O) const override
print - Implement operator<<
static CSKYConstantPoolConstant * Create(const Constant *C, CSKYCP::CSKYCPKind Kind, unsigned PCAdjust, CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress, unsigned ID=0)
bool equals(const CSKYConstantPoolConstant *A) const
const BlockAddress * getBlockAddress() const
const Constant * getConstantPool() const
static bool classof(const CSKYConstantPoolValue *APV)
bool equals(const CSKYConstantPoolJT *A) const
int getExistingMachineCPValue(MachineConstantPool *CP, Align Alignment) override
static CSKYConstantPoolJT * Create(Type *Ty, int JTI, unsigned PCAdj, CSKYCP::CSKYCPModifier Modifier)
void print(raw_ostream &O) const override
print - Implement operator<<
static bool classof(const CSKYConstantPoolValue *ACPV)
void addSelectionDAGCSEId(FoldingSetNodeID &ID) override
int getExistingMachineCPValue(MachineConstantPool *CP, Align Alignment) override
void addSelectionDAGCSEId(FoldingSetNodeID &ID) override
static CSKYConstantPoolMBB * Create(Type *Ty, const MachineBasicBlock *Mbb, unsigned PCAdjust)
static bool classof(const CSKYConstantPoolValue *ACPV)
bool equals(const CSKYConstantPoolMBB *A) const
void print(raw_ostream &O) const override
print - Implement operator<<
const MachineBasicBlock * getMBB() const
void addSelectionDAGCSEId(FoldingSetNodeID &ID) override
void print(raw_ostream &O) const override
print - Implement operator<<
int getExistingMachineCPValue(MachineConstantPool *CP, Align Alignment) override
static bool classof(const CSKYConstantPoolValue *ACPV)
bool equals(const CSKYConstantPoolSymbol *A) const
static CSKYConstantPoolSymbol * Create(Type *Ty, const char *S, unsigned PCAdjust, CSKYCP::CSKYCPModifier Modifier)
void print(raw_ostream &O) const override
print - Implement operator<<
CSKYConstantPoolValue(Type *Ty, CSKYCP::CSKYCPKind Kind, unsigned PCAdjust, CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress, unsigned ID=0)
bool equals(const CSKYConstantPoolValue *A) const
int getExistingMachineCPValueImpl(MachineConstantPool *CP, Align Alignment)
void addSelectionDAGCSEId(FoldingSetNodeID &ID) override
CSKYCP::CSKYCPModifier Modifier
CSKYCP::CSKYCPModifier getModifier() const
int getExistingMachineCPValue(MachineConstantPool *CP, Align Alignment) override
This is an important base class in LLVM.
Definition Constant.h:43
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
Definition FoldingSet.h:330
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
MaybeAlign getAlign(const CallInst &I, unsigned Index)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:649
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39