diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/CSKY/CSKYConstantPoolValue.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Target/CSKY/CSKYConstantPoolValue.cpp | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYConstantPoolValue.cpp b/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYConstantPoolValue.cpp new file mode 100644 index 000000000000..7998f4c6de9c --- /dev/null +++ b/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYConstantPoolValue.cpp @@ -0,0 +1,227 @@ +//===-- 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); +} |
