1 //===-- llvm/CodeGen/PseudoSourceValue.h ------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file contains the declaration of the PseudoSourceValue class.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_CODEGEN_PSEUDOSOURCEVALUE_H
14 #define LLVM_CODEGEN_PSEUDOSOURCEVALUE_H
16 #include "llvm/ADT/StringMap.h"
17 #include "llvm/IR/GlobalValue.h"
18 #include "llvm/IR/Value.h"
19 #include "llvm/IR/ValueMap.h"
24 class MachineFrameInfo
;
25 class MachineMemOperand
;
27 class TargetInstrInfo
;
29 raw_ostream
&operator<<(raw_ostream
&OS
, const MachineMemOperand
&MMO
);
30 class PseudoSourceValue
;
31 raw_ostream
&operator<<(raw_ostream
&OS
, const PseudoSourceValue
* PSV
);
33 /// Special value supplied for machine level alias analysis. It indicates that
34 /// a memory access references the functions stack frame (e.g., a spill slot),
35 /// below the stack frame (e.g., argument space), or constant pool.
36 class PseudoSourceValue
{
38 enum PSVKind
: unsigned {
45 ExternalSymbolCallEntry
,
51 unsigned AddressSpace
;
52 friend raw_ostream
&llvm::operator<<(raw_ostream
&OS
,
53 const PseudoSourceValue
* PSV
);
55 friend class MachineMemOperand
; // For printCustom().
57 /// Implement printing for PseudoSourceValue. This is called from
58 /// Value::print or Value's operator<<.
59 virtual void printCustom(raw_ostream
&O
) const;
62 explicit PseudoSourceValue(unsigned Kind
, const TargetInstrInfo
&TII
);
64 virtual ~PseudoSourceValue();
66 unsigned kind() const { return Kind
; }
68 bool isStack() const { return Kind
== Stack
; }
69 bool isGOT() const { return Kind
== GOT
; }
70 bool isConstantPool() const { return Kind
== ConstantPool
; }
71 bool isJumpTable() const { return Kind
== JumpTable
; }
73 unsigned getAddressSpace() const { return AddressSpace
; }
75 unsigned getTargetCustom() const {
76 return (Kind
>= TargetCustom
) ? ((Kind
+1) - TargetCustom
) : 0;
79 /// Test whether the memory pointed to by this PseudoSourceValue has a
81 virtual bool isConstant(const MachineFrameInfo
*) const;
83 /// Test whether the memory pointed to by this PseudoSourceValue may also be
84 /// pointed to by an LLVM IR Value.
85 virtual bool isAliased(const MachineFrameInfo
*) const;
87 /// Return true if the memory pointed to by this PseudoSourceValue can ever
88 /// alias an LLVM IR Value.
89 virtual bool mayAlias(const MachineFrameInfo
*) const;
92 /// A specialized PseudoSourceValue for holding FixedStack values, which must
93 /// include a frame index.
94 class FixedStackPseudoSourceValue
: public PseudoSourceValue
{
98 explicit FixedStackPseudoSourceValue(int FI
, const TargetInstrInfo
&TII
)
99 : PseudoSourceValue(FixedStack
, TII
), FI(FI
) {}
101 static bool classof(const PseudoSourceValue
*V
) {
102 return V
->kind() == FixedStack
;
105 bool isConstant(const MachineFrameInfo
*MFI
) const override
;
107 bool isAliased(const MachineFrameInfo
*MFI
) const override
;
109 bool mayAlias(const MachineFrameInfo
*) const override
;
111 void printCustom(raw_ostream
&OS
) const override
;
113 int getFrameIndex() const { return FI
; }
116 class CallEntryPseudoSourceValue
: public PseudoSourceValue
{
118 CallEntryPseudoSourceValue(unsigned Kind
, const TargetInstrInfo
&TII
);
121 bool isConstant(const MachineFrameInfo
*) const override
;
122 bool isAliased(const MachineFrameInfo
*) const override
;
123 bool mayAlias(const MachineFrameInfo
*) const override
;
126 /// A specialized pseudo soruce value for holding GlobalValue values.
127 class GlobalValuePseudoSourceValue
: public CallEntryPseudoSourceValue
{
128 const GlobalValue
*GV
;
131 GlobalValuePseudoSourceValue(const GlobalValue
*GV
,
132 const TargetInstrInfo
&TII
);
134 static bool classof(const PseudoSourceValue
*V
) {
135 return V
->kind() == GlobalValueCallEntry
;
138 const GlobalValue
*getValue() const { return GV
; }
141 /// A specialized pseudo source value for holding external symbol values.
142 class ExternalSymbolPseudoSourceValue
: public CallEntryPseudoSourceValue
{
146 ExternalSymbolPseudoSourceValue(const char *ES
, const TargetInstrInfo
&TII
);
148 static bool classof(const PseudoSourceValue
*V
) {
149 return V
->kind() == ExternalSymbolCallEntry
;
152 const char *getSymbol() const { return ES
; }
155 /// Manages creation of pseudo source values.
156 class PseudoSourceValueManager
{
157 const TargetInstrInfo
&TII
;
158 const PseudoSourceValue StackPSV
, GOTPSV
, JumpTablePSV
, ConstantPoolPSV
;
159 std::map
<int, std::unique_ptr
<FixedStackPseudoSourceValue
>> FSValues
;
160 StringMap
<std::unique_ptr
<const ExternalSymbolPseudoSourceValue
>>
162 ValueMap
<const GlobalValue
*,
163 std::unique_ptr
<const GlobalValuePseudoSourceValue
>>
167 PseudoSourceValueManager(const TargetInstrInfo
&TII
);
169 /// Return a pseudo source value referencing the area below the stack frame of
170 /// a function, e.g., the argument space.
171 const PseudoSourceValue
*getStack();
173 /// Return a pseudo source value referencing the global offset table
174 /// (or something the like).
175 const PseudoSourceValue
*getGOT();
177 /// Return a pseudo source value referencing the constant pool. Since constant
178 /// pools are constant, this doesn't need to identify a specific constant
180 const PseudoSourceValue
*getConstantPool();
182 /// Return a pseudo source value referencing a jump table. Since jump tables
183 /// are constant, this doesn't need to identify a specific jump table.
184 const PseudoSourceValue
*getJumpTable();
186 /// Return a pseudo source value referencing a fixed stack frame entry,
187 /// e.g., a spill slot.
188 const PseudoSourceValue
*getFixedStack(int FI
);
190 const PseudoSourceValue
*getGlobalValueCallEntry(const GlobalValue
*GV
);
192 const PseudoSourceValue
*getExternalSymbolCallEntry(const char *ES
);
195 } // end namespace llvm