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