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