//===-- CSKYConstantPoolValue.cpp - CSKY constantpool value ---------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements the CSKY specific constantpool value class. // //===----------------------------------------------------------------------===// #include "CSKYConstantPoolValue.h" #include "llvm/ADT/FoldingSet.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/IR/Constant.h" #include "llvm/IR/Constants.h" #include "llvm/IR/GlobalValue.h" #include "llvm/IR/Type.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; //===----------------------------------------------------------------------===// // CSKYConstantPoolValue //===----------------------------------------------------------------------===// CSKYConstantPoolValue::CSKYConstantPoolValue(Type *Ty, CSKYCP::CSKYCPKind Kind, unsigned PCAdjust, CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress, unsigned ID) : MachineConstantPoolValue(Ty), Kind(Kind), PCAdjust(PCAdjust), Modifier(Modifier), AddCurrentAddress(AddCurrentAddress), LabelId(ID) {} const char *CSKYConstantPoolValue::getModifierText() const { switch (Modifier) { case CSKYCP::ADDR: return "ADDR"; case CSKYCP::GOT: return "GOT"; case CSKYCP::GOTOFF: return "GOTOFF"; case CSKYCP::PLT: return "PLT"; case CSKYCP::TLSIE: return "TLSIE"; case CSKYCP::TLSLE: return "TLSLE"; case CSKYCP::TLSGD: return "TLSGD"; case CSKYCP::NO_MOD: return ""; } llvm_unreachable("Unknown modifier!"); } int CSKYConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP, Align Alignment) { llvm_unreachable("Shouldn't be calling this directly!"); } void CSKYConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) { ID.AddInteger(LabelId); ID.AddInteger(PCAdjust); ID.AddInteger(Modifier); } void CSKYConstantPoolValue::print(raw_ostream &O) const { if (Modifier) O << "(" << getModifierText() << ")"; if (PCAdjust) O << " + " << PCAdjust; } //===----------------------------------------------------------------------===// // CSKYConstantPoolConstant //===----------------------------------------------------------------------===// CSKYConstantPoolConstant::CSKYConstantPoolConstant( const Constant *C, Type *Ty, CSKYCP::CSKYCPKind Kind, unsigned PCAdjust, CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress, unsigned ID) : CSKYConstantPoolValue(Ty, Kind, PCAdjust, Modifier, AddCurrentAddress, ID), CVal(C) {} CSKYConstantPoolConstant *CSKYConstantPoolConstant::Create( const Constant *C, CSKYCP::CSKYCPKind Kind, unsigned PCAdjust, CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress, unsigned ID) { return new CSKYConstantPoolConstant(C, C->getType(), Kind, PCAdjust, Modifier, AddCurrentAddress, ID); } CSKYConstantPoolConstant *CSKYConstantPoolConstant::Create( const Constant *C, Type *Ty, CSKYCP::CSKYCPKind Kind, unsigned PCAdjust, CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress, unsigned ID) { return new CSKYConstantPoolConstant(C, Ty, Kind, PCAdjust, Modifier, AddCurrentAddress, ID); } const GlobalValue *CSKYConstantPoolConstant::getGV() const { assert(isa(CVal) && "CVal should be GlobalValue"); return cast(CVal); } const BlockAddress *CSKYConstantPoolConstant::getBlockAddress() const { assert(isa(CVal) && "CVal should be BlockAddress"); return cast(CVal); } const Constant *CSKYConstantPoolConstant::getConstantPool() const { return CVal; } int CSKYConstantPoolConstant::getExistingMachineCPValue(MachineConstantPool *CP, Align Alignment) { return getExistingMachineCPValueImpl(CP, Alignment); } void CSKYConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) { ID.AddPointer(CVal); CSKYConstantPoolValue::addSelectionDAGCSEId(ID); } void CSKYConstantPoolConstant::print(raw_ostream &O) const { O << CVal->getName(); CSKYConstantPoolValue::print(O); } //===----------------------------------------------------------------------===// // CSKYConstantPoolSymbol //===----------------------------------------------------------------------===// CSKYConstantPoolSymbol::CSKYConstantPoolSymbol(Type *Ty, const char *S, unsigned PCAdjust, CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress) : CSKYConstantPoolValue(Ty, CSKYCP::CPExtSymbol, PCAdjust, Modifier, AddCurrentAddress), S(strdup(S)) {} CSKYConstantPoolSymbol * CSKYConstantPoolSymbol::Create(Type *Ty, const char *S, unsigned PCAdjust, CSKYCP::CSKYCPModifier Modifier) { return new CSKYConstantPoolSymbol(Ty, S, PCAdjust, Modifier, false); } int CSKYConstantPoolSymbol::getExistingMachineCPValue(MachineConstantPool *CP, Align Alignment) { return getExistingMachineCPValueImpl(CP, Alignment); } void CSKYConstantPoolSymbol::addSelectionDAGCSEId(FoldingSetNodeID &ID) { ID.AddString(S); CSKYConstantPoolValue::addSelectionDAGCSEId(ID); } void CSKYConstantPoolSymbol::print(raw_ostream &O) const { O << S; CSKYConstantPoolValue::print(O); } //===----------------------------------------------------------------------===// // CSKYConstantPoolMBB //===----------------------------------------------------------------------===// CSKYConstantPoolMBB::CSKYConstantPoolMBB(Type *Ty, const MachineBasicBlock *Mbb, unsigned PCAdjust, CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress) : CSKYConstantPoolValue(Ty, CSKYCP::CPMachineBasicBlock, PCAdjust, Modifier, AddCurrentAddress), MBB(Mbb) {} CSKYConstantPoolMBB *CSKYConstantPoolMBB::Create(Type *Ty, const MachineBasicBlock *Mbb, unsigned PCAdjust) { return new CSKYConstantPoolMBB(Ty, Mbb, PCAdjust, CSKYCP::ADDR, false); } int CSKYConstantPoolMBB::getExistingMachineCPValue(MachineConstantPool *CP, Align Alignment) { return getExistingMachineCPValueImpl(CP, Alignment); } void CSKYConstantPoolMBB::addSelectionDAGCSEId(FoldingSetNodeID &ID) { ID.AddPointer(MBB); CSKYConstantPoolValue::addSelectionDAGCSEId(ID); } void CSKYConstantPoolMBB::print(raw_ostream &O) const { O << "BB#" << MBB->getNumber(); CSKYConstantPoolValue::print(O); } //===----------------------------------------------------------------------===// // CSKYConstantPoolJT //===----------------------------------------------------------------------===// CSKYConstantPoolJT::CSKYConstantPoolJT(Type *Ty, int JTIndex, unsigned PCAdj, CSKYCP::CSKYCPModifier Modifier, bool AddCurrentAddress) : CSKYConstantPoolValue(Ty, CSKYCP::CPJT, PCAdj, Modifier, AddCurrentAddress), JTI(JTIndex) {} CSKYConstantPoolJT * CSKYConstantPoolJT::Create(Type *Ty, int JTI, unsigned PCAdj, CSKYCP::CSKYCPModifier Modifier) { return new CSKYConstantPoolJT(Ty, JTI, PCAdj, Modifier, false); } int CSKYConstantPoolJT::getExistingMachineCPValue(MachineConstantPool *CP, Align Alignment) { return getExistingMachineCPValueImpl(CP, Alignment); } void CSKYConstantPoolJT::addSelectionDAGCSEId(FoldingSetNodeID &ID) { ID.AddInteger(JTI); CSKYConstantPoolValue::addSelectionDAGCSEId(ID); } void CSKYConstantPoolJT::print(raw_ostream &O) const { O << "JTI#" << JTI; CSKYConstantPoolValue::print(O); }