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