diff options
Diffstat (limited to 'llvm/lib/Target/RISCV/RISCVConstantPoolValue.cpp')
| -rw-r--r-- | llvm/lib/Target/RISCV/RISCVConstantPoolValue.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVConstantPoolValue.cpp b/llvm/lib/Target/RISCV/RISCVConstantPoolValue.cpp new file mode 100644 index 000000000000..3d6c6a6161dd --- /dev/null +++ b/llvm/lib/Target/RISCV/RISCVConstantPoolValue.cpp @@ -0,0 +1,79 @@ +//===------- RISCVConstantPoolValue.cpp - RISC-V 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 RISC-V specific constantpool value class. +// +//===----------------------------------------------------------------------===// + +#include "RISCVConstantPoolValue.h" +#include "llvm/ADT/FoldingSet.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/GlobalValue.h" +#include "llvm/IR/Type.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; + +RISCVConstantPoolValue::RISCVConstantPoolValue(Type *Ty, const GlobalValue *GV) + : MachineConstantPoolValue(Ty), GV(GV), Kind(RISCVCPKind::GlobalValue) {} + +RISCVConstantPoolValue::RISCVConstantPoolValue(LLVMContext &C, StringRef S) + : MachineConstantPoolValue(Type::getInt64Ty(C)), S(S), + Kind(RISCVCPKind::ExtSymbol) {} + +RISCVConstantPoolValue *RISCVConstantPoolValue::Create(const GlobalValue *GV) { + return new RISCVConstantPoolValue(GV->getType(), GV); +} + +RISCVConstantPoolValue *RISCVConstantPoolValue::Create(LLVMContext &C, + StringRef S) { + return new RISCVConstantPoolValue(C, S); +} + +int RISCVConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP, + Align Alignment) { + const std::vector<MachineConstantPoolEntry> &Constants = CP->getConstants(); + for (unsigned i = 0, e = Constants.size(); i != e; ++i) { + if (Constants[i].isMachineConstantPoolEntry() && + Constants[i].getAlign() >= Alignment) { + auto *CPV = + static_cast<RISCVConstantPoolValue *>(Constants[i].Val.MachineCPVal); + if (equals(CPV)) + return i; + } + } + + return -1; +} + +void RISCVConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) { + if (isGlobalValue()) + ID.AddPointer(GV); + else { + assert(isExtSymbol() && "unrecognized constant pool type"); + ID.AddString(S); + } +} + +void RISCVConstantPoolValue::print(raw_ostream &O) const { + if (isGlobalValue()) + O << GV->getName(); + else { + assert(isExtSymbol() && "unrecognized constant pool type"); + O << S; + } +} + +bool RISCVConstantPoolValue::equals(const RISCVConstantPoolValue *A) const { + if (isGlobalValue() && A->isGlobalValue()) + return GV == A->GV; + if (isExtSymbol() && A->isExtSymbol()) + return S == A->S; + + return false; +} |
