1*8ddc8169SZi Xuan Wu //===-- CSKYConstantPoolValue.cpp - CSKY constantpool value ---------------===//
2*8ddc8169SZi Xuan Wu //
3*8ddc8169SZi Xuan Wu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*8ddc8169SZi Xuan Wu // See https://llvm.org/LICENSE.txt for license information.
5*8ddc8169SZi Xuan Wu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*8ddc8169SZi Xuan Wu //
7*8ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
8*8ddc8169SZi Xuan Wu //
9*8ddc8169SZi Xuan Wu // This file implements the CSKY specific constantpool value class.
10*8ddc8169SZi Xuan Wu //
11*8ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
12*8ddc8169SZi Xuan Wu 
13*8ddc8169SZi Xuan Wu #include "CSKYConstantPoolValue.h"
14*8ddc8169SZi Xuan Wu #include "llvm/ADT/FoldingSet.h"
15*8ddc8169SZi Xuan Wu #include "llvm/CodeGen/MachineBasicBlock.h"
16*8ddc8169SZi Xuan Wu #include "llvm/IR/Constant.h"
17*8ddc8169SZi Xuan Wu #include "llvm/IR/Constants.h"
18*8ddc8169SZi Xuan Wu #include "llvm/IR/GlobalValue.h"
19*8ddc8169SZi Xuan Wu #include "llvm/IR/Type.h"
20*8ddc8169SZi Xuan Wu #include "llvm/Support/raw_ostream.h"
21*8ddc8169SZi Xuan Wu using namespace llvm;
22*8ddc8169SZi Xuan Wu 
23*8ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
24*8ddc8169SZi Xuan Wu // CSKYConstantPoolValue
25*8ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
26*8ddc8169SZi Xuan Wu 
CSKYConstantPoolValue(Type * Ty,CSKYCP::CSKYCPKind Kind,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress,unsigned ID)27*8ddc8169SZi Xuan Wu CSKYConstantPoolValue::CSKYConstantPoolValue(Type *Ty, CSKYCP::CSKYCPKind Kind,
28*8ddc8169SZi Xuan Wu                                              unsigned PCAdjust,
29*8ddc8169SZi Xuan Wu                                              CSKYCP::CSKYCPModifier Modifier,
30*8ddc8169SZi Xuan Wu                                              bool AddCurrentAddress,
31*8ddc8169SZi Xuan Wu                                              unsigned ID)
32*8ddc8169SZi Xuan Wu     : MachineConstantPoolValue(Ty), Kind(Kind), PCAdjust(PCAdjust),
33*8ddc8169SZi Xuan Wu       Modifier(Modifier), AddCurrentAddress(AddCurrentAddress), LabelId(ID) {}
34*8ddc8169SZi Xuan Wu 
getModifierText() const35*8ddc8169SZi Xuan Wu const char *CSKYConstantPoolValue::getModifierText() const {
36*8ddc8169SZi Xuan Wu   switch (Modifier) {
37*8ddc8169SZi Xuan Wu   case CSKYCP::ADDR:
38*8ddc8169SZi Xuan Wu     return "ADDR";
39*8ddc8169SZi Xuan Wu   case CSKYCP::GOT:
40*8ddc8169SZi Xuan Wu     return "GOT";
41*8ddc8169SZi Xuan Wu   case CSKYCP::GOTOFF:
42*8ddc8169SZi Xuan Wu     return "GOTOFF";
43*8ddc8169SZi Xuan Wu   case CSKYCP::PLT:
44*8ddc8169SZi Xuan Wu     return "PLT";
45*8ddc8169SZi Xuan Wu   case CSKYCP::TLSIE:
46*8ddc8169SZi Xuan Wu     return "TLSIE";
47*8ddc8169SZi Xuan Wu   case CSKYCP::TLSLE:
48*8ddc8169SZi Xuan Wu     return "TLSLE";
49*8ddc8169SZi Xuan Wu   case CSKYCP::TLSGD:
50*8ddc8169SZi Xuan Wu     return "TLSGD";
51*8ddc8169SZi Xuan Wu   case CSKYCP::NO_MOD:
52*8ddc8169SZi Xuan Wu     return "";
53*8ddc8169SZi Xuan Wu   }
54*8ddc8169SZi Xuan Wu   llvm_unreachable("Unknown modifier!");
55*8ddc8169SZi Xuan Wu }
56*8ddc8169SZi Xuan Wu 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)57*8ddc8169SZi Xuan Wu int CSKYConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP,
58*8ddc8169SZi Xuan Wu                                                      Align Alignment) {
59*8ddc8169SZi Xuan Wu   llvm_unreachable("Shouldn't be calling this directly!");
60*8ddc8169SZi Xuan Wu }
61*8ddc8169SZi Xuan Wu 
addSelectionDAGCSEId(FoldingSetNodeID & ID)62*8ddc8169SZi Xuan Wu void CSKYConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
63*8ddc8169SZi Xuan Wu   ID.AddInteger(LabelId);
64*8ddc8169SZi Xuan Wu   ID.AddInteger(PCAdjust);
65*8ddc8169SZi Xuan Wu   ID.AddInteger(Modifier);
66*8ddc8169SZi Xuan Wu }
67*8ddc8169SZi Xuan Wu 
print(raw_ostream & O) const68*8ddc8169SZi Xuan Wu void CSKYConstantPoolValue::print(raw_ostream &O) const {
69*8ddc8169SZi Xuan Wu   if (Modifier)
70*8ddc8169SZi Xuan Wu     O << "(" << getModifierText() << ")";
71*8ddc8169SZi Xuan Wu   if (PCAdjust)
72*8ddc8169SZi Xuan Wu     O << " + " << PCAdjust;
73*8ddc8169SZi Xuan Wu }
74*8ddc8169SZi Xuan Wu 
75*8ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
76*8ddc8169SZi Xuan Wu // CSKYConstantPoolConstant
77*8ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
78*8ddc8169SZi Xuan Wu 
CSKYConstantPoolConstant(const Constant * C,CSKYCP::CSKYCPKind Kind,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress,unsigned ID)79*8ddc8169SZi Xuan Wu CSKYConstantPoolConstant::CSKYConstantPoolConstant(
80*8ddc8169SZi Xuan Wu     const Constant *C, CSKYCP::CSKYCPKind Kind, unsigned PCAdjust,
81*8ddc8169SZi Xuan Wu     CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress, unsigned ID)
82*8ddc8169SZi Xuan Wu     : CSKYConstantPoolValue(C->getType(), Kind, PCAdjust, Modifier,
83*8ddc8169SZi Xuan Wu                             AddCurrentAddress, ID),
84*8ddc8169SZi Xuan Wu       CVal(C) {}
85*8ddc8169SZi Xuan Wu 
Create(const Constant * C,CSKYCP::CSKYCPKind Kind,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress,unsigned ID)86*8ddc8169SZi Xuan Wu CSKYConstantPoolConstant *CSKYConstantPoolConstant::Create(
87*8ddc8169SZi Xuan Wu     const Constant *C, CSKYCP::CSKYCPKind Kind, unsigned PCAdjust,
88*8ddc8169SZi Xuan Wu     CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress, unsigned ID) {
89*8ddc8169SZi Xuan Wu   return new CSKYConstantPoolConstant(C, Kind, PCAdjust, Modifier,
90*8ddc8169SZi Xuan Wu                                       AddCurrentAddress, ID);
91*8ddc8169SZi Xuan Wu }
92*8ddc8169SZi Xuan Wu 
getGV() const93*8ddc8169SZi Xuan Wu const GlobalValue *CSKYConstantPoolConstant::getGV() const {
94*8ddc8169SZi Xuan Wu   assert(isa<GlobalValue>(CVal) && "CVal should be GlobalValue");
95*8ddc8169SZi Xuan Wu   return cast<GlobalValue>(CVal);
96*8ddc8169SZi Xuan Wu }
97*8ddc8169SZi Xuan Wu 
getBlockAddress() const98*8ddc8169SZi Xuan Wu const BlockAddress *CSKYConstantPoolConstant::getBlockAddress() const {
99*8ddc8169SZi Xuan Wu   assert(isa<BlockAddress>(CVal) && "CVal should be BlockAddress");
100*8ddc8169SZi Xuan Wu   return cast<BlockAddress>(CVal);
101*8ddc8169SZi Xuan Wu }
102*8ddc8169SZi Xuan Wu 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)103*8ddc8169SZi Xuan Wu int CSKYConstantPoolConstant::getExistingMachineCPValue(MachineConstantPool *CP,
104*8ddc8169SZi Xuan Wu                                                         Align Alignment) {
105*8ddc8169SZi Xuan Wu   return getExistingMachineCPValueImpl<CSKYConstantPoolConstant>(CP, Alignment);
106*8ddc8169SZi Xuan Wu }
107*8ddc8169SZi Xuan Wu 
addSelectionDAGCSEId(FoldingSetNodeID & ID)108*8ddc8169SZi Xuan Wu void CSKYConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
109*8ddc8169SZi Xuan Wu   ID.AddPointer(CVal);
110*8ddc8169SZi Xuan Wu 
111*8ddc8169SZi Xuan Wu   CSKYConstantPoolValue::addSelectionDAGCSEId(ID);
112*8ddc8169SZi Xuan Wu }
113*8ddc8169SZi Xuan Wu 
print(raw_ostream & O) const114*8ddc8169SZi Xuan Wu void CSKYConstantPoolConstant::print(raw_ostream &O) const {
115*8ddc8169SZi Xuan Wu   O << CVal->getName();
116*8ddc8169SZi Xuan Wu   CSKYConstantPoolValue::print(O);
117*8ddc8169SZi Xuan Wu }
118*8ddc8169SZi Xuan Wu 
119*8ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
120*8ddc8169SZi Xuan Wu // CSKYConstantPoolSymbol
121*8ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
122*8ddc8169SZi Xuan Wu 
CSKYConstantPoolSymbol(Type * Ty,const char * S,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress)123*8ddc8169SZi Xuan Wu CSKYConstantPoolSymbol::CSKYConstantPoolSymbol(Type *Ty, const char *S,
124*8ddc8169SZi Xuan Wu                                                unsigned PCAdjust,
125*8ddc8169SZi Xuan Wu                                                CSKYCP::CSKYCPModifier Modifier,
126*8ddc8169SZi Xuan Wu                                                bool AddCurrentAddress)
127*8ddc8169SZi Xuan Wu     : CSKYConstantPoolValue(Ty, CSKYCP::CPExtSymbol, PCAdjust, Modifier,
128*8ddc8169SZi Xuan Wu                             AddCurrentAddress),
129*8ddc8169SZi Xuan Wu       S(strdup(S)) {}
130*8ddc8169SZi Xuan Wu 
131*8ddc8169SZi Xuan Wu CSKYConstantPoolSymbol *
Create(Type * Ty,const char * S,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier)132*8ddc8169SZi Xuan Wu CSKYConstantPoolSymbol::Create(Type *Ty, const char *S, unsigned PCAdjust,
133*8ddc8169SZi Xuan Wu                                CSKYCP::CSKYCPModifier Modifier) {
134*8ddc8169SZi Xuan Wu   return new CSKYConstantPoolSymbol(Ty, S, PCAdjust, Modifier, false);
135*8ddc8169SZi Xuan Wu }
136*8ddc8169SZi Xuan Wu 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)137*8ddc8169SZi Xuan Wu int CSKYConstantPoolSymbol::getExistingMachineCPValue(MachineConstantPool *CP,
138*8ddc8169SZi Xuan Wu                                                       Align Alignment) {
139*8ddc8169SZi Xuan Wu 
140*8ddc8169SZi Xuan Wu   return getExistingMachineCPValueImpl<CSKYConstantPoolSymbol>(CP, Alignment);
141*8ddc8169SZi Xuan Wu }
142*8ddc8169SZi Xuan Wu 
addSelectionDAGCSEId(FoldingSetNodeID & ID)143*8ddc8169SZi Xuan Wu void CSKYConstantPoolSymbol::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
144*8ddc8169SZi Xuan Wu   ID.AddString(S);
145*8ddc8169SZi Xuan Wu   CSKYConstantPoolValue::addSelectionDAGCSEId(ID);
146*8ddc8169SZi Xuan Wu }
147*8ddc8169SZi Xuan Wu 
print(raw_ostream & O) const148*8ddc8169SZi Xuan Wu void CSKYConstantPoolSymbol::print(raw_ostream &O) const {
149*8ddc8169SZi Xuan Wu   O << S;
150*8ddc8169SZi Xuan Wu   CSKYConstantPoolValue::print(O);
151*8ddc8169SZi Xuan Wu }
152*8ddc8169SZi Xuan Wu 
153*8ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
154*8ddc8169SZi Xuan Wu // CSKYConstantPoolMBB
155*8ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
156*8ddc8169SZi Xuan Wu 
CSKYConstantPoolMBB(Type * Ty,const MachineBasicBlock * Mbb,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress)157*8ddc8169SZi Xuan Wu CSKYConstantPoolMBB::CSKYConstantPoolMBB(Type *Ty, const MachineBasicBlock *Mbb,
158*8ddc8169SZi Xuan Wu                                          unsigned PCAdjust,
159*8ddc8169SZi Xuan Wu                                          CSKYCP::CSKYCPModifier Modifier,
160*8ddc8169SZi Xuan Wu                                          bool AddCurrentAddress)
161*8ddc8169SZi Xuan Wu     : CSKYConstantPoolValue(Ty, CSKYCP::CPMachineBasicBlock, PCAdjust, Modifier,
162*8ddc8169SZi Xuan Wu                             AddCurrentAddress),
163*8ddc8169SZi Xuan Wu       MBB(Mbb) {}
164*8ddc8169SZi Xuan Wu 
Create(Type * Ty,const MachineBasicBlock * Mbb,unsigned PCAdjust)165*8ddc8169SZi Xuan Wu CSKYConstantPoolMBB *CSKYConstantPoolMBB::Create(Type *Ty,
166*8ddc8169SZi Xuan Wu                                                  const MachineBasicBlock *Mbb,
167*8ddc8169SZi Xuan Wu                                                  unsigned PCAdjust) {
168*8ddc8169SZi Xuan Wu   return new CSKYConstantPoolMBB(Ty, Mbb, PCAdjust, CSKYCP::ADDR, false);
169*8ddc8169SZi Xuan Wu }
170*8ddc8169SZi Xuan Wu 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)171*8ddc8169SZi Xuan Wu int CSKYConstantPoolMBB::getExistingMachineCPValue(MachineConstantPool *CP,
172*8ddc8169SZi Xuan Wu                                                    Align Alignment) {
173*8ddc8169SZi Xuan Wu   return getExistingMachineCPValueImpl<CSKYConstantPoolMBB>(CP, Alignment);
174*8ddc8169SZi Xuan Wu }
175*8ddc8169SZi Xuan Wu 
addSelectionDAGCSEId(FoldingSetNodeID & ID)176*8ddc8169SZi Xuan Wu void CSKYConstantPoolMBB::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
177*8ddc8169SZi Xuan Wu   ID.AddPointer(MBB);
178*8ddc8169SZi Xuan Wu   CSKYConstantPoolValue::addSelectionDAGCSEId(ID);
179*8ddc8169SZi Xuan Wu }
180*8ddc8169SZi Xuan Wu 
print(raw_ostream & O) const181*8ddc8169SZi Xuan Wu void CSKYConstantPoolMBB::print(raw_ostream &O) const {
182*8ddc8169SZi Xuan Wu   O << "BB#" << MBB->getNumber();
183*8ddc8169SZi Xuan Wu   CSKYConstantPoolValue::print(O);
184*8ddc8169SZi Xuan Wu }
185*8ddc8169SZi Xuan Wu 
186*8ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
187*8ddc8169SZi Xuan Wu // CSKYConstantPoolJT
188*8ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
189*8ddc8169SZi Xuan Wu 
CSKYConstantPoolJT(Type * Ty,int JTIndex,unsigned PCAdj,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress)190*8ddc8169SZi Xuan Wu CSKYConstantPoolJT::CSKYConstantPoolJT(Type *Ty, int JTIndex, unsigned PCAdj,
191*8ddc8169SZi Xuan Wu                                        CSKYCP::CSKYCPModifier Modifier,
192*8ddc8169SZi Xuan Wu                                        bool AddCurrentAddress)
193*8ddc8169SZi Xuan Wu     : CSKYConstantPoolValue(Ty, CSKYCP::CPJT, PCAdj, Modifier,
194*8ddc8169SZi Xuan Wu                             AddCurrentAddress),
195*8ddc8169SZi Xuan Wu       JTI(JTIndex) {}
196*8ddc8169SZi Xuan Wu 
197*8ddc8169SZi Xuan Wu CSKYConstantPoolJT *
Create(Type * Ty,int JTI,unsigned PCAdj,CSKYCP::CSKYCPModifier Modifier)198*8ddc8169SZi Xuan Wu CSKYConstantPoolJT::Create(Type *Ty, int JTI, unsigned PCAdj,
199*8ddc8169SZi Xuan Wu                            CSKYCP::CSKYCPModifier Modifier) {
200*8ddc8169SZi Xuan Wu   return new CSKYConstantPoolJT(Ty, JTI, PCAdj, Modifier, false);
201*8ddc8169SZi Xuan Wu }
202*8ddc8169SZi Xuan Wu 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)203*8ddc8169SZi Xuan Wu int CSKYConstantPoolJT::getExistingMachineCPValue(MachineConstantPool *CP,
204*8ddc8169SZi Xuan Wu                                                   Align Alignment) {
205*8ddc8169SZi Xuan Wu   return getExistingMachineCPValueImpl<CSKYConstantPoolJT>(CP, Alignment);
206*8ddc8169SZi Xuan Wu }
207*8ddc8169SZi Xuan Wu 
addSelectionDAGCSEId(FoldingSetNodeID & ID)208*8ddc8169SZi Xuan Wu void CSKYConstantPoolJT::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
209*8ddc8169SZi Xuan Wu   ID.AddInteger(JTI);
210*8ddc8169SZi Xuan Wu   CSKYConstantPoolValue::addSelectionDAGCSEId(ID);
211*8ddc8169SZi Xuan Wu }
212*8ddc8169SZi Xuan Wu 
print(raw_ostream & O) const213*8ddc8169SZi Xuan Wu void CSKYConstantPoolJT::print(raw_ostream &O) const {
214*8ddc8169SZi Xuan Wu   O << "JTI#" << JTI;
215*8ddc8169SZi Xuan Wu   CSKYConstantPoolValue::print(O);
216*8ddc8169SZi Xuan Wu }
217