11d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===-- SystemZConstantPoolValue.cpp - SystemZ constant-pool value --------===//
21d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
31d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//                     The LLVM Compiler Infrastructure
41d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
51d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// This file is distributed under the University of Illinois Open Source
61d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// License. See LICENSE.TXT for details.
71d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
81d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===//
91d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZConstantPoolValue.h"
111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/ADT/FoldingSet.h"
121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/IR/DerivedTypes.h"
131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/IR/GlobalValue.h"
141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/Support/raw_ostream.h"
151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandusing namespace llvm;
171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandSystemZConstantPoolValue::
191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandSystemZConstantPoolValue(const GlobalValue *gv,
201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                         SystemZCP::SystemZCPModifier modifier)
211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  : MachineConstantPoolValue(gv->getType()), GV(gv), Modifier(modifier) {}
221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandSystemZConstantPoolValue *
241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandSystemZConstantPoolValue::Create(const GlobalValue *GV,
251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                 SystemZCP::SystemZCPModifier Modifier) {
261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  return new SystemZConstantPoolValue(GV, Modifier);
271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
291d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandunsigned SystemZConstantPoolValue::getRelocationInfo() const {
301d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  switch (Modifier) {
311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  case SystemZCP::NTPOFF:
321d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // May require a relocation, but the relocations are always resolved
331d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // by the static linker.
341d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    return 1;
351d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
361d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  llvm_unreachable("Unknown modifier");
371d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
381d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
391d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandint SystemZConstantPoolValue::
401d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandgetExistingMachineCPValue(MachineConstantPool *CP, unsigned Alignment) {
411d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  unsigned AlignMask = Alignment - 1;
4294ee55d4b39d6506cf4e0f4e4b1c0b7fbbfeaed5Benjamin Kramer  const std::vector<MachineConstantPoolEntry> &Constants = CP->getConstants();
431d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  for (unsigned I = 0, E = Constants.size(); I != E; ++I) {
441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    if (Constants[I].isMachineConstantPoolEntry() &&
451d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand        (Constants[I].getAlignment() & AlignMask) == 0) {
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      auto *ZCPV =
471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand        static_cast<SystemZConstantPoolValue *>(Constants[I].Val.MachineCPVal);
481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      if (ZCPV->GV == GV && ZCPV->Modifier == Modifier)
491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand        return I;
501d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    }
511d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
521d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  return -1;
531d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandvoid SystemZConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
561d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  ID.AddPointer(GV);
571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  ID.AddInteger(Modifier);
581d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
591d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
601d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandvoid SystemZConstantPoolValue::print(raw_ostream &O) const {
611d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  O << GV << "@" << int(Modifier);
621d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
63