1 //===-- MachineFunctionPass.h - Pass for MachineFunctions --------*-C++ -*-===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines the MachineFunctionPass class.  MachineFunctionPass's are
10 // just FunctionPass's, except they operate on machine code as part of a code
11 // generator.  Because they operate on machine code, not the LLVM
12 // representation, MachineFunctionPass's are not allowed to modify the LLVM
13 // representation.  Due to this limitation, the MachineFunctionPass class takes
14 // care of declaring that no LLVM passes are invalidated.
15 //
16 //===----------------------------------------------------------------------===//
17 
18 #ifndef LLVM_CODEGEN_MACHINEFUNCTIONPASS_H
19 #define LLVM_CODEGEN_MACHINEFUNCTIONPASS_H
20 
21 #include "llvm/CodeGen/MachineFunction.h"
22 #include "llvm/Pass.h"
23 
24 namespace llvm {
25 
26 /// MachineFunctionPass - This class adapts the FunctionPass interface to
27 /// allow convenient creation of passes that operate on the MachineFunction
28 /// representation. Instead of overriding runOnFunction, subclasses
29 /// override runOnMachineFunction.
30 class MachineFunctionPass : public FunctionPass {
31 public:
32   bool doInitialization(Module&) override {
33     // Cache the properties info at module-init time so we don't have to
34     // construct them for every function.
35     RequiredProperties = getRequiredProperties();
36     SetProperties = getSetProperties();
37     ClearedProperties = getClearedProperties();
38     return false;
39   }
40 protected:
41   explicit MachineFunctionPass(char &ID) : FunctionPass(ID) {}
42 
43   /// runOnMachineFunction - This method must be overloaded to perform the
44   /// desired machine code transformation or analysis.
45   ///
46   virtual bool runOnMachineFunction(MachineFunction &MF) = 0;
47 
48   /// getAnalysisUsage - Subclasses that override getAnalysisUsage
49   /// must call this.
50   ///
51   /// For MachineFunctionPasses, calling AU.preservesCFG() indicates that
52   /// the pass does not modify the MachineBasicBlock CFG.
53   ///
54   void getAnalysisUsage(AnalysisUsage &AU) const override;
55 
56   virtual MachineFunctionProperties getRequiredProperties() const {
57     return MachineFunctionProperties();
58   }
59   virtual MachineFunctionProperties getSetProperties() const {
60     return MachineFunctionProperties();
61   }
62   virtual MachineFunctionProperties getClearedProperties() const {
63     return MachineFunctionProperties();
64   }
65 
66 private:
67   MachineFunctionProperties RequiredProperties;
68   MachineFunctionProperties SetProperties;
69   MachineFunctionProperties ClearedProperties;
70 
71   /// createPrinterPass - Get a machine function printer pass.
72   Pass *createPrinterPass(raw_ostream &O,
73                           const std::string &Banner) const override;
74 
75   bool runOnFunction(Function &F) override;
76 };
77 
78 } // End llvm namespace
79 
80 #endif
81