131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- ARMConstantPoolValue.cpp - ARM constantpool value -----------------===// 2a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 3a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// The LLVM Compiler Infrastructure 4a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 8a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===// 9a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 10a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// This file implements the ARM specific constantpool value class. 11a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 12a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===// 13a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 14a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "ARMConstantPoolValue.h" 15a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "llvm/ADT/FoldingSet.h" 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineBasicBlock.h" 170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constant.h" 180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h" 190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalValue.h" 200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h" 21944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner#include "llvm/Support/raw_ostream.h" 22f128787f941bb372e80d69b786ed144d8606a292Jim Grosbach#include <cstdlib> 23a8e2989ece6dc46df59b0768184028257f913843Evan Chengusing namespace llvm; 24a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 25f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling//===----------------------------------------------------------------------===// 26f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling// ARMConstantPoolValue 27f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling//===----------------------------------------------------------------------===// 28f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 29f2b76aae2beec4780c271984070ad15a07bd2d50Bill WendlingARMConstantPoolValue::ARMConstantPoolValue(Type *Ty, unsigned id, 30f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ARMCP::ARMCPKind kind, 31f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling unsigned char PCAdj, 32f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ARMCP::ARMCPModifier modifier, 33f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling bool addCurrentAddress) 343320f2a3bfd4daec23ba7ceb50525140cc6316daBill Wendling : MachineConstantPoolValue(Ty), LabelId(id), Kind(kind), 353e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling PCAdjust(PCAdj), Modifier(modifier), 363e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling AddCurrentAddress(addCurrentAddress) {} 37f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 38ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill WendlingARMConstantPoolValue::ARMConstantPoolValue(LLVMContext &C, unsigned id, 39ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMCP::ARMCPKind kind, 40ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling unsigned char PCAdj, 41ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMCP::ARMCPModifier modifier, 42ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling bool addCurrentAddress) 43ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling : MachineConstantPoolValue((Type*)Type::getInt32Ty(C)), 449aca75c4f8249abf8ba2e558bbd1ae7cdfc6b81fBill Wendling LabelId(id), Kind(kind), PCAdjust(PCAdj), Modifier(modifier), 45ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling AddCurrentAddress(addCurrentAddress) {} 46ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 479aca75c4f8249abf8ba2e558bbd1ae7cdfc6b81fBill WendlingARMConstantPoolValue::~ARMConstantPoolValue() {} 48ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 49d98f838284b7c539f274bb21820b2df3588a295eBill Wendlingconst char *ARMConstantPoolValue::getModifierText() const { 50d98f838284b7c539f274bb21820b2df3588a295eBill Wendling switch (Modifier) { 51d98f838284b7c539f274bb21820b2df3588a295eBill Wendling // FIXME: Are these case sensitive? It'd be nice to lower-case all the 52d98f838284b7c539f274bb21820b2df3588a295eBill Wendling // strings if that's legal. 53d98f838284b7c539f274bb21820b2df3588a295eBill Wendling case ARMCP::no_modifier: return "none"; 54d98f838284b7c539f274bb21820b2df3588a295eBill Wendling case ARMCP::TLSGD: return "tlsgd"; 55d98f838284b7c539f274bb21820b2df3588a295eBill Wendling case ARMCP::GOT: return "GOT"; 56d98f838284b7c539f274bb21820b2df3588a295eBill Wendling case ARMCP::GOTOFF: return "GOTOFF"; 57d98f838284b7c539f274bb21820b2df3588a295eBill Wendling case ARMCP::GOTTPOFF: return "gottpoff"; 58d98f838284b7c539f274bb21820b2df3588a295eBill Wendling case ARMCP::TPOFF: return "tpoff"; 59d98f838284b7c539f274bb21820b2df3588a295eBill Wendling } 602dd674fdce68f8fd59d78a3bbab2cf5b8d220290David Blaikie llvm_unreachable("Unknown modifier!"); 61d98f838284b7c539f274bb21820b2df3588a295eBill Wendling} 62d98f838284b7c539f274bb21820b2df3588a295eBill Wendling 63a8e2989ece6dc46df59b0768184028257f913843Evan Chengint ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP, 64a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned Alignment) { 65bc2198133a1836598b54b943420748e75d5dea94Craig Topper llvm_unreachable("Shouldn't be calling this directly!"); 66a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 67a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 68a8e2989ece6dc46df59b0768184028257f913843Evan Chengvoid 695405d58e21402a8ba3aaaa580ca65155bee00443Jim GrosbachARMConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 70a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ID.AddInteger(LabelId); 71a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ID.AddInteger(PCAdjust); 72a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 73a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 7478e5c1140adc926e7c004748c1c912bfddd875b4Evan Chengbool 7578e5c1140adc926e7c004748c1c912bfddd875b4Evan ChengARMConstantPoolValue::hasSameValue(ARMConstantPoolValue *ACPV) { 7678e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng if (ACPV->Kind == Kind && 7778e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng ACPV->PCAdjust == PCAdjust && 783a2429a86c50a89c3321c741b85fa7d1fe668b38Jim Grosbach ACPV->Modifier == Modifier) { 7978e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng if (ACPV->LabelId == LabelId) 8078e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng return true; 8178e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng // Two PC relative constpool entries containing the same GV address or 8278e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng // external symbols. FIXME: What about blockaddress? 8378e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng if (Kind == ARMCP::CPValue || Kind == ARMCP::CPExtSymbol) 8478e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng return true; 8578e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng } 8678e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng return false; 8778e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng} 8878e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng 895be59eace58e5a92bb851c4885f9cea7236ac30fEvan Chengvoid ARMConstantPoolValue::dump() const { 90705e07f578e2b3af47ddab610feb4e7f2d3063a5Chris Lattner errs() << " " << *this; 915be59eace58e5a92bb851c4885f9cea7236ac30fEvan Cheng} 925be59eace58e5a92bb851c4885f9cea7236ac30fEvan Cheng 93944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattnervoid ARMConstantPoolValue::print(raw_ostream &O) const { 943a2429a86c50a89c3321c741b85fa7d1fe668b38Jim Grosbach if (Modifier) O << "(" << getModifierText() << ")"; 9564f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio if (PCAdjust != 0) { 9625e04788bfddc54dde7bed65302146b46089a166Evan Cheng O << "-(LPC" << LabelId << "+" << (unsigned)PCAdjust; 9725e04788bfddc54dde7bed65302146b46089a166Evan Cheng if (AddCurrentAddress) O << "-."; 9864f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio O << ")"; 9964f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio } 100a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 101f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 102f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling//===----------------------------------------------------------------------===// 103f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling// ARMConstantPoolConstant 104f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling//===----------------------------------------------------------------------===// 105f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 1063e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill WendlingARMConstantPoolConstant::ARMConstantPoolConstant(Type *Ty, 1073e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling const Constant *C, 1083e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling unsigned ID, 1093e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling ARMCP::ARMCPKind Kind, 1103e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling unsigned char PCAdj, 1113e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling ARMCP::ARMCPModifier Modifier, 1123e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling bool AddCurrentAddress) 1133e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling : ARMConstantPoolValue(Ty, ID, Kind, PCAdj, Modifier, AddCurrentAddress), 1143e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling CVal(C) {} 1153e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling 116f2b76aae2beec4780c271984070ad15a07bd2d50Bill WendlingARMConstantPoolConstant::ARMConstantPoolConstant(const Constant *C, 117f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling unsigned ID, 118f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ARMCP::ARMCPKind Kind, 119f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling unsigned char PCAdj, 120f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ARMCP::ARMCPModifier Modifier, 121f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling bool AddCurrentAddress) 122f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling : ARMConstantPoolValue((Type*)C->getType(), ID, Kind, PCAdj, Modifier, 123f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling AddCurrentAddress), 124f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling CVal(C) {} 125f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 126f2b76aae2beec4780c271984070ad15a07bd2d50Bill WendlingARMConstantPoolConstant * 127f2b76aae2beec4780c271984070ad15a07bd2d50Bill WendlingARMConstantPoolConstant::Create(const Constant *C, unsigned ID) { 128f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling return new ARMConstantPoolConstant(C, ID, ARMCP::CPValue, 0, 129f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ARMCP::no_modifier, false); 130f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling} 131f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 132029e93888d2ce07f4a81d2a927fd2e3cfe673afdBill WendlingARMConstantPoolConstant * 1333e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill WendlingARMConstantPoolConstant::Create(const GlobalValue *GV, 1343e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling ARMCP::ARMCPModifier Modifier) { 1353e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return new ARMConstantPoolConstant((Type*)Type::getInt32Ty(GV->getContext()), 1363e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling GV, 0, ARMCP::CPValue, 0, 1373e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling Modifier, false); 1383e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling} 1393e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling 1403e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill WendlingARMConstantPoolConstant * 141029e93888d2ce07f4a81d2a927fd2e3cfe673afdBill WendlingARMConstantPoolConstant::Create(const Constant *C, unsigned ID, 142029e93888d2ce07f4a81d2a927fd2e3cfe673afdBill Wendling ARMCP::ARMCPKind Kind, unsigned char PCAdj) { 143029e93888d2ce07f4a81d2a927fd2e3cfe673afdBill Wendling return new ARMConstantPoolConstant(C, ID, Kind, PCAdj, 144029e93888d2ce07f4a81d2a927fd2e3cfe673afdBill Wendling ARMCP::no_modifier, false); 145029e93888d2ce07f4a81d2a927fd2e3cfe673afdBill Wendling} 146029e93888d2ce07f4a81d2a927fd2e3cfe673afdBill Wendling 1473e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill WendlingARMConstantPoolConstant * 1483e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill WendlingARMConstantPoolConstant::Create(const Constant *C, unsigned ID, 1493e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling ARMCP::ARMCPKind Kind, unsigned char PCAdj, 1503e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling ARMCP::ARMCPModifier Modifier, 1513e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling bool AddCurrentAddress) { 1523e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return new ARMConstantPoolConstant(C, ID, Kind, PCAdj, Modifier, 1533e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling AddCurrentAddress); 1543e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling} 1553e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling 156f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendlingconst GlobalValue *ARMConstantPoolConstant::getGV() const { 1573e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return dyn_cast_or_null<GlobalValue>(CVal); 1583e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling} 1593e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling 1603e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendlingconst BlockAddress *ARMConstantPoolConstant::getBlockAddress() const { 1613e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return dyn_cast_or_null<BlockAddress>(CVal); 1623e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling} 1633e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling 1643e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendlingint ARMConstantPoolConstant::getExistingMachineCPValue(MachineConstantPool *CP, 1653e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling unsigned Alignment) { 1669bc7603750926c15648dae0d31a5451861a0d11eBenjamin Kramer return getExistingMachineCPValueImpl<ARMConstantPoolConstant>(CP, Alignment); 167f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling} 168f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 169f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendlingbool ARMConstantPoolConstant::hasSameValue(ARMConstantPoolValue *ACPV) { 170f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling const ARMConstantPoolConstant *ACPC = dyn_cast<ARMConstantPoolConstant>(ACPV); 1713e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return ACPC && ACPC->CVal == CVal && ARMConstantPoolValue::hasSameValue(ACPV); 172f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling} 173f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 174f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendlingvoid ARMConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 175f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ID.AddPointer(CVal); 176f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ARMConstantPoolValue::addSelectionDAGCSEId(ID); 177f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling} 178f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 179f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendlingvoid ARMConstantPoolConstant::print(raw_ostream &O) const { 180f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling O << CVal->getName(); 181f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ARMConstantPoolValue::print(O); 182f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling} 183ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 184ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling//===----------------------------------------------------------------------===// 185ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling// ARMConstantPoolSymbol 186ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling//===----------------------------------------------------------------------===// 187ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 188ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill WendlingARMConstantPoolSymbol::ARMConstantPoolSymbol(LLVMContext &C, const char *s, 189ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling unsigned id, 190ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling unsigned char PCAdj, 191ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMCP::ARMCPModifier Modifier, 192ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling bool AddCurrentAddress) 193ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling : ARMConstantPoolValue(C, id, ARMCP::CPExtSymbol, PCAdj, Modifier, 194ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling AddCurrentAddress), 195791dbb3e5fbe5910b84e3f2bd26cf272e2bde128Benjamin Kramer S(s) {} 196ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 197ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill WendlingARMConstantPoolSymbol * 198ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill WendlingARMConstantPoolSymbol::Create(LLVMContext &C, const char *s, 199fe31e673506ef9a1080eaa684b43b34178c6f447Bill Wendling unsigned ID, unsigned char PCAdj) { 200fe31e673506ef9a1080eaa684b43b34178c6f447Bill Wendling return new ARMConstantPoolSymbol(C, s, ID, PCAdj, ARMCP::no_modifier, false); 201fe31e673506ef9a1080eaa684b43b34178c6f447Bill Wendling} 202fe31e673506ef9a1080eaa684b43b34178c6f447Bill Wendling 203ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendlingint ARMConstantPoolSymbol::getExistingMachineCPValue(MachineConstantPool *CP, 204ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling unsigned Alignment) { 2059bc7603750926c15648dae0d31a5451861a0d11eBenjamin Kramer return getExistingMachineCPValueImpl<ARMConstantPoolSymbol>(CP, Alignment); 206ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling} 207ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 208ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendlingbool ARMConstantPoolSymbol::hasSameValue(ARMConstantPoolValue *ACPV) { 209ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling const ARMConstantPoolSymbol *ACPS = dyn_cast<ARMConstantPoolSymbol>(ACPV); 210791dbb3e5fbe5910b84e3f2bd26cf272e2bde128Benjamin Kramer return ACPS && ACPS->S == S && ARMConstantPoolValue::hasSameValue(ACPV); 211ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling} 212ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 213ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendlingvoid ARMConstantPoolSymbol::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 214791dbb3e5fbe5910b84e3f2bd26cf272e2bde128Benjamin Kramer ID.AddString(S); 215ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMConstantPoolValue::addSelectionDAGCSEId(ID); 216ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling} 217ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 218ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendlingvoid ARMConstantPoolSymbol::print(raw_ostream &O) const { 219ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling O << S; 220ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMConstantPoolValue::print(O); 221ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling} 2229c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2239c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling//===----------------------------------------------------------------------===// 2249c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling// ARMConstantPoolMBB 2259c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling//===----------------------------------------------------------------------===// 2269c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2273320f2a3bfd4daec23ba7ceb50525140cc6316daBill WendlingARMConstantPoolMBB::ARMConstantPoolMBB(LLVMContext &C, 2283320f2a3bfd4daec23ba7ceb50525140cc6316daBill Wendling const MachineBasicBlock *mbb, 2299c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling unsigned id, unsigned char PCAdj, 2309c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMCP::ARMCPModifier Modifier, 2319c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling bool AddCurrentAddress) 2323320f2a3bfd4daec23ba7ceb50525140cc6316daBill Wendling : ARMConstantPoolValue(C, id, ARMCP::CPMachineBasicBlock, PCAdj, 2339c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling Modifier, AddCurrentAddress), 2349c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling MBB(mbb) {} 2359c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2369c18f51daaf89b9c706aa0557bede2cbb0debb69Bill WendlingARMConstantPoolMBB *ARMConstantPoolMBB::Create(LLVMContext &C, 2373320f2a3bfd4daec23ba7ceb50525140cc6316daBill Wendling const MachineBasicBlock *mbb, 2389c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling unsigned ID, 2399c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling unsigned char PCAdj) { 2409c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling return new ARMConstantPoolMBB(C, mbb, ID, PCAdj, ARMCP::no_modifier, false); 2419c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 2429c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2439c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendlingint ARMConstantPoolMBB::getExistingMachineCPValue(MachineConstantPool *CP, 2449c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling unsigned Alignment) { 2459bc7603750926c15648dae0d31a5451861a0d11eBenjamin Kramer return getExistingMachineCPValueImpl<ARMConstantPoolMBB>(CP, Alignment); 2469c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 2479c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2489c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendlingbool ARMConstantPoolMBB::hasSameValue(ARMConstantPoolValue *ACPV) { 2499c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling const ARMConstantPoolMBB *ACPMBB = dyn_cast<ARMConstantPoolMBB>(ACPV); 2509c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling return ACPMBB && ACPMBB->MBB == MBB && 2519c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMConstantPoolValue::hasSameValue(ACPV); 2529c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 2539c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2549c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendlingvoid ARMConstantPoolMBB::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 2559c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ID.AddPointer(MBB); 2569c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMConstantPoolValue::addSelectionDAGCSEId(ID); 2579c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 2589c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2599c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendlingvoid ARMConstantPoolMBB::print(raw_ostream &O) const { 260aed4952753e2af9e93dde0b18a4ca8af73ec6db5Evan Cheng O << "BB#" << MBB->getNumber(); 2619c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMConstantPoolValue::print(O); 2629c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 263