1; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s
2; RUN: llc < %s | FileCheck %s --check-prefix=ASM
3; RUN: opt -S -debugger-tune=lldb %s | FileCheck -check-prefix=OPT %s
4;
5; -- "thunk.cpp" begin --------------------------------------------------------
6; class A { public: virtual bool MyMethod() { return true; } };
7; class B { public: virtual bool MyMethod() { return true; } };
8; class C : public virtual A, public virtual B {
9; public:
10;     virtual bool MyMethod() { return true; }
11; };
12;
13; int main()
14; {
15;     A* a = new C();
16;     B* b = new C();
17;     C* c = new C();
18;     a->MyMethod();
19;     b->MyMethod();
20;     c->MyMethod();
21;     bool (A::*mp)() = &A::MyMethod;
22;     return 0;
23; }
24; -- "thunk.cpp" end ----------------------------------------------------------
25;
26; Build command:
27;   $ clang -S -emit-llvm -g -gcodeview thunk.cpp
28;
29; CHECK:       Thunk32Sym {
30; CHECK-NEXT:    Kind: S_THUNK32 ({{.*}})
31; CHECK-NEXT:    Name: {{.*_9A.*}}
32; CHECK-NEXT:    Parent: 0
33; CHECK-NEXT:    End: 0
34; CHECK-NEXT:    Next: 0
35; CHECK-NEXT:    Off: 0
36; CHECK-NEXT:    Seg: 0
37; CHECK-NEXT:    Len: {{[0-9]+}}
38; CHECK-NEXT:    Ordinal: Standard (0x0)
39; CHECK-NEXT:  }
40; CHECK-NEXT:  ProcEnd {
41; CHECK-NEXT:    Kind: S_PROC_ID_END ({{.*}})
42; CHECK-NEXT:  }
43;
44; CHECK:       Thunk32Sym {
45; CHECK-NEXT:    Kind: S_THUNK32 ({{.*}})
46; CHECK-NEXT:    Name: {{.*MyMethod.*C.*}}
47; CHECK-NEXT:    Parent: 0
48; CHECK-NEXT:    End: 0
49; CHECK-NEXT:    Next: 0
50; CHECK-NEXT:    Off: 0
51; CHECK-NEXT:    Seg: 0
52; CHECK-NEXT:    Len: {{[0-9]+}}
53; CHECK-NEXT:    Ordinal: Standard (0x0)
54; CHECK-NEXT:  }
55; CHECK-NEXT:  ProcEnd {
56; CHECK-NEXT:    Kind: S_PROC_ID_END ({{.*}})
57; CHECK-NEXT:  }
58
59; ASM:        .long   241                     # Symbol subsection for [[NAME1:.*_9A.*]]
60; ASM-NEXT:   .long   {{.*}}                  # Subsection size
61; ASM-NEXT: {{L.*}}:
62; ASM-NEXT:   .short  [[END1:.?L.*]]-[[BEGIN1:.?L.*]]   # Record length
63; ASM-NEXT: [[BEGIN1]]:
64; ASM-NEXT:   .short  4354                    # Record kind: S_THUNK32
65; ASM-NEXT:   .long   0                       # PtrParent
66; ASM-NEXT:   .long   0                       # PtrEnd
67; ASM-NEXT:   .long   0                       # PtrNext
68; ASM-NEXT:   .secrel32 "[[NAME1]]"           # Thunk section relative address
69; ASM-NEXT:   .secidx "[[NAME1]]"             # Thunk section index
70; ASM-NEXT:   .short  Lfunc_end{{.*}}-"[[NAME1]]" # Code size
71; ASM-NEXT:   .byte   0                       # Ordinal
72; ASM-NEXT:   .asciz  "[[NAME1]]"             # Function name
73; ASM-NEXT:   .p2align 2
74; ASM-NEXT: [[END1]]:
75; ASM-NEXT:   .short  2                       # Record length
76; ASM-NEXT:   .short  4431                    # Record kind: S_PROC_ID_END
77;
78; ASM:        .long 241                       # Symbol subsection for [[NAME2:.*MyMethod.*C.*]]
79; ASM-NEXT:   .long {{.*}}                    # Subsection size
80; ASM-NEXT: {{L.*}}:
81; ASM-NEXT:   .short [[END2:.?L.*]]-[[BEGIN2:.?L.*]] # Record length
82; ASM-NEXT: [[BEGIN2]]:
83; ASM-NEXT:   .short 4354                     # Record kind: S_THUNK32
84; ASM-NEXT:   .long 0                         # PtrParent
85; ASM-NEXT:   .long 0                         # PtrEnd
86; ASM-NEXT:   .long 0                         # PtrNext
87; ASM-NEXT:   .secrel32 "[[NAME2]]"           # Thunk section relative address
88; ASM-NEXT:   .secidx   "[[NAME2]]"           # Thunk section index
89; ASM-NEXT:   .short Lfunc_end{{.*}}-"[[NAME2]]" # Code size
90; ASM-NEXT:   .byte 0                         # Ordinal
91; ASM-NEXT:   .asciz "[[NAME2]]"              # Function name
92; ASM-NEXT:   .p2align 2
93; ASM-NEXT: [[END2]]:
94; ASM-NEXT:   .short 2                        # Record length
95; ASM-NEXT:   .short 4431                     # Record kind: S_PROC_ID_END
96
97; OPT: DISubprogram(linkageName: "{{.*MyMethod.*C.*}}",{{.*}} line: 5,{{.*}} flags: DIFlagArtificial | DIFlagThunk{{.*}})
98
99
100; ModuleID = 'thunk.cpp'
101source_filename = "thunk.cpp"
102target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
103target triple = "i686-pc-windows-msvc19.0.24210"
104
105%rtti.CompleteObjectLocator = type { i32, i32, i32, i8*, %rtti.ClassHierarchyDescriptor* }
106%rtti.ClassHierarchyDescriptor = type { i32, i32, i32, %rtti.BaseClassDescriptor** }
107%rtti.BaseClassDescriptor = type { i8*, i32, i32, i32, i32, i32, %rtti.ClassHierarchyDescriptor* }
108%rtti.TypeDescriptor7 = type { i8**, i8*, [8 x i8] }
109%class.A = type { i32 (...)** }
110%class.B = type { i32 (...)** }
111%class.C = type { i32*, %class.A, %class.B }
112
113$"\01??0C@@QAE@XZ" = comdat any
114
115$"\01??_9A@@$BA@AE" = comdat any
116
117$"\01??0A@@QAE@XZ" = comdat any
118
119$"\01??0B@@QAE@XZ" = comdat any
120
121$"\01?MyMethod@C@@UAE_NXZ" = comdat any
122
123$"\01?MyMethod@C@@W3AE_NXZ" = comdat any
124
125$"\01?MyMethod@A@@UAE_NXZ" = comdat any
126
127$"\01?MyMethod@B@@UAE_NXZ" = comdat any
128
129$"\01??_8C@@7B@" = comdat any
130
131$"\01??_7C@@6BA@@@" = comdat largest
132
133$"\01??_7C@@6BB@@@" = comdat largest
134
135$"\01??_R4C@@6BA@@@" = comdat any
136
137$"\01??_R0?AVC@@@8" = comdat any
138
139$"\01??_R3C@@8" = comdat any
140
141$"\01??_R2C@@8" = comdat any
142
143$"\01??_R1A@?0A@EA@C@@8" = comdat any
144
145$"\01??_R1A@A@3FA@A@@8" = comdat any
146
147$"\01??_R0?AVA@@@8" = comdat any
148
149$"\01??_R3A@@8" = comdat any
150
151$"\01??_R2A@@8" = comdat any
152
153$"\01??_R1A@?0A@EA@A@@8" = comdat any
154
155$"\01??_R1A@A@7FA@B@@8" = comdat any
156
157$"\01??_R0?AVB@@@8" = comdat any
158
159$"\01??_R3B@@8" = comdat any
160
161$"\01??_R2B@@8" = comdat any
162
163$"\01??_R1A@?0A@EA@B@@8" = comdat any
164
165$"\01??_R4C@@6BB@@@" = comdat any
166
167$"\01??_7A@@6B@" = comdat largest
168
169$"\01??_R4A@@6B@" = comdat any
170
171$"\01??_7B@@6B@" = comdat largest
172
173$"\01??_R4B@@6B@" = comdat any
174
175@"\01??_8C@@7B@" = linkonce_odr unnamed_addr constant [3 x i32] [i32 0, i32 4, i32 8], comdat
176@0 = private unnamed_addr constant { [2 x i8*] } { [2 x i8*] [i8* bitcast (%rtti.CompleteObjectLocator* @"\01??_R4C@@6BA@@@" to i8*), i8* bitcast (i1 (i8*)* @"\01?MyMethod@C@@UAE_NXZ" to i8*)] }, comdat($"\01??_7C@@6BA@@@")
177@1 = private unnamed_addr constant { [2 x i8*] } { [2 x i8*] [i8* bitcast (%rtti.CompleteObjectLocator* @"\01??_R4C@@6BB@@@" to i8*), i8* bitcast (i1 (i8*)* @"\01?MyMethod@C@@W3AE_NXZ" to i8*)] }, comdat($"\01??_7C@@6BB@@@")
178@"\01??_R4C@@6BA@@@" = linkonce_odr constant %rtti.CompleteObjectLocator { i32 0, i32 4, i32 0, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AVC@@@8" to i8*), %rtti.ClassHierarchyDescriptor* @"\01??_R3C@@8" }, comdat
179@"\01??_7type_info@@6B@" = external constant i8*
180@"\01??_R0?AVC@@@8" = linkonce_odr global %rtti.TypeDescriptor7 { i8** @"\01??_7type_info@@6B@", i8* null, [8 x i8] c".?AVC@@\00" }, comdat
181@"\01??_R3C@@8" = linkonce_odr constant %rtti.ClassHierarchyDescriptor { i32 0, i32 3, i32 3, %rtti.BaseClassDescriptor** getelementptr inbounds ([4 x %rtti.BaseClassDescriptor*], [4 x %rtti.BaseClassDescriptor*]* @"\01??_R2C@@8", i32 0, i32 0) }, comdat
182@"\01??_R2C@@8" = linkonce_odr constant [4 x %rtti.BaseClassDescriptor*] [%rtti.BaseClassDescriptor* @"\01??_R1A@?0A@EA@C@@8", %rtti.BaseClassDescriptor* @"\01??_R1A@A@3FA@A@@8", %rtti.BaseClassDescriptor* @"\01??_R1A@A@7FA@B@@8", %rtti.BaseClassDescriptor* null], comdat
183@"\01??_R1A@?0A@EA@C@@8" = linkonce_odr constant %rtti.BaseClassDescriptor { i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AVC@@@8" to i8*), i32 2, i32 0, i32 -1, i32 0, i32 64, %rtti.ClassHierarchyDescriptor* @"\01??_R3C@@8" }, comdat
184@"\01??_R1A@A@3FA@A@@8" = linkonce_odr constant %rtti.BaseClassDescriptor { i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AVA@@@8" to i8*), i32 0, i32 0, i32 0, i32 4, i32 80, %rtti.ClassHierarchyDescriptor* @"\01??_R3A@@8" }, comdat
185@"\01??_R0?AVA@@@8" = linkonce_odr global %rtti.TypeDescriptor7 { i8** @"\01??_7type_info@@6B@", i8* null, [8 x i8] c".?AVA@@\00" }, comdat
186@"\01??_R3A@@8" = linkonce_odr constant %rtti.ClassHierarchyDescriptor { i32 0, i32 0, i32 1, %rtti.BaseClassDescriptor** getelementptr inbounds ([2 x %rtti.BaseClassDescriptor*], [2 x %rtti.BaseClassDescriptor*]* @"\01??_R2A@@8", i32 0, i32 0) }, comdat
187@"\01??_R2A@@8" = linkonce_odr constant [2 x %rtti.BaseClassDescriptor*] [%rtti.BaseClassDescriptor* @"\01??_R1A@?0A@EA@A@@8", %rtti.BaseClassDescriptor* null], comdat
188@"\01??_R1A@?0A@EA@A@@8" = linkonce_odr constant %rtti.BaseClassDescriptor { i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AVA@@@8" to i8*), i32 0, i32 0, i32 -1, i32 0, i32 64, %rtti.ClassHierarchyDescriptor* @"\01??_R3A@@8" }, comdat
189@"\01??_R1A@A@7FA@B@@8" = linkonce_odr constant %rtti.BaseClassDescriptor { i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AVB@@@8" to i8*), i32 0, i32 0, i32 0, i32 8, i32 80, %rtti.ClassHierarchyDescriptor* @"\01??_R3B@@8" }, comdat
190@"\01??_R0?AVB@@@8" = linkonce_odr global %rtti.TypeDescriptor7 { i8** @"\01??_7type_info@@6B@", i8* null, [8 x i8] c".?AVB@@\00" }, comdat
191@"\01??_R3B@@8" = linkonce_odr constant %rtti.ClassHierarchyDescriptor { i32 0, i32 0, i32 1, %rtti.BaseClassDescriptor** getelementptr inbounds ([2 x %rtti.BaseClassDescriptor*], [2 x %rtti.BaseClassDescriptor*]* @"\01??_R2B@@8", i32 0, i32 0) }, comdat
192@"\01??_R2B@@8" = linkonce_odr constant [2 x %rtti.BaseClassDescriptor*] [%rtti.BaseClassDescriptor* @"\01??_R1A@?0A@EA@B@@8", %rtti.BaseClassDescriptor* null], comdat
193@"\01??_R1A@?0A@EA@B@@8" = linkonce_odr constant %rtti.BaseClassDescriptor { i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AVB@@@8" to i8*), i32 0, i32 0, i32 -1, i32 0, i32 64, %rtti.ClassHierarchyDescriptor* @"\01??_R3B@@8" }, comdat
194@"\01??_R4C@@6BB@@@" = linkonce_odr constant %rtti.CompleteObjectLocator { i32 0, i32 8, i32 0, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AVC@@@8" to i8*), %rtti.ClassHierarchyDescriptor* @"\01??_R3C@@8" }, comdat
195@2 = private unnamed_addr constant { [2 x i8*] } { [2 x i8*] [i8* bitcast (%rtti.CompleteObjectLocator* @"\01??_R4A@@6B@" to i8*), i8* bitcast (i1 (%class.A*)* @"\01?MyMethod@A@@UAE_NXZ" to i8*)] }, comdat($"\01??_7A@@6B@")
196@"\01??_R4A@@6B@" = linkonce_odr constant %rtti.CompleteObjectLocator { i32 0, i32 0, i32 0, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AVA@@@8" to i8*), %rtti.ClassHierarchyDescriptor* @"\01??_R3A@@8" }, comdat
197@3 = private unnamed_addr constant { [2 x i8*] } { [2 x i8*] [i8* bitcast (%rtti.CompleteObjectLocator* @"\01??_R4B@@6B@" to i8*), i8* bitcast (i1 (%class.B*)* @"\01?MyMethod@B@@UAE_NXZ" to i8*)] }, comdat($"\01??_7B@@6B@")
198@"\01??_R4B@@6B@" = linkonce_odr constant %rtti.CompleteObjectLocator { i32 0, i32 0, i32 0, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AVB@@@8" to i8*), %rtti.ClassHierarchyDescriptor* @"\01??_R3B@@8" }, comdat
199
200@"\01??_7C@@6BA@@@" = unnamed_addr alias i8*, getelementptr inbounds ({ [2 x i8*] }, { [2 x i8*] }* @0, i32 0, i32 0, i32 1)
201@"\01??_7C@@6BB@@@" = unnamed_addr alias i8*, getelementptr inbounds ({ [2 x i8*] }, { [2 x i8*] }* @1, i32 0, i32 0, i32 1)
202@"\01??_7A@@6B@" = unnamed_addr alias i8*, getelementptr inbounds ({ [2 x i8*] }, { [2 x i8*] }* @2, i32 0, i32 0, i32 1)
203@"\01??_7B@@6B@" = unnamed_addr alias i8*, getelementptr inbounds ({ [2 x i8*] }, { [2 x i8*] }* @3, i32 0, i32 0, i32 1)
204
205; Function Attrs: noinline norecurse optnone
206define i32 @main() #0 !dbg !8 {
207entry:
208  %retval = alloca i32, align 4
209  %a = alloca %class.A*, align 4
210  %b = alloca %class.B*, align 4
211  %c = alloca %class.C*, align 4
212  %mp = alloca i8*, align 4
213  store i32 0, i32* %retval, align 4
214  call void @llvm.dbg.declare(metadata %class.A** %a, metadata !12, metadata !DIExpression()), !dbg !24
215  %call = call i8* @"\01??2@YAPAXI@Z"(i32 12) #7, !dbg !25
216  %0 = bitcast i8* %call to %class.C*, !dbg !25
217  %1 = bitcast %class.C* %0 to i8*, !dbg !26
218  call void @llvm.memset.p0i8.i32(i8* align 8 %1, i8 0, i32 12, i1 false), !dbg !26
219  %call1 = call x86_thiscallcc %class.C* @"\01??0C@@QAE@XZ"(%class.C* %0, i32 1) #8, !dbg !26
220  %2 = icmp eq %class.C* %0, null, !dbg !25
221  br i1 %2, label %cast.end, label %cast.notnull, !dbg !25
222
223cast.notnull:                                     ; preds = %entry
224  %3 = bitcast %class.C* %0 to i8*, !dbg !25
225  %vbptr = getelementptr inbounds i8, i8* %3, i32 0, !dbg !25
226  %4 = bitcast i8* %vbptr to i32**, !dbg !25
227  %vbtable = load i32*, i32** %4, align 4, !dbg !25
228  %5 = getelementptr inbounds i32, i32* %vbtable, i32 1, !dbg !25
229  %vbase_offs = load i32, i32* %5, align 4, !dbg !25
230  %6 = add nsw i32 0, %vbase_offs, !dbg !25
231  %7 = bitcast %class.C* %0 to i8*, !dbg !25
232  %add.ptr = getelementptr inbounds i8, i8* %7, i32 %6, !dbg !25
233  %8 = bitcast i8* %add.ptr to %class.A*, !dbg !25
234  br label %cast.end, !dbg !25
235
236cast.end:                                         ; preds = %cast.notnull, %entry
237  %cast.result = phi %class.A* [ %8, %cast.notnull ], [ null, %entry ], !dbg !25
238  store %class.A* %cast.result, %class.A** %a, align 4, !dbg !24
239  call void @llvm.dbg.declare(metadata %class.B** %b, metadata !27, metadata !DIExpression()), !dbg !36
240  %call2 = call i8* @"\01??2@YAPAXI@Z"(i32 12) #7, !dbg !37
241  %9 = bitcast i8* %call2 to %class.C*, !dbg !37
242  %10 = bitcast %class.C* %9 to i8*, !dbg !38
243  call void @llvm.memset.p0i8.i32(i8* align 8 %10, i8 0, i32 12, i1 false), !dbg !38
244  %call3 = call x86_thiscallcc %class.C* @"\01??0C@@QAE@XZ"(%class.C* %9, i32 1) #8, !dbg !38
245  %11 = icmp eq %class.C* %9, null, !dbg !37
246  br i1 %11, label %cast.end9, label %cast.notnull4, !dbg !37
247
248cast.notnull4:                                    ; preds = %cast.end
249  %12 = bitcast %class.C* %9 to i8*, !dbg !37
250  %vbptr5 = getelementptr inbounds i8, i8* %12, i32 0, !dbg !37
251  %13 = bitcast i8* %vbptr5 to i32**, !dbg !37
252  %vbtable6 = load i32*, i32** %13, align 4, !dbg !37
253  %14 = getelementptr inbounds i32, i32* %vbtable6, i32 2, !dbg !37
254  %vbase_offs7 = load i32, i32* %14, align 4, !dbg !37
255  %15 = add nsw i32 0, %vbase_offs7, !dbg !37
256  %16 = bitcast %class.C* %9 to i8*, !dbg !37
257  %add.ptr8 = getelementptr inbounds i8, i8* %16, i32 %15, !dbg !37
258  %17 = bitcast i8* %add.ptr8 to %class.B*, !dbg !37
259  br label %cast.end9, !dbg !37
260
261cast.end9:                                        ; preds = %cast.notnull4, %cast.end
262  %cast.result10 = phi %class.B* [ %17, %cast.notnull4 ], [ null, %cast.end ], !dbg !37
263  store %class.B* %cast.result10, %class.B** %b, align 4, !dbg !36
264  call void @llvm.dbg.declare(metadata %class.C** %c, metadata !39, metadata !DIExpression()), !dbg !49
265  %call11 = call i8* @"\01??2@YAPAXI@Z"(i32 12) #7, !dbg !50
266  %18 = bitcast i8* %call11 to %class.C*, !dbg !50
267  %19 = bitcast %class.C* %18 to i8*, !dbg !51
268  call void @llvm.memset.p0i8.i32(i8* align 8 %19, i8 0, i32 12, i1 false), !dbg !51
269  %call12 = call x86_thiscallcc %class.C* @"\01??0C@@QAE@XZ"(%class.C* %18, i32 1) #8, !dbg !51
270  store %class.C* %18, %class.C** %c, align 4, !dbg !49
271  %20 = load %class.A*, %class.A** %a, align 4, !dbg !52
272  %21 = bitcast %class.A* %20 to i1 (%class.A*)***, !dbg !53
273  %vtable = load i1 (%class.A*)**, i1 (%class.A*)*** %21, align 4, !dbg !53
274  %vfn = getelementptr inbounds i1 (%class.A*)*, i1 (%class.A*)** %vtable, i64 0, !dbg !53
275  %22 = load i1 (%class.A*)*, i1 (%class.A*)** %vfn, align 4, !dbg !53
276  %call13 = call x86_thiscallcc zeroext i1 %22(%class.A* %20), !dbg !53
277  %23 = load %class.B*, %class.B** %b, align 4, !dbg !54
278  %24 = bitcast %class.B* %23 to i1 (%class.B*)***, !dbg !55
279  %vtable14 = load i1 (%class.B*)**, i1 (%class.B*)*** %24, align 4, !dbg !55
280  %vfn15 = getelementptr inbounds i1 (%class.B*)*, i1 (%class.B*)** %vtable14, i64 0, !dbg !55
281  %25 = load i1 (%class.B*)*, i1 (%class.B*)** %vfn15, align 4, !dbg !55
282  %call16 = call x86_thiscallcc zeroext i1 %25(%class.B* %23), !dbg !55
283  %26 = load %class.C*, %class.C** %c, align 4, !dbg !56
284  %27 = bitcast %class.C* %26 to i8*, !dbg !57
285  %vbptr17 = getelementptr inbounds i8, i8* %27, i32 0, !dbg !57
286  %28 = bitcast i8* %vbptr17 to i32**, !dbg !57
287  %vbtable18 = load i32*, i32** %28, align 4, !dbg !57
288  %29 = getelementptr inbounds i32, i32* %vbtable18, i32 1, !dbg !57
289  %vbase_offs19 = load i32, i32* %29, align 4, !dbg !57
290  %30 = add nsw i32 0, %vbase_offs19, !dbg !57
291  %31 = getelementptr inbounds i8, i8* %27, i32 %30, !dbg !57
292  %32 = bitcast %class.C* %26 to i8*, !dbg !57
293  %vbptr20 = getelementptr inbounds i8, i8* %32, i32 0, !dbg !57
294  %33 = bitcast i8* %vbptr20 to i32**, !dbg !57
295  %vbtable21 = load i32*, i32** %33, align 4, !dbg !57
296  %34 = getelementptr inbounds i32, i32* %vbtable21, i32 1, !dbg !57
297  %vbase_offs22 = load i32, i32* %34, align 4, !dbg !57
298  %35 = add nsw i32 0, %vbase_offs22, !dbg !57
299  %36 = getelementptr inbounds i8, i8* %32, i32 %35, !dbg !57
300  %37 = bitcast i8* %36 to i1 (i8*)***, !dbg !57
301  %vtable23 = load i1 (i8*)**, i1 (i8*)*** %37, align 4, !dbg !57
302  %vfn24 = getelementptr inbounds i1 (i8*)*, i1 (i8*)** %vtable23, i64 0, !dbg !57
303  %38 = load i1 (i8*)*, i1 (i8*)** %vfn24, align 4, !dbg !57
304  %call25 = call x86_thiscallcc zeroext i1 %38(i8* %31), !dbg !57
305  call void @llvm.dbg.declare(metadata i8** %mp, metadata !58, metadata !DIExpression()), !dbg !60
306  store i8* bitcast (void (%class.A*, ...)* @"\01??_9A@@$BA@AE" to i8*), i8** %mp, align 4, !dbg !60
307  ret i32 0, !dbg !61
308}
309
310; Function Attrs: nounwind readnone speculatable
311declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
312
313; Function Attrs: nobuiltin
314declare noalias i8* @"\01??2@YAPAXI@Z"(i32) #2
315
316; Function Attrs: argmemonly nounwind
317declare void @llvm.memset.p0i8.i32(i8* nocapture writeonly, i8, i32, i1) #3
318
319; Function Attrs: noinline nounwind optnone
320define linkonce_odr x86_thiscallcc %class.C* @"\01??0C@@QAE@XZ"(%class.C* returned %this, i32 %is_most_derived) unnamed_addr #4 comdat align 2 !dbg !62 {
321entry:
322  %retval = alloca %class.C*, align 4
323  %is_most_derived.addr = alloca i32, align 4
324  %this.addr = alloca %class.C*, align 4
325  store i32 %is_most_derived, i32* %is_most_derived.addr, align 4
326  call void @llvm.dbg.declare(metadata i32* %is_most_derived.addr, metadata !66, metadata !DIExpression()), !dbg !67
327  store %class.C* %this, %class.C** %this.addr, align 4
328  call void @llvm.dbg.declare(metadata %class.C** %this.addr, metadata !68, metadata !DIExpression()), !dbg !67
329  %this1 = load %class.C*, %class.C** %this.addr, align 4
330  store %class.C* %this1, %class.C** %retval, align 4
331  %is_most_derived2 = load i32, i32* %is_most_derived.addr, align 4
332  %is_complete_object = icmp ne i32 %is_most_derived2, 0, !dbg !69
333  br i1 %is_complete_object, label %ctor.init_vbases, label %ctor.skip_vbases, !dbg !69
334
335ctor.init_vbases:                                 ; preds = %entry
336  %this.int8 = bitcast %class.C* %this1 to i8*, !dbg !69
337  %0 = getelementptr inbounds i8, i8* %this.int8, i32 0, !dbg !69
338  %vbptr.C = bitcast i8* %0 to i32**, !dbg !69
339  store i32* getelementptr inbounds ([3 x i32], [3 x i32]* @"\01??_8C@@7B@", i32 0, i32 0), i32** %vbptr.C, align 4, !dbg !69
340  %1 = bitcast %class.C* %this1 to i8*, !dbg !69
341  %2 = getelementptr inbounds i8, i8* %1, i32 4, !dbg !69
342  %3 = bitcast i8* %2 to %class.A*, !dbg !69
343  %call = call x86_thiscallcc %class.A* @"\01??0A@@QAE@XZ"(%class.A* %3) #8, !dbg !69
344  %4 = bitcast %class.C* %this1 to i8*, !dbg !69
345  %5 = getelementptr inbounds i8, i8* %4, i32 8, !dbg !69
346  %6 = bitcast i8* %5 to %class.B*, !dbg !69
347  %call3 = call x86_thiscallcc %class.B* @"\01??0B@@QAE@XZ"(%class.B* %6) #8, !dbg !69
348  br label %ctor.skip_vbases, !dbg !69
349
350ctor.skip_vbases:                                 ; preds = %ctor.init_vbases, %entry
351  %7 = bitcast %class.C* %this1 to i8*, !dbg !69
352  %vbptr = getelementptr inbounds i8, i8* %7, i32 0, !dbg !69
353  %8 = bitcast i8* %vbptr to i32**, !dbg !69
354  %vbtable = load i32*, i32** %8, align 4, !dbg !69
355  %9 = getelementptr inbounds i32, i32* %vbtable, i32 1, !dbg !69
356  %vbase_offs = load i32, i32* %9, align 4, !dbg !69
357  %10 = add nsw i32 0, %vbase_offs, !dbg !69
358  %11 = bitcast %class.C* %this1 to i8*, !dbg !69
359  %add.ptr = getelementptr inbounds i8, i8* %11, i32 %10, !dbg !69
360  %12 = bitcast i8* %add.ptr to i32 (...)***, !dbg !69
361  store i32 (...)** bitcast (i8** @"\01??_7C@@6BA@@@" to i32 (...)**), i32 (...)*** %12, align 4, !dbg !69
362  %13 = bitcast %class.C* %this1 to i8*, !dbg !69
363  %vbptr4 = getelementptr inbounds i8, i8* %13, i32 0, !dbg !69
364  %14 = bitcast i8* %vbptr4 to i32**, !dbg !69
365  %vbtable5 = load i32*, i32** %14, align 4, !dbg !69
366  %15 = getelementptr inbounds i32, i32* %vbtable5, i32 2, !dbg !69
367  %vbase_offs6 = load i32, i32* %15, align 4, !dbg !69
368  %16 = add nsw i32 0, %vbase_offs6, !dbg !69
369  %17 = bitcast %class.C* %this1 to i8*, !dbg !69
370  %add.ptr7 = getelementptr inbounds i8, i8* %17, i32 %16, !dbg !69
371  %18 = bitcast i8* %add.ptr7 to i32 (...)***, !dbg !69
372  store i32 (...)** bitcast (i8** @"\01??_7C@@6BB@@@" to i32 (...)**), i32 (...)*** %18, align 4, !dbg !69
373  %19 = load %class.C*, %class.C** %retval, align 4, !dbg !69
374  ret %class.C* %19, !dbg !69
375}
376
377; Function Attrs: noinline optnone
378define linkonce_odr x86_thiscallcc void @"\01??_9A@@$BA@AE"(%class.A* %this, ...) #5 comdat align 2 !dbg !70 {
379entry:
380  %this.addr = alloca %class.A*, align 4
381  store %class.A* %this, %class.A** %this.addr, align 4
382  call void @llvm.dbg.declare(metadata %class.A** %this.addr, metadata !72, metadata !DIExpression()), !dbg !73
383  %this1 = load %class.A*, %class.A** %this.addr, align 4
384  %0 = bitcast %class.A* %this1 to void (%class.A*, ...)***
385  %vtable = load void (%class.A*, ...)**, void (%class.A*, ...)*** %0, align 4
386  %vfn = getelementptr inbounds void (%class.A*, ...)*, void (%class.A*, ...)** %vtable, i64 0
387  %1 = load void (%class.A*, ...)*, void (%class.A*, ...)** %vfn, align 4
388  musttail call x86_thiscallcc void (%class.A*, ...) %1(%class.A* %this1, ...)
389  ret void
390                                                  ; No predecessors!
391  ret void
392}
393
394; Function Attrs: noinline nounwind optnone
395define linkonce_odr x86_thiscallcc %class.A* @"\01??0A@@QAE@XZ"(%class.A* returned %this) unnamed_addr #4 comdat align 2 !dbg !74 {
396entry:
397  %this.addr = alloca %class.A*, align 4
398  store %class.A* %this, %class.A** %this.addr, align 4
399  call void @llvm.dbg.declare(metadata %class.A** %this.addr, metadata !78, metadata !DIExpression()), !dbg !79
400  %this1 = load %class.A*, %class.A** %this.addr, align 4
401  %0 = bitcast %class.A* %this1 to i32 (...)***, !dbg !80
402  store i32 (...)** bitcast (i8** @"\01??_7A@@6B@" to i32 (...)**), i32 (...)*** %0, align 4, !dbg !80
403  ret %class.A* %this1, !dbg !80
404}
405
406; Function Attrs: noinline nounwind optnone
407define linkonce_odr x86_thiscallcc %class.B* @"\01??0B@@QAE@XZ"(%class.B* returned %this) unnamed_addr #4 comdat align 2 !dbg !81 {
408entry:
409  %this.addr = alloca %class.B*, align 4
410  store %class.B* %this, %class.B** %this.addr, align 4
411  call void @llvm.dbg.declare(metadata %class.B** %this.addr, metadata !85, metadata !DIExpression()), !dbg !86
412  %this1 = load %class.B*, %class.B** %this.addr, align 4
413  %0 = bitcast %class.B* %this1 to i32 (...)***, !dbg !87
414  store i32 (...)** bitcast (i8** @"\01??_7B@@6B@" to i32 (...)**), i32 (...)*** %0, align 4, !dbg !87
415  ret %class.B* %this1, !dbg !87
416}
417
418; Function Attrs: noinline nounwind optnone
419define linkonce_odr x86_thiscallcc zeroext i1 @"\01?MyMethod@C@@UAE_NXZ"(i8* %this.coerce) unnamed_addr #4 comdat align 2 !dbg !88 {
420entry:
421  %this = alloca %class.C*, align 4
422  %this.addr = alloca %class.C*, align 4
423  %coerce.val = bitcast i8* %this.coerce to %class.C*
424  store %class.C* %coerce.val, %class.C** %this, align 4
425  %this1 = load %class.C*, %class.C** %this, align 4
426  store %class.C* %this1, %class.C** %this.addr, align 4
427  call void @llvm.dbg.declare(metadata %class.C** %this.addr, metadata !89, metadata !DIExpression()), !dbg !90
428  %this2 = load %class.C*, %class.C** %this.addr, align 4
429  %0 = bitcast %class.C* %this2 to i8*
430  %1 = getelementptr inbounds i8, i8* %0, i32 -4
431  %this.adjusted = bitcast i8* %1 to %class.C*
432  ret i1 true, !dbg !91
433}
434
435; Function Attrs: noinline optnone
436define linkonce_odr x86_thiscallcc zeroext i1 @"\01?MyMethod@C@@W3AE_NXZ"(i8* %this.coerce) unnamed_addr #6 comdat align 2 !dbg !92 {
437entry:
438  %this = alloca %class.C*, align 4
439  %this.addr = alloca %class.C*, align 4
440  %coerce.val = bitcast i8* %this.coerce to %class.C*
441  store %class.C* %coerce.val, %class.C** %this, align 4
442  %this1 = load %class.C*, %class.C** %this, align 4
443  store %class.C* %this1, %class.C** %this.addr, align 4
444  call void @llvm.dbg.declare(metadata %class.C** %this.addr, metadata !93, metadata !DIExpression()), !dbg !94
445  %this2 = load %class.C*, %class.C** %this.addr, align 4, !dbg !94
446  %0 = bitcast %class.C* %this2 to i8*, !dbg !94
447  %1 = getelementptr i8, i8* %0, i32 -4, !dbg !94
448  %call = tail call x86_thiscallcc zeroext i1 @"\01?MyMethod@C@@UAE_NXZ"(i8* %1), !dbg !94
449  ret i1 %call, !dbg !94
450}
451
452; Function Attrs: noinline nounwind optnone
453define linkonce_odr x86_thiscallcc zeroext i1 @"\01?MyMethod@A@@UAE_NXZ"(%class.A* %this) unnamed_addr #4 comdat align 2 !dbg !95 {
454entry:
455  %this.addr = alloca %class.A*, align 4
456  store %class.A* %this, %class.A** %this.addr, align 4
457  call void @llvm.dbg.declare(metadata %class.A** %this.addr, metadata !96, metadata !DIExpression()), !dbg !97
458  %this1 = load %class.A*, %class.A** %this.addr, align 4
459  ret i1 true, !dbg !98
460}
461
462; Function Attrs: noinline nounwind optnone
463define linkonce_odr x86_thiscallcc zeroext i1 @"\01?MyMethod@B@@UAE_NXZ"(%class.B* %this) unnamed_addr #4 comdat align 2 !dbg !99 {
464entry:
465  %this.addr = alloca %class.B*, align 4
466  store %class.B* %this, %class.B** %this.addr, align 4
467  call void @llvm.dbg.declare(metadata %class.B** %this.addr, metadata !100, metadata !DIExpression()), !dbg !101
468  %this1 = load %class.B*, %class.B** %this.addr, align 4
469  ret i1 true, !dbg !102
470}
471
472attributes #0 = { noinline norecurse optnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
473attributes #1 = { nounwind readnone speculatable }
474attributes #2 = { nobuiltin "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
475attributes #3 = { argmemonly nounwind }
476attributes #4 = { noinline nounwind optnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
477attributes #5 = { noinline optnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "thunk" "unsafe-fp-math"="false" "use-soft-float"="false" }
478attributes #6 = { noinline optnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
479attributes #7 = { builtin }
480attributes #8 = { nounwind }
481
482!llvm.dbg.cu = !{!0}
483!llvm.module.flags = !{!3, !4, !5, !6}
484!llvm.ident = !{!7}
485
486!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 7.0.0 (trunk)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
487!1 = !DIFile(filename: "thunk.cpp", directory: "C:\5Cpath\5Cto", checksumkind: CSK_MD5, checksum: "d4b977fc614313c5a4fbdc980b2f4243")
488!2 = !{}
489!3 = !{i32 1, !"NumRegisterParameters", i32 0}
490!4 = !{i32 2, !"CodeView", i32 1}
491!5 = !{i32 2, !"Debug Info Version", i32 3}
492!6 = !{i32 1, !"wchar_size", i32 2}
493!7 = !{!"clang version 7.0.0 (trunk)"}
494!8 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 8, type: !9, isLocal: false, isDefinition: true, scopeLine: 9, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
495!9 = !DISubroutineType(types: !10)
496!10 = !{!11}
497!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
498!12 = !DILocalVariable(name: "a", scope: !8, file: !1, line: 10, type: !13)
499!13 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !14, size: 32)
500!14 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "A", file: !1, line: 1, size: 32, flags: DIFlagTypePassByValue, elements: !15, vtableHolder: !14, identifier: ".?AVA@@")
501!15 = !{!16, !17, !19}
502!16 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "__vtbl_ptr_type", baseType: null, size: 32)
503!17 = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$A", scope: !1, file: !1, baseType: !18, size: 32, flags: DIFlagArtificial)
504!18 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !16, size: 32)
505!19 = !DISubprogram(name: "MyMethod", linkageName: "\01?MyMethod@A@@UAE_NXZ", scope: !14, file: !1, line: 1, type: !20, isLocal: false, isDefinition: false, scopeLine: 1, containingType: !14, virtuality: DW_VIRTUALITY_virtual, virtualIndex: 0, flags: DIFlagPublic | DIFlagPrototyped | DIFlagIntroducedVirtual, isOptimized: false)
506!20 = !DISubroutineType(cc: DW_CC_BORLAND_thiscall, types: !21)
507!21 = !{!22, !23}
508!22 = !DIBasicType(name: "bool", size: 8, encoding: DW_ATE_boolean)
509!23 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !14, size: 32, flags: DIFlagArtificial | DIFlagObjectPointer)
510!24 = !DILocation(line: 10, column: 8, scope: !8)
511!25 = !DILocation(line: 10, column: 12, scope: !8)
512!26 = !DILocation(line: 10, column: 16, scope: !8)
513!27 = !DILocalVariable(name: "b", scope: !8, file: !1, line: 11, type: !28)
514!28 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !29, size: 32)
515!29 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "B", file: !1, line: 2, size: 32, flags: DIFlagTypePassByValue, elements: !30, vtableHolder: !29, identifier: ".?AVB@@")
516!30 = !{!16, !31, !32}
517!31 = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$B", scope: !1, file: !1, baseType: !18, size: 32, flags: DIFlagArtificial)
518!32 = !DISubprogram(name: "MyMethod", linkageName: "\01?MyMethod@B@@UAE_NXZ", scope: !29, file: !1, line: 2, type: !33, isLocal: false, isDefinition: false, scopeLine: 2, containingType: !29, virtuality: DW_VIRTUALITY_virtual, virtualIndex: 0, flags: DIFlagPublic | DIFlagPrototyped | DIFlagIntroducedVirtual, isOptimized: false)
519!33 = !DISubroutineType(cc: DW_CC_BORLAND_thiscall, types: !34)
520!34 = !{!22, !35}
521!35 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !29, size: 32, flags: DIFlagArtificial | DIFlagObjectPointer)
522!36 = !DILocation(line: 11, column: 8, scope: !8)
523!37 = !DILocation(line: 11, column: 12, scope: !8)
524!38 = !DILocation(line: 11, column: 16, scope: !8)
525!39 = !DILocalVariable(name: "c", scope: !8, file: !1, line: 12, type: !40)
526!40 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !41, size: 32)
527!41 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "C", file: !1, line: 3, size: 96, flags: DIFlagTypePassByValue, elements: !42, vtableHolder: !41, identifier: ".?AVC@@")
528!42 = !{!43, !44, !45}
529!43 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !41, baseType: !14, offset: 4, flags: DIFlagPublic | DIFlagVirtual)
530!44 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !41, baseType: !29, offset: 8, flags: DIFlagPublic | DIFlagVirtual)
531!45 = !DISubprogram(name: "MyMethod", linkageName: "\01?MyMethod@C@@UAE_NXZ", scope: !41, file: !1, line: 5, type: !46, isLocal: false, isDefinition: false, scopeLine: 5, containingType: !41, virtuality: DW_VIRTUALITY_virtual, virtualIndex: 0, thisAdjustment: 4, flags: DIFlagPublic | DIFlagPrototyped, isOptimized: false)
532!46 = !DISubroutineType(cc: DW_CC_BORLAND_thiscall, types: !47)
533!47 = !{!22, !48}
534!48 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !41, size: 32, flags: DIFlagArtificial | DIFlagObjectPointer)
535!49 = !DILocation(line: 12, column: 8, scope: !8)
536!50 = !DILocation(line: 12, column: 12, scope: !8)
537!51 = !DILocation(line: 12, column: 16, scope: !8)
538!52 = !DILocation(line: 13, column: 5, scope: !8)
539!53 = !DILocation(line: 13, column: 8, scope: !8)
540!54 = !DILocation(line: 14, column: 5, scope: !8)
541!55 = !DILocation(line: 14, column: 8, scope: !8)
542!56 = !DILocation(line: 15, column: 5, scope: !8)
543!57 = !DILocation(line: 15, column: 8, scope: !8)
544!58 = !DILocalVariable(name: "mp", scope: !8, file: !1, line: 16, type: !59)
545!59 = !DIDerivedType(tag: DW_TAG_ptr_to_member_type, baseType: !20, size: 32, flags: DIFlagSingleInheritance, extraData: !14)
546!60 = !DILocation(line: 16, column: 15, scope: !8)
547!61 = !DILocation(line: 17, column: 5, scope: !8)
548!62 = distinct !DISubprogram(name: "C", linkageName: "\01??0C@@QAE@XZ", scope: !41, file: !1, line: 3, type: !63, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagArtificial | DIFlagPrototyped, isOptimized: false, unit: !0, declaration: !65, retainedNodes: !2)
549!63 = !DISubroutineType(cc: DW_CC_BORLAND_thiscall, types: !64)
550!64 = !{null, !48}
551!65 = !DISubprogram(name: "C", scope: !41, type: !63, isLocal: false, isDefinition: false, flags: DIFlagPublic | DIFlagArtificial | DIFlagPrototyped, isOptimized: false)
552!66 = !DILocalVariable(name: "is_most_derived", arg: 2, scope: !62, type: !11, flags: DIFlagArtificial)
553!67 = !DILocation(line: 0, scope: !62)
554!68 = !DILocalVariable(name: "this", arg: 1, scope: !62, type: !40, flags: DIFlagArtificial | DIFlagObjectPointer)
555!69 = !DILocation(line: 3, column: 7, scope: !62)
556!70 = distinct !DISubprogram(linkageName: "\01??_9A@@$BA@AE", scope: !1, file: !1, line: 1, type: !71, isLocal: false, isDefinition: true, flags: DIFlagArtificial | DIFlagThunk, isOptimized: false, unit: !0, retainedNodes: !2)
557!71 = !DISubroutineType(types: !2)
558!72 = !DILocalVariable(name: "this", arg: 1, scope: !70, type: !13, flags: DIFlagArtificial | DIFlagObjectPointer)
559!73 = !DILocation(line: 0, scope: !70)
560!74 = distinct !DISubprogram(name: "A", linkageName: "\01??0A@@QAE@XZ", scope: !14, file: !1, line: 1, type: !75, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagArtificial | DIFlagPrototyped, isOptimized: false, unit: !0, declaration: !77, retainedNodes: !2)
561!75 = !DISubroutineType(cc: DW_CC_BORLAND_thiscall, types: !76)
562!76 = !{null, !23}
563!77 = !DISubprogram(name: "A", scope: !14, type: !75, isLocal: false, isDefinition: false, flags: DIFlagPublic | DIFlagArtificial | DIFlagPrototyped, isOptimized: false)
564!78 = !DILocalVariable(name: "this", arg: 1, scope: !74, type: !13, flags: DIFlagArtificial | DIFlagObjectPointer)
565!79 = !DILocation(line: 0, scope: !74)
566!80 = !DILocation(line: 1, column: 7, scope: !74)
567!81 = distinct !DISubprogram(name: "B", linkageName: "\01??0B@@QAE@XZ", scope: !29, file: !1, line: 2, type: !82, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagArtificial | DIFlagPrototyped, isOptimized: false, unit: !0, declaration: !84, retainedNodes: !2)
568!82 = !DISubroutineType(cc: DW_CC_BORLAND_thiscall, types: !83)
569!83 = !{null, !35}
570!84 = !DISubprogram(name: "B", scope: !29, type: !82, isLocal: false, isDefinition: false, flags: DIFlagPublic | DIFlagArtificial | DIFlagPrototyped, isOptimized: false)
571!85 = !DILocalVariable(name: "this", arg: 1, scope: !81, type: !28, flags: DIFlagArtificial | DIFlagObjectPointer)
572!86 = !DILocation(line: 0, scope: !81)
573!87 = !DILocation(line: 2, column: 7, scope: !81)
574!88 = distinct !DISubprogram(name: "MyMethod", linkageName: "\01?MyMethod@C@@UAE_NXZ", scope: !41, file: !1, line: 5, type: !46, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: false, unit: !0, declaration: !45, retainedNodes: !2)
575!89 = !DILocalVariable(name: "this", arg: 1, scope: !88, type: !40, flags: DIFlagArtificial | DIFlagObjectPointer)
576!90 = !DILocation(line: 0, scope: !88)
577!91 = !DILocation(line: 5, column: 31, scope: !88)
578!92 = distinct !DISubprogram(linkageName: "\01?MyMethod@C@@W3AE_NXZ", scope: !1, file: !1, line: 5, type: !71, isLocal: false, isDefinition: true, flags: DIFlagArtificial | DIFlagThunk, isOptimized: false, unit: !0, retainedNodes: !2)
579!93 = !DILocalVariable(name: "this", arg: 1, scope: !92, type: !40, flags: DIFlagArtificial | DIFlagObjectPointer)
580!94 = !DILocation(line: 0, scope: !92)
581!95 = distinct !DISubprogram(name: "MyMethod", linkageName: "\01?MyMethod@A@@UAE_NXZ", scope: !14, file: !1, line: 1, type: !20, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, declaration: !19, retainedNodes: !2)
582!96 = !DILocalVariable(name: "this", arg: 1, scope: !95, type: !13, flags: DIFlagArtificial | DIFlagObjectPointer)
583!97 = !DILocation(line: 0, scope: !95)
584!98 = !DILocation(line: 1, column: 45, scope: !95)
585!99 = distinct !DISubprogram(name: "MyMethod", linkageName: "\01?MyMethod@B@@UAE_NXZ", scope: !29, file: !1, line: 2, type: !33, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: false, unit: !0, declaration: !32, retainedNodes: !2)
586!100 = !DILocalVariable(name: "this", arg: 1, scope: !99, type: !28, flags: DIFlagArtificial | DIFlagObjectPointer)
587!101 = !DILocation(line: 0, scope: !99)
588!102 = !DILocation(line: 2, column: 45, scope: !99)
589