1*9880d681SAndroid Build Coastguard Worker //===-- llvm/CodeGen/PseudoSourceValue.h ------------------------*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file contains the declaration of the PseudoSourceValue class. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_CODEGEN_PSEUDOSOURCEVALUE_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_CODEGEN_PSEUDOSOURCEVALUE_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringMap.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/GlobalValue.h" 19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Value.h" 20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/ValueMap.h" 21*9880d681SAndroid Build Coastguard Worker #include <map> 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker namespace llvm { 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker class MachineFrameInfo; 26*9880d681SAndroid Build Coastguard Worker class MachineMemOperand; 27*9880d681SAndroid Build Coastguard Worker class raw_ostream; 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker raw_ostream &operator<<(raw_ostream &OS, const MachineMemOperand &MMO); 30*9880d681SAndroid Build Coastguard Worker class PseudoSourceValue; 31*9880d681SAndroid Build Coastguard Worker raw_ostream &operator<<(raw_ostream &OS, const PseudoSourceValue* PSV); 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker /// Special value supplied for machine level alias analysis. It indicates that 34*9880d681SAndroid Build Coastguard Worker /// a memory access references the functions stack frame (e.g., a spill slot), 35*9880d681SAndroid Build Coastguard Worker /// below the stack frame (e.g., argument space), or constant pool. 36*9880d681SAndroid Build Coastguard Worker class PseudoSourceValue { 37*9880d681SAndroid Build Coastguard Worker public: 38*9880d681SAndroid Build Coastguard Worker enum PSVKind { 39*9880d681SAndroid Build Coastguard Worker Stack, 40*9880d681SAndroid Build Coastguard Worker GOT, 41*9880d681SAndroid Build Coastguard Worker JumpTable, 42*9880d681SAndroid Build Coastguard Worker ConstantPool, 43*9880d681SAndroid Build Coastguard Worker FixedStack, 44*9880d681SAndroid Build Coastguard Worker GlobalValueCallEntry, 45*9880d681SAndroid Build Coastguard Worker ExternalSymbolCallEntry 46*9880d681SAndroid Build Coastguard Worker }; 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker private: 49*9880d681SAndroid Build Coastguard Worker PSVKind Kind; 50*9880d681SAndroid Build Coastguard Worker friend raw_ostream &llvm::operator<<(raw_ostream &OS, 51*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue* PSV); 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker friend class MachineMemOperand; // For printCustom(). 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker /// Implement printing for PseudoSourceValue. This is called from 56*9880d681SAndroid Build Coastguard Worker /// Value::print or Value's operator<<. 57*9880d681SAndroid Build Coastguard Worker virtual void printCustom(raw_ostream &O) const; 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker public: 60*9880d681SAndroid Build Coastguard Worker explicit PseudoSourceValue(PSVKind Kind); 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker virtual ~PseudoSourceValue(); 63*9880d681SAndroid Build Coastguard Worker kind()64*9880d681SAndroid Build Coastguard Worker PSVKind kind() const { return Kind; } 65*9880d681SAndroid Build Coastguard Worker isStack()66*9880d681SAndroid Build Coastguard Worker bool isStack() const { return Kind == Stack; } isGOT()67*9880d681SAndroid Build Coastguard Worker bool isGOT() const { return Kind == GOT; } isConstantPool()68*9880d681SAndroid Build Coastguard Worker bool isConstantPool() const { return Kind == ConstantPool; } isJumpTable()69*9880d681SAndroid Build Coastguard Worker bool isJumpTable() const { return Kind == JumpTable; } 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker /// Test whether the memory pointed to by this PseudoSourceValue has a 72*9880d681SAndroid Build Coastguard Worker /// constant value. 73*9880d681SAndroid Build Coastguard Worker virtual bool isConstant(const MachineFrameInfo *) const; 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker /// Test whether the memory pointed to by this PseudoSourceValue may also be 76*9880d681SAndroid Build Coastguard Worker /// pointed to by an LLVM IR Value. 77*9880d681SAndroid Build Coastguard Worker virtual bool isAliased(const MachineFrameInfo *) const; 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker /// Return true if the memory pointed to by this PseudoSourceValue can ever 80*9880d681SAndroid Build Coastguard Worker /// alias an LLVM IR Value. 81*9880d681SAndroid Build Coastguard Worker virtual bool mayAlias(const MachineFrameInfo *) const; 82*9880d681SAndroid Build Coastguard Worker }; 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker /// A specialized PseudoSourceValue for holding FixedStack values, which must 85*9880d681SAndroid Build Coastguard Worker /// include a frame index. 86*9880d681SAndroid Build Coastguard Worker class FixedStackPseudoSourceValue : public PseudoSourceValue { 87*9880d681SAndroid Build Coastguard Worker const int FI; 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker public: FixedStackPseudoSourceValue(int FI)90*9880d681SAndroid Build Coastguard Worker explicit FixedStackPseudoSourceValue(int FI) 91*9880d681SAndroid Build Coastguard Worker : PseudoSourceValue(FixedStack), FI(FI) {} 92*9880d681SAndroid Build Coastguard Worker classof(const PseudoSourceValue * V)93*9880d681SAndroid Build Coastguard Worker static inline bool classof(const PseudoSourceValue *V) { 94*9880d681SAndroid Build Coastguard Worker return V->kind() == FixedStack; 95*9880d681SAndroid Build Coastguard Worker } 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker bool isConstant(const MachineFrameInfo *MFI) const override; 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker bool isAliased(const MachineFrameInfo *MFI) const override; 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker bool mayAlias(const MachineFrameInfo *) const override; 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker void printCustom(raw_ostream &OS) const override; 104*9880d681SAndroid Build Coastguard Worker getFrameIndex()105*9880d681SAndroid Build Coastguard Worker int getFrameIndex() const { return FI; } 106*9880d681SAndroid Build Coastguard Worker }; 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker class CallEntryPseudoSourceValue : public PseudoSourceValue { 109*9880d681SAndroid Build Coastguard Worker protected: 110*9880d681SAndroid Build Coastguard Worker CallEntryPseudoSourceValue(PSVKind Kind); 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker public: 113*9880d681SAndroid Build Coastguard Worker bool isConstant(const MachineFrameInfo *) const override; 114*9880d681SAndroid Build Coastguard Worker bool isAliased(const MachineFrameInfo *) const override; 115*9880d681SAndroid Build Coastguard Worker bool mayAlias(const MachineFrameInfo *) const override; 116*9880d681SAndroid Build Coastguard Worker }; 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker /// A specialized pseudo soruce value for holding GlobalValue values. 119*9880d681SAndroid Build Coastguard Worker class GlobalValuePseudoSourceValue : public CallEntryPseudoSourceValue { 120*9880d681SAndroid Build Coastguard Worker const GlobalValue *GV; 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker public: 123*9880d681SAndroid Build Coastguard Worker GlobalValuePseudoSourceValue(const GlobalValue *GV); 124*9880d681SAndroid Build Coastguard Worker classof(const PseudoSourceValue * V)125*9880d681SAndroid Build Coastguard Worker static inline bool classof(const PseudoSourceValue *V) { 126*9880d681SAndroid Build Coastguard Worker return V->kind() == GlobalValueCallEntry; 127*9880d681SAndroid Build Coastguard Worker } 128*9880d681SAndroid Build Coastguard Worker getValue()129*9880d681SAndroid Build Coastguard Worker const GlobalValue *getValue() const { return GV; } 130*9880d681SAndroid Build Coastguard Worker }; 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker /// A specialized pseudo source value for holding external symbol values. 133*9880d681SAndroid Build Coastguard Worker class ExternalSymbolPseudoSourceValue : public CallEntryPseudoSourceValue { 134*9880d681SAndroid Build Coastguard Worker const char *ES; 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker public: 137*9880d681SAndroid Build Coastguard Worker ExternalSymbolPseudoSourceValue(const char *ES); 138*9880d681SAndroid Build Coastguard Worker classof(const PseudoSourceValue * V)139*9880d681SAndroid Build Coastguard Worker static inline bool classof(const PseudoSourceValue *V) { 140*9880d681SAndroid Build Coastguard Worker return V->kind() == ExternalSymbolCallEntry; 141*9880d681SAndroid Build Coastguard Worker } 142*9880d681SAndroid Build Coastguard Worker getSymbol()143*9880d681SAndroid Build Coastguard Worker const char *getSymbol() const { return ES; } 144*9880d681SAndroid Build Coastguard Worker }; 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker /// Manages creation of pseudo source values. 147*9880d681SAndroid Build Coastguard Worker class PseudoSourceValueManager { 148*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue StackPSV, GOTPSV, JumpTablePSV, ConstantPoolPSV; 149*9880d681SAndroid Build Coastguard Worker std::map<int, std::unique_ptr<FixedStackPseudoSourceValue>> FSValues; 150*9880d681SAndroid Build Coastguard Worker StringMap<std::unique_ptr<const ExternalSymbolPseudoSourceValue>> 151*9880d681SAndroid Build Coastguard Worker ExternalCallEntries; 152*9880d681SAndroid Build Coastguard Worker ValueMap<const GlobalValue *, 153*9880d681SAndroid Build Coastguard Worker std::unique_ptr<const GlobalValuePseudoSourceValue>> 154*9880d681SAndroid Build Coastguard Worker GlobalCallEntries; 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker public: 157*9880d681SAndroid Build Coastguard Worker PseudoSourceValueManager(); 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker /// Return a pseudo source value referencing the area below the stack frame of 160*9880d681SAndroid Build Coastguard Worker /// a function, e.g., the argument space. 161*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue *getStack(); 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker /// Return a pseudo source value referencing the global offset table 164*9880d681SAndroid Build Coastguard Worker /// (or something the like). 165*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue *getGOT(); 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Worker /// Return a pseudo source value referencing the constant pool. Since constant 168*9880d681SAndroid Build Coastguard Worker /// pools are constant, this doesn't need to identify a specific constant 169*9880d681SAndroid Build Coastguard Worker /// pool entry. 170*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue *getConstantPool(); 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker /// Return a pseudo source value referencing a jump table. Since jump tables 173*9880d681SAndroid Build Coastguard Worker /// are constant, this doesn't need to identify a specific jump table. 174*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue *getJumpTable(); 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Worker /// Return a pseudo source value referencing a fixed stack frame entry, 177*9880d681SAndroid Build Coastguard Worker /// e.g., a spill slot. 178*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue *getFixedStack(int FI); 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue *getGlobalValueCallEntry(const GlobalValue *GV); 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker const PseudoSourceValue *getExternalSymbolCallEntry(const char *ES); 183*9880d681SAndroid Build Coastguard Worker }; 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker } // end namespace llvm 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Worker #endif 188