123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===-- llvm/CodeGen/PseudoSourceValue.h ------------------------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file contains the declaration of the PseudoSourceValue class.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_CODEGEN_PSEUDOSOURCEVALUE_H
- #define LLVM_CODEGEN_PSEUDOSOURCEVALUE_H
- #include "llvm/ADT/StringMap.h"
- #include "llvm/IR/ValueMap.h"
- #include <map>
- namespace llvm {
- class GlobalValue;
- class MachineFrameInfo;
- class MachineMemOperand;
- class MIRFormatter;
- class PseudoSourceValue;
- class raw_ostream;
- class TargetInstrInfo;
- raw_ostream &operator<<(raw_ostream &OS, const PseudoSourceValue* PSV);
- /// Special value supplied for machine level alias analysis. It indicates that
- /// a memory access references the functions stack frame (e.g., a spill slot),
- /// below the stack frame (e.g., argument space), or constant pool.
- class PseudoSourceValue {
- public:
- enum PSVKind : unsigned {
- Stack,
- GOT,
- JumpTable,
- ConstantPool,
- FixedStack,
- GlobalValueCallEntry,
- ExternalSymbolCallEntry,
- TargetCustom
- };
- private:
- unsigned Kind;
- unsigned AddressSpace;
- friend raw_ostream &llvm::operator<<(raw_ostream &OS,
- const PseudoSourceValue* PSV);
- friend class MachineMemOperand; // For printCustom().
- friend class MIRFormatter; // For printCustom().
- /// Implement printing for PseudoSourceValue. This is called from
- /// Value::print or Value's operator<<.
- virtual void printCustom(raw_ostream &O) const;
- public:
- explicit PseudoSourceValue(unsigned Kind, const TargetInstrInfo &TII);
- virtual ~PseudoSourceValue();
- unsigned kind() const { return Kind; }
- bool isStack() const { return Kind == Stack; }
- bool isGOT() const { return Kind == GOT; }
- bool isConstantPool() const { return Kind == ConstantPool; }
- bool isJumpTable() const { return Kind == JumpTable; }
- unsigned getAddressSpace() const { return AddressSpace; }
- unsigned getTargetCustom() const {
- return (Kind >= TargetCustom) ? ((Kind+1) - TargetCustom) : 0;
- }
- /// Test whether the memory pointed to by this PseudoSourceValue has a
- /// constant value.
- virtual bool isConstant(const MachineFrameInfo *) const;
- /// Test whether the memory pointed to by this PseudoSourceValue may also be
- /// pointed to by an LLVM IR Value.
- virtual bool isAliased(const MachineFrameInfo *) const;
- /// Return true if the memory pointed to by this PseudoSourceValue can ever
- /// alias an LLVM IR Value.
- virtual bool mayAlias(const MachineFrameInfo *) const;
- };
- /// A specialized PseudoSourceValue for holding FixedStack values, which must
- /// include a frame index.
- class FixedStackPseudoSourceValue : public PseudoSourceValue {
- const int FI;
- public:
- explicit FixedStackPseudoSourceValue(int FI, const TargetInstrInfo &TII)
- : PseudoSourceValue(FixedStack, TII), FI(FI) {}
- static bool classof(const PseudoSourceValue *V) {
- return V->kind() == FixedStack;
- }
- bool isConstant(const MachineFrameInfo *MFI) const override;
- bool isAliased(const MachineFrameInfo *MFI) const override;
- bool mayAlias(const MachineFrameInfo *) const override;
- void printCustom(raw_ostream &OS) const override;
- int getFrameIndex() const { return FI; }
- };
- class CallEntryPseudoSourceValue : public PseudoSourceValue {
- protected:
- CallEntryPseudoSourceValue(unsigned Kind, const TargetInstrInfo &TII);
- public:
- bool isConstant(const MachineFrameInfo *) const override;
- bool isAliased(const MachineFrameInfo *) const override;
- bool mayAlias(const MachineFrameInfo *) const override;
- };
- /// A specialized pseudo source value for holding GlobalValue values.
- class GlobalValuePseudoSourceValue : public CallEntryPseudoSourceValue {
- const GlobalValue *GV;
- public:
- GlobalValuePseudoSourceValue(const GlobalValue *GV,
- const TargetInstrInfo &TII);
- static bool classof(const PseudoSourceValue *V) {
- return V->kind() == GlobalValueCallEntry;
- }
- const GlobalValue *getValue() const { return GV; }
- };
- /// A specialized pseudo source value for holding external symbol values.
- class ExternalSymbolPseudoSourceValue : public CallEntryPseudoSourceValue {
- const char *ES;
- public:
- ExternalSymbolPseudoSourceValue(const char *ES, const TargetInstrInfo &TII);
- static bool classof(const PseudoSourceValue *V) {
- return V->kind() == ExternalSymbolCallEntry;
- }
- const char *getSymbol() const { return ES; }
- };
- /// Manages creation of pseudo source values.
- class PseudoSourceValueManager {
- const TargetInstrInfo &TII;
- const PseudoSourceValue StackPSV, GOTPSV, JumpTablePSV, ConstantPoolPSV;
- std::map<int, std::unique_ptr<FixedStackPseudoSourceValue>> FSValues;
- StringMap<std::unique_ptr<const ExternalSymbolPseudoSourceValue>>
- ExternalCallEntries;
- ValueMap<const GlobalValue *,
- std::unique_ptr<const GlobalValuePseudoSourceValue>>
- GlobalCallEntries;
- public:
- PseudoSourceValueManager(const TargetInstrInfo &TII);
- /// Return a pseudo source value referencing the area below the stack frame of
- /// a function, e.g., the argument space.
- const PseudoSourceValue *getStack();
- /// Return a pseudo source value referencing the global offset table
- /// (or something the like).
- const PseudoSourceValue *getGOT();
- /// Return a pseudo source value referencing the constant pool. Since constant
- /// pools are constant, this doesn't need to identify a specific constant
- /// pool entry.
- const PseudoSourceValue *getConstantPool();
- /// Return a pseudo source value referencing a jump table. Since jump tables
- /// are constant, this doesn't need to identify a specific jump table.
- const PseudoSourceValue *getJumpTable();
- /// Return a pseudo source value referencing a fixed stack frame entry,
- /// e.g., a spill slot.
- const PseudoSourceValue *getFixedStack(int FI);
- const PseudoSourceValue *getGlobalValueCallEntry(const GlobalValue *GV);
- const PseudoSourceValue *getExternalSymbolCallEntry(const char *ES);
- };
- } // end namespace llvm
- #endif
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|