//===-- 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 TargetMachine;
 
 
 
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 TargetMachine &TM);
 
 
 
  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 TargetMachine &TM)
 
      : PseudoSourceValue(FixedStack, TM), 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 TargetMachine &TM);
 
 
 
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 TargetMachine &TM);
 
 
 
  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 TargetMachine &TM);
 
 
 
  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 TargetMachine &TM;
 
  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 TargetMachine &TM);
 
 
 
  /// 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