12cab237bSDimitry Andric //===- ARMConstantPoolValue.cpp - ARM constantpool value ------------------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky // The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky // This file implements the ARM specific constantpool value class.
11f22ef01cSRoman Divacky //
12f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
13f22ef01cSRoman Divacky
14f22ef01cSRoman Divacky #include "ARMConstantPoolValue.h"
15f22ef01cSRoman Divacky #include "llvm/ADT/FoldingSet.h"
166122f3e6SDimitry Andric #include "llvm/CodeGen/MachineBasicBlock.h"
17*4ba319b5SDimitry Andric #include "llvm/Config/llvm-config.h"
18139f7f9bSDimitry Andric #include "llvm/IR/Constant.h"
19139f7f9bSDimitry Andric #include "llvm/IR/Constants.h"
20139f7f9bSDimitry Andric #include "llvm/IR/GlobalValue.h"
21139f7f9bSDimitry Andric #include "llvm/IR/Type.h"
227a7e6055SDimitry Andric #include "llvm/Support/Casting.h"
237a7e6055SDimitry Andric #include "llvm/Support/Compiler.h"
247a7e6055SDimitry Andric #include "llvm/Support/ErrorHandling.h"
25f22ef01cSRoman Divacky #include "llvm/Support/raw_ostream.h"
267a7e6055SDimitry Andric
27f22ef01cSRoman Divacky using namespace llvm;
28f22ef01cSRoman Divacky
296122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
306122f3e6SDimitry Andric // ARMConstantPoolValue
316122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
326122f3e6SDimitry Andric
ARMConstantPoolValue(Type * Ty,unsigned id,ARMCP::ARMCPKind kind,unsigned char PCAdj,ARMCP::ARMCPModifier modifier,bool addCurrentAddress)336122f3e6SDimitry Andric ARMConstantPoolValue::ARMConstantPoolValue(Type *Ty, unsigned id,
346122f3e6SDimitry Andric ARMCP::ARMCPKind kind,
35f22ef01cSRoman Divacky unsigned char PCAdj,
366122f3e6SDimitry Andric ARMCP::ARMCPModifier modifier,
376122f3e6SDimitry Andric bool addCurrentAddress)
386122f3e6SDimitry Andric : MachineConstantPoolValue(Ty), LabelId(id), Kind(kind),
396122f3e6SDimitry Andric PCAdjust(PCAdj), Modifier(modifier),
406122f3e6SDimitry Andric AddCurrentAddress(addCurrentAddress) {}
41f22ef01cSRoman Divacky
ARMConstantPoolValue(LLVMContext & C,unsigned id,ARMCP::ARMCPKind kind,unsigned char PCAdj,ARMCP::ARMCPModifier modifier,bool addCurrentAddress)426122f3e6SDimitry Andric ARMConstantPoolValue::ARMConstantPoolValue(LLVMContext &C, unsigned id,
436122f3e6SDimitry Andric ARMCP::ARMCPKind kind,
44f22ef01cSRoman Divacky unsigned char PCAdj,
456122f3e6SDimitry Andric ARMCP::ARMCPModifier modifier,
466122f3e6SDimitry Andric bool addCurrentAddress)
476122f3e6SDimitry Andric : MachineConstantPoolValue((Type*)Type::getInt32Ty(C)),
486122f3e6SDimitry Andric LabelId(id), Kind(kind), PCAdjust(PCAdj), Modifier(modifier),
496122f3e6SDimitry Andric AddCurrentAddress(addCurrentAddress) {}
50f22ef01cSRoman Divacky
517a7e6055SDimitry Andric ARMConstantPoolValue::~ARMConstantPoolValue() = default;
52f22ef01cSRoman Divacky
getModifierText() const53d88c1a5aSDimitry Andric StringRef ARMConstantPoolValue::getModifierText() const {
546122f3e6SDimitry Andric switch (Modifier) {
556122f3e6SDimitry Andric // FIXME: Are these case sensitive? It'd be nice to lower-case all the
566122f3e6SDimitry Andric // strings if that's legal.
573ca95b02SDimitry Andric case ARMCP::no_modifier:
583ca95b02SDimitry Andric return "none";
593ca95b02SDimitry Andric case ARMCP::TLSGD:
603ca95b02SDimitry Andric return "tlsgd";
613ca95b02SDimitry Andric case ARMCP::GOT_PREL:
623ca95b02SDimitry Andric return "GOT_PREL";
633ca95b02SDimitry Andric case ARMCP::GOTTPOFF:
643ca95b02SDimitry Andric return "gottpoff";
653ca95b02SDimitry Andric case ARMCP::TPOFF:
663ca95b02SDimitry Andric return "tpoff";
67d88c1a5aSDimitry Andric case ARMCP::SBREL:
68d88c1a5aSDimitry Andric return "SBREL";
693ca95b02SDimitry Andric case ARMCP::SECREL:
703ca95b02SDimitry Andric return "secrel32";
71f22ef01cSRoman Divacky }
72dff0c46cSDimitry Andric llvm_unreachable("Unknown modifier!");
732754fe60SDimitry Andric }
742754fe60SDimitry Andric
getExistingMachineCPValue(MachineConstantPool * CP,unsigned Alignment)75f22ef01cSRoman Divacky int ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP,
76f22ef01cSRoman Divacky unsigned Alignment) {
77dff0c46cSDimitry Andric llvm_unreachable("Shouldn't be calling this directly!");
78f22ef01cSRoman Divacky }
79f22ef01cSRoman Divacky
80f22ef01cSRoman Divacky void
addSelectionDAGCSEId(FoldingSetNodeID & ID)816122f3e6SDimitry Andric ARMConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
82f22ef01cSRoman Divacky ID.AddInteger(LabelId);
83f22ef01cSRoman Divacky ID.AddInteger(PCAdjust);
84f22ef01cSRoman Divacky }
85f22ef01cSRoman Divacky
86f22ef01cSRoman Divacky bool
hasSameValue(ARMConstantPoolValue * ACPV)87f22ef01cSRoman Divacky ARMConstantPoolValue::hasSameValue(ARMConstantPoolValue *ACPV) {
88f22ef01cSRoman Divacky if (ACPV->Kind == Kind &&
89f22ef01cSRoman Divacky ACPV->PCAdjust == PCAdjust &&
903ca95b02SDimitry Andric ACPV->Modifier == Modifier &&
913ca95b02SDimitry Andric ACPV->LabelId == LabelId &&
923ca95b02SDimitry Andric ACPV->AddCurrentAddress == AddCurrentAddress) {
93f22ef01cSRoman Divacky // Two PC relative constpool entries containing the same GV address or
94f22ef01cSRoman Divacky // external symbols. FIXME: What about blockaddress?
95f22ef01cSRoman Divacky if (Kind == ARMCP::CPValue || Kind == ARMCP::CPExtSymbol)
96f22ef01cSRoman Divacky return true;
97f22ef01cSRoman Divacky }
98f22ef01cSRoman Divacky return false;
99f22ef01cSRoman Divacky }
100f22ef01cSRoman Divacky
1017a7e6055SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump() const1023ca95b02SDimitry Andric LLVM_DUMP_METHOD void ARMConstantPoolValue::dump() const {
103f22ef01cSRoman Divacky errs() << " " << *this;
104f22ef01cSRoman Divacky }
1057a7e6055SDimitry Andric #endif
106f22ef01cSRoman Divacky
print(raw_ostream & O) const107f22ef01cSRoman Divacky void ARMConstantPoolValue::print(raw_ostream &O) const {
1082754fe60SDimitry Andric if (Modifier) O << "(" << getModifierText() << ")";
109f22ef01cSRoman Divacky if (PCAdjust != 0) {
110f22ef01cSRoman Divacky O << "-(LPC" << LabelId << "+" << (unsigned)PCAdjust;
111f22ef01cSRoman Divacky if (AddCurrentAddress) O << "-.";
112f22ef01cSRoman Divacky O << ")";
113f22ef01cSRoman Divacky }
114f22ef01cSRoman Divacky }
1156122f3e6SDimitry Andric
1166122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
1176122f3e6SDimitry Andric // ARMConstantPoolConstant
1186122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
1196122f3e6SDimitry Andric
ARMConstantPoolConstant(Type * Ty,const Constant * C,unsigned ID,ARMCP::ARMCPKind Kind,unsigned char PCAdj,ARMCP::ARMCPModifier Modifier,bool AddCurrentAddress)1206122f3e6SDimitry Andric ARMConstantPoolConstant::ARMConstantPoolConstant(Type *Ty,
1216122f3e6SDimitry Andric const Constant *C,
1226122f3e6SDimitry Andric unsigned ID,
1236122f3e6SDimitry Andric ARMCP::ARMCPKind Kind,
1246122f3e6SDimitry Andric unsigned char PCAdj,
1256122f3e6SDimitry Andric ARMCP::ARMCPModifier Modifier,
1266122f3e6SDimitry Andric bool AddCurrentAddress)
1276122f3e6SDimitry Andric : ARMConstantPoolValue(Ty, ID, Kind, PCAdj, Modifier, AddCurrentAddress),
1286122f3e6SDimitry Andric CVal(C) {}
1296122f3e6SDimitry Andric
ARMConstantPoolConstant(const Constant * C,unsigned ID,ARMCP::ARMCPKind Kind,unsigned char PCAdj,ARMCP::ARMCPModifier Modifier,bool AddCurrentAddress)1306122f3e6SDimitry Andric ARMConstantPoolConstant::ARMConstantPoolConstant(const Constant *C,
1316122f3e6SDimitry Andric unsigned ID,
1326122f3e6SDimitry Andric ARMCP::ARMCPKind Kind,
1336122f3e6SDimitry Andric unsigned char PCAdj,
1346122f3e6SDimitry Andric ARMCP::ARMCPModifier Modifier,
1356122f3e6SDimitry Andric bool AddCurrentAddress)
1366122f3e6SDimitry Andric : ARMConstantPoolValue((Type*)C->getType(), ID, Kind, PCAdj, Modifier,
1376122f3e6SDimitry Andric AddCurrentAddress),
1386122f3e6SDimitry Andric CVal(C) {}
1396122f3e6SDimitry Andric
ARMConstantPoolConstant(const GlobalVariable * GV,const Constant * C)140d88c1a5aSDimitry Andric ARMConstantPoolConstant::ARMConstantPoolConstant(const GlobalVariable *GV,
141d88c1a5aSDimitry Andric const Constant *C)
142d88c1a5aSDimitry Andric : ARMConstantPoolValue((Type *)C->getType(), 0, ARMCP::CPPromotedGlobal, 0,
1432cab237bSDimitry Andric ARMCP::no_modifier, false), CVal(C) {
1442cab237bSDimitry Andric GVars.insert(GV);
1452cab237bSDimitry Andric }
146d88c1a5aSDimitry Andric
1476122f3e6SDimitry Andric ARMConstantPoolConstant *
Create(const Constant * C,unsigned ID)1486122f3e6SDimitry Andric ARMConstantPoolConstant::Create(const Constant *C, unsigned ID) {
1496122f3e6SDimitry Andric return new ARMConstantPoolConstant(C, ID, ARMCP::CPValue, 0,
1506122f3e6SDimitry Andric ARMCP::no_modifier, false);
1516122f3e6SDimitry Andric }
1526122f3e6SDimitry Andric
1536122f3e6SDimitry Andric ARMConstantPoolConstant *
Create(const GlobalVariable * GVar,const Constant * Initializer)154d88c1a5aSDimitry Andric ARMConstantPoolConstant::Create(const GlobalVariable *GVar,
155d88c1a5aSDimitry Andric const Constant *Initializer) {
156d88c1a5aSDimitry Andric return new ARMConstantPoolConstant(GVar, Initializer);
157d88c1a5aSDimitry Andric }
158d88c1a5aSDimitry Andric
159d88c1a5aSDimitry Andric ARMConstantPoolConstant *
Create(const GlobalValue * GV,ARMCP::ARMCPModifier Modifier)1606122f3e6SDimitry Andric ARMConstantPoolConstant::Create(const GlobalValue *GV,
1616122f3e6SDimitry Andric ARMCP::ARMCPModifier Modifier) {
1626122f3e6SDimitry Andric return new ARMConstantPoolConstant((Type*)Type::getInt32Ty(GV->getContext()),
1636122f3e6SDimitry Andric GV, 0, ARMCP::CPValue, 0,
1646122f3e6SDimitry Andric Modifier, false);
1656122f3e6SDimitry Andric }
1666122f3e6SDimitry Andric
1676122f3e6SDimitry Andric ARMConstantPoolConstant *
Create(const Constant * C,unsigned ID,ARMCP::ARMCPKind Kind,unsigned char PCAdj)1686122f3e6SDimitry Andric ARMConstantPoolConstant::Create(const Constant *C, unsigned ID,
1696122f3e6SDimitry Andric ARMCP::ARMCPKind Kind, unsigned char PCAdj) {
1706122f3e6SDimitry Andric return new ARMConstantPoolConstant(C, ID, Kind, PCAdj,
1716122f3e6SDimitry Andric ARMCP::no_modifier, false);
1726122f3e6SDimitry Andric }
1736122f3e6SDimitry Andric
1746122f3e6SDimitry Andric ARMConstantPoolConstant *
Create(const Constant * C,unsigned ID,ARMCP::ARMCPKind Kind,unsigned char PCAdj,ARMCP::ARMCPModifier Modifier,bool AddCurrentAddress)1756122f3e6SDimitry Andric ARMConstantPoolConstant::Create(const Constant *C, unsigned ID,
1766122f3e6SDimitry Andric ARMCP::ARMCPKind Kind, unsigned char PCAdj,
1776122f3e6SDimitry Andric ARMCP::ARMCPModifier Modifier,
1786122f3e6SDimitry Andric bool AddCurrentAddress) {
1796122f3e6SDimitry Andric return new ARMConstantPoolConstant(C, ID, Kind, PCAdj, Modifier,
1806122f3e6SDimitry Andric AddCurrentAddress);
1816122f3e6SDimitry Andric }
1826122f3e6SDimitry Andric
getGV() const1836122f3e6SDimitry Andric const GlobalValue *ARMConstantPoolConstant::getGV() const {
1846122f3e6SDimitry Andric return dyn_cast_or_null<GlobalValue>(CVal);
1856122f3e6SDimitry Andric }
1866122f3e6SDimitry Andric
getBlockAddress() const1876122f3e6SDimitry Andric const BlockAddress *ARMConstantPoolConstant::getBlockAddress() const {
1886122f3e6SDimitry Andric return dyn_cast_or_null<BlockAddress>(CVal);
1896122f3e6SDimitry Andric }
1906122f3e6SDimitry Andric
getExistingMachineCPValue(MachineConstantPool * CP,unsigned Alignment)1916122f3e6SDimitry Andric int ARMConstantPoolConstant::getExistingMachineCPValue(MachineConstantPool *CP,
1926122f3e6SDimitry Andric unsigned Alignment) {
1932cab237bSDimitry Andric int index =
1942cab237bSDimitry Andric getExistingMachineCPValueImpl<ARMConstantPoolConstant>(CP, Alignment);
1952cab237bSDimitry Andric if (index != -1) {
1962cab237bSDimitry Andric auto *CPV = static_cast<ARMConstantPoolValue*>(
1972cab237bSDimitry Andric CP->getConstants()[index].Val.MachineCPVal);
1982cab237bSDimitry Andric auto *Constant = cast<ARMConstantPoolConstant>(CPV);
1992cab237bSDimitry Andric Constant->GVars.insert(GVars.begin(), GVars.end());
2002cab237bSDimitry Andric }
2012cab237bSDimitry Andric return index;
2026122f3e6SDimitry Andric }
2036122f3e6SDimitry Andric
hasSameValue(ARMConstantPoolValue * ACPV)2046122f3e6SDimitry Andric bool ARMConstantPoolConstant::hasSameValue(ARMConstantPoolValue *ACPV) {
2056122f3e6SDimitry Andric const ARMConstantPoolConstant *ACPC = dyn_cast<ARMConstantPoolConstant>(ACPV);
2066122f3e6SDimitry Andric return ACPC && ACPC->CVal == CVal && ARMConstantPoolValue::hasSameValue(ACPV);
2076122f3e6SDimitry Andric }
2086122f3e6SDimitry Andric
addSelectionDAGCSEId(FoldingSetNodeID & ID)2096122f3e6SDimitry Andric void ARMConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
2106122f3e6SDimitry Andric ID.AddPointer(CVal);
2112cab237bSDimitry Andric for (const auto *GV : GVars)
2122cab237bSDimitry Andric ID.AddPointer(GV);
2136122f3e6SDimitry Andric ARMConstantPoolValue::addSelectionDAGCSEId(ID);
2146122f3e6SDimitry Andric }
2156122f3e6SDimitry Andric
print(raw_ostream & O) const2166122f3e6SDimitry Andric void ARMConstantPoolConstant::print(raw_ostream &O) const {
2176122f3e6SDimitry Andric O << CVal->getName();
2186122f3e6SDimitry Andric ARMConstantPoolValue::print(O);
2196122f3e6SDimitry Andric }
2206122f3e6SDimitry Andric
2216122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
2226122f3e6SDimitry Andric // ARMConstantPoolSymbol
2236122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
2246122f3e6SDimitry Andric
ARMConstantPoolSymbol(LLVMContext & C,StringRef s,unsigned id,unsigned char PCAdj,ARMCP::ARMCPModifier Modifier,bool AddCurrentAddress)225d88c1a5aSDimitry Andric ARMConstantPoolSymbol::ARMConstantPoolSymbol(LLVMContext &C, StringRef s,
226d88c1a5aSDimitry Andric unsigned id, unsigned char PCAdj,
2276122f3e6SDimitry Andric ARMCP::ARMCPModifier Modifier,
2286122f3e6SDimitry Andric bool AddCurrentAddress)
2296122f3e6SDimitry Andric : ARMConstantPoolValue(C, id, ARMCP::CPExtSymbol, PCAdj, Modifier,
2306122f3e6SDimitry Andric AddCurrentAddress),
231139f7f9bSDimitry Andric S(s) {}
2326122f3e6SDimitry Andric
Create(LLVMContext & C,StringRef s,unsigned ID,unsigned char PCAdj)233d88c1a5aSDimitry Andric ARMConstantPoolSymbol *ARMConstantPoolSymbol::Create(LLVMContext &C,
234d88c1a5aSDimitry Andric StringRef s, unsigned ID,
235d88c1a5aSDimitry Andric unsigned char PCAdj) {
2366122f3e6SDimitry Andric return new ARMConstantPoolSymbol(C, s, ID, PCAdj, ARMCP::no_modifier, false);
2376122f3e6SDimitry Andric }
2386122f3e6SDimitry Andric
getExistingMachineCPValue(MachineConstantPool * CP,unsigned Alignment)2396122f3e6SDimitry Andric int ARMConstantPoolSymbol::getExistingMachineCPValue(MachineConstantPool *CP,
2406122f3e6SDimitry Andric unsigned Alignment) {
241f785676fSDimitry Andric return getExistingMachineCPValueImpl<ARMConstantPoolSymbol>(CP, Alignment);
2426122f3e6SDimitry Andric }
2436122f3e6SDimitry Andric
hasSameValue(ARMConstantPoolValue * ACPV)2446122f3e6SDimitry Andric bool ARMConstantPoolSymbol::hasSameValue(ARMConstantPoolValue *ACPV) {
2456122f3e6SDimitry Andric const ARMConstantPoolSymbol *ACPS = dyn_cast<ARMConstantPoolSymbol>(ACPV);
246139f7f9bSDimitry Andric return ACPS && ACPS->S == S && ARMConstantPoolValue::hasSameValue(ACPV);
2476122f3e6SDimitry Andric }
2486122f3e6SDimitry Andric
addSelectionDAGCSEId(FoldingSetNodeID & ID)2496122f3e6SDimitry Andric void ARMConstantPoolSymbol::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
250139f7f9bSDimitry Andric ID.AddString(S);
2516122f3e6SDimitry Andric ARMConstantPoolValue::addSelectionDAGCSEId(ID);
2526122f3e6SDimitry Andric }
2536122f3e6SDimitry Andric
print(raw_ostream & O) const2546122f3e6SDimitry Andric void ARMConstantPoolSymbol::print(raw_ostream &O) const {
2556122f3e6SDimitry Andric O << S;
2566122f3e6SDimitry Andric ARMConstantPoolValue::print(O);
2576122f3e6SDimitry Andric }
2586122f3e6SDimitry Andric
2596122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
2606122f3e6SDimitry Andric // ARMConstantPoolMBB
2616122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
2626122f3e6SDimitry Andric
ARMConstantPoolMBB(LLVMContext & C,const MachineBasicBlock * mbb,unsigned id,unsigned char PCAdj,ARMCP::ARMCPModifier Modifier,bool AddCurrentAddress)2636122f3e6SDimitry Andric ARMConstantPoolMBB::ARMConstantPoolMBB(LLVMContext &C,
2646122f3e6SDimitry Andric const MachineBasicBlock *mbb,
2656122f3e6SDimitry Andric unsigned id, unsigned char PCAdj,
2666122f3e6SDimitry Andric ARMCP::ARMCPModifier Modifier,
2676122f3e6SDimitry Andric bool AddCurrentAddress)
2686122f3e6SDimitry Andric : ARMConstantPoolValue(C, id, ARMCP::CPMachineBasicBlock, PCAdj,
2696122f3e6SDimitry Andric Modifier, AddCurrentAddress),
2706122f3e6SDimitry Andric MBB(mbb) {}
2716122f3e6SDimitry Andric
Create(LLVMContext & C,const MachineBasicBlock * mbb,unsigned ID,unsigned char PCAdj)2726122f3e6SDimitry Andric ARMConstantPoolMBB *ARMConstantPoolMBB::Create(LLVMContext &C,
2736122f3e6SDimitry Andric const MachineBasicBlock *mbb,
2746122f3e6SDimitry Andric unsigned ID,
2756122f3e6SDimitry Andric unsigned char PCAdj) {
2766122f3e6SDimitry Andric return new ARMConstantPoolMBB(C, mbb, ID, PCAdj, ARMCP::no_modifier, false);
2776122f3e6SDimitry Andric }
2786122f3e6SDimitry Andric
getExistingMachineCPValue(MachineConstantPool * CP,unsigned Alignment)2796122f3e6SDimitry Andric int ARMConstantPoolMBB::getExistingMachineCPValue(MachineConstantPool *CP,
2806122f3e6SDimitry Andric unsigned Alignment) {
281f785676fSDimitry Andric return getExistingMachineCPValueImpl<ARMConstantPoolMBB>(CP, Alignment);
2826122f3e6SDimitry Andric }
2836122f3e6SDimitry Andric
hasSameValue(ARMConstantPoolValue * ACPV)2846122f3e6SDimitry Andric bool ARMConstantPoolMBB::hasSameValue(ARMConstantPoolValue *ACPV) {
2856122f3e6SDimitry Andric const ARMConstantPoolMBB *ACPMBB = dyn_cast<ARMConstantPoolMBB>(ACPV);
2866122f3e6SDimitry Andric return ACPMBB && ACPMBB->MBB == MBB &&
2876122f3e6SDimitry Andric ARMConstantPoolValue::hasSameValue(ACPV);
2886122f3e6SDimitry Andric }
2896122f3e6SDimitry Andric
addSelectionDAGCSEId(FoldingSetNodeID & ID)2906122f3e6SDimitry Andric void ARMConstantPoolMBB::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
2916122f3e6SDimitry Andric ID.AddPointer(MBB);
2926122f3e6SDimitry Andric ARMConstantPoolValue::addSelectionDAGCSEId(ID);
2936122f3e6SDimitry Andric }
2946122f3e6SDimitry Andric
print(raw_ostream & O) const2956122f3e6SDimitry Andric void ARMConstantPoolMBB::print(raw_ostream &O) const {
2962cab237bSDimitry Andric O << printMBBReference(*MBB);
2976122f3e6SDimitry Andric ARMConstantPoolValue::print(O);
2986122f3e6SDimitry Andric }
299