ARMConstantPoolValue.cpp revision f128787f941bb372e80d69b786ed144d8606a292
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" 16a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "llvm/GlobalValue.h" 17c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng#include "llvm/Type.h" 185be59eace58e5a92bb851c4885f9cea7236ac30fEvan Cheng#include "llvm/Support/Streams.h" 19944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner#include "llvm/Support/raw_ostream.h" 20f128787f941bb372e80d69b786ed144d8606a292Jim Grosbach#include <cstdlib> 21a8e2989ece6dc46df59b0768184028257f913843Evan Chengusing namespace llvm; 22a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 23a8e2989ece6dc46df59b0768184028257f913843Evan ChengARMConstantPoolValue::ARMConstantPoolValue(GlobalValue *gv, unsigned id, 24c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng ARMCP::ARMCPKind k, 250ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio unsigned char PCAdj, 2664f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio const char *Modif, 2764f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio bool AddCA) 28a8e2989ece6dc46df59b0768184028257f913843Evan Cheng : MachineConstantPoolValue((const Type*)gv->getType()), 290ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio GV(gv), S(NULL), LabelId(id), Kind(k), PCAdjust(PCAdj), 3064f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio Modifier(Modif), AddCurrentAddress(AddCA) {} 31c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng 32c60e76d139a96cc8bb7454929172cdb992e16971Evan ChengARMConstantPoolValue::ARMConstantPoolValue(const char *s, unsigned id, 33c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng ARMCP::ARMCPKind k, 340ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio unsigned char PCAdj, 3564f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio const char *Modif, 3664f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio bool AddCA) 37c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng : MachineConstantPoolValue((const Type*)Type::Int32Ty), 381b747ad8a0694b86e8d98a8b9a05ddfe74ec0cd3Jim Grosbach GV(NULL), S(strdup(s)), LabelId(id), Kind(k), PCAdjust(PCAdj), 3964f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio Modifier(Modif), AddCurrentAddress(AddCA) {} 400ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio 410ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos VenancioARMConstantPoolValue::ARMConstantPoolValue(GlobalValue *gv, 420ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio ARMCP::ARMCPKind k, 430ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio const char *Modif) 440ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio : MachineConstantPoolValue((const Type*)Type::Int32Ty), 450ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio GV(gv), S(NULL), LabelId(0), Kind(k), PCAdjust(0), 460ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio Modifier(Modif) {} 47a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 48a8e2989ece6dc46df59b0768184028257f913843Evan Chengint ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP, 49a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned Alignment) { 501606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned AlignMask = Alignment - 1; 51a8e2989ece6dc46df59b0768184028257f913843Evan Cheng const std::vector<MachineConstantPoolEntry> Constants = CP->getConstants(); 52a8e2989ece6dc46df59b0768184028257f913843Evan Cheng for (unsigned i = 0, e = Constants.size(); i != e; ++i) { 53a8e2989ece6dc46df59b0768184028257f913843Evan Cheng if (Constants[i].isMachineConstantPoolEntry() && 541606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng (Constants[i].getAlignment() & AlignMask) == 0) { 55a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ARMConstantPoolValue *CPV = 56a8e2989ece6dc46df59b0768184028257f913843Evan Cheng (ARMConstantPoolValue *)Constants[i].Val.MachineCPVal; 57c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng if (CPV->GV == GV && 58c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng CPV->S == S && 59c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng CPV->LabelId == LabelId && 60c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng CPV->Kind == Kind && 61c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng CPV->PCAdjust == PCAdjust) 62a8e2989ece6dc46df59b0768184028257f913843Evan Cheng return i; 63a8e2989ece6dc46df59b0768184028257f913843Evan Cheng } 64a8e2989ece6dc46df59b0768184028257f913843Evan Cheng } 65a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 66a8e2989ece6dc46df59b0768184028257f913843Evan Cheng return -1; 67a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 68a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 69f128787f941bb372e80d69b786ed144d8606a292Jim GrosbachARMConstantPoolValue::~ARMConstantPoolValue(void) { 70f128787f941bb372e80d69b786ed144d8606a292Jim Grosbach free((void*)S); 71f128787f941bb372e80d69b786ed144d8606a292Jim Grosbach} 72f128787f941bb372e80d69b786ed144d8606a292Jim Grosbach 73a8e2989ece6dc46df59b0768184028257f913843Evan Chengvoid 74a8e2989ece6dc46df59b0768184028257f913843Evan ChengARMConstantPoolValue::AddSelectionDAGCSEId(FoldingSetNodeID &ID) { 75a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ID.AddPointer(GV); 76c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng ID.AddPointer(S); 77a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ID.AddInteger(LabelId); 78c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng ID.AddInteger((unsigned)Kind); 79a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ID.AddInteger(PCAdjust); 80a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 81a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 825be59eace58e5a92bb851c4885f9cea7236ac30fEvan Chengvoid ARMConstantPoolValue::dump() const { 835be59eace58e5a92bb851c4885f9cea7236ac30fEvan Cheng cerr << " " << *this; 845be59eace58e5a92bb851c4885f9cea7236ac30fEvan Cheng} 855be59eace58e5a92bb851c4885f9cea7236ac30fEvan Cheng 865be59eace58e5a92bb851c4885f9cea7236ac30fEvan Chengvoid ARMConstantPoolValue::print(std::ostream &O) const { 875be59eace58e5a92bb851c4885f9cea7236ac30fEvan Cheng raw_os_ostream RawOS(O); 885be59eace58e5a92bb851c4885f9cea7236ac30fEvan Cheng print(RawOS); 895be59eace58e5a92bb851c4885f9cea7236ac30fEvan Cheng} 905be59eace58e5a92bb851c4885f9cea7236ac30fEvan Cheng 91944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattnervoid ARMConstantPoolValue::print(raw_ostream &O) const { 92c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng if (GV) 93c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng O << GV->getName(); 94c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng else 95c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng O << S; 96c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng if (isNonLazyPointer()) O << "$non_lazy_ptr"; 97c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng else if (isStub()) O << "$stub"; 980ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio if (Modifier) O << "(" << Modifier << ")"; 9964f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio if (PCAdjust != 0) { 10025e04788bfddc54dde7bed65302146b46089a166Evan Cheng O << "-(LPC" << LabelId << "+" << (unsigned)PCAdjust; 10125e04788bfddc54dde7bed65302146b46089a166Evan Cheng if (AddCurrentAddress) O << "-."; 10264f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio O << ")"; 10364f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio } 104a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 105