| //===-- UnifyFunctionExitNodes.h - Ensure fn's have one return --*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This pass is used to ensure that functions have at most one return and one | |
| // unwind instruction in them. Additionally, it keeps track of which node is | |
| // the new exit node of the CFG. If there are no return or unwind instructions | |
| // in the function, the getReturnBlock/getUnwindBlock methods will return a null | |
| // pointer. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_TRANSFORMS_UNIFYFUNCTIONEXITNODES_H | |
| #define LLVM_TRANSFORMS_UNIFYFUNCTIONEXITNODES_H | |
| #include "llvm/Pass.h" | |
| namespace llvm { | |
| struct UnifyFunctionExitNodes : public FunctionPass { | |
| BasicBlock *ReturnBlock, *UnwindBlock, *UnreachableBlock; | |
| public: | |
| static char ID; // Pass identification, replacement for typeid | |
| UnifyFunctionExitNodes() : FunctionPass(ID), | |
| ReturnBlock(0), UnwindBlock(0) { | |
| initializeUnifyFunctionExitNodesPass(*PassRegistry::getPassRegistry()); | |
| } | |
| // We can preserve non-critical-edgeness when we unify function exit nodes | |
| virtual void getAnalysisUsage(AnalysisUsage &AU) const; | |
| // getReturn|Unwind|UnreachableBlock - Return the new single (or nonexistant) | |
| // return, unwind, or unreachable basic blocks in the CFG. | |
| // | |
| BasicBlock *getReturnBlock() const { return ReturnBlock; } | |
| BasicBlock *getUnwindBlock() const { return UnwindBlock; } | |
| BasicBlock *getUnreachableBlock() const { return UnreachableBlock; } | |
| virtual bool runOnFunction(Function &F); | |
| }; | |
| Pass *createUnifyFunctionExitNodesPass(); | |
| } // End llvm namespace | |
| #endif |