| //===-- 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<GlobalValue>(CVal) && "CVal should be GlobalValue"); | |
| return cast<GlobalValue>(CVal); | |
| } | |
| const BlockAddress *CSKYConstantPoolConstant::getBlockAddress() const { | |
| assert(isa<BlockAddress>(CVal) && "CVal should be BlockAddress"); | |
| return cast<BlockAddress>(CVal); | |
| } | |
| const Constant *CSKYConstantPoolConstant::getConstantPool() const { | |
| return CVal; | |
| } | |
| int CSKYConstantPoolConstant::getExistingMachineCPValue(MachineConstantPool *CP, | |
| Align Alignment) { | |
| return getExistingMachineCPValueImpl<CSKYConstantPoolConstant>(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<CSKYConstantPoolSymbol>(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<CSKYConstantPoolMBB>(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<CSKYConstantPoolJT>(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); | |
| } |