1251607Sdim//===-- SystemZConstantPoolValue.cpp - SystemZ constant-pool value --------===// 2251607Sdim// 3251607Sdim// The LLVM Compiler Infrastructure 4251607Sdim// 5251607Sdim// This file is distributed under the University of Illinois Open Source 6251607Sdim// License. See LICENSE.TXT for details. 7251607Sdim// 8251607Sdim//===----------------------------------------------------------------------===// 9251607Sdim 10251607Sdim#include "SystemZConstantPoolValue.h" 11251607Sdim#include "llvm/ADT/FoldingSet.h" 12251607Sdim#include "llvm/IR/DerivedTypes.h" 13251607Sdim#include "llvm/IR/GlobalValue.h" 14251607Sdim#include "llvm/Support/raw_ostream.h" 15251607Sdim 16251607Sdimusing namespace llvm; 17251607Sdim 18251607SdimSystemZConstantPoolValue:: 19251607SdimSystemZConstantPoolValue(const GlobalValue *gv, 20251607Sdim SystemZCP::SystemZCPModifier modifier) 21251607Sdim : MachineConstantPoolValue(gv->getType()), GV(gv), Modifier(modifier) {} 22251607Sdim 23251607SdimSystemZConstantPoolValue * 24251607SdimSystemZConstantPoolValue::Create(const GlobalValue *GV, 25251607Sdim SystemZCP::SystemZCPModifier Modifier) { 26251607Sdim return new SystemZConstantPoolValue(GV, Modifier); 27251607Sdim} 28251607Sdim 29251607Sdimunsigned SystemZConstantPoolValue::getRelocationInfo() const { 30251607Sdim switch (Modifier) { 31251607Sdim case SystemZCP::NTPOFF: 32251607Sdim // May require a relocation, but the relocations are always resolved 33251607Sdim // by the static linker. 34251607Sdim return 1; 35251607Sdim } 36251607Sdim llvm_unreachable("Unknown modifier"); 37251607Sdim} 38251607Sdim 39251607Sdimint SystemZConstantPoolValue:: 40251607SdimgetExistingMachineCPValue(MachineConstantPool *CP, unsigned Alignment) { 41251607Sdim unsigned AlignMask = Alignment - 1; 42263509Sdim const std::vector<MachineConstantPoolEntry> &Constants = CP->getConstants(); 43251607Sdim for (unsigned I = 0, E = Constants.size(); I != E; ++I) { 44251607Sdim if (Constants[I].isMachineConstantPoolEntry() && 45251607Sdim (Constants[I].getAlignment() & AlignMask) == 0) { 46251607Sdim SystemZConstantPoolValue *ZCPV = 47251607Sdim static_cast<SystemZConstantPoolValue *>(Constants[I].Val.MachineCPVal); 48251607Sdim if (ZCPV->GV == GV && ZCPV->Modifier == Modifier) 49251607Sdim return I; 50251607Sdim } 51251607Sdim } 52251607Sdim return -1; 53251607Sdim} 54251607Sdim 55251607Sdimvoid SystemZConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 56251607Sdim ID.AddPointer(GV); 57251607Sdim ID.AddInteger(Modifier); 58251607Sdim} 59251607Sdim 60251607Sdimvoid SystemZConstantPoolValue::print(raw_ostream &O) const { 61251607Sdim O << GV << "@" << int(Modifier); 62251607Sdim} 63