//===-- CGCleanup.h - Classes for cleanups IR generation --------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // These classes support the generation of LLVM IR for cleanups. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_LIB_CODEGEN_CGCLEANUP_H #define LLVM_CLANG_LIB_CODEGEN_CGCLEANUP_H #include "EHScopeStack.h" #include "Address.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/IR/Instruction.h" namespace llvm { class BasicBlock; class Value; class ConstantInt; } namespace clang { class FunctionDecl; namespace CodeGen { class CodeGenModule; class CodeGenFunction; /// The MS C++ ABI needs a pointer to RTTI data plus some flags to describe the /// type of a catch handler, so we use this wrapper. struct CatchTypeInfo { … }; /// A protected scope for zero-cost EH handling. class EHScope { … }; /// A scope which attempts to handle some, possibly all, types of /// exceptions. /// /// Objective C \@finally blocks are represented using a cleanup scope /// after the catch scope. class EHCatchScope : public EHScope { … }; /// A cleanup scope which generates the cleanup blocks lazily. class alignas(8) EHCleanupScope : public EHScope { … }; // NOTE: there's a bunch of different data classes tacked on after an // EHCleanupScope. It is asserted (in EHScopeStack::pushCleanup*) that // they don't require greater alignment than ScopeStackAlignment. So, // EHCleanupScope ought to have alignment equal to that -- not more // (would be misaligned by the stack allocator), and not less (would // break the appended classes). static_assert …; /// An exceptions scope which filters exceptions thrown through it. /// Only exceptions matching the filter types will be permitted to be /// thrown. /// /// This is used to implement C++ exception specifications. class EHFilterScope : public EHScope { … }; /// An exceptions scope which calls std::terminate if any exception /// reaches it. class EHTerminateScope : public EHScope { … }; /// A non-stable pointer into the scope stack. class EHScopeStack::iterator { … }; inline EHScopeStack::iterator EHScopeStack::begin() const { … } inline EHScopeStack::iterator EHScopeStack::end() const { … } inline void EHScopeStack::popCatch() { … } inline void EHScopeStack::popTerminate() { … } inline EHScopeStack::iterator EHScopeStack::find(stable_iterator sp) const { … } inline EHScopeStack::stable_iterator EHScopeStack::stabilize(iterator ir) const { … } /// The exceptions personality for a function. struct EHPersonality { … }; } } #endif