summaryrefslogtreecommitdiff
path: root/include/llvm/CodeGen/StackMapLivenessAnalysis.h
blob: 651ca6b914a3f68974feb36b7c4d6947bf4b914c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//===--- StackMapLivenessAnalysis - StackMap Liveness Analysis --*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This pass calculates the liveness for each basic block in a function and
// attaches the register live-out information to a patchpoint intrinsic (if
// present).
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_CODEGEN_STACKMAP_LIVENESS_ANALYSIS_H
#define LLVM_CODEGEN_STACKMAP_LIVENESS_ANALYSIS_H

#include "llvm/CodeGen/LivePhysRegs.h"
#include "llvm/CodeGen/MachineFunctionPass.h"


namespace llvm {

/// \brief This pass calculates the liveness information for each basic block in
/// a function and attaches the register live-out information to a patchpoint
/// intrinsic if present.
///
/// This is an optional pass that has to be explicitly enabled via the
/// -enable-patchpoint-liveness flag. The pass skips functions that don't have
/// any patchpoint intrinsics. The information provided by this pass is optional
/// and not required by the aformentioned intrinsic to function.
class StackMapLiveness : public MachineFunctionPass {
  MachineFunction *MF;
  const TargetRegisterInfo *TRI;
  LivePhysRegs LiveRegs;
public:
  static char ID;

  /// \brief Default construct and initialize the pass.
  StackMapLiveness();

  /// \brief Tell the pass manager which passes we depend on and what
  /// information we preserve.
  void getAnalysisUsage(AnalysisUsage &AU) const override;

  /// \brief Calculate the liveness information for the given machine function.
  bool runOnMachineFunction(MachineFunction &MF) override;

private:
  /// \brief Performs the actual liveness calculation for the function.
  bool calculateLiveness();

  /// \brief Add the current register live set to the instruction.
  void addLiveOutSetToMI(MachineInstr &MI);

  /// \brief Create a register mask and initialize it with the registers from
  /// the register live set.
  uint32_t *createRegisterMask() const;
};

} // llvm namespace

#endif // LLVM_CODEGEN_STACKMAP_LIVENESS_ANALYSIS_H