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