1 //===- ARMConstantPoolValue.h - ARM constantpool value ----------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the ARM specific constantpool value class.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_TARGET_ARM_CONSTANTPOOLVALUE_H
15 #define LLVM_TARGET_ARM_CONSTANTPOOLVALUE_H
17 #include "llvm/CodeGen/MachineConstantPool.h"
32 /// ARMConstantPoolValue - ARM specific constantpool value. This is used to
33 /// represent PC relative displacement between the address of the load
34 /// instruction and the global value being loaded, i.e. (&GV-(LPIC+8)).
35 class ARMConstantPoolValue
: public MachineConstantPoolValue
{
36 GlobalValue
*GV
; // GlobalValue being loaded.
37 const char *S
; // ExtSymbol being loaded.
38 unsigned LabelId
; // Label id of the load.
39 ARMCP::ARMCPKind Kind
; // non_lazy_ptr or stub?
40 unsigned char PCAdjust
; // Extra adjustment if constantpool is pc relative.
41 // 8 for ARM, 4 for Thumb.
42 const char *Modifier
; // GV modifier i.e. (&GV(modifier)-(LPIC+8))
43 bool AddCurrentAddress
;
46 ARMConstantPoolValue(GlobalValue
*gv
, unsigned id
,
47 ARMCP::ARMCPKind Kind
= ARMCP::CPValue
,
48 unsigned char PCAdj
= 0, const char *Modifier
= NULL
,
49 bool AddCurrentAddress
= false);
50 ARMConstantPoolValue(const char *s
, unsigned id
,
51 ARMCP::ARMCPKind Kind
= ARMCP::CPValue
,
52 unsigned char PCAdj
= 0, const char *Modifier
= NULL
,
53 bool AddCurrentAddress
= false);
54 ARMConstantPoolValue(GlobalValue
*GV
, ARMCP::ARMCPKind Kind
,
55 const char *Modifier
);
58 GlobalValue
*getGV() const { return GV
; }
59 const char *getSymbol() const { return S
; }
60 const char *getModifier() const { return Modifier
; }
61 bool hasModifier() const { return Modifier
!= NULL
; }
62 bool mustAddCurrentAddress() const { return AddCurrentAddress
; }
63 unsigned getLabelId() const { return LabelId
; }
64 bool isNonLazyPointer() const { return Kind
== ARMCP::CPNonLazyPtr
; }
65 bool isStub() const { return Kind
== ARMCP::CPStub
; }
66 unsigned char getPCAdjustment() const { return PCAdjust
; }
68 virtual int getExistingMachineCPValue(MachineConstantPool
*CP
,
71 virtual void AddSelectionDAGCSEId(FoldingSetNodeID
&ID
);
73 void print(std::ostream
*O
) const { if (O
) print(*O
); }
74 void print(std::ostream
&O
) const;
75 void print(raw_ostream
*O
) const { if (O
) print(*O
); }
76 void print(raw_ostream
&O
) const;
80 inline std::ostream
&operator<<(std::ostream
&O
, const ARMConstantPoolValue
&V
) {
85 inline raw_ostream
&operator<<(raw_ostream
&O
, const ARMConstantPoolValue
&V
) {
90 } // End llvm namespace