110043e21SEvan Cheng //===- ARMConstantPoolValue.cpp - ARM constantpool value --------*- C++ -*-===// 210043e21SEvan Cheng // 310043e21SEvan Cheng // The LLVM Compiler Infrastructure 410043e21SEvan Cheng // 5f3ebc3f3SChris Lattner // This file is distributed under the University of Illinois Open Source 6f3ebc3f3SChris Lattner // License. See LICENSE.TXT for details. 710043e21SEvan Cheng // 810043e21SEvan Cheng //===----------------------------------------------------------------------===// 910043e21SEvan Cheng // 1010043e21SEvan Cheng // This file implements the ARM specific constantpool value class. 1110043e21SEvan Cheng // 1210043e21SEvan Cheng //===----------------------------------------------------------------------===// 1310043e21SEvan Cheng 1410043e21SEvan Cheng #include "ARMConstantPoolValue.h" 1510043e21SEvan Cheng #include "llvm/ADT/FoldingSet.h" 1610043e21SEvan Cheng #include "llvm/GlobalValue.h" 1783f35170SEvan Cheng #include "llvm/Type.h" 18*0c19df48SChris Lattner #include "llvm/Support/raw_ostream.h" 1910043e21SEvan Cheng using namespace llvm; 2010043e21SEvan Cheng 2110043e21SEvan Cheng ARMConstantPoolValue::ARMConstantPoolValue(GlobalValue *gv, unsigned id, 2283f35170SEvan Cheng ARMCP::ARMCPKind k, 23ee2d164fSLauro Ramos Venancio unsigned char PCAdj, 24c39c12a3SLauro Ramos Venancio const char *Modif, 25c39c12a3SLauro Ramos Venancio bool AddCA) 2610043e21SEvan Cheng : MachineConstantPoolValue((const Type*)gv->getType()), 27ee2d164fSLauro Ramos Venancio GV(gv), S(NULL), LabelId(id), Kind(k), PCAdjust(PCAdj), 28c39c12a3SLauro Ramos Venancio Modifier(Modif), AddCurrentAddress(AddCA) {} 2983f35170SEvan Cheng 3083f35170SEvan Cheng ARMConstantPoolValue::ARMConstantPoolValue(const char *s, unsigned id, 3183f35170SEvan Cheng ARMCP::ARMCPKind k, 32ee2d164fSLauro Ramos Venancio unsigned char PCAdj, 33c39c12a3SLauro Ramos Venancio const char *Modif, 34c39c12a3SLauro Ramos Venancio bool AddCA) 3583f35170SEvan Cheng : MachineConstantPoolValue((const Type*)Type::Int32Ty), 36ee2d164fSLauro Ramos Venancio GV(NULL), S(s), LabelId(id), Kind(k), PCAdjust(PCAdj), 37c39c12a3SLauro Ramos Venancio Modifier(Modif), AddCurrentAddress(AddCA) {} 38ee2d164fSLauro Ramos Venancio 39ee2d164fSLauro Ramos Venancio ARMConstantPoolValue::ARMConstantPoolValue(GlobalValue *gv, 40ee2d164fSLauro Ramos Venancio ARMCP::ARMCPKind k, 41ee2d164fSLauro Ramos Venancio const char *Modif) 42ee2d164fSLauro Ramos Venancio : MachineConstantPoolValue((const Type*)Type::Int32Ty), 43ee2d164fSLauro Ramos Venancio GV(gv), S(NULL), LabelId(0), Kind(k), PCAdjust(0), 44ee2d164fSLauro Ramos Venancio Modifier(Modif) {} 4510043e21SEvan Cheng 4610043e21SEvan Cheng int ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP, 4710043e21SEvan Cheng unsigned Alignment) { 4810043e21SEvan Cheng unsigned AlignMask = (1 << Alignment)-1; 4910043e21SEvan Cheng const std::vector<MachineConstantPoolEntry> Constants = CP->getConstants(); 5010043e21SEvan Cheng for (unsigned i = 0, e = Constants.size(); i != e; ++i) { 5110043e21SEvan Cheng if (Constants[i].isMachineConstantPoolEntry() && 5210043e21SEvan Cheng (Constants[i].Offset & AlignMask) == 0) { 5310043e21SEvan Cheng ARMConstantPoolValue *CPV = 5410043e21SEvan Cheng (ARMConstantPoolValue *)Constants[i].Val.MachineCPVal; 5583f35170SEvan Cheng if (CPV->GV == GV && 5683f35170SEvan Cheng CPV->S == S && 5783f35170SEvan Cheng CPV->LabelId == LabelId && 5883f35170SEvan Cheng CPV->Kind == Kind && 5983f35170SEvan Cheng CPV->PCAdjust == PCAdjust) 6010043e21SEvan Cheng return i; 6110043e21SEvan Cheng } 6210043e21SEvan Cheng } 6310043e21SEvan Cheng 6410043e21SEvan Cheng return -1; 6510043e21SEvan Cheng } 6610043e21SEvan Cheng 6710043e21SEvan Cheng void 6810043e21SEvan Cheng ARMConstantPoolValue::AddSelectionDAGCSEId(FoldingSetNodeID &ID) { 6910043e21SEvan Cheng ID.AddPointer(GV); 7083f35170SEvan Cheng ID.AddPointer(S); 7110043e21SEvan Cheng ID.AddInteger(LabelId); 7283f35170SEvan Cheng ID.AddInteger((unsigned)Kind); 7310043e21SEvan Cheng ID.AddInteger(PCAdjust); 7410043e21SEvan Cheng } 7510043e21SEvan Cheng 76*0c19df48SChris Lattner void ARMConstantPoolValue::print(raw_ostream &O) const { 7783f35170SEvan Cheng if (GV) 7810043e21SEvan Cheng O << GV->getName(); 7983f35170SEvan Cheng else 8083f35170SEvan Cheng O << S; 8183f35170SEvan Cheng if (isNonLazyPointer()) O << "$non_lazy_ptr"; 8283f35170SEvan Cheng else if (isStub()) O << "$stub"; 83ee2d164fSLauro Ramos Venancio if (Modifier) O << "(" << Modifier << ")"; 84c39c12a3SLauro Ramos Venancio if (PCAdjust != 0) { 85c39c12a3SLauro Ramos Venancio O << "-(LPIC" << LabelId << "+" 86c39c12a3SLauro Ramos Venancio << (unsigned)PCAdjust; 87c39c12a3SLauro Ramos Venancio if (AddCurrentAddress) 88c39c12a3SLauro Ramos Venancio O << "-."; 89c39c12a3SLauro Ramos Venancio O << ")"; 90c39c12a3SLauro Ramos Venancio } 9110043e21SEvan Cheng } 92