LibCallSemantics.h   [plain text]


//===- LibCallSemantics.h - Describe library semantics --------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines interfaces that can be used to describe language specific
// runtime library interfaces (e.g. libc, libm, etc) to LLVM optimizers.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_ANALYSIS_LIBCALLSEMANTICS_H
#define LLVM_ANALYSIS_LIBCALLSEMANTICS_H

#include "llvm/Analysis/AliasAnalysis.h"

namespace llvm {
class InvokeInst;

  enum class EHPersonality {
    Unknown,
    GNU_Ada,
    GNU_C,
    GNU_CXX,
    GNU_ObjC,
    MSVC_X86SEH,
    MSVC_Win64SEH,
    MSVC_CXX,
    CoreCLR
  };

  /// \brief See if the given exception handling personality function is one
  /// that we understand.  If so, return a description of it; otherwise return
  /// Unknown.
  EHPersonality classifyEHPersonality(const Value *Pers);

  /// \brief Returns true if this personality function catches asynchronous
  /// exceptions.
  inline bool isAsynchronousEHPersonality(EHPersonality Pers) {
    // The two SEH personality functions can catch asynch exceptions. We assume
    // unknown personalities don't catch asynch exceptions.
    switch (Pers) {
    case EHPersonality::MSVC_X86SEH:
    case EHPersonality::MSVC_Win64SEH:
      return true;
    default: return false;
    }
    llvm_unreachable("invalid enum");
  }

  /// \brief Returns true if this is a personality function that invokes
  /// handler funclets (which must return to it).
  inline bool isFuncletEHPersonality(EHPersonality Pers) {
    switch (Pers) {
    case EHPersonality::MSVC_CXX:
    case EHPersonality::MSVC_X86SEH:
    case EHPersonality::MSVC_Win64SEH:
    case EHPersonality::CoreCLR:
      return true;
    default: return false;
    }
    llvm_unreachable("invalid enum");
  }

  /// \brief Return true if this personality may be safely removed if there
  /// are no invoke instructions remaining in the current function.
  inline bool isNoOpWithoutInvoke(EHPersonality Pers) {
    switch (Pers) {
    case EHPersonality::Unknown:
      return false;
    // All known personalities currently have this behavior
    default: return true;
    }
    llvm_unreachable("invalid enum");
  }

  bool canSimplifyInvokeNoUnwind(const Function *F);

} // end namespace llvm

#endif