Home | History | Annotate | Download | only in Utils
      1 //===-- UnifyFunctionExitNodes.h - Ensure fn's have one return --*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This pass is used to ensure that functions have at most one return and one
     11 // unwind instruction in them.  Additionally, it keeps track of which node is
     12 // the new exit node of the CFG.  If there are no return or unwind instructions
     13 // in the function, the getReturnBlock/getUnwindBlock methods will return a null
     14 // pointer.
     15 //
     16 //===----------------------------------------------------------------------===//
     17 
     18 #ifndef LLVM_TRANSFORMS_UNIFYFUNCTIONEXITNODES_H
     19 #define LLVM_TRANSFORMS_UNIFYFUNCTIONEXITNODES_H
     20 
     21 #include "llvm/Pass.h"
     22 
     23 namespace llvm {
     24 
     25 struct UnifyFunctionExitNodes : public FunctionPass {
     26   BasicBlock *ReturnBlock, *UnwindBlock, *UnreachableBlock;
     27 
     28 public:
     29   static char ID; // Pass identification, replacement for typeid
     30   UnifyFunctionExitNodes() : FunctionPass(ID),
     31                              ReturnBlock(nullptr), UnwindBlock(nullptr) {
     32     initializeUnifyFunctionExitNodesPass(*PassRegistry::getPassRegistry());
     33   }
     34 
     35   // We can preserve non-critical-edgeness when we unify function exit nodes
     36   void getAnalysisUsage(AnalysisUsage &AU) const override;
     37 
     38   // getReturn|Unwind|UnreachableBlock - Return the new single (or nonexistent)
     39   // return, unwind, or unreachable  basic blocks in the CFG.
     40   //
     41   BasicBlock *getReturnBlock() const { return ReturnBlock; }
     42   BasicBlock *getUnwindBlock() const { return UnwindBlock; }
     43   BasicBlock *getUnreachableBlock() const { return UnreachableBlock; }
     44 
     45   bool runOnFunction(Function &F) override;
     46 };
     47 
     48 Pass *createUnifyFunctionExitNodesPass();
     49 
     50 } // End llvm namespace
     51 
     52 #endif
     53