xref: /llvm-project/llvm/lib/Target/CSKY/CSKYConstantPoolValue.cpp (revision f4d61cdf9cc3a24d08fc0145a567a339ac347cdb)
18ddc8169SZi Xuan Wu //===-- CSKYConstantPoolValue.cpp - CSKY constantpool value ---------------===//
28ddc8169SZi Xuan Wu //
38ddc8169SZi Xuan Wu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48ddc8169SZi Xuan Wu // See https://llvm.org/LICENSE.txt for license information.
58ddc8169SZi Xuan Wu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68ddc8169SZi Xuan Wu //
78ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
88ddc8169SZi Xuan Wu //
98ddc8169SZi Xuan Wu // This file implements the CSKY specific constantpool value class.
108ddc8169SZi Xuan Wu //
118ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
128ddc8169SZi Xuan Wu 
138ddc8169SZi Xuan Wu #include "CSKYConstantPoolValue.h"
148ddc8169SZi Xuan Wu #include "llvm/ADT/FoldingSet.h"
158ddc8169SZi Xuan Wu #include "llvm/CodeGen/MachineBasicBlock.h"
168ddc8169SZi Xuan Wu #include "llvm/IR/Constant.h"
178ddc8169SZi Xuan Wu #include "llvm/IR/Constants.h"
188ddc8169SZi Xuan Wu #include "llvm/IR/GlobalValue.h"
198ddc8169SZi Xuan Wu #include "llvm/IR/Type.h"
208ddc8169SZi Xuan Wu #include "llvm/Support/raw_ostream.h"
218ddc8169SZi Xuan Wu using namespace llvm;
228ddc8169SZi Xuan Wu 
238ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
248ddc8169SZi Xuan Wu // CSKYConstantPoolValue
258ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
268ddc8169SZi Xuan Wu 
CSKYConstantPoolValue(Type * Ty,CSKYCP::CSKYCPKind Kind,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress,unsigned ID)278ddc8169SZi Xuan Wu CSKYConstantPoolValue::CSKYConstantPoolValue(Type *Ty, CSKYCP::CSKYCPKind Kind,
288ddc8169SZi Xuan Wu                                              unsigned PCAdjust,
298ddc8169SZi Xuan Wu                                              CSKYCP::CSKYCPModifier Modifier,
308ddc8169SZi Xuan Wu                                              bool AddCurrentAddress,
318ddc8169SZi Xuan Wu                                              unsigned ID)
328ddc8169SZi Xuan Wu     : MachineConstantPoolValue(Ty), Kind(Kind), PCAdjust(PCAdjust),
338ddc8169SZi Xuan Wu       Modifier(Modifier), AddCurrentAddress(AddCurrentAddress), LabelId(ID) {}
348ddc8169SZi Xuan Wu 
getModifierText() const358ddc8169SZi Xuan Wu const char *CSKYConstantPoolValue::getModifierText() const {
368ddc8169SZi Xuan Wu   switch (Modifier) {
378ddc8169SZi Xuan Wu   case CSKYCP::ADDR:
388ddc8169SZi Xuan Wu     return "ADDR";
398ddc8169SZi Xuan Wu   case CSKYCP::GOT:
408ddc8169SZi Xuan Wu     return "GOT";
418ddc8169SZi Xuan Wu   case CSKYCP::GOTOFF:
428ddc8169SZi Xuan Wu     return "GOTOFF";
438ddc8169SZi Xuan Wu   case CSKYCP::PLT:
448ddc8169SZi Xuan Wu     return "PLT";
458ddc8169SZi Xuan Wu   case CSKYCP::TLSIE:
468ddc8169SZi Xuan Wu     return "TLSIE";
478ddc8169SZi Xuan Wu   case CSKYCP::TLSLE:
488ddc8169SZi Xuan Wu     return "TLSLE";
498ddc8169SZi Xuan Wu   case CSKYCP::TLSGD:
508ddc8169SZi Xuan Wu     return "TLSGD";
518ddc8169SZi Xuan Wu   case CSKYCP::NO_MOD:
528ddc8169SZi Xuan Wu     return "";
538ddc8169SZi Xuan Wu   }
548ddc8169SZi Xuan Wu   llvm_unreachable("Unknown modifier!");
558ddc8169SZi Xuan Wu }
568ddc8169SZi Xuan Wu 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)578ddc8169SZi Xuan Wu int CSKYConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP,
588ddc8169SZi Xuan Wu                                                      Align Alignment) {
598ddc8169SZi Xuan Wu   llvm_unreachable("Shouldn't be calling this directly!");
608ddc8169SZi Xuan Wu }
618ddc8169SZi Xuan Wu 
addSelectionDAGCSEId(FoldingSetNodeID & ID)628ddc8169SZi Xuan Wu void CSKYConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
638ddc8169SZi Xuan Wu   ID.AddInteger(LabelId);
648ddc8169SZi Xuan Wu   ID.AddInteger(PCAdjust);
658ddc8169SZi Xuan Wu   ID.AddInteger(Modifier);
668ddc8169SZi Xuan Wu }
678ddc8169SZi Xuan Wu 
print(raw_ostream & O) const688ddc8169SZi Xuan Wu void CSKYConstantPoolValue::print(raw_ostream &O) const {
698ddc8169SZi Xuan Wu   if (Modifier)
708ddc8169SZi Xuan Wu     O << "(" << getModifierText() << ")";
718ddc8169SZi Xuan Wu   if (PCAdjust)
728ddc8169SZi Xuan Wu     O << " + " << PCAdjust;
738ddc8169SZi Xuan Wu }
748ddc8169SZi Xuan Wu 
758ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
768ddc8169SZi Xuan Wu // CSKYConstantPoolConstant
778ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
788ddc8169SZi Xuan Wu 
CSKYConstantPoolConstant(const Constant * C,Type * Ty,CSKYCP::CSKYCPKind Kind,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress,unsigned ID)798ddc8169SZi Xuan Wu CSKYConstantPoolConstant::CSKYConstantPoolConstant(
80*f4d61cdfSZi Xuan Wu (Zeson)     const Constant *C, Type *Ty, CSKYCP::CSKYCPKind Kind, unsigned PCAdjust,
818ddc8169SZi Xuan Wu     CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress, unsigned ID)
82*f4d61cdfSZi Xuan Wu (Zeson)     : CSKYConstantPoolValue(Ty, Kind, PCAdjust, Modifier, AddCurrentAddress,
83*f4d61cdfSZi Xuan Wu (Zeson)                             ID),
848ddc8169SZi Xuan Wu       CVal(C) {}
858ddc8169SZi Xuan Wu 
Create(const Constant * C,CSKYCP::CSKYCPKind Kind,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress,unsigned ID)868ddc8169SZi Xuan Wu CSKYConstantPoolConstant *CSKYConstantPoolConstant::Create(
878ddc8169SZi Xuan Wu     const Constant *C, CSKYCP::CSKYCPKind Kind, unsigned PCAdjust,
888ddc8169SZi Xuan Wu     CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress, unsigned ID) {
89*f4d61cdfSZi Xuan Wu (Zeson)   return new CSKYConstantPoolConstant(C, C->getType(), Kind, PCAdjust, Modifier,
90*f4d61cdfSZi Xuan Wu (Zeson)                                       AddCurrentAddress, ID);
91*f4d61cdfSZi Xuan Wu (Zeson) }
92*f4d61cdfSZi Xuan Wu (Zeson) 
Create(const Constant * C,Type * Ty,CSKYCP::CSKYCPKind Kind,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress,unsigned ID)93*f4d61cdfSZi Xuan Wu (Zeson) CSKYConstantPoolConstant *CSKYConstantPoolConstant::Create(
94*f4d61cdfSZi Xuan Wu (Zeson)     const Constant *C, Type *Ty, CSKYCP::CSKYCPKind Kind, unsigned PCAdjust,
95*f4d61cdfSZi Xuan Wu (Zeson)     CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress, unsigned ID) {
96*f4d61cdfSZi Xuan Wu (Zeson)   return new CSKYConstantPoolConstant(C, Ty, Kind, PCAdjust, Modifier,
978ddc8169SZi Xuan Wu                                       AddCurrentAddress, ID);
988ddc8169SZi Xuan Wu }
998ddc8169SZi Xuan Wu 
getGV() const1008ddc8169SZi Xuan Wu const GlobalValue *CSKYConstantPoolConstant::getGV() const {
1018ddc8169SZi Xuan Wu   assert(isa<GlobalValue>(CVal) && "CVal should be GlobalValue");
1028ddc8169SZi Xuan Wu   return cast<GlobalValue>(CVal);
1038ddc8169SZi Xuan Wu }
1048ddc8169SZi Xuan Wu 
getBlockAddress() const1058ddc8169SZi Xuan Wu const BlockAddress *CSKYConstantPoolConstant::getBlockAddress() const {
1068ddc8169SZi Xuan Wu   assert(isa<BlockAddress>(CVal) && "CVal should be BlockAddress");
1078ddc8169SZi Xuan Wu   return cast<BlockAddress>(CVal);
1088ddc8169SZi Xuan Wu }
1098ddc8169SZi Xuan Wu 
getConstantPool() const110*f4d61cdfSZi Xuan Wu (Zeson) const Constant *CSKYConstantPoolConstant::getConstantPool() const {
111*f4d61cdfSZi Xuan Wu (Zeson)   return CVal;
112*f4d61cdfSZi Xuan Wu (Zeson) }
113*f4d61cdfSZi Xuan Wu (Zeson) 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)1148ddc8169SZi Xuan Wu int CSKYConstantPoolConstant::getExistingMachineCPValue(MachineConstantPool *CP,
1158ddc8169SZi Xuan Wu                                                         Align Alignment) {
1168ddc8169SZi Xuan Wu   return getExistingMachineCPValueImpl<CSKYConstantPoolConstant>(CP, Alignment);
1178ddc8169SZi Xuan Wu }
1188ddc8169SZi Xuan Wu 
addSelectionDAGCSEId(FoldingSetNodeID & ID)1198ddc8169SZi Xuan Wu void CSKYConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
1208ddc8169SZi Xuan Wu   ID.AddPointer(CVal);
1218ddc8169SZi Xuan Wu 
1228ddc8169SZi Xuan Wu   CSKYConstantPoolValue::addSelectionDAGCSEId(ID);
1238ddc8169SZi Xuan Wu }
1248ddc8169SZi Xuan Wu 
print(raw_ostream & O) const1258ddc8169SZi Xuan Wu void CSKYConstantPoolConstant::print(raw_ostream &O) const {
1268ddc8169SZi Xuan Wu   O << CVal->getName();
1278ddc8169SZi Xuan Wu   CSKYConstantPoolValue::print(O);
1288ddc8169SZi Xuan Wu }
1298ddc8169SZi Xuan Wu 
1308ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
1318ddc8169SZi Xuan Wu // CSKYConstantPoolSymbol
1328ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
1338ddc8169SZi Xuan Wu 
CSKYConstantPoolSymbol(Type * Ty,const char * S,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress)1348ddc8169SZi Xuan Wu CSKYConstantPoolSymbol::CSKYConstantPoolSymbol(Type *Ty, const char *S,
1358ddc8169SZi Xuan Wu                                                unsigned PCAdjust,
1368ddc8169SZi Xuan Wu                                                CSKYCP::CSKYCPModifier Modifier,
1378ddc8169SZi Xuan Wu                                                bool AddCurrentAddress)
1388ddc8169SZi Xuan Wu     : CSKYConstantPoolValue(Ty, CSKYCP::CPExtSymbol, PCAdjust, Modifier,
1398ddc8169SZi Xuan Wu                             AddCurrentAddress),
1408ddc8169SZi Xuan Wu       S(strdup(S)) {}
1418ddc8169SZi Xuan Wu 
1428ddc8169SZi Xuan Wu CSKYConstantPoolSymbol *
Create(Type * Ty,const char * S,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier)1438ddc8169SZi Xuan Wu CSKYConstantPoolSymbol::Create(Type *Ty, const char *S, unsigned PCAdjust,
1448ddc8169SZi Xuan Wu                                CSKYCP::CSKYCPModifier Modifier) {
1458ddc8169SZi Xuan Wu   return new CSKYConstantPoolSymbol(Ty, S, PCAdjust, Modifier, false);
1468ddc8169SZi Xuan Wu }
1478ddc8169SZi Xuan Wu 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)1488ddc8169SZi Xuan Wu int CSKYConstantPoolSymbol::getExistingMachineCPValue(MachineConstantPool *CP,
1498ddc8169SZi Xuan Wu                                                       Align Alignment) {
1508ddc8169SZi Xuan Wu 
1518ddc8169SZi Xuan Wu   return getExistingMachineCPValueImpl<CSKYConstantPoolSymbol>(CP, Alignment);
1528ddc8169SZi Xuan Wu }
1538ddc8169SZi Xuan Wu 
addSelectionDAGCSEId(FoldingSetNodeID & ID)1548ddc8169SZi Xuan Wu void CSKYConstantPoolSymbol::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
1558ddc8169SZi Xuan Wu   ID.AddString(S);
1568ddc8169SZi Xuan Wu   CSKYConstantPoolValue::addSelectionDAGCSEId(ID);
1578ddc8169SZi Xuan Wu }
1588ddc8169SZi Xuan Wu 
print(raw_ostream & O) const1598ddc8169SZi Xuan Wu void CSKYConstantPoolSymbol::print(raw_ostream &O) const {
1608ddc8169SZi Xuan Wu   O << S;
1618ddc8169SZi Xuan Wu   CSKYConstantPoolValue::print(O);
1628ddc8169SZi Xuan Wu }
1638ddc8169SZi Xuan Wu 
1648ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
1658ddc8169SZi Xuan Wu // CSKYConstantPoolMBB
1668ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
1678ddc8169SZi Xuan Wu 
CSKYConstantPoolMBB(Type * Ty,const MachineBasicBlock * Mbb,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress)1688ddc8169SZi Xuan Wu CSKYConstantPoolMBB::CSKYConstantPoolMBB(Type *Ty, const MachineBasicBlock *Mbb,
1698ddc8169SZi Xuan Wu                                          unsigned PCAdjust,
1708ddc8169SZi Xuan Wu                                          CSKYCP::CSKYCPModifier Modifier,
1718ddc8169SZi Xuan Wu                                          bool AddCurrentAddress)
1728ddc8169SZi Xuan Wu     : CSKYConstantPoolValue(Ty, CSKYCP::CPMachineBasicBlock, PCAdjust, Modifier,
1738ddc8169SZi Xuan Wu                             AddCurrentAddress),
1748ddc8169SZi Xuan Wu       MBB(Mbb) {}
1758ddc8169SZi Xuan Wu 
Create(Type * Ty,const MachineBasicBlock * Mbb,unsigned PCAdjust)1768ddc8169SZi Xuan Wu CSKYConstantPoolMBB *CSKYConstantPoolMBB::Create(Type *Ty,
1778ddc8169SZi Xuan Wu                                                  const MachineBasicBlock *Mbb,
1788ddc8169SZi Xuan Wu                                                  unsigned PCAdjust) {
1798ddc8169SZi Xuan Wu   return new CSKYConstantPoolMBB(Ty, Mbb, PCAdjust, CSKYCP::ADDR, false);
1808ddc8169SZi Xuan Wu }
1818ddc8169SZi Xuan Wu 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)1828ddc8169SZi Xuan Wu int CSKYConstantPoolMBB::getExistingMachineCPValue(MachineConstantPool *CP,
1838ddc8169SZi Xuan Wu                                                    Align Alignment) {
1848ddc8169SZi Xuan Wu   return getExistingMachineCPValueImpl<CSKYConstantPoolMBB>(CP, Alignment);
1858ddc8169SZi Xuan Wu }
1868ddc8169SZi Xuan Wu 
addSelectionDAGCSEId(FoldingSetNodeID & ID)1878ddc8169SZi Xuan Wu void CSKYConstantPoolMBB::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
1888ddc8169SZi Xuan Wu   ID.AddPointer(MBB);
1898ddc8169SZi Xuan Wu   CSKYConstantPoolValue::addSelectionDAGCSEId(ID);
1908ddc8169SZi Xuan Wu }
1918ddc8169SZi Xuan Wu 
print(raw_ostream & O) const1928ddc8169SZi Xuan Wu void CSKYConstantPoolMBB::print(raw_ostream &O) const {
1938ddc8169SZi Xuan Wu   O << "BB#" << MBB->getNumber();
1948ddc8169SZi Xuan Wu   CSKYConstantPoolValue::print(O);
1958ddc8169SZi Xuan Wu }
1968ddc8169SZi Xuan Wu 
1978ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
1988ddc8169SZi Xuan Wu // CSKYConstantPoolJT
1998ddc8169SZi Xuan Wu //===----------------------------------------------------------------------===//
2008ddc8169SZi Xuan Wu 
CSKYConstantPoolJT(Type * Ty,int JTIndex,unsigned PCAdj,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress)2018ddc8169SZi Xuan Wu CSKYConstantPoolJT::CSKYConstantPoolJT(Type *Ty, int JTIndex, unsigned PCAdj,
2028ddc8169SZi Xuan Wu                                        CSKYCP::CSKYCPModifier Modifier,
2038ddc8169SZi Xuan Wu                                        bool AddCurrentAddress)
2048ddc8169SZi Xuan Wu     : CSKYConstantPoolValue(Ty, CSKYCP::CPJT, PCAdj, Modifier,
2058ddc8169SZi Xuan Wu                             AddCurrentAddress),
2068ddc8169SZi Xuan Wu       JTI(JTIndex) {}
2078ddc8169SZi Xuan Wu 
2088ddc8169SZi Xuan Wu CSKYConstantPoolJT *
Create(Type * Ty,int JTI,unsigned PCAdj,CSKYCP::CSKYCPModifier Modifier)2098ddc8169SZi Xuan Wu CSKYConstantPoolJT::Create(Type *Ty, int JTI, unsigned PCAdj,
2108ddc8169SZi Xuan Wu                            CSKYCP::CSKYCPModifier Modifier) {
2118ddc8169SZi Xuan Wu   return new CSKYConstantPoolJT(Ty, JTI, PCAdj, Modifier, false);
2128ddc8169SZi Xuan Wu }
2138ddc8169SZi Xuan Wu 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)2148ddc8169SZi Xuan Wu int CSKYConstantPoolJT::getExistingMachineCPValue(MachineConstantPool *CP,
2158ddc8169SZi Xuan Wu                                                   Align Alignment) {
2168ddc8169SZi Xuan Wu   return getExistingMachineCPValueImpl<CSKYConstantPoolJT>(CP, Alignment);
2178ddc8169SZi Xuan Wu }
2188ddc8169SZi Xuan Wu 
addSelectionDAGCSEId(FoldingSetNodeID & ID)2198ddc8169SZi Xuan Wu void CSKYConstantPoolJT::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
2208ddc8169SZi Xuan Wu   ID.AddInteger(JTI);
2218ddc8169SZi Xuan Wu   CSKYConstantPoolValue::addSelectionDAGCSEId(ID);
2228ddc8169SZi Xuan Wu }
2238ddc8169SZi Xuan Wu 
print(raw_ostream & O) const2248ddc8169SZi Xuan Wu void CSKYConstantPoolJT::print(raw_ostream &O) const {
2258ddc8169SZi Xuan Wu   O << "JTI#" << JTI;
2268ddc8169SZi Xuan Wu   CSKYConstantPoolValue::print(O);
2278ddc8169SZi Xuan Wu }
228