| //===----- ABI.h - ABI related declarations ---------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// \brief Enums/classes describing ABI related information about constructors, |
| /// destructors and thunks. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef CLANG_BASIC_ABI_H |
| #define CLANG_BASIC_ABI_H |
| |
| #include "llvm/Support/DataTypes.h" |
| |
| namespace clang { |
| |
| /// \brief C++ constructor types. |
| enum CXXCtorType { |
| Ctor_Complete, ///< Complete object ctor |
| Ctor_Base, ///< Base object ctor |
| Ctor_CompleteAllocating ///< Complete object allocating ctor |
| }; |
| |
| /// \brief C++ destructor types. |
| enum CXXDtorType { |
| Dtor_Deleting, ///< Deleting dtor |
| Dtor_Complete, ///< Complete object dtor |
| Dtor_Base ///< Base object dtor |
| }; |
| |
| /// \brief A return adjustment. |
| struct ReturnAdjustment { |
| /// \brief The non-virtual adjustment from the derived object to its |
| /// nearest virtual base. |
| int64_t NonVirtual; |
| |
| /// \brief The offset (in bytes), relative to the address point |
| /// of the virtual base class offset. |
| int64_t VBaseOffsetOffset; |
| |
| ReturnAdjustment() : NonVirtual(0), VBaseOffsetOffset(0) { } |
| |
| bool isEmpty() const { return !NonVirtual && !VBaseOffsetOffset; } |
| |
| friend bool operator==(const ReturnAdjustment &LHS, |
| const ReturnAdjustment &RHS) { |
| return LHS.NonVirtual == RHS.NonVirtual && |
| LHS.VBaseOffsetOffset == RHS.VBaseOffsetOffset; |
| } |
| |
| friend bool operator<(const ReturnAdjustment &LHS, |
| const ReturnAdjustment &RHS) { |
| if (LHS.NonVirtual < RHS.NonVirtual) |
| return true; |
| |
| return LHS.NonVirtual == RHS.NonVirtual && |
| LHS.VBaseOffsetOffset < RHS.VBaseOffsetOffset; |
| } |
| }; |
| |
| /// \brief A \c this pointer adjustment. |
| struct ThisAdjustment { |
| /// \brief The non-virtual adjustment from the derived object to its |
| /// nearest virtual base. |
| int64_t NonVirtual; |
| |
| /// \brief The offset (in bytes), relative to the address point, |
| /// of the virtual call offset. |
| int64_t VCallOffsetOffset; |
| |
| ThisAdjustment() : NonVirtual(0), VCallOffsetOffset(0) { } |
| |
| bool isEmpty() const { return !NonVirtual && !VCallOffsetOffset; } |
| |
| friend bool operator==(const ThisAdjustment &LHS, |
| const ThisAdjustment &RHS) { |
| return LHS.NonVirtual == RHS.NonVirtual && |
| LHS.VCallOffsetOffset == RHS.VCallOffsetOffset; |
| } |
| |
| friend bool operator<(const ThisAdjustment &LHS, |
| const ThisAdjustment &RHS) { |
| if (LHS.NonVirtual < RHS.NonVirtual) |
| return true; |
| |
| return LHS.NonVirtual == RHS.NonVirtual && |
| LHS.VCallOffsetOffset < RHS.VCallOffsetOffset; |
| } |
| }; |
| |
| /// \brief The \c this pointer adjustment as well as an optional return |
| /// adjustment for a thunk. |
| struct ThunkInfo { |
| /// \brief The \c this pointer adjustment. |
| ThisAdjustment This; |
| |
| /// \brief The return adjustment. |
| ReturnAdjustment Return; |
| |
| ThunkInfo() { } |
| |
| ThunkInfo(const ThisAdjustment &This, const ReturnAdjustment &Return) |
| : This(This), Return(Return) { } |
| |
| friend bool operator==(const ThunkInfo &LHS, const ThunkInfo &RHS) { |
| return LHS.This == RHS.This && LHS.Return == RHS.Return; |
| } |
| |
| friend bool operator<(const ThunkInfo &LHS, const ThunkInfo &RHS) { |
| if (LHS.This < RHS.This) |
| return true; |
| |
| return LHS.This == RHS.This && LHS.Return < RHS.Return; |
| } |
| |
| bool isEmpty() const { return This.isEmpty() && Return.isEmpty(); } |
| }; |
| |
| } // end namespace clang |
| |
| #endif // CLANG_BASIC_ABI_H |