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