Home | History | Annotate | Download | only in AST

Lines Matching full:thunk

880   /// AddThunk - Add a thunk for the given method.
881 void AddThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk);
926 /// adjustment is required and no thunk is generated. However, inside D
930 /// thunk. Since we require that a call to C::f() first convert to A*,
1070 const ThunkInfo &Thunk) {
1076 // Check if we have this thunk already.
1077 if (std::find(ThunksVector.begin(), ThunksVector.end(), Thunk) !=
1081 ThunksVector.push_back(Thunk);
1144 // When a return thunk is needed by a derived class that overrides a
1146 // While the thunk itself might be needed by vtables in subclasses or
1148 // the thunk in this vtable. Still, we do so to match gcc.
1172 // We don't need to store thunk information for construction vtables.
1179 const ThunkInfo &Thunk = I->second;
1192 // We've already added the thunk when we saw the complete dtor pointer.
1197 AddThunk(MD, Thunk);
1549 // thunk if we ever have a class hierarchy where the base class is not
1568 // This is a virtual thunk for the most derived class, add it.
1979 ThunkInfo Thunk = VTableThunks.lookup(I);
1980 if (!Thunk.isEmpty()) {
1982 if (!Thunk.Return.isEmpty()) {
1984 Out << Thunk.Return.NonVirtual << " non-virtual";
1986 if (Thunk.Return.Virtual.Itanium.VBaseOffsetOffset) {
1987 Out << ", " << Thunk.Return.Virtual.Itanium.VBaseOffsetOffset;
1995 if (!Thunk.This.isEmpty()) {
1997 Out << Thunk.This.NonVirtual << " non-virtual";
1999 if (Thunk.This.Virtual.Itanium.VCallOffsetOffset) {
2000 Out << ", " << Thunk.This.Virtual.Itanium.VCallOffsetOffset;
2027 ThunkInfo Thunk = VTableThunks.lookup(I);
2028 if (!Thunk.isEmpty()) {
2030 if (!Thunk.This.isEmpty()) {
2032 Out << Thunk.This.NonVirtual << " non-virtual";
2034 if (Thunk.This.Virtual.Itanium.VCallOffsetOffset) {
2035 Out << ", " << Thunk.This.Virtual.Itanium.VCallOffsetOffset;
2159 const ThunkInfo &Thunk = ThunksVector[I];
2164 if (!Thunk.Return.isEmpty()) {
2165 Out << "return adjustment: " << Thunk.Return.NonVirtual;
2167 if (Thunk.Return.Virtual.Itanium.VBaseOffsetOffset) {
2168 Out << ", " << Thunk.Return.Virtual.Itanium.VBaseOffsetOffset;
2172 if (!Thunk.This.isEmpty())
2177 if (!Thunk.This.isEmpty()) {
2179 Out << Thunk.This.NonVirtual << " non-virtual";
2181 if (Thunk.This.Virtual.Itanium.VCallOffsetOffset) {
2182 Out << ", " << Thunk.This.Virtual.Itanium.VCallOffsetOffset;
2397 // the method instead of passing through a thunk.
2409 // object), the vf-table may require a this-adjustment thunk.
2477 /// any of the overridden slots required a return adjusting thunk.
2509 /// AddThunk - Add a thunk for the given method.
2510 void AddThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk) {
2513 // Check if we have this thunk already.
2514 if (std::find(ThunksVector.begin(), ThunksVector.end(), Thunk) !=
2518 ThunksVector.push_back(Thunk);
2705 // vftable entry should hold a thunk that adds 12 to the "this" argument before
2757 // this-adjusting thunk in the vftable if A and B are laid out
2859 // An extra adjustment is needed, so we emit a thunk into the B vftable.
2860 // This vtordisp thunk subtracts the value of vtordisp
2880 // When D::D() calls foo(), we find ourselves in a thunk that should tailcall
2902 // OK, now we know we need to use a vtordisp thunk.
2908 // A simple vtordisp thunk will suffice if the final overrider is defined
3066 // Force a special name mangling for a return-adjusting thunk
3190 // FIXME: Figure out how to print the real thunk type, since they can
3201 ThunkInfo Thunk = VTableThunks.lookup(I);
3202 if (!Thunk.isEmpty())
3203 dumpMicrosoftThunkAdjustment(Thunk, Out, /*ContinueFirstLine=*/false);
3217 ThunkInfo Thunk = VTableThunks.lookup(I);
3218 if (!Thunk.isEmpty()) {
3219 assert(Thunk.Return.isEmpty() &&
3221 dumpMicrosoftThunkAdjustment(Thunk, Out, /*ContinueFirstLine=*/false);
3273 const ThunkInfo &Thunk = ThunksVector[I];
3276 dumpMicrosoftThunkAdjustment(Thunk, Out, /*ContinueFirstLine=*/true);