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