Home | History | Annotate | Download | only in Analysis
      1 //===- EHPersonalities.h - Compute EH-related information -----------------===//
      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 #ifndef LLVM_ANALYSIS_EHPERSONALITIES_H
     11 #define LLVM_ANALYSIS_EHPERSONALITIES_H
     12 
     13 #include "llvm/ADT/DenseMap.h"
     14 #include "llvm/ADT/TinyPtrVector.h"
     15 #include "llvm/Support/ErrorHandling.h"
     16 
     17 namespace llvm {
     18 class BasicBlock;
     19 class Function;
     20 class Value;
     21 
     22 enum class EHPersonality {
     23   Unknown,
     24   GNU_Ada,
     25   GNU_C,
     26   GNU_C_SjLj,
     27   GNU_CXX,
     28   GNU_CXX_SjLj,
     29   GNU_ObjC,
     30   MSVC_X86SEH,
     31   MSVC_Win64SEH,
     32   MSVC_CXX,
     33   CoreCLR,
     34   Rust
     35 };
     36 
     37 /// \brief See if the given exception handling personality function is one
     38 /// that we understand.  If so, return a description of it; otherwise return
     39 /// Unknown.
     40 EHPersonality classifyEHPersonality(const Value *Pers);
     41 
     42 /// \brief Returns true if this personality function catches asynchronous
     43 /// exceptions.
     44 inline bool isAsynchronousEHPersonality(EHPersonality Pers) {
     45   // The two SEH personality functions can catch asynch exceptions. We assume
     46   // unknown personalities don't catch asynch exceptions.
     47   switch (Pers) {
     48   case EHPersonality::MSVC_X86SEH:
     49   case EHPersonality::MSVC_Win64SEH:
     50     return true;
     51   default:
     52     return false;
     53   }
     54   llvm_unreachable("invalid enum");
     55 }
     56 
     57 /// \brief Returns true if this is a personality function that invokes
     58 /// handler funclets (which must return to it).
     59 inline bool isFuncletEHPersonality(EHPersonality Pers) {
     60   switch (Pers) {
     61   case EHPersonality::MSVC_CXX:
     62   case EHPersonality::MSVC_X86SEH:
     63   case EHPersonality::MSVC_Win64SEH:
     64   case EHPersonality::CoreCLR:
     65     return true;
     66   default:
     67     return false;
     68   }
     69   llvm_unreachable("invalid enum");
     70 }
     71 
     72 /// \brief Return true if this personality may be safely removed if there
     73 /// are no invoke instructions remaining in the current function.
     74 inline bool isNoOpWithoutInvoke(EHPersonality Pers) {
     75   switch (Pers) {
     76   case EHPersonality::Unknown:
     77     return false;
     78   // All known personalities currently have this behavior
     79   default:
     80     return true;
     81   }
     82   llvm_unreachable("invalid enum");
     83 }
     84 
     85 bool canSimplifyInvokeNoUnwind(const Function *F);
     86 
     87 typedef TinyPtrVector<BasicBlock *> ColorVector;
     88 
     89 /// \brief If an EH funclet personality is in use (see isFuncletEHPersonality),
     90 /// this will recompute which blocks are in which funclet. It is possible that
     91 /// some blocks are in multiple funclets. Consider this analysis to be
     92 /// expensive.
     93 DenseMap<BasicBlock *, ColorVector> colorEHFunclets(Function &F);
     94 
     95 } // end namespace llvm
     96 
     97 #endif
     98