xref: /src/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYConstantPoolValue.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
16f8fc217SDimitry Andric //===-- CSKYConstantPoolValue.cpp - CSKY constantpool value ---------------===//
26f8fc217SDimitry Andric //
36f8fc217SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
46f8fc217SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
56f8fc217SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66f8fc217SDimitry Andric //
76f8fc217SDimitry Andric //===----------------------------------------------------------------------===//
86f8fc217SDimitry Andric //
96f8fc217SDimitry Andric // This file implements the CSKY specific constantpool value class.
106f8fc217SDimitry Andric //
116f8fc217SDimitry Andric //===----------------------------------------------------------------------===//
126f8fc217SDimitry Andric 
136f8fc217SDimitry Andric #include "CSKYConstantPoolValue.h"
146f8fc217SDimitry Andric #include "llvm/ADT/FoldingSet.h"
156f8fc217SDimitry Andric #include "llvm/CodeGen/MachineBasicBlock.h"
166f8fc217SDimitry Andric #include "llvm/IR/Constant.h"
176f8fc217SDimitry Andric #include "llvm/IR/Constants.h"
186f8fc217SDimitry Andric #include "llvm/IR/GlobalValue.h"
196f8fc217SDimitry Andric #include "llvm/IR/Type.h"
206f8fc217SDimitry Andric #include "llvm/Support/raw_ostream.h"
216f8fc217SDimitry Andric using namespace llvm;
226f8fc217SDimitry Andric 
236f8fc217SDimitry Andric //===----------------------------------------------------------------------===//
246f8fc217SDimitry Andric // CSKYConstantPoolValue
256f8fc217SDimitry Andric //===----------------------------------------------------------------------===//
266f8fc217SDimitry Andric 
CSKYConstantPoolValue(Type * Ty,CSKYCP::CSKYCPKind Kind,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress,unsigned ID)276f8fc217SDimitry Andric CSKYConstantPoolValue::CSKYConstantPoolValue(Type *Ty, CSKYCP::CSKYCPKind Kind,
286f8fc217SDimitry Andric                                              unsigned PCAdjust,
296f8fc217SDimitry Andric                                              CSKYCP::CSKYCPModifier Modifier,
306f8fc217SDimitry Andric                                              bool AddCurrentAddress,
316f8fc217SDimitry Andric                                              unsigned ID)
326f8fc217SDimitry Andric     : MachineConstantPoolValue(Ty), Kind(Kind), PCAdjust(PCAdjust),
336f8fc217SDimitry Andric       Modifier(Modifier), AddCurrentAddress(AddCurrentAddress), LabelId(ID) {}
346f8fc217SDimitry Andric 
getModifierText() const356f8fc217SDimitry Andric const char *CSKYConstantPoolValue::getModifierText() const {
366f8fc217SDimitry Andric   switch (Modifier) {
376f8fc217SDimitry Andric   case CSKYCP::ADDR:
386f8fc217SDimitry Andric     return "ADDR";
396f8fc217SDimitry Andric   case CSKYCP::GOT:
406f8fc217SDimitry Andric     return "GOT";
416f8fc217SDimitry Andric   case CSKYCP::GOTOFF:
426f8fc217SDimitry Andric     return "GOTOFF";
436f8fc217SDimitry Andric   case CSKYCP::PLT:
446f8fc217SDimitry Andric     return "PLT";
456f8fc217SDimitry Andric   case CSKYCP::TLSIE:
466f8fc217SDimitry Andric     return "TLSIE";
476f8fc217SDimitry Andric   case CSKYCP::TLSLE:
486f8fc217SDimitry Andric     return "TLSLE";
496f8fc217SDimitry Andric   case CSKYCP::TLSGD:
506f8fc217SDimitry Andric     return "TLSGD";
516f8fc217SDimitry Andric   case CSKYCP::NO_MOD:
526f8fc217SDimitry Andric     return "";
536f8fc217SDimitry Andric   }
546f8fc217SDimitry Andric   llvm_unreachable("Unknown modifier!");
556f8fc217SDimitry Andric }
566f8fc217SDimitry Andric 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)576f8fc217SDimitry Andric int CSKYConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP,
586f8fc217SDimitry Andric                                                      Align Alignment) {
596f8fc217SDimitry Andric   llvm_unreachable("Shouldn't be calling this directly!");
606f8fc217SDimitry Andric }
616f8fc217SDimitry Andric 
addSelectionDAGCSEId(FoldingSetNodeID & ID)626f8fc217SDimitry Andric void CSKYConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
636f8fc217SDimitry Andric   ID.AddInteger(LabelId);
646f8fc217SDimitry Andric   ID.AddInteger(PCAdjust);
656f8fc217SDimitry Andric   ID.AddInteger(Modifier);
666f8fc217SDimitry Andric }
676f8fc217SDimitry Andric 
print(raw_ostream & O) const686f8fc217SDimitry Andric void CSKYConstantPoolValue::print(raw_ostream &O) const {
696f8fc217SDimitry Andric   if (Modifier)
706f8fc217SDimitry Andric     O << "(" << getModifierText() << ")";
716f8fc217SDimitry Andric   if (PCAdjust)
726f8fc217SDimitry Andric     O << " + " << PCAdjust;
736f8fc217SDimitry Andric }
746f8fc217SDimitry Andric 
756f8fc217SDimitry Andric //===----------------------------------------------------------------------===//
766f8fc217SDimitry Andric // CSKYConstantPoolConstant
776f8fc217SDimitry Andric //===----------------------------------------------------------------------===//
786f8fc217SDimitry Andric 
CSKYConstantPoolConstant(const Constant * C,Type * Ty,CSKYCP::CSKYCPKind Kind,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress,unsigned ID)796f8fc217SDimitry Andric CSKYConstantPoolConstant::CSKYConstantPoolConstant(
80e3b55780SDimitry Andric     const Constant *C, Type *Ty, CSKYCP::CSKYCPKind Kind, unsigned PCAdjust,
816f8fc217SDimitry Andric     CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress, unsigned ID)
82e3b55780SDimitry Andric     : CSKYConstantPoolValue(Ty, Kind, PCAdjust, Modifier, AddCurrentAddress,
83e3b55780SDimitry Andric                             ID),
846f8fc217SDimitry Andric       CVal(C) {}
856f8fc217SDimitry Andric 
Create(const Constant * C,CSKYCP::CSKYCPKind Kind,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress,unsigned ID)866f8fc217SDimitry Andric CSKYConstantPoolConstant *CSKYConstantPoolConstant::Create(
876f8fc217SDimitry Andric     const Constant *C, CSKYCP::CSKYCPKind Kind, unsigned PCAdjust,
886f8fc217SDimitry Andric     CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress, unsigned ID) {
89e3b55780SDimitry Andric   return new CSKYConstantPoolConstant(C, C->getType(), Kind, PCAdjust, Modifier,
90e3b55780SDimitry Andric                                       AddCurrentAddress, ID);
91e3b55780SDimitry Andric }
92e3b55780SDimitry Andric 
Create(const Constant * C,Type * Ty,CSKYCP::CSKYCPKind Kind,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress,unsigned ID)93e3b55780SDimitry Andric CSKYConstantPoolConstant *CSKYConstantPoolConstant::Create(
94e3b55780SDimitry Andric     const Constant *C, Type *Ty, CSKYCP::CSKYCPKind Kind, unsigned PCAdjust,
95e3b55780SDimitry Andric     CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress, unsigned ID) {
96e3b55780SDimitry Andric   return new CSKYConstantPoolConstant(C, Ty, Kind, PCAdjust, Modifier,
976f8fc217SDimitry Andric                                       AddCurrentAddress, ID);
986f8fc217SDimitry Andric }
996f8fc217SDimitry Andric 
getGV() const1006f8fc217SDimitry Andric const GlobalValue *CSKYConstantPoolConstant::getGV() const {
1016f8fc217SDimitry Andric   assert(isa<GlobalValue>(CVal) && "CVal should be GlobalValue");
1026f8fc217SDimitry Andric   return cast<GlobalValue>(CVal);
1036f8fc217SDimitry Andric }
1046f8fc217SDimitry Andric 
getBlockAddress() const1056f8fc217SDimitry Andric const BlockAddress *CSKYConstantPoolConstant::getBlockAddress() const {
1066f8fc217SDimitry Andric   assert(isa<BlockAddress>(CVal) && "CVal should be BlockAddress");
1076f8fc217SDimitry Andric   return cast<BlockAddress>(CVal);
1086f8fc217SDimitry Andric }
1096f8fc217SDimitry Andric 
getConstantPool() const110e3b55780SDimitry Andric const Constant *CSKYConstantPoolConstant::getConstantPool() const {
111e3b55780SDimitry Andric   return CVal;
112e3b55780SDimitry Andric }
113e3b55780SDimitry Andric 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)1146f8fc217SDimitry Andric int CSKYConstantPoolConstant::getExistingMachineCPValue(MachineConstantPool *CP,
1156f8fc217SDimitry Andric                                                         Align Alignment) {
1166f8fc217SDimitry Andric   return getExistingMachineCPValueImpl<CSKYConstantPoolConstant>(CP, Alignment);
1176f8fc217SDimitry Andric }
1186f8fc217SDimitry Andric 
addSelectionDAGCSEId(FoldingSetNodeID & ID)1196f8fc217SDimitry Andric void CSKYConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
1206f8fc217SDimitry Andric   ID.AddPointer(CVal);
1216f8fc217SDimitry Andric 
1226f8fc217SDimitry Andric   CSKYConstantPoolValue::addSelectionDAGCSEId(ID);
1236f8fc217SDimitry Andric }
1246f8fc217SDimitry Andric 
print(raw_ostream & O) const1256f8fc217SDimitry Andric void CSKYConstantPoolConstant::print(raw_ostream &O) const {
1266f8fc217SDimitry Andric   O << CVal->getName();
1276f8fc217SDimitry Andric   CSKYConstantPoolValue::print(O);
1286f8fc217SDimitry Andric }
1296f8fc217SDimitry Andric 
1306f8fc217SDimitry Andric //===----------------------------------------------------------------------===//
1316f8fc217SDimitry Andric // CSKYConstantPoolSymbol
1326f8fc217SDimitry Andric //===----------------------------------------------------------------------===//
1336f8fc217SDimitry Andric 
CSKYConstantPoolSymbol(Type * Ty,const char * S,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress)1346f8fc217SDimitry Andric CSKYConstantPoolSymbol::CSKYConstantPoolSymbol(Type *Ty, const char *S,
1356f8fc217SDimitry Andric                                                unsigned PCAdjust,
1366f8fc217SDimitry Andric                                                CSKYCP::CSKYCPModifier Modifier,
1376f8fc217SDimitry Andric                                                bool AddCurrentAddress)
1386f8fc217SDimitry Andric     : CSKYConstantPoolValue(Ty, CSKYCP::CPExtSymbol, PCAdjust, Modifier,
1396f8fc217SDimitry Andric                             AddCurrentAddress),
1406f8fc217SDimitry Andric       S(strdup(S)) {}
1416f8fc217SDimitry Andric 
1426f8fc217SDimitry Andric CSKYConstantPoolSymbol *
Create(Type * Ty,const char * S,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier)1436f8fc217SDimitry Andric CSKYConstantPoolSymbol::Create(Type *Ty, const char *S, unsigned PCAdjust,
1446f8fc217SDimitry Andric                                CSKYCP::CSKYCPModifier Modifier) {
1456f8fc217SDimitry Andric   return new CSKYConstantPoolSymbol(Ty, S, PCAdjust, Modifier, false);
1466f8fc217SDimitry Andric }
1476f8fc217SDimitry Andric 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)1486f8fc217SDimitry Andric int CSKYConstantPoolSymbol::getExistingMachineCPValue(MachineConstantPool *CP,
1496f8fc217SDimitry Andric                                                       Align Alignment) {
1506f8fc217SDimitry Andric 
1516f8fc217SDimitry Andric   return getExistingMachineCPValueImpl<CSKYConstantPoolSymbol>(CP, Alignment);
1526f8fc217SDimitry Andric }
1536f8fc217SDimitry Andric 
addSelectionDAGCSEId(FoldingSetNodeID & ID)1546f8fc217SDimitry Andric void CSKYConstantPoolSymbol::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
1556f8fc217SDimitry Andric   ID.AddString(S);
1566f8fc217SDimitry Andric   CSKYConstantPoolValue::addSelectionDAGCSEId(ID);
1576f8fc217SDimitry Andric }
1586f8fc217SDimitry Andric 
print(raw_ostream & O) const1596f8fc217SDimitry Andric void CSKYConstantPoolSymbol::print(raw_ostream &O) const {
1606f8fc217SDimitry Andric   O << S;
1616f8fc217SDimitry Andric   CSKYConstantPoolValue::print(O);
1626f8fc217SDimitry Andric }
1636f8fc217SDimitry Andric 
1646f8fc217SDimitry Andric //===----------------------------------------------------------------------===//
1656f8fc217SDimitry Andric // CSKYConstantPoolMBB
1666f8fc217SDimitry Andric //===----------------------------------------------------------------------===//
1676f8fc217SDimitry Andric 
CSKYConstantPoolMBB(Type * Ty,const MachineBasicBlock * Mbb,unsigned PCAdjust,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress)1686f8fc217SDimitry Andric CSKYConstantPoolMBB::CSKYConstantPoolMBB(Type *Ty, const MachineBasicBlock *Mbb,
1696f8fc217SDimitry Andric                                          unsigned PCAdjust,
1706f8fc217SDimitry Andric                                          CSKYCP::CSKYCPModifier Modifier,
1716f8fc217SDimitry Andric                                          bool AddCurrentAddress)
1726f8fc217SDimitry Andric     : CSKYConstantPoolValue(Ty, CSKYCP::CPMachineBasicBlock, PCAdjust, Modifier,
1736f8fc217SDimitry Andric                             AddCurrentAddress),
1746f8fc217SDimitry Andric       MBB(Mbb) {}
1756f8fc217SDimitry Andric 
Create(Type * Ty,const MachineBasicBlock * Mbb,unsigned PCAdjust)1766f8fc217SDimitry Andric CSKYConstantPoolMBB *CSKYConstantPoolMBB::Create(Type *Ty,
1776f8fc217SDimitry Andric                                                  const MachineBasicBlock *Mbb,
1786f8fc217SDimitry Andric                                                  unsigned PCAdjust) {
1796f8fc217SDimitry Andric   return new CSKYConstantPoolMBB(Ty, Mbb, PCAdjust, CSKYCP::ADDR, false);
1806f8fc217SDimitry Andric }
1816f8fc217SDimitry Andric 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)1826f8fc217SDimitry Andric int CSKYConstantPoolMBB::getExistingMachineCPValue(MachineConstantPool *CP,
1836f8fc217SDimitry Andric                                                    Align Alignment) {
1846f8fc217SDimitry Andric   return getExistingMachineCPValueImpl<CSKYConstantPoolMBB>(CP, Alignment);
1856f8fc217SDimitry Andric }
1866f8fc217SDimitry Andric 
addSelectionDAGCSEId(FoldingSetNodeID & ID)1876f8fc217SDimitry Andric void CSKYConstantPoolMBB::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
1886f8fc217SDimitry Andric   ID.AddPointer(MBB);
1896f8fc217SDimitry Andric   CSKYConstantPoolValue::addSelectionDAGCSEId(ID);
1906f8fc217SDimitry Andric }
1916f8fc217SDimitry Andric 
print(raw_ostream & O) const1926f8fc217SDimitry Andric void CSKYConstantPoolMBB::print(raw_ostream &O) const {
1936f8fc217SDimitry Andric   O << "BB#" << MBB->getNumber();
1946f8fc217SDimitry Andric   CSKYConstantPoolValue::print(O);
1956f8fc217SDimitry Andric }
1966f8fc217SDimitry Andric 
1976f8fc217SDimitry Andric //===----------------------------------------------------------------------===//
1986f8fc217SDimitry Andric // CSKYConstantPoolJT
1996f8fc217SDimitry Andric //===----------------------------------------------------------------------===//
2006f8fc217SDimitry Andric 
CSKYConstantPoolJT(Type * Ty,int JTIndex,unsigned PCAdj,CSKYCP::CSKYCPModifier Modifier,bool AddCurrentAddress)2016f8fc217SDimitry Andric CSKYConstantPoolJT::CSKYConstantPoolJT(Type *Ty, int JTIndex, unsigned PCAdj,
2026f8fc217SDimitry Andric                                        CSKYCP::CSKYCPModifier Modifier,
2036f8fc217SDimitry Andric                                        bool AddCurrentAddress)
2046f8fc217SDimitry Andric     : CSKYConstantPoolValue(Ty, CSKYCP::CPJT, PCAdj, Modifier,
2056f8fc217SDimitry Andric                             AddCurrentAddress),
2066f8fc217SDimitry Andric       JTI(JTIndex) {}
2076f8fc217SDimitry Andric 
2086f8fc217SDimitry Andric CSKYConstantPoolJT *
Create(Type * Ty,int JTI,unsigned PCAdj,CSKYCP::CSKYCPModifier Modifier)2096f8fc217SDimitry Andric CSKYConstantPoolJT::Create(Type *Ty, int JTI, unsigned PCAdj,
2106f8fc217SDimitry Andric                            CSKYCP::CSKYCPModifier Modifier) {
2116f8fc217SDimitry Andric   return new CSKYConstantPoolJT(Ty, JTI, PCAdj, Modifier, false);
2126f8fc217SDimitry Andric }
2136f8fc217SDimitry Andric 
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)2146f8fc217SDimitry Andric int CSKYConstantPoolJT::getExistingMachineCPValue(MachineConstantPool *CP,
2156f8fc217SDimitry Andric                                                   Align Alignment) {
2166f8fc217SDimitry Andric   return getExistingMachineCPValueImpl<CSKYConstantPoolJT>(CP, Alignment);
2176f8fc217SDimitry Andric }
2186f8fc217SDimitry Andric 
addSelectionDAGCSEId(FoldingSetNodeID & ID)2196f8fc217SDimitry Andric void CSKYConstantPoolJT::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
2206f8fc217SDimitry Andric   ID.AddInteger(JTI);
2216f8fc217SDimitry Andric   CSKYConstantPoolValue::addSelectionDAGCSEId(ID);
2226f8fc217SDimitry Andric }
2236f8fc217SDimitry Andric 
print(raw_ostream & O) const2246f8fc217SDimitry Andric void CSKYConstantPoolJT::print(raw_ostream &O) const {
2256f8fc217SDimitry Andric   O << "JTI#" << JTI;
2266f8fc217SDimitry Andric   CSKYConstantPoolValue::print(O);
2276f8fc217SDimitry Andric }
228