Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVConstantPoolValue.cpp
213799 views
1
//===------- RISCVConstantPoolValue.cpp - RISC-V constantpool value -------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file implements the RISC-V specific constantpool value class.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#include "RISCVConstantPoolValue.h"
14
#include "llvm/ADT/FoldingSet.h"
15
#include "llvm/IR/DerivedTypes.h"
16
#include "llvm/IR/GlobalValue.h"
17
#include "llvm/IR/Type.h"
18
#include "llvm/Support/raw_ostream.h"
19
20
using namespace llvm;
21
22
RISCVConstantPoolValue::RISCVConstantPoolValue(Type *Ty, const GlobalValue *GV)
23
: MachineConstantPoolValue(Ty), GV(GV), Kind(RISCVCPKind::GlobalValue) {}
24
25
RISCVConstantPoolValue::RISCVConstantPoolValue(LLVMContext &C, StringRef S)
26
: MachineConstantPoolValue(Type::getInt64Ty(C)), S(S),
27
Kind(RISCVCPKind::ExtSymbol) {}
28
29
RISCVConstantPoolValue *RISCVConstantPoolValue::Create(const GlobalValue *GV) {
30
return new RISCVConstantPoolValue(GV->getType(), GV);
31
}
32
33
RISCVConstantPoolValue *RISCVConstantPoolValue::Create(LLVMContext &C,
34
StringRef S) {
35
return new RISCVConstantPoolValue(C, S);
36
}
37
38
int RISCVConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP,
39
Align Alignment) {
40
const std::vector<MachineConstantPoolEntry> &Constants = CP->getConstants();
41
for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
42
if (Constants[i].isMachineConstantPoolEntry() &&
43
Constants[i].getAlign() >= Alignment) {
44
auto *CPV =
45
static_cast<RISCVConstantPoolValue *>(Constants[i].Val.MachineCPVal);
46
if (equals(CPV))
47
return i;
48
}
49
}
50
51
return -1;
52
}
53
54
void RISCVConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
55
if (isGlobalValue())
56
ID.AddPointer(GV);
57
else {
58
assert(isExtSymbol() && "unrecognized constant pool type");
59
ID.AddString(S);
60
}
61
}
62
63
void RISCVConstantPoolValue::print(raw_ostream &O) const {
64
if (isGlobalValue())
65
O << GV->getName();
66
else {
67
assert(isExtSymbol() && "unrecognized constant pool type");
68
O << S;
69
}
70
}
71
72
bool RISCVConstantPoolValue::equals(const RISCVConstantPoolValue *A) const {
73
if (isGlobalValue() && A->isGlobalValue())
74
return GV == A->GV;
75
if (isExtSymbol() && A->isExtSymbol())
76
return S == A->S;
77
78
return false;
79
}
80
81