ARMConstantPoolValue.cpp revision 405ca137a1bf5b08fbda3ba086fb013537ce8662
1a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===- ARMConstantPoolValue.cpp - ARM constantpool value --------*- C++ -*-===// 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" 1628989a8ddc665dce4dde368e8c000a5769871b63Bob Wilson#include "llvm/Constant.h" 1728989a8ddc665dce4dde368e8c000a5769871b63Bob Wilson#include "llvm/Constants.h" 18a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "llvm/GlobalValue.h" 19c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng#include "llvm/Type.h" 204dd9b091cceaa62f72ed8370f8a946fbe474d8a2Bill Wendling#include "llvm/CodeGen/MachineBasicBlock.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 default: llvm_unreachable("Unknown modifier!"); 52d98f838284b7c539f274bb21820b2df3588a295eBill Wendling // FIXME: Are these case sensitive? It'd be nice to lower-case all the 53d98f838284b7c539f274bb21820b2df3588a295eBill Wendling // strings if that's legal. 54d98f838284b7c539f274bb21820b2df3588a295eBill Wendling case ARMCP::no_modifier: return "none"; 55d98f838284b7c539f274bb21820b2df3588a295eBill Wendling case ARMCP::TLSGD: return "tlsgd"; 56d98f838284b7c539f274bb21820b2df3588a295eBill Wendling case ARMCP::GOT: return "GOT"; 57d98f838284b7c539f274bb21820b2df3588a295eBill Wendling case ARMCP::GOTOFF: return "GOTOFF"; 58d98f838284b7c539f274bb21820b2df3588a295eBill Wendling case ARMCP::GOTTPOFF: return "gottpoff"; 59d98f838284b7c539f274bb21820b2df3588a295eBill Wendling case ARMCP::TPOFF: return "tpoff"; 60d98f838284b7c539f274bb21820b2df3588a295eBill Wendling } 61d98f838284b7c539f274bb21820b2df3588a295eBill Wendling} 62d98f838284b7c539f274bb21820b2df3588a295eBill Wendling 63a8e2989ece6dc46df59b0768184028257f913843Evan Chengint ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP, 64a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned Alignment) { 651606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned AlignMask = Alignment - 1; 66a8e2989ece6dc46df59b0768184028257f913843Evan Cheng const std::vector<MachineConstantPoolEntry> Constants = CP->getConstants(); 67a8e2989ece6dc46df59b0768184028257f913843Evan Cheng for (unsigned i = 0, e = Constants.size(); i != e; ++i) { 68a8e2989ece6dc46df59b0768184028257f913843Evan Cheng if (Constants[i].isMachineConstantPoolEntry() && 691606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng (Constants[i].getAlignment() & AlignMask) == 0) { 70a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ARMConstantPoolValue *CPV = 71a8e2989ece6dc46df59b0768184028257f913843Evan Cheng (ARMConstantPoolValue *)Constants[i].Val.MachineCPVal; 72405ca137a1bf5b08fbda3ba086fb013537ce8662Bill Wendling if (this->equals(CPV)) 73a8e2989ece6dc46df59b0768184028257f913843Evan Cheng return i; 74a8e2989ece6dc46df59b0768184028257f913843Evan Cheng } 75a8e2989ece6dc46df59b0768184028257f913843Evan Cheng } 76a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 77a8e2989ece6dc46df59b0768184028257f913843Evan Cheng return -1; 78a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 79a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 80a8e2989ece6dc46df59b0768184028257f913843Evan Chengvoid 815405d58e21402a8ba3aaaa580ca65155bee00443Jim GrosbachARMConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 82a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ID.AddInteger(LabelId); 83a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ID.AddInteger(PCAdjust); 84a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 85a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 8678e5c1140adc926e7c004748c1c912bfddd875b4Evan Chengbool 8778e5c1140adc926e7c004748c1c912bfddd875b4Evan ChengARMConstantPoolValue::hasSameValue(ARMConstantPoolValue *ACPV) { 8878e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng if (ACPV->Kind == Kind && 8978e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng ACPV->PCAdjust == PCAdjust && 903a2429a86c50a89c3321c741b85fa7d1fe668b38Jim Grosbach ACPV->Modifier == Modifier) { 9178e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng if (ACPV->LabelId == LabelId) 9278e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng return true; 9378e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng // Two PC relative constpool entries containing the same GV address or 9478e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng // external symbols. FIXME: What about blockaddress? 9578e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng if (Kind == ARMCP::CPValue || Kind == ARMCP::CPExtSymbol) 9678e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng return true; 9778e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng } 9878e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng return false; 9978e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng} 10078e5c1140adc926e7c004748c1c912bfddd875b4Evan Cheng 1015be59eace58e5a92bb851c4885f9cea7236ac30fEvan Chengvoid ARMConstantPoolValue::dump() const { 102705e07f578e2b3af47ddab610feb4e7f2d3063a5Chris Lattner errs() << " " << *this; 1035be59eace58e5a92bb851c4885f9cea7236ac30fEvan Cheng} 1045be59eace58e5a92bb851c4885f9cea7236ac30fEvan Cheng 105944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattnervoid ARMConstantPoolValue::print(raw_ostream &O) const { 1063a2429a86c50a89c3321c741b85fa7d1fe668b38Jim Grosbach if (Modifier) O << "(" << getModifierText() << ")"; 10764f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio if (PCAdjust != 0) { 10825e04788bfddc54dde7bed65302146b46089a166Evan Cheng O << "-(LPC" << LabelId << "+" << (unsigned)PCAdjust; 10925e04788bfddc54dde7bed65302146b46089a166Evan Cheng if (AddCurrentAddress) O << "-."; 11064f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio O << ")"; 11164f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio } 112a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 113f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 114f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling//===----------------------------------------------------------------------===// 115f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling// ARMConstantPoolConstant 116f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling//===----------------------------------------------------------------------===// 117f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 1183e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill WendlingARMConstantPoolConstant::ARMConstantPoolConstant(Type *Ty, 1193e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling const Constant *C, 1203e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling unsigned ID, 1213e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling ARMCP::ARMCPKind Kind, 1223e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling unsigned char PCAdj, 1233e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling ARMCP::ARMCPModifier Modifier, 1243e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling bool AddCurrentAddress) 1253e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling : ARMConstantPoolValue(Ty, ID, Kind, PCAdj, Modifier, AddCurrentAddress), 1263e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling CVal(C) {} 1273e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling 128f2b76aae2beec4780c271984070ad15a07bd2d50Bill WendlingARMConstantPoolConstant::ARMConstantPoolConstant(const Constant *C, 129f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling unsigned ID, 130f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ARMCP::ARMCPKind Kind, 131f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling unsigned char PCAdj, 132f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ARMCP::ARMCPModifier Modifier, 133f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling bool AddCurrentAddress) 134f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling : ARMConstantPoolValue((Type*)C->getType(), ID, Kind, PCAdj, Modifier, 135f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling AddCurrentAddress), 136f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling CVal(C) {} 137f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 138f2b76aae2beec4780c271984070ad15a07bd2d50Bill WendlingARMConstantPoolConstant * 139f2b76aae2beec4780c271984070ad15a07bd2d50Bill WendlingARMConstantPoolConstant::Create(const Constant *C, unsigned ID) { 140f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling return new ARMConstantPoolConstant(C, ID, ARMCP::CPValue, 0, 141f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ARMCP::no_modifier, false); 142f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling} 143f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 144029e93888d2ce07f4a81d2a927fd2e3cfe673afdBill WendlingARMConstantPoolConstant * 1453e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill WendlingARMConstantPoolConstant::Create(const GlobalValue *GV, 1463e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling ARMCP::ARMCPModifier Modifier) { 1473e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return new ARMConstantPoolConstant((Type*)Type::getInt32Ty(GV->getContext()), 1483e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling GV, 0, ARMCP::CPValue, 0, 1493e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling Modifier, false); 1503e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling} 1513e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling 1523e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill WendlingARMConstantPoolConstant * 153029e93888d2ce07f4a81d2a927fd2e3cfe673afdBill WendlingARMConstantPoolConstant::Create(const Constant *C, unsigned ID, 154029e93888d2ce07f4a81d2a927fd2e3cfe673afdBill Wendling ARMCP::ARMCPKind Kind, unsigned char PCAdj) { 155029e93888d2ce07f4a81d2a927fd2e3cfe673afdBill Wendling return new ARMConstantPoolConstant(C, ID, Kind, PCAdj, 156029e93888d2ce07f4a81d2a927fd2e3cfe673afdBill Wendling ARMCP::no_modifier, false); 157029e93888d2ce07f4a81d2a927fd2e3cfe673afdBill Wendling} 158029e93888d2ce07f4a81d2a927fd2e3cfe673afdBill Wendling 1593e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill WendlingARMConstantPoolConstant * 1603e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill WendlingARMConstantPoolConstant::Create(const Constant *C, unsigned ID, 1613e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling ARMCP::ARMCPKind Kind, unsigned char PCAdj, 1623e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling ARMCP::ARMCPModifier Modifier, 1633e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling bool AddCurrentAddress) { 1643e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return new ARMConstantPoolConstant(C, ID, Kind, PCAdj, Modifier, 1653e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling AddCurrentAddress); 1663e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling} 1673e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling 168f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendlingconst GlobalValue *ARMConstantPoolConstant::getGV() const { 1693e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return dyn_cast_or_null<GlobalValue>(CVal); 1703e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling} 1713e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling 1723e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendlingconst BlockAddress *ARMConstantPoolConstant::getBlockAddress() const { 1733e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return dyn_cast_or_null<BlockAddress>(CVal); 1743e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling} 1753e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling 1763e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendlingint ARMConstantPoolConstant::getExistingMachineCPValue(MachineConstantPool *CP, 1773e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling unsigned Alignment) { 1783e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling unsigned AlignMask = Alignment - 1; 1793e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling const std::vector<MachineConstantPoolEntry> Constants = CP->getConstants(); 1803e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling for (unsigned i = 0, e = Constants.size(); i != e; ++i) { 1813e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling if (Constants[i].isMachineConstantPoolEntry() && 1823e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling (Constants[i].getAlignment() & AlignMask) == 0) { 1833e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling ARMConstantPoolValue *CPV = 1843e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling (ARMConstantPoolValue *)Constants[i].Val.MachineCPVal; 1853e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling ARMConstantPoolConstant *APC = dyn_cast<ARMConstantPoolConstant>(CPV); 1863e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling if (!APC) continue; 187405ca137a1bf5b08fbda3ba086fb013537ce8662Bill Wendling if (APC->CVal == CVal && equals(APC)) 1883e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return i; 1893e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling } 1903e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling } 1913e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling 1923e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return -1; 193f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling} 194f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 195f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendlingbool ARMConstantPoolConstant::hasSameValue(ARMConstantPoolValue *ACPV) { 196f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling const ARMConstantPoolConstant *ACPC = dyn_cast<ARMConstantPoolConstant>(ACPV); 1973e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return ACPC && ACPC->CVal == CVal && ARMConstantPoolValue::hasSameValue(ACPV); 198f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling} 199f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 200f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendlingvoid ARMConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 201f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ID.AddPointer(CVal); 202f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ARMConstantPoolValue::addSelectionDAGCSEId(ID); 203f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling} 204f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 205f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendlingvoid ARMConstantPoolConstant::print(raw_ostream &O) const { 206f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling O << CVal->getName(); 207f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ARMConstantPoolValue::print(O); 208f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling} 209ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 210ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling//===----------------------------------------------------------------------===// 211ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling// ARMConstantPoolSymbol 212ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling//===----------------------------------------------------------------------===// 213ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 214ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill WendlingARMConstantPoolSymbol::ARMConstantPoolSymbol(LLVMContext &C, const char *s, 215ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling unsigned id, 216ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling unsigned char PCAdj, 217ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMCP::ARMCPModifier Modifier, 218ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling bool AddCurrentAddress) 219ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling : ARMConstantPoolValue(C, id, ARMCP::CPExtSymbol, PCAdj, Modifier, 220ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling AddCurrentAddress), 221ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling S(strdup(s)) {} 222ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 223ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill WendlingARMConstantPoolSymbol::~ARMConstantPoolSymbol() { 224ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling free((void*)S); 225ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling} 226ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 227ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill WendlingARMConstantPoolSymbol * 228ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill WendlingARMConstantPoolSymbol::Create(LLVMContext &C, const char *s, 229fe31e673506ef9a1080eaa684b43b34178c6f447Bill Wendling unsigned ID, unsigned char PCAdj) { 230fe31e673506ef9a1080eaa684b43b34178c6f447Bill Wendling return new ARMConstantPoolSymbol(C, s, ID, PCAdj, ARMCP::no_modifier, false); 231fe31e673506ef9a1080eaa684b43b34178c6f447Bill Wendling} 232fe31e673506ef9a1080eaa684b43b34178c6f447Bill Wendling 2339aca75c4f8249abf8ba2e558bbd1ae7cdfc6b81fBill Wendlingstatic bool CPV_streq(const char *S1, const char *S2) { 2349aca75c4f8249abf8ba2e558bbd1ae7cdfc6b81fBill Wendling if (S1 == S2) 2359aca75c4f8249abf8ba2e558bbd1ae7cdfc6b81fBill Wendling return true; 2369aca75c4f8249abf8ba2e558bbd1ae7cdfc6b81fBill Wendling if (S1 && S2 && strcmp(S1, S2) == 0) 2379aca75c4f8249abf8ba2e558bbd1ae7cdfc6b81fBill Wendling return true; 2389aca75c4f8249abf8ba2e558bbd1ae7cdfc6b81fBill Wendling return false; 2399aca75c4f8249abf8ba2e558bbd1ae7cdfc6b81fBill Wendling} 2409aca75c4f8249abf8ba2e558bbd1ae7cdfc6b81fBill Wendling 241ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendlingint ARMConstantPoolSymbol::getExistingMachineCPValue(MachineConstantPool *CP, 242ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling unsigned Alignment) { 243ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling unsigned AlignMask = Alignment - 1; 244ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling const std::vector<MachineConstantPoolEntry> Constants = CP->getConstants(); 245ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling for (unsigned i = 0, e = Constants.size(); i != e; ++i) { 246ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling if (Constants[i].isMachineConstantPoolEntry() && 247ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling (Constants[i].getAlignment() & AlignMask) == 0) { 248ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMConstantPoolValue *CPV = 249ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling (ARMConstantPoolValue *)Constants[i].Val.MachineCPVal; 250ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMConstantPoolSymbol *APS = dyn_cast<ARMConstantPoolSymbol>(CPV); 251ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling if (!APS) continue; 252ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 253405ca137a1bf5b08fbda3ba086fb013537ce8662Bill Wendling if (CPV_streq(APS->S, S) && equals(APS)) 254ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling return i; 255ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling } 256ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling } 257ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 258ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling return -1; 259ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling} 260ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 261ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendlingbool ARMConstantPoolSymbol::hasSameValue(ARMConstantPoolValue *ACPV) { 262ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling const ARMConstantPoolSymbol *ACPS = dyn_cast<ARMConstantPoolSymbol>(ACPV); 263ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling return ACPS && CPV_streq(ACPS->S, S) && 264ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMConstantPoolValue::hasSameValue(ACPV); 265ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling} 266ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 267ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendlingvoid ARMConstantPoolSymbol::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 268ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ID.AddPointer(S); 269ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMConstantPoolValue::addSelectionDAGCSEId(ID); 270ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling} 271ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 272ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendlingvoid ARMConstantPoolSymbol::print(raw_ostream &O) const { 273ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling O << S; 274ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMConstantPoolValue::print(O); 275ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling} 2769c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2779c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling//===----------------------------------------------------------------------===// 2789c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling// ARMConstantPoolMBB 2799c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling//===----------------------------------------------------------------------===// 2809c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2813320f2a3bfd4daec23ba7ceb50525140cc6316daBill WendlingARMConstantPoolMBB::ARMConstantPoolMBB(LLVMContext &C, 2823320f2a3bfd4daec23ba7ceb50525140cc6316daBill Wendling const MachineBasicBlock *mbb, 2839c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling unsigned id, unsigned char PCAdj, 2849c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMCP::ARMCPModifier Modifier, 2859c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling bool AddCurrentAddress) 2863320f2a3bfd4daec23ba7ceb50525140cc6316daBill Wendling : ARMConstantPoolValue(C, id, ARMCP::CPMachineBasicBlock, PCAdj, 2879c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling Modifier, AddCurrentAddress), 2889c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling MBB(mbb) {} 2899c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2909c18f51daaf89b9c706aa0557bede2cbb0debb69Bill WendlingARMConstantPoolMBB *ARMConstantPoolMBB::Create(LLVMContext &C, 2913320f2a3bfd4daec23ba7ceb50525140cc6316daBill Wendling const MachineBasicBlock *mbb, 2929c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling unsigned ID, 2939c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling unsigned char PCAdj) { 2949c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling return new ARMConstantPoolMBB(C, mbb, ID, PCAdj, ARMCP::no_modifier, false); 2959c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 2969c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2979c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendlingint ARMConstantPoolMBB::getExistingMachineCPValue(MachineConstantPool *CP, 2989c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling unsigned Alignment) { 2999c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling unsigned AlignMask = Alignment - 1; 3009c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling const std::vector<MachineConstantPoolEntry> Constants = CP->getConstants(); 3019c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling for (unsigned i = 0, e = Constants.size(); i != e; ++i) { 3029c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling if (Constants[i].isMachineConstantPoolEntry() && 3039c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling (Constants[i].getAlignment() & AlignMask) == 0) { 3049c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMConstantPoolValue *CPV = 3059c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling (ARMConstantPoolValue *)Constants[i].Val.MachineCPVal; 3069c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMConstantPoolMBB *APMBB = dyn_cast<ARMConstantPoolMBB>(CPV); 3079c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling if (!APMBB) continue; 3089c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 309405ca137a1bf5b08fbda3ba086fb013537ce8662Bill Wendling if (APMBB->MBB == MBB && equals(APMBB)) 3109c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling return i; 3119c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling } 3129c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling } 3139c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 3149c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling return -1; 3159c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 3169c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 3179c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendlingbool ARMConstantPoolMBB::hasSameValue(ARMConstantPoolValue *ACPV) { 3189c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling const ARMConstantPoolMBB *ACPMBB = dyn_cast<ARMConstantPoolMBB>(ACPV); 3199c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling return ACPMBB && ACPMBB->MBB == MBB && 3209c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMConstantPoolValue::hasSameValue(ACPV); 3219c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 3229c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 3239c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendlingvoid ARMConstantPoolMBB::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 3249c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ID.AddPointer(MBB); 3259c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMConstantPoolValue::addSelectionDAGCSEId(ID); 3269c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 3279c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 3289c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendlingvoid ARMConstantPoolMBB::print(raw_ostream &O) const { 3299c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMConstantPoolValue::print(O); 3309c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 331