1*36209d36SAndrei Safronov //===- XtensaConstantPoolValue.cpp - Xtensa constantpool value ------------===//
2*36209d36SAndrei Safronov //
3*36209d36SAndrei Safronov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*36209d36SAndrei Safronov // See https://llvm.org/LICENSE.txt for license information.
5*36209d36SAndrei Safronov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*36209d36SAndrei Safronov //
7*36209d36SAndrei Safronov //===----------------------------------------------------------------------===//
8*36209d36SAndrei Safronov //
9*36209d36SAndrei Safronov // This file implements the Xtensa specific constantpool value class.
10*36209d36SAndrei Safronov //
11*36209d36SAndrei Safronov //===----------------------------------------------------------------------===//
12*36209d36SAndrei Safronov
13*36209d36SAndrei Safronov #include "XtensaConstantPoolValue.h"
14*36209d36SAndrei Safronov #include "llvm/ADT/FoldingSet.h"
15*36209d36SAndrei Safronov #include "llvm/CodeGen/MachineBasicBlock.h"
16*36209d36SAndrei Safronov #include "llvm/IR/Constant.h"
17*36209d36SAndrei Safronov #include "llvm/IR/Constants.h"
18*36209d36SAndrei Safronov #include "llvm/IR/GlobalValue.h"
19*36209d36SAndrei Safronov #include "llvm/IR/Type.h"
20*36209d36SAndrei Safronov #include "llvm/Support/raw_ostream.h"
21*36209d36SAndrei Safronov #include <cstdlib>
22*36209d36SAndrei Safronov using namespace llvm;
23*36209d36SAndrei Safronov
XtensaConstantPoolValue(Type * Ty,unsigned ID,XtensaCP::XtensaCPKind Kind,XtensaCP::XtensaCPModifier modifier)24*36209d36SAndrei Safronov XtensaConstantPoolValue::XtensaConstantPoolValue(
25*36209d36SAndrei Safronov Type *Ty, unsigned ID, XtensaCP::XtensaCPKind Kind,
26*36209d36SAndrei Safronov XtensaCP::XtensaCPModifier modifier)
27*36209d36SAndrei Safronov : MachineConstantPoolValue(Ty), LabelId(ID), Kind(Kind),
28*36209d36SAndrei Safronov Modifier(modifier) {}
29*36209d36SAndrei Safronov
XtensaConstantPoolValue(LLVMContext & C,unsigned ID,XtensaCP::XtensaCPKind Kind,XtensaCP::XtensaCPModifier Modifier)30*36209d36SAndrei Safronov XtensaConstantPoolValue::XtensaConstantPoolValue(
31*36209d36SAndrei Safronov LLVMContext &C, unsigned ID, XtensaCP::XtensaCPKind Kind,
32*36209d36SAndrei Safronov XtensaCP::XtensaCPModifier Modifier)
33*36209d36SAndrei Safronov : MachineConstantPoolValue((Type *)Type::getInt32Ty(C)), LabelId(ID),
34*36209d36SAndrei Safronov Kind(Kind), Modifier(Modifier) {}
35*36209d36SAndrei Safronov
~XtensaConstantPoolValue()36*36209d36SAndrei Safronov XtensaConstantPoolValue::~XtensaConstantPoolValue() {}
37*36209d36SAndrei Safronov
getModifierText() const38*36209d36SAndrei Safronov StringRef XtensaConstantPoolValue::getModifierText() const {
39*36209d36SAndrei Safronov switch (Modifier) {
40*36209d36SAndrei Safronov case XtensaCP::no_modifier:
41*36209d36SAndrei Safronov return "";
42*36209d36SAndrei Safronov case XtensaCP::TPOFF:
43*36209d36SAndrei Safronov return "@TPOFF";
44*36209d36SAndrei Safronov }
45*36209d36SAndrei Safronov report_fatal_error("Unknown modifier!");
46*36209d36SAndrei Safronov }
47*36209d36SAndrei Safronov
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)48*36209d36SAndrei Safronov int XtensaConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP,
49*36209d36SAndrei Safronov Align Alignment) {
50*36209d36SAndrei Safronov report_fatal_error("Shouldn't be calling this directly!");
51*36209d36SAndrei Safronov }
52*36209d36SAndrei Safronov
addSelectionDAGCSEId(FoldingSetNodeID & ID)53*36209d36SAndrei Safronov void XtensaConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
54*36209d36SAndrei Safronov ID.AddInteger(LabelId);
55*36209d36SAndrei Safronov }
56*36209d36SAndrei Safronov
hasSameValue(XtensaConstantPoolValue * ACPV)57*36209d36SAndrei Safronov bool XtensaConstantPoolValue::hasSameValue(XtensaConstantPoolValue *ACPV) {
58*36209d36SAndrei Safronov if (ACPV->Kind == Kind) {
59*36209d36SAndrei Safronov if (ACPV->LabelId == LabelId)
60*36209d36SAndrei Safronov return true;
61*36209d36SAndrei Safronov }
62*36209d36SAndrei Safronov return false;
63*36209d36SAndrei Safronov }
64*36209d36SAndrei Safronov
65*36209d36SAndrei Safronov #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump() const66*36209d36SAndrei Safronov void XtensaConstantPoolValue::dump() const { errs() << " " << *this; }
67*36209d36SAndrei Safronov #endif
68*36209d36SAndrei Safronov
print(raw_ostream & O) const69*36209d36SAndrei Safronov void XtensaConstantPoolValue::print(raw_ostream &O) const {}
70*36209d36SAndrei Safronov
71*36209d36SAndrei Safronov //===----------------------------------------------------------------------===//
72*36209d36SAndrei Safronov // XtensaConstantPoolConstant
73*36209d36SAndrei Safronov //===----------------------------------------------------------------------===//
74*36209d36SAndrei Safronov
XtensaConstantPoolConstant(const Constant * C,unsigned ID,XtensaCP::XtensaCPKind Kind)75*36209d36SAndrei Safronov XtensaConstantPoolConstant::XtensaConstantPoolConstant(
76*36209d36SAndrei Safronov const Constant *C, unsigned ID, XtensaCP::XtensaCPKind Kind)
77*36209d36SAndrei Safronov : XtensaConstantPoolValue(C->getType(), ID, Kind), CVal(C) {}
78*36209d36SAndrei Safronov
79*36209d36SAndrei Safronov XtensaConstantPoolConstant *
Create(const Constant * C,unsigned ID,XtensaCP::XtensaCPKind Kind)80*36209d36SAndrei Safronov XtensaConstantPoolConstant::Create(const Constant *C, unsigned ID,
81*36209d36SAndrei Safronov XtensaCP::XtensaCPKind Kind) {
82*36209d36SAndrei Safronov return new XtensaConstantPoolConstant(C, ID, Kind);
83*36209d36SAndrei Safronov }
84*36209d36SAndrei Safronov
getBlockAddress() const85*36209d36SAndrei Safronov const BlockAddress *XtensaConstantPoolConstant::getBlockAddress() const {
86*36209d36SAndrei Safronov return dyn_cast_or_null<BlockAddress>(CVal);
87*36209d36SAndrei Safronov }
88*36209d36SAndrei Safronov
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)89*36209d36SAndrei Safronov int XtensaConstantPoolConstant::getExistingMachineCPValue(
90*36209d36SAndrei Safronov MachineConstantPool *CP, Align Alignment) {
91*36209d36SAndrei Safronov return getExistingMachineCPValueImpl<XtensaConstantPoolConstant>(CP,
92*36209d36SAndrei Safronov Alignment);
93*36209d36SAndrei Safronov }
94*36209d36SAndrei Safronov
hasSameValue(XtensaConstantPoolValue * ACPV)95*36209d36SAndrei Safronov bool XtensaConstantPoolConstant::hasSameValue(XtensaConstantPoolValue *ACPV) {
96*36209d36SAndrei Safronov const XtensaConstantPoolConstant *ACPC =
97*36209d36SAndrei Safronov dyn_cast<XtensaConstantPoolConstant>(ACPV);
98*36209d36SAndrei Safronov return ACPC && ACPC->CVal == CVal &&
99*36209d36SAndrei Safronov XtensaConstantPoolValue::hasSameValue(ACPV);
100*36209d36SAndrei Safronov }
101*36209d36SAndrei Safronov
addSelectionDAGCSEId(FoldingSetNodeID & ID)102*36209d36SAndrei Safronov void XtensaConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
103*36209d36SAndrei Safronov ID.AddPointer(CVal);
104*36209d36SAndrei Safronov XtensaConstantPoolValue::addSelectionDAGCSEId(ID);
105*36209d36SAndrei Safronov }
106*36209d36SAndrei Safronov
print(raw_ostream & O) const107*36209d36SAndrei Safronov void XtensaConstantPoolConstant::print(raw_ostream &O) const {
108*36209d36SAndrei Safronov O << CVal->getName();
109*36209d36SAndrei Safronov XtensaConstantPoolValue::print(O);
110*36209d36SAndrei Safronov }
111*36209d36SAndrei Safronov
XtensaConstantPoolSymbol(LLVMContext & C,const char * Str,unsigned ID,bool PrivLinkage,XtensaCP::XtensaCPModifier Modifier)112*36209d36SAndrei Safronov XtensaConstantPoolSymbol::XtensaConstantPoolSymbol(
113*36209d36SAndrei Safronov LLVMContext &C, const char *Str, unsigned ID, bool PrivLinkage,
114*36209d36SAndrei Safronov XtensaCP::XtensaCPModifier Modifier)
115*36209d36SAndrei Safronov : XtensaConstantPoolValue(C, ID, XtensaCP::CPExtSymbol, Modifier), S(Str),
116*36209d36SAndrei Safronov PrivateLinkage(PrivLinkage) {}
117*36209d36SAndrei Safronov
118*36209d36SAndrei Safronov XtensaConstantPoolSymbol *
Create(LLVMContext & C,const char * Str,unsigned ID,bool PrivLinkage,XtensaCP::XtensaCPModifier Modifier)119*36209d36SAndrei Safronov XtensaConstantPoolSymbol::Create(LLVMContext &C, const char *Str, unsigned ID,
120*36209d36SAndrei Safronov bool PrivLinkage,
121*36209d36SAndrei Safronov XtensaCP::XtensaCPModifier Modifier)
122*36209d36SAndrei Safronov
123*36209d36SAndrei Safronov {
124*36209d36SAndrei Safronov return new XtensaConstantPoolSymbol(C, Str, ID, PrivLinkage, Modifier);
125*36209d36SAndrei Safronov }
126*36209d36SAndrei Safronov
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)127*36209d36SAndrei Safronov int XtensaConstantPoolSymbol::getExistingMachineCPValue(MachineConstantPool *CP,
128*36209d36SAndrei Safronov Align Alignment) {
129*36209d36SAndrei Safronov return getExistingMachineCPValueImpl<XtensaConstantPoolSymbol>(CP, Alignment);
130*36209d36SAndrei Safronov }
131*36209d36SAndrei Safronov
hasSameValue(XtensaConstantPoolValue * ACPV)132*36209d36SAndrei Safronov bool XtensaConstantPoolSymbol::hasSameValue(XtensaConstantPoolValue *ACPV) {
133*36209d36SAndrei Safronov const XtensaConstantPoolSymbol *ACPS =
134*36209d36SAndrei Safronov dyn_cast<XtensaConstantPoolSymbol>(ACPV);
135*36209d36SAndrei Safronov return ACPS && ACPS->S == S && XtensaConstantPoolValue::hasSameValue(ACPV);
136*36209d36SAndrei Safronov }
137*36209d36SAndrei Safronov
addSelectionDAGCSEId(FoldingSetNodeID & ID)138*36209d36SAndrei Safronov void XtensaConstantPoolSymbol::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
139*36209d36SAndrei Safronov ID.AddString(S);
140*36209d36SAndrei Safronov XtensaConstantPoolValue::addSelectionDAGCSEId(ID);
141*36209d36SAndrei Safronov }
142*36209d36SAndrei Safronov
print(raw_ostream & O) const143*36209d36SAndrei Safronov void XtensaConstantPoolSymbol::print(raw_ostream &O) const {
144*36209d36SAndrei Safronov O << S;
145*36209d36SAndrei Safronov XtensaConstantPoolValue::print(O);
146*36209d36SAndrei Safronov }
147*36209d36SAndrei Safronov
XtensaConstantPoolMBB(LLVMContext & C,const MachineBasicBlock * M,unsigned Id)148*36209d36SAndrei Safronov XtensaConstantPoolMBB::XtensaConstantPoolMBB(LLVMContext &C,
149*36209d36SAndrei Safronov const MachineBasicBlock *M,
150*36209d36SAndrei Safronov unsigned Id)
151*36209d36SAndrei Safronov : XtensaConstantPoolValue(C, 0, XtensaCP::CPMachineBasicBlock), MBB(M) {}
152*36209d36SAndrei Safronov
Create(LLVMContext & C,const MachineBasicBlock * M,unsigned Idx)153*36209d36SAndrei Safronov XtensaConstantPoolMBB *XtensaConstantPoolMBB::Create(LLVMContext &C,
154*36209d36SAndrei Safronov const MachineBasicBlock *M,
155*36209d36SAndrei Safronov unsigned Idx) {
156*36209d36SAndrei Safronov return new XtensaConstantPoolMBB(C, M, Idx);
157*36209d36SAndrei Safronov }
158*36209d36SAndrei Safronov
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)159*36209d36SAndrei Safronov int XtensaConstantPoolMBB::getExistingMachineCPValue(MachineConstantPool *CP,
160*36209d36SAndrei Safronov Align Alignment) {
161*36209d36SAndrei Safronov return getExistingMachineCPValueImpl<XtensaConstantPoolMBB>(CP, Alignment);
162*36209d36SAndrei Safronov }
163*36209d36SAndrei Safronov
hasSameValue(XtensaConstantPoolValue * ACPV)164*36209d36SAndrei Safronov bool XtensaConstantPoolMBB::hasSameValue(XtensaConstantPoolValue *ACPV) {
165*36209d36SAndrei Safronov const XtensaConstantPoolMBB *ACPMBB = dyn_cast<XtensaConstantPoolMBB>(ACPV);
166*36209d36SAndrei Safronov return ACPMBB && ACPMBB->MBB == MBB &&
167*36209d36SAndrei Safronov XtensaConstantPoolValue::hasSameValue(ACPV);
168*36209d36SAndrei Safronov }
169*36209d36SAndrei Safronov
addSelectionDAGCSEId(FoldingSetNodeID & ID)170*36209d36SAndrei Safronov void XtensaConstantPoolMBB::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
171*36209d36SAndrei Safronov ID.AddPointer(MBB);
172*36209d36SAndrei Safronov XtensaConstantPoolValue::addSelectionDAGCSEId(ID);
173*36209d36SAndrei Safronov }
174*36209d36SAndrei Safronov
print(raw_ostream & O) const175*36209d36SAndrei Safronov void XtensaConstantPoolMBB::print(raw_ostream &O) const {
176*36209d36SAndrei Safronov O << "BB#" << MBB->getNumber();
177*36209d36SAndrei Safronov XtensaConstantPoolValue::print(O);
178*36209d36SAndrei Safronov }
179*36209d36SAndrei Safronov
XtensaConstantPoolJumpTable(LLVMContext & C,unsigned Index)180*36209d36SAndrei Safronov XtensaConstantPoolJumpTable::XtensaConstantPoolJumpTable(LLVMContext &C,
181*36209d36SAndrei Safronov unsigned Index)
182*36209d36SAndrei Safronov : XtensaConstantPoolValue(C, 0, XtensaCP::CPJumpTable), Idx(Index) {}
183*36209d36SAndrei Safronov
Create(LLVMContext & C,unsigned Idx)184*36209d36SAndrei Safronov XtensaConstantPoolJumpTable *XtensaConstantPoolJumpTable::Create(LLVMContext &C,
185*36209d36SAndrei Safronov unsigned Idx) {
186*36209d36SAndrei Safronov return new XtensaConstantPoolJumpTable(C, Idx);
187*36209d36SAndrei Safronov }
188*36209d36SAndrei Safronov
getExistingMachineCPValue(MachineConstantPool * CP,Align Alignment)189*36209d36SAndrei Safronov int XtensaConstantPoolJumpTable::getExistingMachineCPValue(
190*36209d36SAndrei Safronov MachineConstantPool *CP, Align Alignment) {
191*36209d36SAndrei Safronov return getExistingMachineCPValueImpl<XtensaConstantPoolJumpTable>(CP,
192*36209d36SAndrei Safronov Alignment);
193*36209d36SAndrei Safronov }
194*36209d36SAndrei Safronov
hasSameValue(XtensaConstantPoolValue * ACPV)195*36209d36SAndrei Safronov bool XtensaConstantPoolJumpTable::hasSameValue(XtensaConstantPoolValue *ACPV) {
196*36209d36SAndrei Safronov const XtensaConstantPoolJumpTable *ACPJT =
197*36209d36SAndrei Safronov dyn_cast<XtensaConstantPoolJumpTable>(ACPV);
198*36209d36SAndrei Safronov return ACPJT && ACPJT->Idx == Idx &&
199*36209d36SAndrei Safronov XtensaConstantPoolValue::hasSameValue(ACPV);
200*36209d36SAndrei Safronov }
201*36209d36SAndrei Safronov
addSelectionDAGCSEId(FoldingSetNodeID & ID)202*36209d36SAndrei Safronov void XtensaConstantPoolJumpTable::addSelectionDAGCSEId(FoldingSetNodeID &ID) {}
203*36209d36SAndrei Safronov
print(raw_ostream & O) const204*36209d36SAndrei Safronov void XtensaConstantPoolJumpTable::print(raw_ostream &O) const {
205*36209d36SAndrei Safronov O << "JT" << Idx;
206*36209d36SAndrei Safronov XtensaConstantPoolValue::print(O);
207*36209d36SAndrei Safronov }
208