• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===----- ABI.h - ABI related declarations ---------------------*- C++ -*-===//
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 // These enums/classes describe ABI related information about constructors,
11 // destructors and thunks.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef CLANG_BASIC_ABI_H
16 #define CLANG_BASIC_ABI_H
17 
18 #include "llvm/Support/DataTypes.h"
19 
20 namespace clang {
21 
22 /// CXXCtorType - C++ constructor types
23 enum CXXCtorType {
24     Ctor_Complete,          // Complete object ctor
25     Ctor_Base,              // Base object ctor
26     Ctor_CompleteAllocating // Complete object allocating ctor
27 };
28 
29 /// CXXDtorType - C++ destructor types
30 enum CXXDtorType {
31     Dtor_Deleting, // Deleting dtor
32     Dtor_Complete, // Complete object dtor
33     Dtor_Base      // Base object dtor
34 };
35 
36 /// ReturnAdjustment - A return adjustment.
37 struct ReturnAdjustment {
38   /// NonVirtual - The non-virtual adjustment from the derived object to its
39   /// nearest virtual base.
40   int64_t NonVirtual;
41 
42   /// VBaseOffsetOffset - The offset (in bytes), relative to the address point
43   /// of the virtual base class offset.
44   int64_t VBaseOffsetOffset;
45 
ReturnAdjustmentReturnAdjustment46   ReturnAdjustment() : NonVirtual(0), VBaseOffsetOffset(0) { }
47 
isEmptyReturnAdjustment48   bool isEmpty() const { return !NonVirtual && !VBaseOffsetOffset; }
49 
50   friend bool operator==(const ReturnAdjustment &LHS,
51                          const ReturnAdjustment &RHS) {
52     return LHS.NonVirtual == RHS.NonVirtual &&
53       LHS.VBaseOffsetOffset == RHS.VBaseOffsetOffset;
54   }
55 
56   friend bool operator<(const ReturnAdjustment &LHS,
57                         const ReturnAdjustment &RHS) {
58     if (LHS.NonVirtual < RHS.NonVirtual)
59       return true;
60 
61     return LHS.NonVirtual == RHS.NonVirtual &&
62       LHS.VBaseOffsetOffset < RHS.VBaseOffsetOffset;
63   }
64 };
65 
66 /// ThisAdjustment - A 'this' pointer adjustment.
67 struct ThisAdjustment {
68   /// NonVirtual - The non-virtual adjustment from the derived object to its
69   /// nearest virtual base.
70   int64_t NonVirtual;
71 
72   /// VCallOffsetOffset - The offset (in bytes), relative to the address point,
73   /// of the virtual call offset.
74   int64_t VCallOffsetOffset;
75 
ThisAdjustmentThisAdjustment76   ThisAdjustment() : NonVirtual(0), VCallOffsetOffset(0) { }
77 
isEmptyThisAdjustment78   bool isEmpty() const { return !NonVirtual && !VCallOffsetOffset; }
79 
80   friend bool operator==(const ThisAdjustment &LHS,
81                          const ThisAdjustment &RHS) {
82     return LHS.NonVirtual == RHS.NonVirtual &&
83       LHS.VCallOffsetOffset == RHS.VCallOffsetOffset;
84   }
85 
86   friend bool operator<(const ThisAdjustment &LHS,
87                         const ThisAdjustment &RHS) {
88     if (LHS.NonVirtual < RHS.NonVirtual)
89       return true;
90 
91     return LHS.NonVirtual == RHS.NonVirtual &&
92       LHS.VCallOffsetOffset < RHS.VCallOffsetOffset;
93   }
94 };
95 
96 /// ThunkInfo - The 'this' pointer adjustment as well as an optional return
97 /// adjustment for a thunk.
98 struct ThunkInfo {
99   /// This - The 'this' pointer adjustment.
100   ThisAdjustment This;
101 
102   /// Return - The return adjustment.
103   ReturnAdjustment Return;
104 
ThunkInfoThunkInfo105   ThunkInfo() { }
106 
ThunkInfoThunkInfo107   ThunkInfo(const ThisAdjustment &This, const ReturnAdjustment &Return)
108     : This(This), Return(Return) { }
109 
110   friend bool operator==(const ThunkInfo &LHS, const ThunkInfo &RHS) {
111     return LHS.This == RHS.This && LHS.Return == RHS.Return;
112   }
113 
114   friend bool operator<(const ThunkInfo &LHS, const ThunkInfo &RHS) {
115     if (LHS.This < RHS.This)
116       return true;
117 
118     return LHS.This == RHS.This && LHS.Return < RHS.Return;
119   }
120 
isEmptyThunkInfo121   bool isEmpty() const { return This.isEmpty() && Return.isEmpty(); }
122 };
123 
124 } // end namespace clang
125 
126 #endif // CLANG_BASIC_ABI_H
127