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