12a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner//===-- MachineFunctionPass.h - Pass for MachineFunctions --------*-C++ -*-===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
92a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner//
102a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner// This file defines the MachineFunctionPass class.  MachineFunctionPass's are
112a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner// just FunctionPass's, except they operate on machine code as part of a code
122a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner// generator.  Because they operate on machine code, not the LLVM
132a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner// representation, MachineFunctionPass's are not allowed to modify the LLVM
142a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner// representation.  Due to this limitation, the MachineFunctionPass class takes
152a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner// care of declaring that no LLVM passes are invalidated.
162a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner//
172a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner//===----------------------------------------------------------------------===//
182a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner
19674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_CODEGEN_MACHINEFUNCTIONPASS_H
20674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_CODEGEN_MACHINEFUNCTIONPASS_H
212a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner
222a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner#include "llvm/Pass.h"
23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/CodeGen/MachineFunction.h"
242a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
27ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan Gohman/// MachineFunctionPass - This class adapts the FunctionPass interface to
28ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan Gohman/// allow convenient creation of passes that operate on the MachineFunction
29ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan Gohman/// representation. Instead of overriding runOnFunction, subclasses
30ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan Gohman/// override runOnMachineFunction.
31ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan Gohmanclass MachineFunctionPass : public FunctionPass {
32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool doInitialization(Module&) override {
34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Cache the properties info at module-init time so we don't have to
35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // construct them for every function.
36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    RequiredProperties = getRequiredProperties();
37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SetProperties = getSetProperties();
38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ClearedProperties = getClearedProperties();
39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return false;
40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
41ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan Gohmanprotected:
4290c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson  explicit MachineFunctionPass(char &ID) : FunctionPass(ID) {}
43794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel
442a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner  /// runOnMachineFunction - This method must be overloaded to perform the
452a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner  /// desired machine code transformation or analysis.
462a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner  ///
472a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner  virtual bool runOnMachineFunction(MachineFunction &MF) = 0;
482a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner
49ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan Gohman  /// getAnalysisUsage - Subclasses that override getAnalysisUsage
50ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan Gohman  /// must call this.
51d1ad72f54f4abf62a5f0b2c297edf5e4b1ab1024Dan Gohman  ///
52d1ad72f54f4abf62a5f0b2c297edf5e4b1ab1024Dan Gohman  /// For MachineFunctionPasses, calling AU.preservesCFG() indicates that
53d1ad72f54f4abf62a5f0b2c297edf5e4b1ab1024Dan Gohman  /// the pass does not modify the MachineBasicBlock CFG.
54d1ad72f54f4abf62a5f0b2c297edf5e4b1ab1024Dan Gohman  ///
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void getAnalysisUsage(AnalysisUsage &AU) const override;
56ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan Gohman
57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual MachineFunctionProperties getRequiredProperties() const {
58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return MachineFunctionProperties();
59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual MachineFunctionProperties getSetProperties() const {
61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return MachineFunctionProperties();
62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual MachineFunctionProperties getClearedProperties() const {
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return MachineFunctionProperties();
65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
67ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan Gohmanprivate:
68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MachineFunctionProperties RequiredProperties;
69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MachineFunctionProperties SetProperties;
70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MachineFunctionProperties ClearedProperties;
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
728613b18a5aa80b13bb8c7f470528146f009bed74Dan Gohman  /// createPrinterPass - Get a machine function printer pass.
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Pass *createPrinterPass(raw_ostream &O,
7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                          const std::string &Banner) const override;
758613b18a5aa80b13bb8c7f470528146f009bed74Dan Gohman
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool runOnFunction(Function &F) override;
772a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner};
782a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner
79d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
80d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
812a4a095e5788be7967c0ac311efc269bc87e80b3Chris Lattner#endif
82