| //===------- 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; |
| } |