//===-- EHScopeStack.h - Stack for cleanup 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 should be the minimum interface required for other parts of // CodeGen to emit cleanups. The implementation is in CGCleanup.cpp and other // implemenentation details that are not widely needed are in CGCleanup.h. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_LIB_CODEGEN_EHSCOPESTACK_H #define LLVM_CLANG_LIB_CODEGEN_EHSCOPESTACK_H #include "clang/Basic/LLVM.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/Value.h" namespace clang { namespace CodeGen { class CodeGenFunction; /// A branch fixup. These are required when emitting a goto to a /// label which hasn't been emitted yet. The goto is optimistically /// emitted as a branch to the basic block for the label, and (if it /// occurs in a scope with non-trivial cleanups) a fixup is added to /// the innermost cleanup. When a (normal) cleanup is popped, any /// unresolved fixups in that scope are threaded through the cleanup. struct BranchFixup { … }; template <class T> struct InvariantValue { … }; /// A metaprogramming class for ensuring that a value will dominate an /// arbitrary position in a function. template <class T> struct DominatingValue : InvariantValue<T> { … }; template <class T, bool mightBeInstruction = std::is_base_of<llvm::Value, T>::value && !std::is_base_of<llvm::Constant, T>::value && !std::is_base_of<llvm::BasicBlock, T>::value> struct DominatingPointer; DominatingPointer<T, false>; // template <class T> struct DominatingPointer<T,true> at end of file DominatingValue<T *>; enum CleanupKind : unsigned { … }; /// A stack of scopes which respond to exceptions, including cleanups /// and catch blocks. class EHScopeStack { … }; } // namespace CodeGen } // namespace clang #endif