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