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) { 1663e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling unsigned AlignMask = Alignment - 1; 1673e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling const std::vector<MachineConstantPoolEntry> Constants = CP->getConstants(); 1683e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling for (unsigned i = 0, e = Constants.size(); i != e; ++i) { 1693e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling if (Constants[i].isMachineConstantPoolEntry() && 1703e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling (Constants[i].getAlignment() & AlignMask) == 0) { 1713e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling ARMConstantPoolValue *CPV = 1723e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling (ARMConstantPoolValue *)Constants[i].Val.MachineCPVal; 1733e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling ARMConstantPoolConstant *APC = dyn_cast<ARMConstantPoolConstant>(CPV); 1743e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling if (!APC) continue; 175405ca137a1bf5b08fbda3ba086fb013537ce8662Bill Wendling if (APC->CVal == CVal && equals(APC)) 1763e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return i; 1773e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling } 1783e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling } 1793e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling 1803e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return -1; 181f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling} 182f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 183f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendlingbool ARMConstantPoolConstant::hasSameValue(ARMConstantPoolValue *ACPV) { 184f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling const ARMConstantPoolConstant *ACPC = dyn_cast<ARMConstantPoolConstant>(ACPV); 1853e944e38ea2d7585d2ccbf1557746d6cf7132b23Bill Wendling return ACPC && ACPC->CVal == CVal && ARMConstantPoolValue::hasSameValue(ACPV); 186f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling} 187f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 188f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendlingvoid ARMConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 189f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ID.AddPointer(CVal); 190f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ARMConstantPoolValue::addSelectionDAGCSEId(ID); 191f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling} 192f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling 193f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendlingvoid ARMConstantPoolConstant::print(raw_ostream &O) const { 194f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling O << CVal->getName(); 195f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling ARMConstantPoolValue::print(O); 196f2b76aae2beec4780c271984070ad15a07bd2d50Bill Wendling} 197ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 198ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling//===----------------------------------------------------------------------===// 199ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling// ARMConstantPoolSymbol 200ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling//===----------------------------------------------------------------------===// 201ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 202ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill WendlingARMConstantPoolSymbol::ARMConstantPoolSymbol(LLVMContext &C, const char *s, 203ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling unsigned id, 204ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling unsigned char PCAdj, 205ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMCP::ARMCPModifier Modifier, 206ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling bool AddCurrentAddress) 207ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling : ARMConstantPoolValue(C, id, ARMCP::CPExtSymbol, PCAdj, Modifier, 208ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling AddCurrentAddress), 209791dbb3e5fbe5910b84e3f2bd26cf272e2bde128Benjamin Kramer S(s) {} 210ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 211ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill WendlingARMConstantPoolSymbol * 212ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill WendlingARMConstantPoolSymbol::Create(LLVMContext &C, const char *s, 213fe31e673506ef9a1080eaa684b43b34178c6f447Bill Wendling unsigned ID, unsigned char PCAdj) { 214fe31e673506ef9a1080eaa684b43b34178c6f447Bill Wendling return new ARMConstantPoolSymbol(C, s, ID, PCAdj, ARMCP::no_modifier, false); 215fe31e673506ef9a1080eaa684b43b34178c6f447Bill Wendling} 216fe31e673506ef9a1080eaa684b43b34178c6f447Bill Wendling 217ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendlingint ARMConstantPoolSymbol::getExistingMachineCPValue(MachineConstantPool *CP, 218ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling unsigned Alignment) { 219ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling unsigned AlignMask = Alignment - 1; 220ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling const std::vector<MachineConstantPoolEntry> Constants = CP->getConstants(); 221ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling for (unsigned i = 0, e = Constants.size(); i != e; ++i) { 222ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling if (Constants[i].isMachineConstantPoolEntry() && 223ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling (Constants[i].getAlignment() & AlignMask) == 0) { 224ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMConstantPoolValue *CPV = 225ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling (ARMConstantPoolValue *)Constants[i].Val.MachineCPVal; 226ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMConstantPoolSymbol *APS = dyn_cast<ARMConstantPoolSymbol>(CPV); 227ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling if (!APS) continue; 228ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 229791dbb3e5fbe5910b84e3f2bd26cf272e2bde128Benjamin Kramer if (APS->S == S && equals(APS)) 230ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling return i; 231ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling } 232ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling } 233ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 234ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling return -1; 235ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling} 236ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 237ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendlingbool ARMConstantPoolSymbol::hasSameValue(ARMConstantPoolValue *ACPV) { 238ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling const ARMConstantPoolSymbol *ACPS = dyn_cast<ARMConstantPoolSymbol>(ACPV); 239791dbb3e5fbe5910b84e3f2bd26cf272e2bde128Benjamin Kramer return ACPS && ACPS->S == S && ARMConstantPoolValue::hasSameValue(ACPV); 240ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling} 241ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 242ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendlingvoid ARMConstantPoolSymbol::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 243791dbb3e5fbe5910b84e3f2bd26cf272e2bde128Benjamin Kramer ID.AddString(S); 244ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMConstantPoolValue::addSelectionDAGCSEId(ID); 245ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling} 246ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling 247ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendlingvoid ARMConstantPoolSymbol::print(raw_ostream &O) const { 248ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling O << S; 249ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling ARMConstantPoolValue::print(O); 250ff4a8023ecf328047c8f98c7f42bf5e8b46b2f11Bill Wendling} 2519c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2529c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling//===----------------------------------------------------------------------===// 2539c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling// ARMConstantPoolMBB 2549c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling//===----------------------------------------------------------------------===// 2559c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2563320f2a3bfd4daec23ba7ceb50525140cc6316daBill WendlingARMConstantPoolMBB::ARMConstantPoolMBB(LLVMContext &C, 2573320f2a3bfd4daec23ba7ceb50525140cc6316daBill Wendling const MachineBasicBlock *mbb, 2589c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling unsigned id, unsigned char PCAdj, 2599c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMCP::ARMCPModifier Modifier, 2609c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling bool AddCurrentAddress) 2613320f2a3bfd4daec23ba7ceb50525140cc6316daBill Wendling : ARMConstantPoolValue(C, id, ARMCP::CPMachineBasicBlock, PCAdj, 2629c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling Modifier, AddCurrentAddress), 2639c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling MBB(mbb) {} 2649c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2659c18f51daaf89b9c706aa0557bede2cbb0debb69Bill WendlingARMConstantPoolMBB *ARMConstantPoolMBB::Create(LLVMContext &C, 2663320f2a3bfd4daec23ba7ceb50525140cc6316daBill Wendling const MachineBasicBlock *mbb, 2679c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling unsigned ID, 2689c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling unsigned char PCAdj) { 2699c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling return new ARMConstantPoolMBB(C, mbb, ID, PCAdj, ARMCP::no_modifier, false); 2709c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 2719c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2729c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendlingint ARMConstantPoolMBB::getExistingMachineCPValue(MachineConstantPool *CP, 2739c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling unsigned Alignment) { 2749c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling unsigned AlignMask = Alignment - 1; 2759c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling const std::vector<MachineConstantPoolEntry> Constants = CP->getConstants(); 2769c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling for (unsigned i = 0, e = Constants.size(); i != e; ++i) { 2779c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling if (Constants[i].isMachineConstantPoolEntry() && 2789c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling (Constants[i].getAlignment() & AlignMask) == 0) { 2799c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMConstantPoolValue *CPV = 2809c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling (ARMConstantPoolValue *)Constants[i].Val.MachineCPVal; 2819c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMConstantPoolMBB *APMBB = dyn_cast<ARMConstantPoolMBB>(CPV); 2829c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling if (!APMBB) continue; 2839c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 284405ca137a1bf5b08fbda3ba086fb013537ce8662Bill Wendling if (APMBB->MBB == MBB && equals(APMBB)) 2859c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling return i; 2869c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling } 2879c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling } 2889c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2899c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling return -1; 2909c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 2919c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2929c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendlingbool ARMConstantPoolMBB::hasSameValue(ARMConstantPoolValue *ACPV) { 2939c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling const ARMConstantPoolMBB *ACPMBB = dyn_cast<ARMConstantPoolMBB>(ACPV); 2949c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling return ACPMBB && ACPMBB->MBB == MBB && 2959c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMConstantPoolValue::hasSameValue(ACPV); 2969c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 2979c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 2989c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendlingvoid ARMConstantPoolMBB::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 2999c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ID.AddPointer(MBB); 3009c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMConstantPoolValue::addSelectionDAGCSEId(ID); 3019c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 3029c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling 3039c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendlingvoid ARMConstantPoolMBB::print(raw_ostream &O) const { 304aed4952753e2af9e93dde0b18a4ca8af73ec6db5Evan Cheng O << "BB#" << MBB->getNumber(); 3059c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling ARMConstantPoolValue::print(O); 3069c18f51daaf89b9c706aa0557bede2cbb0debb69Bill Wendling} 307