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