3 Jay Krell (jaykrell@microsoft.com)
5 Copyright 2018 Microsoft
6 Licensed under the MIT license. See LICENSE file in the project root for full license information.
8 Derived from tailcall-interface.cs.
11 .assembly extern mscorlib { }
13 .assembly 'tailcall-interface-conservestack' { }
15 .class public sequential sealed Point
16 extends [mscorlib]System.ValueType
22 .class interface private abstract I1
25 .method public newslot abstract virtual instance void perturb_interface_offset1() { }
27 .method public newslot abstract virtual instance void F1(class I2 i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
31 .method public newslot abstract virtual instance void GF1<TF>(class I2 i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
37 .class interface private abstract GI1`1<TC>
40 .method public newslot abstract virtual instance void perturb_interface_offset1()
44 .method public newslot abstract virtual instance void perturb_interface_offset2()
48 .method public newslot abstract virtual instance void F1(class GI2`1<!TC> i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
52 .method public newslot abstract virtual instance void GF1<TF>(class GI2`1<!TC> i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
56 .method public newslot abstract virtual instance void HF1<TF>(class GI2`1<!!TF> i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
61 .class interface private abstract I2
63 .method public newslot abstract virtual instance void perturb_interface_offset1() { }
65 .method public newslot abstract virtual instance void perturb_interface_offset2() { }
67 .method public newslot abstract virtual instance void perturb_interface_offset3() { }
69 .method public newslot abstract virtual instance void F2(class I1 i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
73 .method public newslot abstract virtual instance void GF2<TF>(class I1 i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
79 .class interface private abstract GI2`1<TC>
82 .method public newslot abstract virtual instance void perturb_interface_offset1()
86 .method public newslot abstract virtual instance void perturb_interface_offset2()
90 .method public newslot abstract virtual instance void perturb_interface_offset3()
94 .method public newslot abstract virtual instance void perturb_interface_offset4()
98 .method public newslot abstract virtual instance void F2(class GI1`1<!TC> i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
101 .method public newslot abstract virtual instance void GF2<TF>(class GI1`1<!TC> i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
104 .method public newslot abstract virtual instance void HF2<TF>(class GI1`1<!!TF> i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
109 .class public C1 implements I1
111 .field static int64 i
112 .field public static int64 errors
114 .method private newslot virtual final instance void I1.perturb_interface_offset1()
116 .override I1::perturb_interface_offset1
120 .method public static void check(int64 stack1, int64 stack2)
133 //box [mscorlib]System.Int64
134 //call void [mscorlib]System.Console::WriteLine(string, object)
138 ldsfld int64 C1::errors
141 stsfld int64 C1::errors
143 ldstr "{0} tailcall failure stack1:{1:X} stack2:{2:X} delta:{3}"
146 newarr [mscorlib]System.Object
151 box [mscorlib]System.Int64
157 box [mscorlib]System.Int64
163 box [mscorlib]System.Int64
171 box [mscorlib]System.Int64
174 call void class [mscorlib]System.Console::WriteLine(string, object[])
177 .method private newslot virtual final instance void I1.F1(class I2 i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
195 callvirt instance void I2::F2(class I1, int64, int64, int64)
203 call void C1::check(int64, int64)
207 .method private newslot virtual final instance void I1.GF1<TF>(class I2 i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
225 callvirt instance void I2::GF2<!!0>(class I1, int64, int64, int64)
233 call void C1::check(int64, int64)
236 .method public instance void .ctor()
239 call instance void [mscorlib]System.Object::.ctor()
243 .class public GC1`1<TC>
244 implements class GI1`1<!TC>
246 .method private newslot virtual final instance void 'GI1<TC>.perturb_interface_offset1'()
248 .override method instance void class GI1`1<!TC>::perturb_interface_offset1()
251 .method private newslot virtual final instance void 'GI1<TC>.perturb_interface_offset2'()
253 .override method instance void class GI1`1<!TC>::perturb_interface_offset2()
256 .method public static void check(int64 stack1, int64 stack2)
260 call void C1::check(int64, int64)
263 .method private newslot virtual final instance void 'GI1<TC>.F1'(class GI2`1<!TC> i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
265 .override method instance void class GI1`1<!TC>::F1(class GI2`1<!0>, int64, int64, int64)
281 callvirt instance void class GI2`1<!TC>::F2(class GI1`1<!0>, int64, int64, int64)
289 call void class GC1`1<!TC>::check(int64, int64)
292 .method private newslot virtual final instance void 'GI1<TC>.GF1'<TF>(class GI2`1<!TC> i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
294 .override method instance void class GI1`1<!TC>::GF1<[1]>(class GI2`1<!0>, int64, int64, int64)
309 callvirt instance void class GI2`1<!TC>::GF2<!!0>(class GI1`1<!0>, int64, int64, int64)
317 call void class GC1`1<!TC>::check(int64, int64)
321 .method private newslot virtual final instance void 'GI1<TC>.HF1'<TF>(class GI2`1<!!TF> i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
323 .override method instance void class GI1`1<!TC>::HF1<[1]>(class GI2`1<!!TF>, int64, int64, int64)
339 callvirt instance void class GI2`1<!!0>::HF2<!0>(class GI1`1<!!0>, int64, int64, int64)
347 call void class GC1`1<!TC>::check(int64, int64)
351 .method public instance void .ctor()
354 call instance void [mscorlib]System.Object::.ctor()
361 .method private newslot virtual final instance void I2.perturb_interface_offset1()
363 .override I2::perturb_interface_offset1
366 .method private newslot virtual final instance void I2.perturb_interface_offset2()
368 .override I2::perturb_interface_offset2
371 .method private newslot virtual final instance void I2.perturb_interface_offset3()
373 .override I2::perturb_interface_offset3
377 .method private static void check(int64 stack1, int64 stack2)
381 call void C1::check(int64, int64)
385 .method private newslot virtual final instance void I2.F2(class I1 i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
403 callvirt instance void I1::F1(class I2, int64, int64, int64)
411 call void C2::check(int64, int64)
414 .method private newslot virtual final instance void I2.GF2<TF>(class I1 i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
431 callvirt instance void I1::GF1<!!0>(class I2, int64, int64, int64)
438 call void C2::check(int64, int64)
441 .method public instance void .ctor()
444 call instance void [mscorlib]System.Object::.ctor()
448 .class public GC2`1<TC>
449 implements class GI2`1<!TC>
451 .method private newslot virtual final instance void 'GI2<TC>.perturb_interface_offset1'()
453 .override method instance void class GI2`1<!TC>::perturb_interface_offset1()
456 .method private newslot virtual final instance void 'GI2<TC>.perturb_interface_offset2'()
458 .override method instance void class GI2`1<!TC>::perturb_interface_offset2()
461 .method private newslot virtual final instance void 'GI2<TC>.perturb_interface_offset3'()
463 .override method instance void class GI2`1<!TC>::perturb_interface_offset3()
466 .method private newslot virtual final instance void 'GI2<TC>.perturb_interface_offset4'()
468 .override method instance void class GI2`1<!TC>::perturb_interface_offset4()
471 .method public static void check(int64 stack1, int64 stack2)
475 call void C1::check(int64, int64)
478 .method private newslot virtual final instance void 'GI2<TC>.F2'(class GI1`1<!TC> i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
480 .override method instance void class GI2`1<!TC>::F2(class GI1`1<!0>, int64, int64, int64)
496 callvirt instance void class GI1`1<!TC>::F1(class GI2`1<!0>, int64, int64, int64)
504 call void class GC2`1<!TC>::check(int64, int64)
507 .method private newslot virtual final instance void 'GI2<TC>.GF2'<TF>(class GI1`1<!TC> i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
509 .override method instance void class GI2`1<!TC>::GF2<[1]>(class GI1`1<!0>, int64, int64, int64)
525 callvirt instance void class GI1`1<!TC>::GF1<!!0>(class GI2`1<!0>, int64, int64, int64)
533 call void class GC2`1<!TC>::check(int64, int64)
536 .method private newslot virtual final instance void 'GI2<TC>.HF2'<TF>(class GI1`1<!!TF> i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
538 .override method instance void class GI2`1<!TC>::HF2<[1]>(class GI1`1<!!TF>, int64, int64, int64)
553 callvirt instance void class GI1`1<!!0>::HF1<!0>(class GI2`1<!!0>, int64, int64, int64)
561 call void class GC2`1<!TC>::check(int64, int64)
564 .method public instance void .ctor()
567 call instance void [mscorlib]System.Object::.ctor()
573 .method public instance void .ctor()
576 call instance void [mscorlib]System.Object::.ctor()
582 .method public instance void .ctor()
585 call instance void [mscorlib]System.Object::.ctor()
589 .class interface private abstract IC
591 .method public newslot abstract virtual instance !!T cast1<T>(object o, int64 counter, int64 stack) noinlining
594 .method public newslot abstract virtual instance class B cast2(object o, int64 counter, int64 stack) noinlining
597 .method public newslot abstract virtual instance !!T cast3<T>(object o, int64 counter, int64 stack) noinlining
600 .method public newslot abstract virtual instance class B[] cast4(object o, int64 counter, int64 stack) noinlining
603 .method public newslot abstract virtual instance !!T[] cast5<T>(object o, int64 counter, int64 stack) noinlining
609 .method public static void check(int64 stack1, int64 stack2) noinlining
613 call void C1::check(int64, int64)
617 .method public instance !!T cast1<T>(object o, int64 counter, int64 stack) noinlining
632 call instance !!0 C::cast1<!!0>(object, int64, int64)
640 call void C::check(int64, int64)
645 .method public instance class B cast2(object o, int64 counter, int64 stack) noinlining
660 call instance class B C::cast2(object, int64, int64)
668 call void C::check(int64, int64)
674 call instance !!0 C::cast1<class B>(object, int64, int64)
677 .method public instance !!T cast3<T>(object o, int64 counter, int64 stack) noinlining
692 call instance !!0 C::cast3<!!0>(object, int64, int64)
700 call void C::check(int64, int64)
706 call instance !!0 C::cast1<!!0>(object, int64, int64)
709 .method public instance class B[] cast4(object o, int64 counter, int64 stack) noinlining
724 call instance class B[] C::cast4(object, int64, int64)
732 call void C::check(int64, int64)
738 call instance !!0 C::cast1<class B[]>(object, int64, int64)
741 .method public instance !!T[] cast5<T>(object o, int64 counter, int64 stack) noinlining
756 call instance !!0[] C::cast5<!!0>(object, int64, int64)
764 call void C::check(int64, int64)
770 call instance !!0 C::cast1<!!0[]>(object, int64, int64)
773 .method public instance void .ctor()
776 call instance void [mscorlib]System.Object::.ctor()
780 .class public D`1<T1>
782 .method public static void check(int64 stack1, int64 stack2) noinlining
786 call void C::check(int64, int64)
789 .method public static !!T cast1<T>(object o, int64 counter, int64 stack) noinlining
803 call !!0 class D`1<!T1>::cast1<!!0>(object, int64, int64)
811 call void class D`1<!T1>::check(int64, int64)
816 .method public instance class B cast2(object o, int64 counter, int64 stack) noinlining
831 call instance class B class D`1<!T1>::cast2(object, int64, int64)
839 call void class D`1<!T1>::check(int64, int64)
844 call !!0 class D`1<!T1>::cast1<class B>(object, int64, int64)
847 .method public instance !!T cast3<T>(object o, int64 counter, int64 stack) noinlining
862 call instance !!0 class D`1<!T1>::cast3<!!0>(object, int64, int64)
870 call void class D`1<!T1>::check(int64, int64)
875 call !!0 class D`1<!T1>::cast1<!!0>(object, int64, int64)
878 .method public instance class B[] cast4(object o, int64 counter, int64 stack) noinlining
893 call instance class B[] class D`1<!T1>::cast4(object, int64, int64)
901 call void class D`1<!T1>::check(int64, int64)
906 call !!0 class D`1<!T1>::cast1<class B[]>(object, int64, int64)
909 .method public instance !!T[] cast5<T>(object o, int64 counter, int64 stack) noinlining
924 call instance !!0[] class D`1<!T1>::cast5<!!0>(object, int64, int64)
932 call void class D`1<!T1>::check(int64, int64)
937 call !!0 class D`1<!T1>::cast1<!!0[]>(object, int64, int64)
940 .method public instance !T1 cast6(object o, int64 counter, int64 stack) noinlining
955 call instance !0 class D`1<!T1>::cast6(object, int64, int64)
963 call void class D`1<!T1>::check(int64, int64)
968 call !!0 class D`1<!T1>::cast1<!0>(object, int64, int64)
971 .method public instance !T1 cast7<T>(object o, int64 counter, int64 stack) noinlining
986 call instance !0 class D`1<!T1>::cast7<!!0>(object, int64, int64)
994 call void class D`1<!T1>::check(int64, int64)
999 call !!0 class D`1<!T1>::cast1<!0>(object, int64, int64)
1002 .method public instance !T1[] cast8(object o, int64 counter, int64 stack) noinlining
1017 call instance !0[] class D`1<!T1>::cast8(object, int64, int64)
1025 call void class D`1<!T1>::check(int64, int64)
1031 call instance !!0 class D`1<!T1>::cast3<!0[]>(object, int64, int64)
1034 .method public instance !T1[] cast9<T>(object o, int64 counter, int64 stack) noinlining
1049 call instance !0[] class D`1<!T1>::cast9<!!0>(object, int64, int64)
1057 call void class D`1<!T1>::check(int64, int64)
1063 call instance !!0 class D`1<!T1>::cast3<!0[]>(object, int64, int64)
1066 .method public instance void .ctor()
1069 call instance void [mscorlib]System.Object::.ctor()
1075 .method static void print() noinlining
1080 .method static void print(object o) noinlining
1082 call void C3::print()
1086 .method public static void Main(string[] args) noinlining
1090 class D`1<class A> V_0,
1091 class D`1<class B> V_1,
1092 class D`1<class B[]> V_2,
1100 class GI1`1<object> V_10,
1101 class GI1`1<object[]> V_11,
1102 class GI1`1<int64> V_12,
1103 class GI1`1<int64[]> V_13,
1104 class GI1`1<valuetype Point> V_14,
1105 class GI1`1<valuetype Point[]> V_15,
1106 class GI2`1<object> V_16,
1107 class GI2`1<object[]> V_17,
1108 class GI2`1<int64> V_18,
1109 class GI2`1<int64[]> V_19,
1110 class GI2`1<valuetype Point> V_20,
1111 class GI2`1<valuetype Point[]> V_21,
1117 newobj instance void class D`1<class A>::.ctor()
1119 newobj instance void class D`1<class B>::.ctor()
1121 newobj instance void class D`1<class B[]>::.ctor()
1123 newobj instance void C::.ctor()
1125 newobj instance void B::.ctor()
1131 newobj instance void C1::.ctor()
1133 newobj instance void C2::.ctor()
1136 newobj instance void class GC1`1<object>::.ctor()
1138 newobj instance void class GC1`1<object[]>::.ctor()
1140 newobj instance void class GC1`1<int64>::.ctor()
1142 newobj instance void class GC1`1<int64[]>::.ctor()
1144 newobj instance void class GC1`1<valuetype Point>::.ctor()
1146 newobj instance void class GC1`1<valuetype Point[]>::.ctor()
1148 newobj instance void class GC2`1<object>::.ctor()
1150 newobj instance void class GC2`1<object[]>::.ctor()
1152 newobj instance void class GC2`1<int64>::.ctor()
1154 newobj instance void class GC2`1<int64[]>::.ctor()
1156 newobj instance void class GC2`1<valuetype Point>::.ctor()
1158 newobj instance void class GC2`1<valuetype Point[]>::.ctor()
1161 // test-split-prefix do not remove or edit this line
1167 callvirt instance class B class D`1<class A>::cast2(object, int64, int64)
1168 call void C3::print(object)
1174 callvirt instance !!0 class D`1<class A>::cast3<class B>(object, int64, int64)
1175 call void C3::print(object)
1182 callvirt instance !!0 class D`1<class A>::cast3<class B[]>(object, int64, int64)
1183 call void C3::print(object)
1189 callvirt instance class B[] class D`1<class A>::cast4(object, int64, int64)
1190 call void C3::print(object)
1196 callvirt instance !!0[] class D`1<class A>::cast5<class B>(object, int64, int64)
1197 call void C3::print(object)
1203 callvirt instance !0 class D`1<class B>::cast6(object, int64, int64)
1204 call void C3::print(object)
1210 callvirt instance !0 class D`1<class B>::cast7<class A>(object, int64, int64)
1211 call void C3::print(object)
1217 callvirt instance !0 class D`1<class B[]>::cast7<class A[]>(object, int64, int64)
1218 call void C3::print(object)
1224 callvirt instance !0[] class D`1<class B>::cast8(object, int64, int64)
1225 call void C3::print(object)
1231 callvirt instance !0[] class D`1<class B>::cast9<class A>(object, int64, int64)
1232 call void C3::print(object)
1238 callvirt instance class B C::cast2(object, int64, int64)
1239 call void C3::print(object)
1245 callvirt instance !!0 C::cast3<class B>(object, int64, int64)
1246 call void C3::print(object)
1252 callvirt instance !!0 C::cast3<class B[]>(object, int64, int64)
1253 call void C3::print(object)
1259 callvirt instance class B[] C::cast4(object, int64, int64)
1260 call void C3::print(object)
1266 callvirt instance !!0[] C::cast5<class B>(object, int64, int64)
1267 call void C3::print(object)
1276 callvirt instance void I1::F1(class I2, int64, int64, int64)
1285 callvirt instance void I1::GF1<object>(class I2, int64, int64, int64)
1294 callvirt instance void I1::GF1<class A>(class I2, int64, int64, int64)
1303 callvirt instance void I1::GF1<class A[]>(class I2, int64, int64, int64)
1312 callvirt instance void I1::GF1<int64>(class I2, int64, int64, int64)
1321 callvirt instance void I1::GF1<int64[]>(class I2, int64, int64, int64)
1323 // This is the only failure on desktop.
1331 callvirt instance void class GI1`1<object>::F1(class GI2`1<!0>, int64, int64, int64)
1340 callvirt instance void class GI1`1<object>::GF1<object>(class GI2`1<!0>, int64, int64, int64)
1349 callvirt instance void class GI1`1<object>::GF1<class A>(class GI2`1<!0>, int64, int64, int64)
1358 callvirt instance void class GI1`1<object>::GF1<class A[]>(class GI2`1<!0>, int64, int64, int64)
1367 callvirt instance void class GI1`1<object>::GF1<int64>(class GI2`1<!0>, int64, int64, int64)
1376 callvirt instance void class GI1`1<object>::GF1<int64[]>(class GI2`1<!0>, int64, int64, int64)
1385 callvirt instance void class GI1`1<object[]>::GF1<object[]>(class GI2`1<!0>, int64, int64, int64)
1394 callvirt instance void class GI1`1<object[]>::GF1<class A>(class GI2`1<!0>, int64, int64, int64)
1403 callvirt instance void class GI1`1<object[]>::GF1<class A[]>(class GI2`1<!0>, int64, int64, int64)
1412 callvirt instance void class GI1`1<object[]>::GF1<int64>(class GI2`1<!0>, int64, int64, int64)
1421 callvirt instance void class GI1`1<object[]>::GF1<int64[]>(class GI2`1<!0>, int64, int64, int64)
1430 callvirt instance void class GI1`1<int64>::GF1<object>(class GI2`1<!0>, int64, int64, int64)
1439 callvirt instance void class GI1`1<int64>::GF1<class A>(class GI2`1<!0>, int64, int64, int64)
1448 callvirt instance void class GI1`1<int64>::GF1<class A[]>(class GI2`1<!0>, int64, int64, int64)
1457 callvirt instance void class GI1`1<int64>::GF1<int64>(class GI2`1<!0>, int64, int64, int64)
1466 callvirt instance void class GI1`1<int64>::GF1<int64[]>(class GI2`1<!0>, int64, int64, int64)
1475 callvirt instance void class GI1`1<int64[]>::GF1<object>(class GI2`1<!0>, int64, int64, int64)
1484 callvirt instance void class GI1`1<int64[]>::GF1<class A>(class GI2`1<!0>, int64, int64, int64)
1493 callvirt instance void class GI1`1<int64[]>::GF1<class A[]>(class GI2`1<!0>, int64, int64, int64)
1502 callvirt instance void class GI1`1<int64[]>::GF1<int64>(class GI2`1<!0>, int64, int64, int64)
1511 callvirt instance void class GI1`1<int64[]>::GF1<int64[]>(class GI2`1<!0>, int64, int64, int64)
1520 callvirt instance void class GI1`1<valuetype Point>::GF1<object>(class GI2`1<!0>, int64, int64, int64)
1529 callvirt instance void class GI1`1<valuetype Point>::GF1<class A>(class GI2`1<!0>, int64, int64, int64)
1538 callvirt instance void class GI1`1<valuetype Point>::GF1<class A[]>(class GI2`1<!0>, int64, int64, int64)
1547 callvirt instance void class GI1`1<valuetype Point>::GF1<int64>(class GI2`1<!0>, int64, int64, int64)
1556 callvirt instance void class GI1`1<valuetype Point>::GF1<int64[]>(class GI2`1<!0>, int64, int64, int64)
1565 callvirt instance void class GI1`1<valuetype Point[]>::GF1<object>(class GI2`1<!0>, int64, int64, int64)
1574 callvirt instance void class GI1`1<valuetype Point[]>::GF1<class A>(class GI2`1<!0>, int64, int64, int64)
1583 callvirt instance void class GI1`1<valuetype Point[]>::GF1<class A[]>(class GI2`1<!0>, int64, int64, int64)
1592 callvirt instance void class GI1`1<valuetype Point[]>::GF1<int64>(class GI2`1<!0>, int64, int64, int64)
1601 callvirt instance void class GI1`1<valuetype Point[]>::GF1<int64[]>(class GI2`1<!0>, int64, int64, int64)
1603 // test-split-suffix do not remove or edit this line
1605 ldsfld int64 C1::errors
1618 box [mscorlib]System.Int64
1619 call void [mscorlib]System.Console::WriteLine(string, object)
1622 call void [mscorlib]System.Environment::Exit(int32)