ARMConstantPoolValue.cpp revision 261991
10Sstevel@tonic-gate//===-- ARMConstantPoolValue.cpp - ARM constantpool value -----------------===// 20Sstevel@tonic-gate// 30Sstevel@tonic-gate// The LLVM Compiler Infrastructure 40Sstevel@tonic-gate// 52830Sdjl// This file is distributed under the University of Illinois Open Source 62830Sdjl// License. See LICENSE.TXT for details. 70Sstevel@tonic-gate// 80Sstevel@tonic-gate//===----------------------------------------------------------------------===// 90Sstevel@tonic-gate// 100Sstevel@tonic-gate// This file implements the ARM specific constantpool value class. 110Sstevel@tonic-gate// 120Sstevel@tonic-gate//===----------------------------------------------------------------------===// 130Sstevel@tonic-gate 140Sstevel@tonic-gate#include "ARMConstantPoolValue.h" 150Sstevel@tonic-gate#include "llvm/ADT/FoldingSet.h" 160Sstevel@tonic-gate#include "llvm/CodeGen/MachineBasicBlock.h" 170Sstevel@tonic-gate#include "llvm/IR/Constant.h" 180Sstevel@tonic-gate#include "llvm/IR/Constants.h" 190Sstevel@tonic-gate#include "llvm/IR/GlobalValue.h" 200Sstevel@tonic-gate#include "llvm/IR/Type.h" 210Sstevel@tonic-gate#include "llvm/Support/raw_ostream.h" 222830Sdjl#include <cstdlib> 232830Sdjlusing namespace llvm; 240Sstevel@tonic-gate 252830Sdjl//===----------------------------------------------------------------------===// 260Sstevel@tonic-gate// ARMConstantPoolValue 270Sstevel@tonic-gate//===----------------------------------------------------------------------===// 280Sstevel@tonic-gate 290Sstevel@tonic-gateARMConstantPoolValue::ARMConstantPoolValue(Type *Ty, unsigned id, 300Sstevel@tonic-gate ARMCP::ARMCPKind kind, 310Sstevel@tonic-gate unsigned char PCAdj, 320Sstevel@tonic-gate ARMCP::ARMCPModifier modifier, 330Sstevel@tonic-gate bool addCurrentAddress) 340Sstevel@tonic-gate : MachineConstantPoolValue(Ty), LabelId(id), Kind(kind), 350Sstevel@tonic-gate PCAdjust(PCAdj), Modifier(modifier), 360Sstevel@tonic-gate AddCurrentAddress(addCurrentAddress) {} 370Sstevel@tonic-gate 380Sstevel@tonic-gateARMConstantPoolValue::ARMConstantPoolValue(LLVMContext &C, unsigned id, 390Sstevel@tonic-gate ARMCP::ARMCPKind kind, 400Sstevel@tonic-gate unsigned char PCAdj, 410Sstevel@tonic-gate ARMCP::ARMCPModifier modifier, 420Sstevel@tonic-gate bool addCurrentAddress) 430Sstevel@tonic-gate : MachineConstantPoolValue((Type*)Type::getInt32Ty(C)), 440Sstevel@tonic-gate LabelId(id), Kind(kind), PCAdjust(PCAdj), Modifier(modifier), 450Sstevel@tonic-gate AddCurrentAddress(addCurrentAddress) {} 460Sstevel@tonic-gate 470Sstevel@tonic-gateARMConstantPoolValue::~ARMConstantPoolValue() {} 480Sstevel@tonic-gate 490Sstevel@tonic-gateconst char *ARMConstantPoolValue::getModifierText() const { 500Sstevel@tonic-gate switch (Modifier) { 510Sstevel@tonic-gate // FIXME: Are these case sensitive? It'd be nice to lower-case all the 520Sstevel@tonic-gate // strings if that's legal. 532830Sdjl case ARMCP::no_modifier: return "none"; 540Sstevel@tonic-gate case ARMCP::TLSGD: return "tlsgd"; 550Sstevel@tonic-gate case ARMCP::GOT: return "GOT"; 560Sstevel@tonic-gate case ARMCP::GOTOFF: return "GOTOFF"; 570Sstevel@tonic-gate case ARMCP::GOTTPOFF: return "gottpoff"; 580Sstevel@tonic-gate case ARMCP::TPOFF: return "tpoff"; 590Sstevel@tonic-gate } 600Sstevel@tonic-gate llvm_unreachable("Unknown modifier!"); 610Sstevel@tonic-gate} 620Sstevel@tonic-gate 630Sstevel@tonic-gateint ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP, 642830Sdjl unsigned Alignment) { 650Sstevel@tonic-gate llvm_unreachable("Shouldn't be calling this directly!"); 662830Sdjl} 670Sstevel@tonic-gate 682830Sdjlvoid 690Sstevel@tonic-gateARMConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 700Sstevel@tonic-gate ID.AddInteger(LabelId); 710Sstevel@tonic-gate ID.AddInteger(PCAdjust); 720Sstevel@tonic-gate} 730Sstevel@tonic-gate 740Sstevel@tonic-gatebool 750Sstevel@tonic-gateARMConstantPoolValue::hasSameValue(ARMConstantPoolValue *ACPV) { 760Sstevel@tonic-gate if (ACPV->Kind == Kind && 770Sstevel@tonic-gate ACPV->PCAdjust == PCAdjust && 780Sstevel@tonic-gate ACPV->Modifier == Modifier) { 790Sstevel@tonic-gate if (ACPV->LabelId == LabelId) 800Sstevel@tonic-gate return true; 810Sstevel@tonic-gate // Two PC relative constpool entries containing the same GV address or 820Sstevel@tonic-gate // external symbols. FIXME: What about blockaddress? 830Sstevel@tonic-gate if (Kind == ARMCP::CPValue || Kind == ARMCP::CPExtSymbol) 840Sstevel@tonic-gate return true; 850Sstevel@tonic-gate } 860Sstevel@tonic-gate return false; 870Sstevel@tonic-gate} 88 89void ARMConstantPoolValue::dump() const { 90 errs() << " " << *this; 91} 92 93void ARMConstantPoolValue::print(raw_ostream &O) const { 94 if (Modifier) O << "(" << getModifierText() << ")"; 95 if (PCAdjust != 0) { 96 O << "-(LPC" << LabelId << "+" << (unsigned)PCAdjust; 97 if (AddCurrentAddress) O << "-."; 98 O << ")"; 99 } 100} 101 102//===----------------------------------------------------------------------===// 103// ARMConstantPoolConstant 104//===----------------------------------------------------------------------===// 105 106ARMConstantPoolConstant::ARMConstantPoolConstant(Type *Ty, 107 const Constant *C, 108 unsigned ID, 109 ARMCP::ARMCPKind Kind, 110 unsigned char PCAdj, 111 ARMCP::ARMCPModifier Modifier, 112 bool AddCurrentAddress) 113 : ARMConstantPoolValue(Ty, ID, Kind, PCAdj, Modifier, AddCurrentAddress), 114 CVal(C) {} 115 116ARMConstantPoolConstant::ARMConstantPoolConstant(const Constant *C, 117 unsigned ID, 118 ARMCP::ARMCPKind Kind, 119 unsigned char PCAdj, 120 ARMCP::ARMCPModifier Modifier, 121 bool AddCurrentAddress) 122 : ARMConstantPoolValue((Type*)C->getType(), ID, Kind, PCAdj, Modifier, 123 AddCurrentAddress), 124 CVal(C) {} 125 126ARMConstantPoolConstant * 127ARMConstantPoolConstant::Create(const Constant *C, unsigned ID) { 128 return new ARMConstantPoolConstant(C, ID, ARMCP::CPValue, 0, 129 ARMCP::no_modifier, false); 130} 131 132ARMConstantPoolConstant * 133ARMConstantPoolConstant::Create(const GlobalValue *GV, 134 ARMCP::ARMCPModifier Modifier) { 135 return new ARMConstantPoolConstant((Type*)Type::getInt32Ty(GV->getContext()), 136 GV, 0, ARMCP::CPValue, 0, 137 Modifier, false); 138} 139 140ARMConstantPoolConstant * 141ARMConstantPoolConstant::Create(const Constant *C, unsigned ID, 142 ARMCP::ARMCPKind Kind, unsigned char PCAdj) { 143 return new ARMConstantPoolConstant(C, ID, Kind, PCAdj, 144 ARMCP::no_modifier, false); 145} 146 147ARMConstantPoolConstant * 148ARMConstantPoolConstant::Create(const Constant *C, unsigned ID, 149 ARMCP::ARMCPKind Kind, unsigned char PCAdj, 150 ARMCP::ARMCPModifier Modifier, 151 bool AddCurrentAddress) { 152 return new ARMConstantPoolConstant(C, ID, Kind, PCAdj, Modifier, 153 AddCurrentAddress); 154} 155 156const GlobalValue *ARMConstantPoolConstant::getGV() const { 157 return dyn_cast_or_null<GlobalValue>(CVal); 158} 159 160const BlockAddress *ARMConstantPoolConstant::getBlockAddress() const { 161 return dyn_cast_or_null<BlockAddress>(CVal); 162} 163 164int ARMConstantPoolConstant::getExistingMachineCPValue(MachineConstantPool *CP, 165 unsigned Alignment) { 166 return getExistingMachineCPValueImpl<ARMConstantPoolConstant>(CP, Alignment); 167} 168 169bool ARMConstantPoolConstant::hasSameValue(ARMConstantPoolValue *ACPV) { 170 const ARMConstantPoolConstant *ACPC = dyn_cast<ARMConstantPoolConstant>(ACPV); 171 return ACPC && ACPC->CVal == CVal && ARMConstantPoolValue::hasSameValue(ACPV); 172} 173 174void ARMConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 175 ID.AddPointer(CVal); 176 ARMConstantPoolValue::addSelectionDAGCSEId(ID); 177} 178 179void ARMConstantPoolConstant::print(raw_ostream &O) const { 180 O << CVal->getName(); 181 ARMConstantPoolValue::print(O); 182} 183 184//===----------------------------------------------------------------------===// 185// ARMConstantPoolSymbol 186//===----------------------------------------------------------------------===// 187 188ARMConstantPoolSymbol::ARMConstantPoolSymbol(LLVMContext &C, const char *s, 189 unsigned id, 190 unsigned char PCAdj, 191 ARMCP::ARMCPModifier Modifier, 192 bool AddCurrentAddress) 193 : ARMConstantPoolValue(C, id, ARMCP::CPExtSymbol, PCAdj, Modifier, 194 AddCurrentAddress), 195 S(s) {} 196 197ARMConstantPoolSymbol * 198ARMConstantPoolSymbol::Create(LLVMContext &C, const char *s, 199 unsigned ID, unsigned char PCAdj) { 200 return new ARMConstantPoolSymbol(C, s, ID, PCAdj, ARMCP::no_modifier, false); 201} 202 203int ARMConstantPoolSymbol::getExistingMachineCPValue(MachineConstantPool *CP, 204 unsigned Alignment) { 205 return getExistingMachineCPValueImpl<ARMConstantPoolSymbol>(CP, Alignment); 206} 207 208bool ARMConstantPoolSymbol::hasSameValue(ARMConstantPoolValue *ACPV) { 209 const ARMConstantPoolSymbol *ACPS = dyn_cast<ARMConstantPoolSymbol>(ACPV); 210 return ACPS && ACPS->S == S && ARMConstantPoolValue::hasSameValue(ACPV); 211} 212 213void ARMConstantPoolSymbol::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 214 ID.AddString(S); 215 ARMConstantPoolValue::addSelectionDAGCSEId(ID); 216} 217 218void ARMConstantPoolSymbol::print(raw_ostream &O) const { 219 O << S; 220 ARMConstantPoolValue::print(O); 221} 222 223//===----------------------------------------------------------------------===// 224// ARMConstantPoolMBB 225//===----------------------------------------------------------------------===// 226 227ARMConstantPoolMBB::ARMConstantPoolMBB(LLVMContext &C, 228 const MachineBasicBlock *mbb, 229 unsigned id, unsigned char PCAdj, 230 ARMCP::ARMCPModifier Modifier, 231 bool AddCurrentAddress) 232 : ARMConstantPoolValue(C, id, ARMCP::CPMachineBasicBlock, PCAdj, 233 Modifier, AddCurrentAddress), 234 MBB(mbb) {} 235 236ARMConstantPoolMBB *ARMConstantPoolMBB::Create(LLVMContext &C, 237 const MachineBasicBlock *mbb, 238 unsigned ID, 239 unsigned char PCAdj) { 240 return new ARMConstantPoolMBB(C, mbb, ID, PCAdj, ARMCP::no_modifier, false); 241} 242 243int ARMConstantPoolMBB::getExistingMachineCPValue(MachineConstantPool *CP, 244 unsigned Alignment) { 245 return getExistingMachineCPValueImpl<ARMConstantPoolMBB>(CP, Alignment); 246} 247 248bool ARMConstantPoolMBB::hasSameValue(ARMConstantPoolValue *ACPV) { 249 const ARMConstantPoolMBB *ACPMBB = dyn_cast<ARMConstantPoolMBB>(ACPV); 250 return ACPMBB && ACPMBB->MBB == MBB && 251 ARMConstantPoolValue::hasSameValue(ACPV); 252} 253 254void ARMConstantPoolMBB::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 255 ID.AddPointer(MBB); 256 ARMConstantPoolValue::addSelectionDAGCSEId(ID); 257} 258 259void ARMConstantPoolMBB::print(raw_ostream &O) const { 260 O << "BB#" << MBB->getNumber(); 261 ARMConstantPoolValue::print(O); 262} 263