1 //===-- CSKYConstantPoolValue.cpp - CSKY constantpool value ---------------===//
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
7 //===----------------------------------------------------------------------===//
9 // This file implements the CSKY specific constantpool value class.
11 //===----------------------------------------------------------------------===//
13 #include "CSKYConstantPoolValue.h"
14 #include "llvm/ADT/FoldingSet.h"
15 #include "llvm/CodeGen/MachineBasicBlock.h"
16 #include "llvm/IR/Constant.h"
17 #include "llvm/IR/Constants.h"
18 #include "llvm/IR/GlobalValue.h"
19 #include "llvm/IR/Type.h"
20 #include "llvm/Support/raw_ostream.h"
23 //===----------------------------------------------------------------------===//
24 // CSKYConstantPoolValue
25 //===----------------------------------------------------------------------===//
27 CSKYConstantPoolValue::CSKYConstantPoolValue(Type
*Ty
, CSKYCP::CSKYCPKind Kind
,
29 CSKYCP::CSKYCPModifier Modifier
,
30 bool AddCurrentAddress
,
32 : MachineConstantPoolValue(Ty
), Kind(Kind
), PCAdjust(PCAdjust
),
33 Modifier(Modifier
), AddCurrentAddress(AddCurrentAddress
), LabelId(ID
) {}
35 const char *CSKYConstantPoolValue::getModifierText() const {
54 llvm_unreachable("Unknown modifier!");
57 int CSKYConstantPoolValue::getExistingMachineCPValue(MachineConstantPool
*CP
,
59 llvm_unreachable("Shouldn't be calling this directly!");
62 void CSKYConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID
&ID
) {
63 ID
.AddInteger(LabelId
);
64 ID
.AddInteger(PCAdjust
);
65 ID
.AddInteger(Modifier
);
68 void CSKYConstantPoolValue::print(raw_ostream
&O
) const {
70 O
<< "(" << getModifierText() << ")";
72 O
<< " + " << PCAdjust
;
75 //===----------------------------------------------------------------------===//
76 // CSKYConstantPoolConstant
77 //===----------------------------------------------------------------------===//
79 CSKYConstantPoolConstant::CSKYConstantPoolConstant(
80 const Constant
*C
, Type
*Ty
, CSKYCP::CSKYCPKind Kind
, unsigned PCAdjust
,
81 CSKYCP::CSKYCPModifier Modifier
, bool AddCurrentAddress
, unsigned ID
)
82 : CSKYConstantPoolValue(Ty
, Kind
, PCAdjust
, Modifier
, AddCurrentAddress
,
86 CSKYConstantPoolConstant
*CSKYConstantPoolConstant::Create(
87 const Constant
*C
, CSKYCP::CSKYCPKind Kind
, unsigned PCAdjust
,
88 CSKYCP::CSKYCPModifier Modifier
, bool AddCurrentAddress
, unsigned ID
) {
89 return new CSKYConstantPoolConstant(C
, C
->getType(), Kind
, PCAdjust
, Modifier
,
90 AddCurrentAddress
, ID
);
93 CSKYConstantPoolConstant
*CSKYConstantPoolConstant::Create(
94 const Constant
*C
, Type
*Ty
, CSKYCP::CSKYCPKind Kind
, unsigned PCAdjust
,
95 CSKYCP::CSKYCPModifier Modifier
, bool AddCurrentAddress
, unsigned ID
) {
96 return new CSKYConstantPoolConstant(C
, Ty
, Kind
, PCAdjust
, Modifier
,
97 AddCurrentAddress
, ID
);
100 const GlobalValue
*CSKYConstantPoolConstant::getGV() const {
101 assert(isa
<GlobalValue
>(CVal
) && "CVal should be GlobalValue");
102 return cast
<GlobalValue
>(CVal
);
105 const BlockAddress
*CSKYConstantPoolConstant::getBlockAddress() const {
106 assert(isa
<BlockAddress
>(CVal
) && "CVal should be BlockAddress");
107 return cast
<BlockAddress
>(CVal
);
110 const Constant
*CSKYConstantPoolConstant::getConstantPool() const {
114 int CSKYConstantPoolConstant::getExistingMachineCPValue(MachineConstantPool
*CP
,
116 return getExistingMachineCPValueImpl
<CSKYConstantPoolConstant
>(CP
, Alignment
);
119 void CSKYConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID
&ID
) {
122 CSKYConstantPoolValue::addSelectionDAGCSEId(ID
);
125 void CSKYConstantPoolConstant::print(raw_ostream
&O
) const {
126 O
<< CVal
->getName();
127 CSKYConstantPoolValue::print(O
);
130 //===----------------------------------------------------------------------===//
131 // CSKYConstantPoolSymbol
132 //===----------------------------------------------------------------------===//
134 CSKYConstantPoolSymbol::CSKYConstantPoolSymbol(Type
*Ty
, const char *S
,
136 CSKYCP::CSKYCPModifier Modifier
,
137 bool AddCurrentAddress
)
138 : CSKYConstantPoolValue(Ty
, CSKYCP::CPExtSymbol
, PCAdjust
, Modifier
,
142 CSKYConstantPoolSymbol
*
143 CSKYConstantPoolSymbol::Create(Type
*Ty
, const char *S
, unsigned PCAdjust
,
144 CSKYCP::CSKYCPModifier Modifier
) {
145 return new CSKYConstantPoolSymbol(Ty
, S
, PCAdjust
, Modifier
, false);
148 int CSKYConstantPoolSymbol::getExistingMachineCPValue(MachineConstantPool
*CP
,
151 return getExistingMachineCPValueImpl
<CSKYConstantPoolSymbol
>(CP
, Alignment
);
154 void CSKYConstantPoolSymbol::addSelectionDAGCSEId(FoldingSetNodeID
&ID
) {
156 CSKYConstantPoolValue::addSelectionDAGCSEId(ID
);
159 void CSKYConstantPoolSymbol::print(raw_ostream
&O
) const {
161 CSKYConstantPoolValue::print(O
);
164 //===----------------------------------------------------------------------===//
165 // CSKYConstantPoolMBB
166 //===----------------------------------------------------------------------===//
168 CSKYConstantPoolMBB::CSKYConstantPoolMBB(Type
*Ty
, const MachineBasicBlock
*Mbb
,
170 CSKYCP::CSKYCPModifier Modifier
,
171 bool AddCurrentAddress
)
172 : CSKYConstantPoolValue(Ty
, CSKYCP::CPMachineBasicBlock
, PCAdjust
, Modifier
,
176 CSKYConstantPoolMBB
*CSKYConstantPoolMBB::Create(Type
*Ty
,
177 const MachineBasicBlock
*Mbb
,
179 return new CSKYConstantPoolMBB(Ty
, Mbb
, PCAdjust
, CSKYCP::ADDR
, false);
182 int CSKYConstantPoolMBB::getExistingMachineCPValue(MachineConstantPool
*CP
,
184 return getExistingMachineCPValueImpl
<CSKYConstantPoolMBB
>(CP
, Alignment
);
187 void CSKYConstantPoolMBB::addSelectionDAGCSEId(FoldingSetNodeID
&ID
) {
189 CSKYConstantPoolValue::addSelectionDAGCSEId(ID
);
192 void CSKYConstantPoolMBB::print(raw_ostream
&O
) const {
193 O
<< "BB#" << MBB
->getNumber();
194 CSKYConstantPoolValue::print(O
);
197 //===----------------------------------------------------------------------===//
198 // CSKYConstantPoolJT
199 //===----------------------------------------------------------------------===//
201 CSKYConstantPoolJT::CSKYConstantPoolJT(Type
*Ty
, int JTIndex
, unsigned PCAdj
,
202 CSKYCP::CSKYCPModifier Modifier
,
203 bool AddCurrentAddress
)
204 : CSKYConstantPoolValue(Ty
, CSKYCP::CPJT
, PCAdj
, Modifier
,
209 CSKYConstantPoolJT::Create(Type
*Ty
, int JTI
, unsigned PCAdj
,
210 CSKYCP::CSKYCPModifier Modifier
) {
211 return new CSKYConstantPoolJT(Ty
, JTI
, PCAdj
, Modifier
, false);
214 int CSKYConstantPoolJT::getExistingMachineCPValue(MachineConstantPool
*CP
,
216 return getExistingMachineCPValueImpl
<CSKYConstantPoolJT
>(CP
, Alignment
);
219 void CSKYConstantPoolJT::addSelectionDAGCSEId(FoldingSetNodeID
&ID
) {
221 CSKYConstantPoolValue::addSelectionDAGCSEId(ID
);
224 void CSKYConstantPoolJT::print(raw_ostream
&O
) const {
226 CSKYConstantPoolValue::print(O
);