ARMConstantPoolValue.cpp revision a8e2989ece6dc46df59b0768184028257f913843
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"
17a8e2989ece6dc46df59b0768184028257f913843Evan Chengusing namespace llvm;
18a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
19a8e2989ece6dc46df59b0768184028257f913843Evan ChengARMConstantPoolValue::ARMConstantPoolValue(GlobalValue *gv, unsigned id,
20a8e2989ece6dc46df59b0768184028257f913843Evan Cheng                                         bool isNonLazy, unsigned char PCAdj)
21a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  : MachineConstantPoolValue((const Type*)gv->getType()),
22a8e2989ece6dc46df59b0768184028257f913843Evan Cheng    GV(gv), LabelId(id), isNonLazyPtr(isNonLazy), PCAdjust(PCAdj) {}
23a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
24a8e2989ece6dc46df59b0768184028257f913843Evan Chengint ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP,
25a8e2989ece6dc46df59b0768184028257f913843Evan Cheng                                                    unsigned Alignment) {
26a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned AlignMask = (1 << Alignment)-1;
27a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  const std::vector<MachineConstantPoolEntry> Constants = CP->getConstants();
28a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
29a8e2989ece6dc46df59b0768184028257f913843Evan Cheng    if (Constants[i].isMachineConstantPoolEntry() &&
30a8e2989ece6dc46df59b0768184028257f913843Evan Cheng        (Constants[i].Offset & AlignMask) == 0) {
31a8e2989ece6dc46df59b0768184028257f913843Evan Cheng      ARMConstantPoolValue *CPV =
32a8e2989ece6dc46df59b0768184028257f913843Evan Cheng        (ARMConstantPoolValue *)Constants[i].Val.MachineCPVal;
33a8e2989ece6dc46df59b0768184028257f913843Evan Cheng      if (CPV->GV == GV && CPV->LabelId == LabelId &&
34a8e2989ece6dc46df59b0768184028257f913843Evan Cheng          CPV->isNonLazyPtr == isNonLazyPtr)
35a8e2989ece6dc46df59b0768184028257f913843Evan Cheng        return i;
36a8e2989ece6dc46df59b0768184028257f913843Evan Cheng    }
37a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  }
38a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
39a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  return -1;
40a8e2989ece6dc46df59b0768184028257f913843Evan Cheng}
41a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
42a8e2989ece6dc46df59b0768184028257f913843Evan Chengvoid
43a8e2989ece6dc46df59b0768184028257f913843Evan ChengARMConstantPoolValue::AddSelectionDAGCSEId(FoldingSetNodeID &ID) {
44a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  ID.AddPointer(GV);
45a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  ID.AddInteger(LabelId);
46a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  ID.AddInteger((unsigned)isNonLazyPtr);
47a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  ID.AddInteger(PCAdjust);
48a8e2989ece6dc46df59b0768184028257f913843Evan Cheng}
49a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
50a8e2989ece6dc46df59b0768184028257f913843Evan Chengvoid ARMConstantPoolValue::print(std::ostream &O) const {
51a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  O << GV->getName();
52a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  if (isNonLazyPtr) O << "$non_lazy_ptr";
53a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  if (PCAdjust != 0) O << "-(LPIC" << LabelId << "+"
54a8e2989ece6dc46df59b0768184028257f913843Evan Cheng                       << (unsigned)PCAdjust << ")";
55a8e2989ece6dc46df59b0768184028257f913843Evan Cheng}
56