1; RUN: llc < %s | grep cv_fpo_proc | FileCheck %s 2 3; C++ source: 4; extern "C" { 5; extern int g; 6; 7; void cdecl1(int a) { g += a; } 8; void cdecl2(int a, int b) { g += a + b; } 9; void cdecl3(int a, int b, int c) { g += a + b + c; } 10; 11; void __fastcall fastcall1(int a) { g += a; } 12; void __fastcall fastcall2(int a, int b) { g += a + b; } 13; void __fastcall fastcall3(int a, int b, int c) { g += a + b + c; } 14; 15; void __stdcall stdcall1(int a) { g += a; } 16; void __stdcall stdcall2(int a, int b) { g += a + b; } 17; void __stdcall stdcall3(int a, int b, int c) { g += a + b + c; } 18; } 19; 20; struct Foo { 21; void thiscall1(int a); 22; void thiscall2(int a, int b); 23; void thiscall3(int a, int b, int c); 24; }; 25; 26; void Foo::thiscall1(int a) { g += a; } 27; void Foo::thiscall2(int a, int b) { g += a + b; } 28; void Foo::thiscall3(int a, int b, int c) { g += a + b + c; } 29 30; CHECK: .cv_fpo_proc _cdecl1 4 31; CHECK: .cv_fpo_proc _cdecl2 8 32; CHECK: .cv_fpo_proc _cdecl3 12 33 34; First two args are in registers and don't count. 35; CHECK: .cv_fpo_proc @fastcall1@4 0 36; CHECK: .cv_fpo_proc @fastcall2@8 0 37; CHECK: .cv_fpo_proc @fastcall3@12 4 38 39; CHECK: .cv_fpo_proc _stdcall1@4 4 40; CHECK: .cv_fpo_proc _stdcall2@8 8 41; CHECK: .cv_fpo_proc _stdcall3@12 12 42 43; 'this' is in ecx and doesn't count. 44; CHECK: .cv_fpo_proc "?thiscall1@Foo@@QAEXH@Z" 4 45; CHECK: .cv_fpo_proc "?thiscall2@Foo@@QAEXHH@Z" 8 46; CHECK: .cv_fpo_proc "?thiscall3@Foo@@QAEXHHH@Z" 12 47 48; ModuleID = 't.c' 49source_filename = "t.c" 50target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" 51target triple = "i386-pc-windows-msvc19.11.25508" 52 53%struct.Foo = type { i8 } 54 55@g = external global i32, align 4 56 57; Function Attrs: noinline nounwind optnone 58define void @cdecl1(i32 %a) #0 !dbg !8 { 59entry: 60 %a.addr = alloca i32, align 4 61 store i32 %a, i32* %a.addr, align 4 62 call void @llvm.dbg.declare(metadata i32* %a.addr, metadata !12, metadata !DIExpression()), !dbg !13 63 %0 = load i32, i32* %a.addr, align 4, !dbg !14 64 %1 = load i32, i32* @g, align 4, !dbg !15 65 %add = add nsw i32 %1, %0, !dbg !15 66 store i32 %add, i32* @g, align 4, !dbg !15 67 ret void, !dbg !16 68} 69 70; Function Attrs: nounwind readnone speculatable 71declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 72 73; Function Attrs: noinline nounwind optnone 74define void @cdecl2(i32 %a, i32 %b) #0 !dbg !17 { 75entry: 76 %b.addr = alloca i32, align 4 77 %a.addr = alloca i32, align 4 78 store i32 %b, i32* %b.addr, align 4 79 call void @llvm.dbg.declare(metadata i32* %b.addr, metadata !20, metadata !DIExpression()), !dbg !21 80 store i32 %a, i32* %a.addr, align 4 81 call void @llvm.dbg.declare(metadata i32* %a.addr, metadata !22, metadata !DIExpression()), !dbg !23 82 %0 = load i32, i32* %a.addr, align 4, !dbg !24 83 %1 = load i32, i32* %b.addr, align 4, !dbg !25 84 %add = add nsw i32 %0, %1, !dbg !26 85 %2 = load i32, i32* @g, align 4, !dbg !27 86 %add1 = add nsw i32 %2, %add, !dbg !27 87 store i32 %add1, i32* @g, align 4, !dbg !27 88 ret void, !dbg !28 89} 90 91; Function Attrs: noinline nounwind optnone 92define void @cdecl3(i32 %a, i32 %b, i32 %c) #0 !dbg !29 { 93entry: 94 %c.addr = alloca i32, align 4 95 %b.addr = alloca i32, align 4 96 %a.addr = alloca i32, align 4 97 store i32 %c, i32* %c.addr, align 4 98 call void @llvm.dbg.declare(metadata i32* %c.addr, metadata !32, metadata !DIExpression()), !dbg !33 99 store i32 %b, i32* %b.addr, align 4 100 call void @llvm.dbg.declare(metadata i32* %b.addr, metadata !34, metadata !DIExpression()), !dbg !35 101 store i32 %a, i32* %a.addr, align 4 102 call void @llvm.dbg.declare(metadata i32* %a.addr, metadata !36, metadata !DIExpression()), !dbg !37 103 %0 = load i32, i32* %a.addr, align 4, !dbg !38 104 %1 = load i32, i32* %b.addr, align 4, !dbg !39 105 %add = add nsw i32 %0, %1, !dbg !40 106 %2 = load i32, i32* %c.addr, align 4, !dbg !41 107 %add1 = add nsw i32 %add, %2, !dbg !42 108 %3 = load i32, i32* @g, align 4, !dbg !43 109 %add2 = add nsw i32 %3, %add1, !dbg !43 110 store i32 %add2, i32* @g, align 4, !dbg !43 111 ret void, !dbg !44 112} 113 114; Function Attrs: noinline nounwind optnone 115define x86_fastcallcc void @"\01@fastcall1@4"(i32 inreg %a) #0 !dbg !45 { 116entry: 117 %a.addr = alloca i32, align 4 118 store i32 %a, i32* %a.addr, align 4 119 call void @llvm.dbg.declare(metadata i32* %a.addr, metadata !47, metadata !DIExpression()), !dbg !48 120 %0 = load i32, i32* %a.addr, align 4, !dbg !49 121 %1 = load i32, i32* @g, align 4, !dbg !50 122 %add = add nsw i32 %1, %0, !dbg !50 123 store i32 %add, i32* @g, align 4, !dbg !50 124 ret void, !dbg !51 125} 126 127; Function Attrs: noinline nounwind optnone 128define x86_fastcallcc void @"\01@fastcall2@8"(i32 inreg %a, i32 inreg %b) #0 !dbg !52 { 129entry: 130 %b.addr = alloca i32, align 4 131 %a.addr = alloca i32, align 4 132 store i32 %b, i32* %b.addr, align 4 133 call void @llvm.dbg.declare(metadata i32* %b.addr, metadata !54, metadata !DIExpression()), !dbg !55 134 store i32 %a, i32* %a.addr, align 4 135 call void @llvm.dbg.declare(metadata i32* %a.addr, metadata !56, metadata !DIExpression()), !dbg !57 136 %0 = load i32, i32* %a.addr, align 4, !dbg !58 137 %1 = load i32, i32* %b.addr, align 4, !dbg !59 138 %add = add nsw i32 %0, %1, !dbg !60 139 %2 = load i32, i32* @g, align 4, !dbg !61 140 %add1 = add nsw i32 %2, %add, !dbg !61 141 store i32 %add1, i32* @g, align 4, !dbg !61 142 ret void, !dbg !62 143} 144 145; Function Attrs: noinline nounwind optnone 146define x86_fastcallcc void @"\01@fastcall3@12"(i32 inreg %a, i32 inreg %b, i32 %c) #0 !dbg !63 { 147entry: 148 %c.addr = alloca i32, align 4 149 %b.addr = alloca i32, align 4 150 %a.addr = alloca i32, align 4 151 store i32 %c, i32* %c.addr, align 4 152 call void @llvm.dbg.declare(metadata i32* %c.addr, metadata !65, metadata !DIExpression()), !dbg !66 153 store i32 %b, i32* %b.addr, align 4 154 call void @llvm.dbg.declare(metadata i32* %b.addr, metadata !67, metadata !DIExpression()), !dbg !68 155 store i32 %a, i32* %a.addr, align 4 156 call void @llvm.dbg.declare(metadata i32* %a.addr, metadata !69, metadata !DIExpression()), !dbg !70 157 %0 = load i32, i32* %a.addr, align 4, !dbg !71 158 %1 = load i32, i32* %b.addr, align 4, !dbg !72 159 %add = add nsw i32 %0, %1, !dbg !73 160 %2 = load i32, i32* %c.addr, align 4, !dbg !74 161 %add1 = add nsw i32 %add, %2, !dbg !75 162 %3 = load i32, i32* @g, align 4, !dbg !76 163 %add2 = add nsw i32 %3, %add1, !dbg !76 164 store i32 %add2, i32* @g, align 4, !dbg !76 165 ret void, !dbg !77 166} 167 168; Function Attrs: noinline nounwind optnone 169define x86_stdcallcc void @"\01_stdcall1@4"(i32 %a) #0 !dbg !78 { 170entry: 171 %a.addr = alloca i32, align 4 172 store i32 %a, i32* %a.addr, align 4 173 call void @llvm.dbg.declare(metadata i32* %a.addr, metadata !80, metadata !DIExpression()), !dbg !81 174 %0 = load i32, i32* %a.addr, align 4, !dbg !82 175 %1 = load i32, i32* @g, align 4, !dbg !83 176 %add = add nsw i32 %1, %0, !dbg !83 177 store i32 %add, i32* @g, align 4, !dbg !83 178 ret void, !dbg !84 179} 180 181; Function Attrs: noinline nounwind optnone 182define x86_stdcallcc void @"\01_stdcall2@8"(i32 %a, i32 %b) #0 !dbg !85 { 183entry: 184 %b.addr = alloca i32, align 4 185 %a.addr = alloca i32, align 4 186 store i32 %b, i32* %b.addr, align 4 187 call void @llvm.dbg.declare(metadata i32* %b.addr, metadata !87, metadata !DIExpression()), !dbg !88 188 store i32 %a, i32* %a.addr, align 4 189 call void @llvm.dbg.declare(metadata i32* %a.addr, metadata !89, metadata !DIExpression()), !dbg !90 190 %0 = load i32, i32* %a.addr, align 4, !dbg !91 191 %1 = load i32, i32* %b.addr, align 4, !dbg !92 192 %add = add nsw i32 %0, %1, !dbg !93 193 %2 = load i32, i32* @g, align 4, !dbg !94 194 %add1 = add nsw i32 %2, %add, !dbg !94 195 store i32 %add1, i32* @g, align 4, !dbg !94 196 ret void, !dbg !95 197} 198 199; Function Attrs: noinline nounwind optnone 200define x86_stdcallcc void @"\01_stdcall3@12"(i32 %a, i32 %b, i32 %c) #0 !dbg !96 { 201entry: 202 %c.addr = alloca i32, align 4 203 %b.addr = alloca i32, align 4 204 %a.addr = alloca i32, align 4 205 store i32 %c, i32* %c.addr, align 4 206 call void @llvm.dbg.declare(metadata i32* %c.addr, metadata !98, metadata !DIExpression()), !dbg !99 207 store i32 %b, i32* %b.addr, align 4 208 call void @llvm.dbg.declare(metadata i32* %b.addr, metadata !100, metadata !DIExpression()), !dbg !101 209 store i32 %a, i32* %a.addr, align 4 210 call void @llvm.dbg.declare(metadata i32* %a.addr, metadata !102, metadata !DIExpression()), !dbg !103 211 %0 = load i32, i32* %a.addr, align 4, !dbg !104 212 %1 = load i32, i32* %b.addr, align 4, !dbg !105 213 %add = add nsw i32 %0, %1, !dbg !106 214 %2 = load i32, i32* %c.addr, align 4, !dbg !107 215 %add1 = add nsw i32 %add, %2, !dbg !108 216 %3 = load i32, i32* @g, align 4, !dbg !109 217 %add2 = add nsw i32 %3, %add1, !dbg !109 218 store i32 %add2, i32* @g, align 4, !dbg !109 219 ret void, !dbg !110 220} 221 222; Function Attrs: noinline nounwind optnone 223define x86_thiscallcc void @"\01?thiscall1@Foo@@QAEXH@Z"(%struct.Foo* %this, i32 %a) #0 align 2 !dbg !111 { 224entry: 225 %a.addr = alloca i32, align 4 226 %this.addr = alloca %struct.Foo*, align 4 227 store i32 %a, i32* %a.addr, align 4 228 call void @llvm.dbg.declare(metadata i32* %a.addr, metadata !124, metadata !DIExpression()), !dbg !125 229 store %struct.Foo* %this, %struct.Foo** %this.addr, align 4 230 call void @llvm.dbg.declare(metadata %struct.Foo** %this.addr, metadata !126, metadata !DIExpression()), !dbg !128 231 %this1 = load %struct.Foo*, %struct.Foo** %this.addr, align 4 232 %0 = load i32, i32* %a.addr, align 4, !dbg !129 233 %1 = load i32, i32* @g, align 4, !dbg !130 234 %add = add nsw i32 %1, %0, !dbg !130 235 store i32 %add, i32* @g, align 4, !dbg !130 236 ret void, !dbg !131 237} 238 239; Function Attrs: noinline nounwind optnone 240define x86_thiscallcc void @"\01?thiscall2@Foo@@QAEXHH@Z"(%struct.Foo* %this, i32 %a, i32 %b) #0 align 2 !dbg !132 { 241entry: 242 %b.addr = alloca i32, align 4 243 %a.addr = alloca i32, align 4 244 %this.addr = alloca %struct.Foo*, align 4 245 store i32 %b, i32* %b.addr, align 4 246 call void @llvm.dbg.declare(metadata i32* %b.addr, metadata !133, metadata !DIExpression()), !dbg !134 247 store i32 %a, i32* %a.addr, align 4 248 call void @llvm.dbg.declare(metadata i32* %a.addr, metadata !135, metadata !DIExpression()), !dbg !136 249 store %struct.Foo* %this, %struct.Foo** %this.addr, align 4 250 call void @llvm.dbg.declare(metadata %struct.Foo** %this.addr, metadata !137, metadata !DIExpression()), !dbg !138 251 %this1 = load %struct.Foo*, %struct.Foo** %this.addr, align 4 252 %0 = load i32, i32* %a.addr, align 4, !dbg !139 253 %1 = load i32, i32* %b.addr, align 4, !dbg !140 254 %add = add nsw i32 %0, %1, !dbg !141 255 %2 = load i32, i32* @g, align 4, !dbg !142 256 %add2 = add nsw i32 %2, %add, !dbg !142 257 store i32 %add2, i32* @g, align 4, !dbg !142 258 ret void, !dbg !143 259} 260 261; Function Attrs: noinline nounwind optnone 262define x86_thiscallcc void @"\01?thiscall3@Foo@@QAEXHHH@Z"(%struct.Foo* %this, i32 %a, i32 %b, i32 %c) #0 align 2 !dbg !144 { 263entry: 264 %c.addr = alloca i32, align 4 265 %b.addr = alloca i32, align 4 266 %a.addr = alloca i32, align 4 267 %this.addr = alloca %struct.Foo*, align 4 268 store i32 %c, i32* %c.addr, align 4 269 call void @llvm.dbg.declare(metadata i32* %c.addr, metadata !145, metadata !DIExpression()), !dbg !146 270 store i32 %b, i32* %b.addr, align 4 271 call void @llvm.dbg.declare(metadata i32* %b.addr, metadata !147, metadata !DIExpression()), !dbg !148 272 store i32 %a, i32* %a.addr, align 4 273 call void @llvm.dbg.declare(metadata i32* %a.addr, metadata !149, metadata !DIExpression()), !dbg !150 274 store %struct.Foo* %this, %struct.Foo** %this.addr, align 4 275 call void @llvm.dbg.declare(metadata %struct.Foo** %this.addr, metadata !151, metadata !DIExpression()), !dbg !152 276 %this1 = load %struct.Foo*, %struct.Foo** %this.addr, align 4 277 %0 = load i32, i32* %a.addr, align 4, !dbg !153 278 %1 = load i32, i32* %b.addr, align 4, !dbg !154 279 %add = add nsw i32 %0, %1, !dbg !155 280 %2 = load i32, i32* %c.addr, align 4, !dbg !156 281 %add2 = add nsw i32 %add, %2, !dbg !157 282 %3 = load i32, i32* @g, align 4, !dbg !158 283 %add3 = add nsw i32 %3, %add2, !dbg !158 284 store i32 %add3, i32* @g, align 4, !dbg !158 285 ret void, !dbg !159 286} 287 288attributes #0 = { 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" } 289attributes #1 = { nounwind readnone speculatable } 290 291!llvm.dbg.cu = !{!0} 292!llvm.module.flags = !{!3, !4, !5, !6} 293!llvm.ident = !{!7} 294 295!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 6.0.0 ", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2) 296!1 = !DIFile(filename: "t.c", directory: "C:\5Csrc\5Cllvm-project\5Cbuild", checksumkind: CSK_MD5, checksum: "0ce3e4edcf2f8511157da4edb99fcdf4") 297!2 = !{} 298!3 = !{i32 1, !"NumRegisterParameters", i32 0} 299!4 = !{i32 2, !"CodeView", i32 1} 300!5 = !{i32 2, !"Debug Info Version", i32 3} 301!6 = !{i32 1, !"wchar_size", i32 2} 302!7 = !{!"clang version 6.0.0 "} 303!8 = distinct !DISubprogram(name: "cdecl1", scope: !1, file: !1, line: 4, type: !9, isLocal: false, isDefinition: true, scopeLine: 4, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) 304!9 = !DISubroutineType(types: !10) 305!10 = !{null, !11} 306!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) 307!12 = !DILocalVariable(name: "a", arg: 1, scope: !8, file: !1, line: 4, type: !11) 308!13 = !DILocation(line: 4, column: 17, scope: !8) 309!14 = !DILocation(line: 4, column: 27, scope: !8) 310!15 = !DILocation(line: 4, column: 24, scope: !8) 311!16 = !DILocation(line: 4, column: 30, scope: !8) 312!17 = distinct !DISubprogram(name: "cdecl2", scope: !1, file: !1, line: 5, type: !18, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) 313!18 = !DISubroutineType(types: !19) 314!19 = !{null, !11, !11} 315!20 = !DILocalVariable(name: "b", arg: 2, scope: !17, file: !1, line: 5, type: !11) 316!21 = !DILocation(line: 5, column: 24, scope: !17) 317!22 = !DILocalVariable(name: "a", arg: 1, scope: !17, file: !1, line: 5, type: !11) 318!23 = !DILocation(line: 5, column: 17, scope: !17) 319!24 = !DILocation(line: 5, column: 34, scope: !17) 320!25 = !DILocation(line: 5, column: 38, scope: !17) 321!26 = !DILocation(line: 5, column: 36, scope: !17) 322!27 = !DILocation(line: 5, column: 31, scope: !17) 323!28 = !DILocation(line: 5, column: 41, scope: !17) 324!29 = distinct !DISubprogram(name: "cdecl3", scope: !1, file: !1, line: 6, type: !30, isLocal: false, isDefinition: true, scopeLine: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) 325!30 = !DISubroutineType(types: !31) 326!31 = !{null, !11, !11, !11} 327!32 = !DILocalVariable(name: "c", arg: 3, scope: !29, file: !1, line: 6, type: !11) 328!33 = !DILocation(line: 6, column: 31, scope: !29) 329!34 = !DILocalVariable(name: "b", arg: 2, scope: !29, file: !1, line: 6, type: !11) 330!35 = !DILocation(line: 6, column: 24, scope: !29) 331!36 = !DILocalVariable(name: "a", arg: 1, scope: !29, file: !1, line: 6, type: !11) 332!37 = !DILocation(line: 6, column: 17, scope: !29) 333!38 = !DILocation(line: 6, column: 41, scope: !29) 334!39 = !DILocation(line: 6, column: 45, scope: !29) 335!40 = !DILocation(line: 6, column: 43, scope: !29) 336!41 = !DILocation(line: 6, column: 49, scope: !29) 337!42 = !DILocation(line: 6, column: 47, scope: !29) 338!43 = !DILocation(line: 6, column: 38, scope: !29) 339!44 = !DILocation(line: 6, column: 52, scope: !29) 340!45 = distinct !DISubprogram(name: "fastcall1", linkageName: "\01@fastcall1@4", scope: !1, file: !1, line: 8, type: !46, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) 341!46 = !DISubroutineType(cc: DW_CC_BORLAND_msfastcall, types: !10) 342!47 = !DILocalVariable(name: "a", arg: 1, scope: !45, file: !1, line: 8, type: !11) 343!48 = !DILocation(line: 8, column: 31, scope: !45) 344!49 = !DILocation(line: 8, column: 41, scope: !45) 345!50 = !DILocation(line: 8, column: 38, scope: !45) 346!51 = !DILocation(line: 8, column: 44, scope: !45) 347!52 = distinct !DISubprogram(name: "fastcall2", linkageName: "\01@fastcall2@8", scope: !1, file: !1, line: 9, type: !53, isLocal: false, isDefinition: true, scopeLine: 9, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) 348!53 = !DISubroutineType(cc: DW_CC_BORLAND_msfastcall, types: !19) 349!54 = !DILocalVariable(name: "b", arg: 2, scope: !52, file: !1, line: 9, type: !11) 350!55 = !DILocation(line: 9, column: 38, scope: !52) 351!56 = !DILocalVariable(name: "a", arg: 1, scope: !52, file: !1, line: 9, type: !11) 352!57 = !DILocation(line: 9, column: 31, scope: !52) 353!58 = !DILocation(line: 9, column: 48, scope: !52) 354!59 = !DILocation(line: 9, column: 52, scope: !52) 355!60 = !DILocation(line: 9, column: 50, scope: !52) 356!61 = !DILocation(line: 9, column: 45, scope: !52) 357!62 = !DILocation(line: 9, column: 55, scope: !52) 358!63 = distinct !DISubprogram(name: "fastcall3", linkageName: "\01@fastcall3@12", scope: !1, file: !1, line: 10, type: !64, isLocal: false, isDefinition: true, scopeLine: 10, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) 359!64 = !DISubroutineType(cc: DW_CC_BORLAND_msfastcall, types: !31) 360!65 = !DILocalVariable(name: "c", arg: 3, scope: !63, file: !1, line: 10, type: !11) 361!66 = !DILocation(line: 10, column: 45, scope: !63) 362!67 = !DILocalVariable(name: "b", arg: 2, scope: !63, file: !1, line: 10, type: !11) 363!68 = !DILocation(line: 10, column: 38, scope: !63) 364!69 = !DILocalVariable(name: "a", arg: 1, scope: !63, file: !1, line: 10, type: !11) 365!70 = !DILocation(line: 10, column: 31, scope: !63) 366!71 = !DILocation(line: 10, column: 55, scope: !63) 367!72 = !DILocation(line: 10, column: 59, scope: !63) 368!73 = !DILocation(line: 10, column: 57, scope: !63) 369!74 = !DILocation(line: 10, column: 63, scope: !63) 370!75 = !DILocation(line: 10, column: 61, scope: !63) 371!76 = !DILocation(line: 10, column: 52, scope: !63) 372!77 = !DILocation(line: 10, column: 66, scope: !63) 373!78 = distinct !DISubprogram(name: "stdcall1", linkageName: "\01_stdcall1@4", scope: !1, file: !1, line: 12, type: !79, isLocal: false, isDefinition: true, scopeLine: 12, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) 374!79 = !DISubroutineType(cc: DW_CC_BORLAND_stdcall, types: !10) 375!80 = !DILocalVariable(name: "a", arg: 1, scope: !78, file: !1, line: 12, type: !11) 376!81 = !DILocation(line: 12, column: 29, scope: !78) 377!82 = !DILocation(line: 12, column: 39, scope: !78) 378!83 = !DILocation(line: 12, column: 36, scope: !78) 379!84 = !DILocation(line: 12, column: 42, scope: !78) 380!85 = distinct !DISubprogram(name: "stdcall2", linkageName: "\01_stdcall2@8", scope: !1, file: !1, line: 13, type: !86, isLocal: false, isDefinition: true, scopeLine: 13, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) 381!86 = !DISubroutineType(cc: DW_CC_BORLAND_stdcall, types: !19) 382!87 = !DILocalVariable(name: "b", arg: 2, scope: !85, file: !1, line: 13, type: !11) 383!88 = !DILocation(line: 13, column: 36, scope: !85) 384!89 = !DILocalVariable(name: "a", arg: 1, scope: !85, file: !1, line: 13, type: !11) 385!90 = !DILocation(line: 13, column: 29, scope: !85) 386!91 = !DILocation(line: 13, column: 46, scope: !85) 387!92 = !DILocation(line: 13, column: 50, scope: !85) 388!93 = !DILocation(line: 13, column: 48, scope: !85) 389!94 = !DILocation(line: 13, column: 43, scope: !85) 390!95 = !DILocation(line: 13, column: 53, scope: !85) 391!96 = distinct !DISubprogram(name: "stdcall3", linkageName: "\01_stdcall3@12", scope: !1, file: !1, line: 14, type: !97, isLocal: false, isDefinition: true, scopeLine: 14, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) 392!97 = !DISubroutineType(cc: DW_CC_BORLAND_stdcall, types: !31) 393!98 = !DILocalVariable(name: "c", arg: 3, scope: !96, file: !1, line: 14, type: !11) 394!99 = !DILocation(line: 14, column: 43, scope: !96) 395!100 = !DILocalVariable(name: "b", arg: 2, scope: !96, file: !1, line: 14, type: !11) 396!101 = !DILocation(line: 14, column: 36, scope: !96) 397!102 = !DILocalVariable(name: "a", arg: 1, scope: !96, file: !1, line: 14, type: !11) 398!103 = !DILocation(line: 14, column: 29, scope: !96) 399!104 = !DILocation(line: 14, column: 53, scope: !96) 400!105 = !DILocation(line: 14, column: 57, scope: !96) 401!106 = !DILocation(line: 14, column: 55, scope: !96) 402!107 = !DILocation(line: 14, column: 61, scope: !96) 403!108 = !DILocation(line: 14, column: 59, scope: !96) 404!109 = !DILocation(line: 14, column: 50, scope: !96) 405!110 = !DILocation(line: 14, column: 64, scope: !96) 406!111 = distinct !DISubprogram(name: "thiscall1", linkageName: "\01?thiscall1@Foo@@QAEXH@Z", scope: !112, file: !1, line: 23, type: !115, isLocal: false, isDefinition: true, scopeLine: 23, flags: DIFlagPrototyped, isOptimized: false, unit: !0, declaration: !114, retainedNodes: !2) 407!112 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "Foo", file: !1, line: 17, size: 8, elements: !113, identifier: ".?AUFoo@@") 408!113 = !{!114, !118, !121} 409!114 = !DISubprogram(name: "thiscall1", linkageName: "\01?thiscall1@Foo@@QAEXH@Z", scope: !112, file: !1, line: 18, type: !115, isLocal: false, isDefinition: false, scopeLine: 18, flags: DIFlagPrototyped, isOptimized: false) 410!115 = !DISubroutineType(cc: DW_CC_BORLAND_thiscall, types: !116) 411!116 = !{null, !117, !11} 412!117 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !112, size: 32, flags: DIFlagArtificial | DIFlagObjectPointer) 413!118 = !DISubprogram(name: "thiscall2", linkageName: "\01?thiscall2@Foo@@QAEXHH@Z", scope: !112, file: !1, line: 19, type: !119, isLocal: false, isDefinition: false, scopeLine: 19, flags: DIFlagPrototyped, isOptimized: false) 414!119 = !DISubroutineType(cc: DW_CC_BORLAND_thiscall, types: !120) 415!120 = !{null, !117, !11, !11} 416!121 = !DISubprogram(name: "thiscall3", linkageName: "\01?thiscall3@Foo@@QAEXHHH@Z", scope: !112, file: !1, line: 20, type: !122, isLocal: false, isDefinition: false, scopeLine: 20, flags: DIFlagPrototyped, isOptimized: false) 417!122 = !DISubroutineType(cc: DW_CC_BORLAND_thiscall, types: !123) 418!123 = !{null, !117, !11, !11, !11} 419!124 = !DILocalVariable(name: "a", arg: 2, scope: !111, file: !1, line: 23, type: !11) 420!125 = !DILocation(line: 23, column: 25, scope: !111) 421!126 = !DILocalVariable(name: "this", arg: 1, scope: !111, type: !127, flags: DIFlagArtificial | DIFlagObjectPointer) 422!127 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !112, size: 32) 423!128 = !DILocation(line: 0, scope: !111) 424!129 = !DILocation(line: 23, column: 35, scope: !111) 425!130 = !DILocation(line: 23, column: 32, scope: !111) 426!131 = !DILocation(line: 23, column: 38, scope: !111) 427!132 = distinct !DISubprogram(name: "thiscall2", linkageName: "\01?thiscall2@Foo@@QAEXHH@Z", scope: !112, file: !1, line: 24, type: !119, isLocal: false, isDefinition: true, scopeLine: 24, flags: DIFlagPrototyped, isOptimized: false, unit: !0, declaration: !118, retainedNodes: !2) 428!133 = !DILocalVariable(name: "b", arg: 3, scope: !132, file: !1, line: 24, type: !11) 429!134 = !DILocation(line: 24, column: 32, scope: !132) 430!135 = !DILocalVariable(name: "a", arg: 2, scope: !132, file: !1, line: 24, type: !11) 431!136 = !DILocation(line: 24, column: 25, scope: !132) 432!137 = !DILocalVariable(name: "this", arg: 1, scope: !132, type: !127, flags: DIFlagArtificial | DIFlagObjectPointer) 433!138 = !DILocation(line: 0, scope: !132) 434!139 = !DILocation(line: 24, column: 42, scope: !132) 435!140 = !DILocation(line: 24, column: 46, scope: !132) 436!141 = !DILocation(line: 24, column: 44, scope: !132) 437!142 = !DILocation(line: 24, column: 39, scope: !132) 438!143 = !DILocation(line: 24, column: 49, scope: !132) 439!144 = distinct !DISubprogram(name: "thiscall3", linkageName: "\01?thiscall3@Foo@@QAEXHHH@Z", scope: !112, file: !1, line: 25, type: !122, isLocal: false, isDefinition: true, scopeLine: 25, flags: DIFlagPrototyped, isOptimized: false, unit: !0, declaration: !121, retainedNodes: !2) 440!145 = !DILocalVariable(name: "c", arg: 4, scope: !144, file: !1, line: 25, type: !11) 441!146 = !DILocation(line: 25, column: 39, scope: !144) 442!147 = !DILocalVariable(name: "b", arg: 3, scope: !144, file: !1, line: 25, type: !11) 443!148 = !DILocation(line: 25, column: 32, scope: !144) 444!149 = !DILocalVariable(name: "a", arg: 2, scope: !144, file: !1, line: 25, type: !11) 445!150 = !DILocation(line: 25, column: 25, scope: !144) 446!151 = !DILocalVariable(name: "this", arg: 1, scope: !144, type: !127, flags: DIFlagArtificial | DIFlagObjectPointer) 447!152 = !DILocation(line: 0, scope: !144) 448!153 = !DILocation(line: 25, column: 49, scope: !144) 449!154 = !DILocation(line: 25, column: 53, scope: !144) 450!155 = !DILocation(line: 25, column: 51, scope: !144) 451!156 = !DILocation(line: 25, column: 57, scope: !144) 452!157 = !DILocation(line: 25, column: 55, scope: !144) 453!158 = !DILocation(line: 25, column: 46, scope: !144) 454!159 = !DILocation(line: 25, column: 60, scope: !144) 455