1# Copyright (c) 2021-2022 Huawei Device Co., Ltd. 2# Licensed under the Apache License, Version 2.0 (the "License"); 3# you may not use this file except in compliance with the License. 4# You may obtain a copy of the License at 5# 6# http://www.apache.org/licenses/LICENSE-2.0 7# 8# Unless required by applicable law or agreed to in writing, software 9# distributed under the License is distributed on an "AS IS" BASIS, 10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11# See the License for the specific language governing permissions and 12# limitations under the License. 13 14definitions: 15 - name: PandaAssembly 16 template: | 17 .language PandaAssembly 18 .record R {} 19 .record E <panda.extends=R> {} 20 .record A <panda.annotation, panda.annotation.type=runtime> {} 21 .record panda.String <external> 22 .record panda.Class <external> 23 .record panda.Object <external> 24 - name: pandasm 25 template: | 26 .record R {} 27 .record panda.String <external> 28 .record panda.Class <external> 29 .record panda.Object <external> 30 31tests: 32 - file-name: "newobj" 33 isa: 34 title: Create new object 35 description: | 36 Resolve class type from type_id, allocate memory for an object, initialize its fields with their 37 default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created 38 object into register. The object should be initialized by calling initialization method before 39 further usage. 40 instructions: 41 - sig: newobj v:out:ref, type_id 42 acc: none 43 format: [op_v_8_id_16] 44 commands: 45 46 47 - file-name: "invalid_reg" 48 isa: 49 instructions: 50 - sig: newobj v:out:ref, type_id 51 acc: none 52 format: [op_v_8_id_16] 53 runner-options: [compile-failure] 54 description: Check 'newobj' instruction with invalid register. 55 header-template: [] 56 code-template: | 57 .record A {} 58 59 .function i32 main() { 60 newobj %s 61 check-type: exit-positive 62 cases: 63 - values: ['v255, A'] 64 runner-options: ['compile-only'] 65 - values: [''] 66 - values: ['A'] 67 - values: ['v256, A'] 68 - values: ['v65535, A'] 69 - values: ['v32767, A'] 70 - values: ['a0, A'] 71 - values: ['V0, A'] 72 - values: ['A, A'] 73 - values: ['}, A'] 74 - values: ['v0, v0'] 75 76 77 - file-name: "invalid_type" 78 isa: 79 verification: 80 - type_id_object 81 runner-options: [compile-failure] 82 description: Check 'newobj' instruction with invalid type id. 83 header-template: [] 84 code-template: | 85 .record A { 86 i32 f32 87 A fA 88 i32[] f32Array 89 A[] fAArray 90 } 91 .function void aFunc(A a0) { 92 return.void 93 } 94 .function void bFunc() <static> { 95 return.void 96 } 97 .function i32 main() { 98 begin: 99 newobj v0, %s 100 end: 101 check-type: exit-positive 102 cases: 103 - values: 104 - "" 105 - values: 106 - "label:" 107 - values: 108 - "begin" 109 - values: 110 - "{}" 111 - values: 112 - "}" 113 - values: 114 - "# comment" 115 - values: 116 - "null" 117 - values: 118 - "0" 119 - values: 120 - "v0" 121 - values: 122 - "i32" 123 - values: 124 - '"A"' 125 - values: 126 - "A.f32" 127 - values: 128 - "A.fA" 129 - values: 130 - "A.f32Array" 131 - values: 132 - "A.fAArray" 133 - values: 134 - "panda.Object[]" 135 - values: 136 - "aFunc" 137 - values: 138 - "A.aFunc" 139 - values: 140 - "bFunc" 141 - values: 142 - "main" 143 - values: 144 - "panda" 145 - values: 146 - "Object" 147 148 - file-name: "valid_type_p" 149 isa: 150 verification: 151 - type_id_object 152 runner-options: ['verifier-only', 'verifier-config'] 153 tags: [verifier] 154 description: Check 'newobj' instruction with valid type id in PandaAssembly context. 155 header-template: [pandasm, main] 156 code-template: | 157 # 158 newobj v0, %s 159 check-type: exit-positive 160 cases: 161 - values: 162 - R 163 - values: 164 - panda.Class 165 - values: 166 - panda.Object 167 - values: 168 - panda.String 169 tags: ["tsan"] 170 171 - file-name: "valid_type_j" 172 isa: 173 verification: 174 - type_id_object 175 runner-options: [verifier-only, use-pa, verifier-config] 176 tags: [verifier, pa-verifier] 177 description: Check 'newobj' instruction with valid type id in PandaAssembly context. 178 header-template: [PandaAssembly, main] 179 bugid: ["3574"] 180 code-template: | 181 # 182 newobj v0, %s 183 check-type: exit-positive 184 cases: 185 - values: 186 - R 187 - values: 188 - E 189 - values: 190 - A 191 - values: 192 - panda.Object 193 - values: 194 - panda.String 195 196 - file-name: "valid_instance_p" 197 isa: 198 description: | 199 Resolve class type from type_id, allocate memory for an object, initialize its fields with their 200 default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created 201 object into register. 202 description: Check type of object created by 'newobj' instruction with valid type in PandaAssembly context. 203 header-template: [pandasm, main] 204 code-template: | 205 # 206 lda.null 207 newobj v1, %s 208 lda.obj v1 209 isinstance %s 210 jeqz set_failure 211 lda.obj v1 212 isinstance panda.Object 213 jeqz set_failure 214 ldai 0 215 return 216 set_failure: 217 ldai 1 218 return 219 check-type: none 220 cases: 221 - values: 222 - R 223 - R 224 - values: 225 - panda.String 226 - panda.String 227 - values: 228 - panda.Class 229 - panda.Class 230 bugid: ["3540"] 231 ignore: true 232 - values: 233 - panda.Object 234 - panda.Object 235 tags: ["tsan"] 236 237 - file-name: "valid_instance_j" 238 isa: 239 description: | 240 Resolve class type from type_id, allocate memory for an object, initialize its fields with their 241 default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created 242 object into register. 243 description: Check type of object created by 'newobj' instruction with valid type in PandaAssembly context. 244 runner-options: [use-pa] 245 header-template: [PandaAssembly, main] 246 code-template: | 247 # 248 lda.null 249 newobj v1, %s 250 lda.obj v1 251 isinstance %s 252 jeqz set_failure 253 lda.obj v1 254 isinstance panda.Object 255 jeqz set_failure 256 ldai 0 257 return 258 set_failure: 259 ldai 1 260 return 261 check-type: none 262 cases: 263 - values: 264 - R 265 - R 266 - values: 267 - E 268 - E 269 - values: 270 - A 271 - A 272 - values: 273 - panda.String 274 - panda.String 275 tags: ["tsan"] 276 - values: 277 - panda.Object 278 - panda.Object 279 280 - file-name: "obj_ne_p" 281 isa: 282 description: | 283 Resolve class type from type_id, allocate memory for an object, initialize its fields with their 284 default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created 285 object into register. 286 description: Check that two objects created by 'newobj' instructions are different in PandaAssembly context. 287 header-template: [pandasm, main] 288 code-template: | 289 # 290 newobj v1, %s 291 lda.null 292 newobj v0, %s 293 lda.obj v0 294 jne.obj v1, ok 295 ldai 1 296 return 297 ok: 298 check-type: exit-positive 299 cases: 300 - values: 301 - R 302 - R 303 - values: 304 - R 305 - panda.Object 306 - values: 307 - R 308 - panda.String 309 - values: 310 - R 311 - panda.Class 312 bugid: ["3540"] 313 ignore: true 314 - values: 315 - panda.Object 316 - panda.Object 317 tags: ["tsan"] 318 - values: 319 - panda.Object 320 - panda.String 321 tags: ["tsan"] 322 - values: 323 - panda.Object 324 - panda.Class 325 bugid: ["3540"] 326 ignore: true 327 - values: 328 - panda.String 329 - panda.String 330 - values: 331 - panda.String 332 - panda.Class 333 bugid: ["3540"] 334 ignore: true 335 - values: 336 - panda.Class 337 - panda.Class 338 bugid: ["3540"] 339 ignore: true 340 341 - file-name: "obj_ne_j" 342 isa: 343 description: | 344 Resolve class type from type_id, allocate memory for an object, initialize its fields with their 345 default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created 346 object into register. 347 description: Check that two objects created by 'newobj' instructions are different in PandaAssembly context. 348 header-template: [PandaAssembly, main] 349 runner-options: [use-pa] 350 code-template: | 351 # 352 newobj v1, %s 353 lda.null 354 newobj v0, %s 355 lda.obj v0 356 jne.obj v1, ok 357 ldai 1 358 return 359 ok: 360 check-type: exit-positive 361 cases: 362 - values: 363 - R 364 - R 365 - values: 366 - R 367 - E 368 - values: 369 - R 370 - A 371 - values: 372 - R 373 - panda.Object 374 - values: 375 - R 376 - panda.String 377 - values: 378 - E 379 - E 380 - values: 381 - E 382 - A 383 - values: 384 - E 385 - panda.Object 386 - values: 387 - E 388 - panda.String 389 - values: 390 - A 391 - A 392 - values: 393 - A 394 - panda.Object 395 - values: 396 - A 397 - panda.String 398 - values: 399 - panda.Object 400 - panda.Object 401 tags: ["tsan"] 402 - values: 403 - panda.Object 404 - panda.String 405 - values: 406 - panda.String 407 - panda.String 408 409 - file-name: "init_p" 410 isa: 411 description: | 412 Resolve class type from type_id, allocate memory for an object, initialize its fields with their 413 default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created 414 object into register. 415 description: Check that objects fields are properly initialized in PandaAssembly context. 416 header-template: [pandasm] 417 tags: ['tsan', 'irtoc_ignore'] 418 code-template: | 419 .record Z { 420 u1 fu1 421 u8 fu8 422 i8 fi8 423 u16 fu16 424 i16 fi16 425 u32 fu32 426 i32 fi32 427 u64 fu64 428 i64 fi64 429 f32 ff32 430 f64 ff64 431 432 u1[] fu1a 433 u8[] fu8a 434 i8[] fi8a 435 u16[] fu16a 436 i16[] fi16a 437 u32[] fu32a 438 i32[] fi32a 439 u64[] fu64a 440 i64[] fi64a 441 f32[] ff32a 442 f64[] ff64a 443 444 u1[][] fu1aa 445 u8[][] fu8aa 446 i8[][] fi8aa 447 u16[][] fu16aa 448 i16[][] fi16aa 449 u32[][] fu32aa 450 i32[][] fi32aa 451 u64[][] fu64aa 452 i64[][] fi64aa 453 f32[][] ff32aa 454 f64[][] ff64aa 455 456 R fR 457 R[] fRa 458 R[][] fRaa 459 460 panda.Object fO 461 panda.Object[] fOa 462 panda.Object[][] fOaa 463 464 panda.String fS 465 panda.String[] fSa 466 panda.String[][] fSaa 467 468 panda.Class fC 469 panda.Class[] fCa 470 panda.Class[][] fCaa 471 } 472 473 .function i32 main() { 474 newobj v1, Z 475 label_u1: 476 ldai 111 477 ldobj v1, Z.fu1 478 jeqz label_u8 479 ldai 1 480 return 481 label_u8: 482 ldai 111 483 ldobj v1, Z.fu8 484 jeqz label_i8 485 ldai 2 486 return 487 label_i8: 488 ldai 111 489 ldobj v1, Z.fi8 490 jeqz label_u16 491 ldai 3 492 return 493 label_u16: 494 ldai 111 495 ldobj v1, Z.fu16 496 jeqz label_i16 497 ldai 4 498 return 499 label_i16: 500 ldai 111 501 ldobj v1, Z.fi16 502 jeqz label_u32 503 ldai 5 504 return 505 label_u32: 506 ldai 111 507 ldobj v1, Z.fu32 508 jeqz label_i32 509 ldai 6 510 return 511 label_i32: 512 ldai 111 513 ldobj v1, Z.fi32 514 jeqz label_u64 515 ldai 7 516 return 517 label_u64: 518 ldai 111 519 ldobj.64 v1, Z.fu64 520 movi.64 v2, 0 521 ucmp.64 v2 522 jeqz label_i64 523 ldai 8 524 return 525 label_i64: 526 ldai 111 527 ldobj.64 v1, Z.fi64 528 movi.64 v2, 0 529 cmp.64 v2 530 jeqz label_f32 531 ldai 9 532 return 533 label_f32: 534 ldai 111 535 ldobj v1, Z.ff32 536 fmovi v2, 0.0 537 fcmpg v2 538 jeqz label_f64 539 ldai 10 540 return 541 label_f64: 542 ldai 111 543 ldobj.64 v1, Z.ff64 544 fmovi.64 v2, 0.0 545 fcmpg.64 v2 546 jeqz label_R 547 ldai 11 548 return 549 label_R: 550 ldai 111 551 ldobj.obj v1, Z.fR 552 jeqz.obj label_Ra 553 ldai 12 554 return 555 label_Ra: 556 ldai 111 557 ldobj.obj v1, Z.fRa 558 jeqz.obj label_Raa 559 ldai 13 560 return 561 label_Raa: 562 ldai 111 563 ldobj.obj v1, Z.fRaa 564 jeqz.obj label_O 565 ldai 14 566 return 567 label_O: 568 ldai 111 569 ldobj.obj v1, Z.fO 570 jeqz.obj label_Oa 571 ldai 15 572 return 573 label_Oa: 574 ldai 111 575 ldobj.obj v1, Z.fOa 576 jeqz.obj label_Oaa 577 ldai 16 578 return 579 label_Oaa: 580 ldai 111 581 ldobj.obj v1, Z.fOaa 582 jeqz.obj label_S 583 ldai 17 584 return 585 label_S: 586 ldai 111 587 ldobj.obj v1, Z.fS 588 jeqz.obj label_Sa 589 ldai 18 590 return 591 label_Sa: 592 ldai 111 593 ldobj.obj v1, Z.fSa 594 jeqz.obj label_Saa 595 ldai 19 596 return 597 label_Saa: 598 ldai 111 599 ldobj.obj v1, Z.fSaa 600 jeqz.obj label_C 601 ldai 20 602 return 603 label_C: 604 ldai 111 605 ldobj.obj v1, Z.fC 606 jeqz.obj label_Ca 607 ldai 21 608 return 609 label_Ca: 610 ldai 111 611 ldobj.obj v1, Z.fCa 612 jeqz.obj label_Caa 613 ldai 22 614 return 615 label_Caa: 616 ldai 111 617 ldobj.obj v1, Z.fCaa 618 jeqz.obj label_u1a 619 ldai 23 620 return 621 label_u1a: 622 ldai 111 623 ldobj.obj v1, Z.fu1a 624 jeqz.obj label_u8a 625 ldai 24 626 return 627 label_u8a: 628 ldai 111 629 ldobj.obj v1, Z.fu8a 630 jeqz.obj label_i8a 631 ldai 25 632 return 633 label_i8a: 634 ldai 111 635 ldobj.obj v1, Z.fi8a 636 jeqz.obj label_u16a 637 ldai 26 638 return 639 label_u16a: 640 ldai 111 641 ldobj.obj v1, Z.fu16a 642 jeqz.obj label_i16a 643 ldai 27 644 return 645 label_i16a: 646 ldai 111 647 ldobj.obj v1, Z.fi16a 648 jeqz.obj label_u32a 649 ldai 28 650 return 651 label_u32a: 652 ldai 111 653 ldobj.obj v1, Z.fu32a 654 jeqz.obj label_i32a 655 ldai 29 656 return 657 label_i32a: 658 ldai 111 659 ldobj.obj v1, Z.fi32a 660 jeqz.obj label_u64a 661 ldai 30 662 return 663 label_u64a: 664 ldai 111 665 ldobj.obj v1, Z.fu64a 666 jeqz.obj label_i64a 667 ldai 31 668 return 669 label_i64a: 670 ldai 111 671 ldobj.obj v1, Z.fi64a 672 jeqz.obj label_f32a 673 ldai 32 674 return 675 label_f32a: 676 ldai 111 677 ldobj.obj v1, Z.ff32a 678 jeqz.obj label_f64a 679 ldai 33 680 return 681 label_f64a: 682 ldai 111 683 ldobj.obj v1, Z.ff64a 684 jeqz.obj label_u1aa 685 ldai 34 686 return 687 label_u1aa: 688 ldai 111 689 ldobj.obj v1, Z.fu1aa 690 jeqz.obj label_u8aa 691 ldai 35 692 return 693 label_u8aa: 694 ldai 111 695 ldobj.obj v1, Z.fu8aa 696 jeqz.obj label_i8aa 697 ldai 36 698 return 699 label_i8aa: 700 ldai 111 701 ldobj.obj v1, Z.fi8aa 702 jeqz.obj label_u16aa 703 ldai 37 704 return 705 label_u16aa: 706 ldai 111 707 ldobj.obj v1, Z.fu16aa 708 jeqz.obj label_i16aa 709 ldai 38 710 return 711 label_i16aa: 712 ldai 111 713 ldobj.obj v1, Z.fi16aa 714 jeqz.obj label_u32aa 715 ldai 39 716 return 717 label_u32aa: 718 ldai 111 719 ldobj.obj v1, Z.fu32aa 720 jeqz.obj label_i32aa 721 ldai 40 722 return 723 label_i32aa: 724 ldai 111 725 ldobj.obj v1, Z.fi32aa 726 jeqz.obj label_u64aa 727 ldai 41 728 return 729 label_u64aa: 730 ldai 111 731 ldobj.obj v1, Z.fu64aa 732 jeqz.obj label_i64aa 733 ldai 42 734 return 735 label_i64aa: 736 ldai 111 737 ldobj.obj v1, Z.fi64aa 738 jeqz.obj label_f32aa 739 ldai 43 740 return 741 label_f32aa: 742 ldai 111 743 ldobj.obj v1, Z.ff32aa 744 jeqz.obj label_f64aa 745 ldai 44 746 return 747 label_f64aa: 748 ldai 111 749 ldobj.obj v1, Z.ff64aa 750 jeqz.obj ok 751 ldai 45 752 return 753 ok: 754 check-type: exit-positive 755 756 - file-name: "init_j" 757 isa: 758 description: | 759 Resolve class type from type_id, allocate memory for an object, initialize its fields with their 760 default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created 761 object into register. 762 description: Check that objects fields are properly initialized in PandaAssembly context. 763 runner-options: [use-pa] 764 tags: ['tsan', 'irtoc_ignore'] 765 header-template: [PandaAssembly] 766 code-template: | 767 .record Z { 768 u1 fu1 769 i8 fi8 770 u16 fu16 771 i16 fi16 772 i32 fi32 773 i64 fi64 774 f32 ff32 775 f64 ff64 776 777 u1[] fu1a 778 i8[] fi8a 779 u16[] fu16a 780 i16[] fi16a 781 i32[] fi32a 782 i64[] fi64a 783 f32[] ff32a 784 f64[] ff64a 785 786 u1[][] fu1aa 787 i8[][] fi8aa 788 u16[][] fu16aa 789 i16[][] fi16aa 790 i32[][] fi32aa 791 i64[][] fi64aa 792 f32[][] ff32aa 793 f64[][] ff64aa 794 795 R fR 796 R[] fRa 797 R[][] fRaa 798 799 panda.Object fO 800 panda.Object[] fOa 801 panda.Object[][] fOaa 802 803 panda.String fS 804 panda.String[] fSa 805 panda.String[][] fSaa 806 807 panda.Class fC 808 panda.Class[] fCa 809 panda.Class[][] fCaa 810 } 811 812 .function i32 main() { 813 newobj v1, Z 814 label_u1: 815 ldai 111 816 ldobj v1, Z.fu1 817 jeqz label_i8 818 ldai 1 819 return 820 label_i8: 821 ldai 111 822 ldobj v1, Z.fi8 823 jeqz label_u16 824 ldai 3 825 return 826 label_u16: 827 ldai 111 828 ldobj v1, Z.fu16 829 jeqz label_i16 830 ldai 4 831 return 832 label_i16: 833 ldai 111 834 ldobj v1, Z.fi16 835 jeqz label_i32 836 ldai 5 837 return 838 label_i32: 839 ldai 111 840 ldobj v1, Z.fi32 841 jeqz label_i64 842 ldai 7 843 return 844 label_i64: 845 ldai 111 846 ldobj.64 v1, Z.fi64 847 movi.64 v2, 0 848 cmp.64 v2 849 jeqz label_f32 850 ldai 9 851 return 852 label_f32: 853 ldai 111 854 ldobj v1, Z.ff32 855 fmovi v2, 0.0 856 fcmpg v2 857 jeqz label_f64 858 ldai 10 859 return 860 label_f64: 861 ldai 111 862 ldobj.64 v1, Z.ff64 863 fmovi.64 v2, 0.0 864 fcmpg.64 v2 865 jeqz label_R 866 ldai 11 867 return 868 label_R: 869 ldai 111 870 ldobj.obj v1, Z.fR 871 jeqz.obj label_Ra 872 ldai 12 873 return 874 label_Ra: 875 ldai 111 876 ldobj.obj v1, Z.fRa 877 jeqz.obj label_Raa 878 ldai 13 879 return 880 label_Raa: 881 ldai 111 882 ldobj.obj v1, Z.fRaa 883 jeqz.obj label_O 884 ldai 14 885 return 886 label_O: 887 ldai 111 888 ldobj.obj v1, Z.fO 889 jeqz.obj label_Oa 890 ldai 15 891 return 892 label_Oa: 893 ldai 111 894 ldobj.obj v1, Z.fOa 895 jeqz.obj label_Oaa 896 ldai 16 897 return 898 label_Oaa: 899 ldai 111 900 ldobj.obj v1, Z.fOaa 901 jeqz.obj label_S 902 ldai 17 903 return 904 label_S: 905 ldai 111 906 ldobj.obj v1, Z.fS 907 jeqz.obj label_Sa 908 ldai 18 909 return 910 label_Sa: 911 ldai 111 912 ldobj.obj v1, Z.fSa 913 jeqz.obj label_Saa 914 ldai 19 915 return 916 label_Saa: 917 ldai 111 918 ldobj.obj v1, Z.fSaa 919 jeqz.obj label_C 920 ldai 20 921 return 922 label_C: 923 ldai 111 924 ldobj.obj v1, Z.fC 925 jeqz.obj label_Ca 926 ldai 21 927 return 928 label_Ca: 929 ldai 111 930 ldobj.obj v1, Z.fCa 931 jeqz.obj label_Caa 932 ldai 22 933 return 934 label_Caa: 935 ldai 111 936 ldobj.obj v1, Z.fCaa 937 jeqz.obj label_u1a 938 ldai 23 939 return 940 label_u1a: 941 ldai 111 942 ldobj.obj v1, Z.fu1a 943 jeqz.obj label_i8a 944 ldai 24 945 return 946 label_i8a: 947 ldai 111 948 ldobj.obj v1, Z.fi8a 949 jeqz.obj label_u16a 950 ldai 26 951 return 952 label_u16a: 953 ldai 111 954 ldobj.obj v1, Z.fu16a 955 jeqz.obj label_i16a 956 ldai 27 957 return 958 label_i16a: 959 ldai 111 960 ldobj.obj v1, Z.fi16a 961 jeqz.obj label_i32a 962 ldai 28 963 return 964 label_i32a: 965 ldai 111 966 ldobj.obj v1, Z.fi32a 967 jeqz.obj label_i64a 968 ldai 30 969 return 970 label_i64a: 971 ldai 111 972 ldobj.obj v1, Z.fi64a 973 jeqz.obj label_f32a 974 ldai 32 975 return 976 label_f32a: 977 ldai 111 978 ldobj.obj v1, Z.ff32a 979 jeqz.obj label_f64a 980 ldai 33 981 return 982 label_f64a: 983 ldai 111 984 ldobj.obj v1, Z.ff64a 985 jeqz.obj label_u1aa 986 ldai 34 987 return 988 label_u1aa: 989 ldai 111 990 ldobj.obj v1, Z.fu1aa 991 jeqz.obj label_i8aa 992 ldai 35 993 return 994 label_i8aa: 995 ldai 111 996 ldobj.obj v1, Z.fi8aa 997 jeqz.obj label_u16aa 998 ldai 37 999 return 1000 label_u16aa: 1001 ldai 111 1002 ldobj.obj v1, Z.fu16aa 1003 jeqz.obj label_i16aa 1004 ldai 38 1005 return 1006 label_i16aa: 1007 ldai 111 1008 ldobj.obj v1, Z.fi16aa 1009 jeqz.obj label_i32aa 1010 ldai 39 1011 return 1012 label_i32aa: 1013 ldai 111 1014 ldobj.obj v1, Z.fi32aa 1015 jeqz.obj label_i64aa 1016 ldai 41 1017 return 1018 label_i64aa: 1019 ldai 111 1020 ldobj.obj v1, Z.fi64aa 1021 jeqz.obj label_f32aa 1022 ldai 43 1023 return 1024 label_f32aa: 1025 ldai 111 1026 ldobj.obj v1, Z.ff32aa 1027 jeqz.obj label_f64aa 1028 ldai 44 1029 return 1030 label_f64aa: 1031 ldai 111 1032 ldobj.obj v1, Z.ff64aa 1033 jeqz.obj ok 1034 ldai 45 1035 return 1036 ok: 1037 check-type: exit-positive 1038 1039 - file-name: "oome_p" 1040 isa: 1041 exceptions: 1042 - x_oom 1043 description: Create objects with newobj instruction until OutOfMemoryError in PandaAssembly context 1044 header-template: [] 1045 tags: ['irtoc_ignore'] 1046 panda-options: "--heap-size-limit=67108864" 1047 bugid: ["3578", "4170", "4171"] 1048 code-template: | 1049 .record panda.OutOfMemoryError <external> 1050 .record Z { 1051 %s 1052 } 1053 .function i32 main() { 1054 movi v7, 50000 # array size 1055 newarr v6, v7, Z[] # array ref 1056 movi v1, 0 # index 1057 begin: 1058 newobj v0, Z 1059 lda.obj v0 1060 starr.obj v6, v1 1061 inci v1, 1 1062 lda v1 1063 jlt v7, begin 1064 end: 1065 ldai 1 # Should not reach this line 1066 return 1067 1068 catch_OOME: 1069 ldai 0 # Expected panda.OutOfMemoryError 1070 return 1071 1072 catch_all: 1073 ldai 2 # Unexpected exception, test failed 1074 return 1075 1076 .catch panda.OutOfMemoryError, begin, end, catch_OOME 1077 .catchall begin, end, catch_all 1078 check-type: none 1079 cases: 1080 - values: 1081 - "#{[*1..500].map do |i| \" f64 f#{i}\\n\" end .join}" 1082 tags: ["tsan"] 1083 1084 - file-name: "oome_j" 1085 isa: 1086 exceptions: 1087 - x_oom 1088 description: Create objects with newobj instruction until OutOfMemoryError in PandaAssembly context 1089 header-template: [] 1090 tags: ['irtoc_ignore'] 1091 panda-options: "--heap-size-limit=67108864" 1092 bugid: ['3578', '4171', '6147'] 1093 runner-options: [use-pa] 1094 code-template: | 1095 .language PandaAssembly 1096 .record panda.OutOfMemoryError <external> 1097 .record Z { 1098 %s 1099 } 1100 .function i32 main() { 1101 movi v7, 50000 # array size 1102 newarr v6, v7, Z[] # array ref 1103 movi v1, 0 # index 1104 begin: 1105 newobj v0, Z 1106 lda.obj v0 1107 starr.obj v6, v1 1108 inci v1, 1 1109 lda v1 1110 jlt v7, begin 1111 end: 1112 ldai 1 # Should not reach this line 1113 return 1114 1115 catch_OOME: 1116 ldai 0 # Expected panda.OutOfMemoryError 1117 return 1118 1119 catch_all: 1120 ldai 2 # Unexpected exception, test failed 1121 return 1122 1123 .catch panda.OutOfMemoryError, begin, end, catch_OOME 1124 .catchall begin, end, catch_all 1125 check-type: none 1126 cases: 1127 - values: 1128 - "#{[*1..500].map do |i| \" f64 f#{i}\\n\" end .join}" 1129 1130 - file-name: "ctor_p" 1131 isa: 1132 description: | 1133 Resolve class type from type_id, allocate memory for an object, initialize its fields with their 1134 default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created 1135 object into register. The object should be initialized by calling initialization method before 1136 further usage. 1137 description: Check that ctor is not called in PandaAssembly context. 1138 header-template: [] 1139 tags: ["tsan"] 1140 code-template: | 1141 .record Z {} 1142 .function void Z.ctor(Z a0) <ctor> { 1143 ldai 42 1144 ststatic Y.ctor_called 1145 return.void 1146 } 1147 .function void Z.cctor() <cctor> { 1148 ldai 42 1149 ststatic Y.cctor_called 1150 return.void 1151 } 1152 .record Y { 1153 i32 ctor_called <static> 1154 i32 cctor_called <static> 1155 } 1156 .function i32 main() { 1157 movi v1, 42 1158 ldstatic Y.cctor_called 1159 jnez exit_failure # Z.cctor must not be called yet 1160 ldstatic Y.ctor_called 1161 jnez exit_failure # Z.ctor must not be called 1162 newobj v0, Z 1163 ldstatic Y.cctor_called 1164 jne v1, exit_failure # Z.cctor must be called 1165 ldstatic Y.ctor_called 1166 jnez exit_failure # Z.ctor must not be called 1167 ldai 0 1168 return 1169 exit_failure: 1170 ldai 1 1171 return 1172 check-type: none 1173 1174 - file-name: "ctor_j" 1175 isa: 1176 description: | 1177 Resolve class type from type_id, allocate memory for an object, initialize its fields with their 1178 default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created 1179 object into register. The object should be initialized by calling initialization method before 1180 further usage. 1181 description: Check that ctor is not called in PandaAssembly context. 1182 header-template: [] 1183 runner-options: [use-pa] 1184 tags: ['tsan'] 1185 code-template: | 1186 .language PandaAssembly 1187 .record Z {} 1188 .function void Z.ctor(Z a0) <ctor> { 1189 ldai 42 1190 ststatic Y.ctor_called 1191 return.void 1192 } 1193 .function void Z.cctor() <cctor> { 1194 ldai 42 1195 ststatic Y.cctor_called 1196 return.void 1197 } 1198 .record Y { 1199 i32 ctor_called <static> 1200 i32 cctor_called <static> 1201 } 1202 .function i32 main() { 1203 movi v1, 42 1204 ldstatic Y.cctor_called 1205 jnez exit_failure # Z.cctor must not be called yet 1206 ldstatic Y.ctor_called 1207 jnez exit_failure # Z.ctor must not be called 1208 newobj v0, Z 1209 ldstatic Y.cctor_called 1210 jne v1, exit_failure # Z.cctor must be called 1211 ldstatic Y.ctor_called 1212 jnez exit_failure # Z.ctor must not be called 1213 ldai 0 1214 return 1215 exit_failure: 1216 ldai 1 1217 return 1218 check-type: none 1219