diff options
Diffstat (limited to 'include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h')
-rw-r--r-- | include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h b/include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h new file mode 100644 index 0000000000..09394685c1 --- /dev/null +++ b/include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h @@ -0,0 +1,37 @@ +//===-- UnifyMethodExitNodes.h - Ensure methods have one return --*- C++ -*--=// +// +// This pass is used to ensure that methods have at most one return instruction +// in them. It also holds onto the return instruction of the last unified +// method. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_XFORMS_UNIFY_METHOD_EXIT_NODES_H +#define LLVM_XFORMS_UNIFY_METHOD_EXIT_NODES_H + +#include "llvm/Pass.h" +#include "llvm/Analysis/SimplifyCFG.h" // FIXME!! + +struct UnifyMethodExitNodes : public MethodPass { + BasicBlock *ExitNode; +public: + static AnalysisID ID; // Pass ID + UnifyMethodExitNodes(AnalysisID id) : ExitNode(0) { assert(ID == id); } + + virtual bool runOnMethod(Method *M) { + ExitNode = cfg::UnifyAllExitNodes(M); + + return true; // FIXME: This should return a correct code!!! + } + + BasicBlock *getExitNode() const { return ExitNode; } + + virtual void getAnalysisUsageInfo(Pass::AnalysisSet &Required, + Pass::AnalysisSet &Destroyed, + Pass::AnalysisSet &Provided) { + // FIXME: Should invalidate CFG + Provided.push_back(ID); // Provide self! + } +}; + +#endif |