ARMConstantPoolValue.cpp revision 0ae4a3357a556261f25b1584a2d9914637c69e65
1a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===- ARMConstantPoolValue.cpp - ARM constantpool value --------*- C++ -*-===// 2a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 3a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// The LLVM Compiler Infrastructure 4a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 5a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// This file was developed by Evan Cheng and is distributed under the 6a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// University of Illinois Open Source 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" 18a8e2989ece6dc46df59b0768184028257f913843Evan Chengusing namespace llvm; 19a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 20a8e2989ece6dc46df59b0768184028257f913843Evan ChengARMConstantPoolValue::ARMConstantPoolValue(GlobalValue *gv, unsigned id, 21c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng ARMCP::ARMCPKind k, 220ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio unsigned char PCAdj, 230ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio const char *Modif) 24a8e2989ece6dc46df59b0768184028257f913843Evan Cheng : MachineConstantPoolValue((const Type*)gv->getType()), 250ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio GV(gv), S(NULL), LabelId(id), Kind(k), PCAdjust(PCAdj), 260ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio Modifier(Modif) {} 27c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng 28c60e76d139a96cc8bb7454929172cdb992e16971Evan ChengARMConstantPoolValue::ARMConstantPoolValue(const char *s, unsigned id, 29c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng ARMCP::ARMCPKind k, 300ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio unsigned char PCAdj, 310ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio const char *Modif) 32c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng : MachineConstantPoolValue((const Type*)Type::Int32Ty), 330ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio GV(NULL), S(s), LabelId(id), Kind(k), PCAdjust(PCAdj), 340ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio Modifier(Modif) {} 350ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio 360ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos VenancioARMConstantPoolValue::ARMConstantPoolValue(GlobalValue *gv, 370ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio ARMCP::ARMCPKind k, 380ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio const char *Modif) 390ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio : MachineConstantPoolValue((const Type*)Type::Int32Ty), 400ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio GV(gv), S(NULL), LabelId(0), Kind(k), PCAdjust(0), 410ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio Modifier(Modif) {} 42a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 43a8e2989ece6dc46df59b0768184028257f913843Evan Chengint ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP, 44a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned Alignment) { 45a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned AlignMask = (1 << Alignment)-1; 46a8e2989ece6dc46df59b0768184028257f913843Evan Cheng const std::vector<MachineConstantPoolEntry> Constants = CP->getConstants(); 47a8e2989ece6dc46df59b0768184028257f913843Evan Cheng for (unsigned i = 0, e = Constants.size(); i != e; ++i) { 48a8e2989ece6dc46df59b0768184028257f913843Evan Cheng if (Constants[i].isMachineConstantPoolEntry() && 49a8e2989ece6dc46df59b0768184028257f913843Evan Cheng (Constants[i].Offset & AlignMask) == 0) { 50a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ARMConstantPoolValue *CPV = 51a8e2989ece6dc46df59b0768184028257f913843Evan Cheng (ARMConstantPoolValue *)Constants[i].Val.MachineCPVal; 52c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng if (CPV->GV == GV && 53c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng CPV->S == S && 54c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng CPV->LabelId == LabelId && 55c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng CPV->Kind == Kind && 56c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng CPV->PCAdjust == PCAdjust) 57a8e2989ece6dc46df59b0768184028257f913843Evan Cheng return i; 58a8e2989ece6dc46df59b0768184028257f913843Evan Cheng } 59a8e2989ece6dc46df59b0768184028257f913843Evan Cheng } 60a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 61a8e2989ece6dc46df59b0768184028257f913843Evan Cheng return -1; 62a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 63a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 64a8e2989ece6dc46df59b0768184028257f913843Evan Chengvoid 65a8e2989ece6dc46df59b0768184028257f913843Evan ChengARMConstantPoolValue::AddSelectionDAGCSEId(FoldingSetNodeID &ID) { 66a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ID.AddPointer(GV); 67c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng ID.AddPointer(S); 68a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ID.AddInteger(LabelId); 69c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng ID.AddInteger((unsigned)Kind); 70a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ID.AddInteger(PCAdjust); 71a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 72a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 73a8e2989ece6dc46df59b0768184028257f913843Evan Chengvoid ARMConstantPoolValue::print(std::ostream &O) const { 74c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng if (GV) 75c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng O << GV->getName(); 76c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng else 77c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng O << S; 78c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng if (isNonLazyPointer()) O << "$non_lazy_ptr"; 79c60e76d139a96cc8bb7454929172cdb992e16971Evan Cheng else if (isStub()) O << "$stub"; 800ae4a3357a556261f25b1584a2d9914637c69e65Lauro Ramos Venancio if (Modifier) O << "(" << Modifier << ")"; 81a8e2989ece6dc46df59b0768184028257f913843Evan Cheng if (PCAdjust != 0) O << "-(LPIC" << LabelId << "+" 82a8e2989ece6dc46df59b0768184028257f913843Evan Cheng << (unsigned)PCAdjust << ")"; 83a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 84