Brock Wyma | 94ece8f | 2018-04-16 16:53:57 +0000 | [diff] [blame] | 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 |
Reid Kleckner | 53ce059 | 2018-12-18 01:14:05 +0000 | [diff] [blame] | 73 | ; ASM-NEXT: .p2align 2 |
Brock Wyma | 94ece8f | 2018-04-16 16:53:57 +0000 | [diff] [blame] | 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 |
Reid Kleckner | 53ce059 | 2018-12-18 01:14:05 +0000 | [diff] [blame] | 92 | ; ASM-NEXT: .p2align 2 |
Brock Wyma | 94ece8f | 2018-04-16 16:53:57 +0000 | [diff] [blame] | 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' |
| 101 | source_filename = "thunk.cpp" |
| 102 | target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" |
| 103 | target 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 |
| 206 | define i32 @main() #0 !dbg !8 { |
| 207 | entry: |
| 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 | |
| 223 | cast.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 | |
| 236 | cast.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 | |
| 248 | cast.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 | |
| 261 | cast.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 |
| 311 | declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 |
| 312 | |
| 313 | ; Function Attrs: nobuiltin |
| 314 | declare noalias i8* @"\01??2@YAPAXI@Z"(i32) #2 |
| 315 | |
| 316 | ; Function Attrs: argmemonly nounwind |
| 317 | declare void @llvm.memset.p0i8.i32(i8* nocapture writeonly, i8, i32, i1) #3 |
| 318 | |
| 319 | ; Function Attrs: noinline nounwind optnone |
| 320 | define 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 { |
| 321 | entry: |
| 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 | |
| 335 | ctor.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 | |
| 350 | ctor.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 |
| 378 | define linkonce_odr x86_thiscallcc void @"\01??_9A@@$BA@AE"(%class.A* %this, ...) #5 comdat align 2 !dbg !70 { |
| 379 | entry: |
| 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 |
| 395 | define linkonce_odr x86_thiscallcc %class.A* @"\01??0A@@QAE@XZ"(%class.A* returned %this) unnamed_addr #4 comdat align 2 !dbg !74 { |
| 396 | entry: |
| 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 |
| 407 | define linkonce_odr x86_thiscallcc %class.B* @"\01??0B@@QAE@XZ"(%class.B* returned %this) unnamed_addr #4 comdat align 2 !dbg !81 { |
| 408 | entry: |
| 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 |
| 419 | define linkonce_odr x86_thiscallcc zeroext i1 @"\01?MyMethod@C@@UAE_NXZ"(i8* %this.coerce) unnamed_addr #4 comdat align 2 !dbg !88 { |
| 420 | entry: |
| 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 |
| 436 | define linkonce_odr x86_thiscallcc zeroext i1 @"\01?MyMethod@C@@W3AE_NXZ"(i8* %this.coerce) unnamed_addr #6 comdat align 2 !dbg !92 { |
| 437 | entry: |
| 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 |
| 453 | define linkonce_odr x86_thiscallcc zeroext i1 @"\01?MyMethod@A@@UAE_NXZ"(%class.A* %this) unnamed_addr #4 comdat align 2 !dbg !95 { |
| 454 | entry: |
| 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 |
| 463 | define linkonce_odr x86_thiscallcc zeroext i1 @"\01?MyMethod@B@@UAE_NXZ"(%class.B* %this) unnamed_addr #4 comdat align 2 !dbg !99 { |
| 464 | entry: |
| 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 | |
| 472 | attributes #0 = { noinline norecurse optnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "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" } |
| 473 | attributes #1 = { nounwind readnone speculatable } |
| 474 | attributes #2 = { nobuiltin "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "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" } |
| 475 | attributes #3 = { argmemonly nounwind } |
| 476 | attributes #4 = { noinline nounwind optnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "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" } |
| 477 | attributes #5 = { noinline optnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "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" } |
| 478 | attributes #6 = { noinline optnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "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" } |
| 479 | attributes #7 = { builtin } |
| 480 | attributes #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)"} |
Shiva Chen | 2c86455 | 2018-05-09 02:40:45 +0000 | [diff] [blame] | 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) |
Brock Wyma | 94ece8f | 2018-04-16 16:53:57 +0000 | [diff] [blame] | 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) |
Shiva Chen | 2c86455 | 2018-05-09 02:40:45 +0000 | [diff] [blame] | 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) |
Brock Wyma | 94ece8f | 2018-04-16 16:53:57 +0000 | [diff] [blame] | 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) |
Shiva Chen | 2c86455 | 2018-05-09 02:40:45 +0000 | [diff] [blame] | 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) |
Brock Wyma | 94ece8f | 2018-04-16 16:53:57 +0000 | [diff] [blame] | 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) |
Shiva Chen | 2c86455 | 2018-05-09 02:40:45 +0000 | [diff] [blame] | 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) |
Brock Wyma | 94ece8f | 2018-04-16 16:53:57 +0000 | [diff] [blame] | 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) |
Shiva Chen | 2c86455 | 2018-05-09 02:40:45 +0000 | [diff] [blame] | 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) |
Brock Wyma | 94ece8f | 2018-04-16 16:53:57 +0000 | [diff] [blame] | 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) |
Shiva Chen | 2c86455 | 2018-05-09 02:40:45 +0000 | [diff] [blame] | 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) |
Brock Wyma | 94ece8f | 2018-04-16 16:53:57 +0000 | [diff] [blame] | 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) |
Shiva Chen | 2c86455 | 2018-05-09 02:40:45 +0000 | [diff] [blame] | 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) |
Brock Wyma | 94ece8f | 2018-04-16 16:53:57 +0000 | [diff] [blame] | 579 | !93 = !DILocalVariable(name: "this", arg: 1, scope: !92, type: !40, flags: DIFlagArtificial | DIFlagObjectPointer) |
| 580 | !94 = !DILocation(line: 0, scope: !92) |
Shiva Chen | 2c86455 | 2018-05-09 02:40:45 +0000 | [diff] [blame] | 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) |
Brock Wyma | 94ece8f | 2018-04-16 16:53:57 +0000 | [diff] [blame] | 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) |
Shiva Chen | 2c86455 | 2018-05-09 02:40:45 +0000 | [diff] [blame] | 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) |
Brock Wyma | 94ece8f | 2018-04-16 16:53:57 +0000 | [diff] [blame] | 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) |