1//===- SystemZConstantPoolValue.h - SystemZ constant-pool value -*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef SYSTEMZCONSTANTPOOLVALUE_H
11#define SYSTEMZCONSTANTPOOLVALUE_H
12
13#include "llvm/CodeGen/MachineConstantPool.h"
14#include "llvm/Support/ErrorHandling.h"
15
16namespace llvm {
17
18class GlobalValue;
19
20namespace SystemZCP {
21  enum SystemZCPModifier {
22    NTPOFF
23  };
24}
25
26/// A SystemZ-specific constant pool value.  At present, the only
27/// defined constant pool values are offsets of thread-local variables
28/// (written x@NTPOFF).
29class SystemZConstantPoolValue : public MachineConstantPoolValue {
30  const GlobalValue *GV;
31  SystemZCP::SystemZCPModifier Modifier;
32
33protected:
34  SystemZConstantPoolValue(const GlobalValue *GV,
35                           SystemZCP::SystemZCPModifier Modifier);
36
37public:
38  static SystemZConstantPoolValue *
39    Create(const GlobalValue *GV, SystemZCP::SystemZCPModifier Modifier);
40
41  // Override MachineConstantPoolValue.
42  virtual unsigned getRelocationInfo() const LLVM_OVERRIDE;
43  virtual int getExistingMachineCPValue(MachineConstantPool *CP,
44                                        unsigned Alignment) LLVM_OVERRIDE;
45  virtual void addSelectionDAGCSEId(FoldingSetNodeID &ID) LLVM_OVERRIDE;
46  virtual void print(raw_ostream &O) const LLVM_OVERRIDE;
47
48  // Access SystemZ-specific fields.
49  const GlobalValue *getGlobalValue() const { return GV; }
50  SystemZCP::SystemZCPModifier getModifier() const { return Modifier; }
51};
52
53} // End llvm namespace
54
55#endif
56