Skip to content

Commit b2e0d59

Browse files
committed
Refactor CIL instruction hierarchy for clarity
Introduced abstract base classes for indirect load/store, field load/store, element load/store, and conversion instructions to better organize and clarify the CIL instruction hierarchy. Updated relevant instruction classes to inherit from these new abstractions.
1 parent 3a1a052 commit b2e0d59

1 file changed

Lines changed: 106 additions & 79 deletions

File tree

binary/ql/lib/semmle/code/binary/ast/internal/CilInstructions.qll

Lines changed: 106 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -407,41 +407,47 @@ class CilBlt_un extends @il_blt_un, CilRelationalBranchInstruction { }
407407

408408
class CilSwitch extends @il_switch, CilInstruction { }
409409

410-
class CilLdind_I1 extends @il_ldind_I1, CilInstruction { }
410+
/** An instruction that loads a value indirectly through a pointer. */
411+
abstract class CilLoadIndirectInstruction extends CilInstruction { }
411412

412-
class CilLdind_U1 extends @il_ldind_U1, CilInstruction { }
413+
class CilLdind_I1 extends @il_ldind_I1, CilLoadIndirectInstruction { }
413414

414-
class CilLdind_I2 extends @il_ldind_I2, CilInstruction { }
415+
class CilLdind_U1 extends @il_ldind_U1, CilLoadIndirectInstruction { }
415416

416-
class CilLdind_U2 extends @il_ldind_U2, CilInstruction { }
417+
class CilLdind_I2 extends @il_ldind_I2, CilLoadIndirectInstruction { }
417418

418-
class CilLdind_I4 extends @il_ldind_I4, CilInstruction { }
419+
class CilLdind_U2 extends @il_ldind_U2, CilLoadIndirectInstruction { }
419420

420-
class CilLdind_U4 extends @il_ldind_U4, CilInstruction { }
421+
class CilLdind_I4 extends @il_ldind_I4, CilLoadIndirectInstruction { }
421422

422-
class CilLdind_I8 extends @il_ldind_I8, CilInstruction { }
423+
class CilLdind_U4 extends @il_ldind_U4, CilLoadIndirectInstruction { }
423424

424-
class CilLdind_I extends @il_ldind_I, CilInstruction { }
425+
class CilLdind_I8 extends @il_ldind_I8, CilLoadIndirectInstruction { }
425426

426-
class CilLdind_R4 extends @il_ldind_R4, CilInstruction { }
427+
class CilLdind_I extends @il_ldind_I, CilLoadIndirectInstruction { }
427428

428-
class CilLdind_R8 extends @il_ldind_R8, CilInstruction { }
429+
class CilLdind_R4 extends @il_ldind_R4, CilLoadIndirectInstruction { }
429430

430-
class CilLdind_Ref extends @il_ldind_Ref, CilInstruction { }
431+
class CilLdind_R8 extends @il_ldind_R8, CilLoadIndirectInstruction { }
431432

432-
class CilStind_Ref extends @il_stind_Ref, CilInstruction { }
433+
class CilLdind_Ref extends @il_ldind_Ref, CilLoadIndirectInstruction { }
433434

434-
class CilStind_I1 extends @il_stind_I1, CilInstruction { }
435+
/** An instruction that stores a value indirectly through a pointer. */
436+
abstract class CilStoreIndirectInstruction extends CilInstruction { }
435437

436-
class CilStind_I2 extends @il_stind_I2, CilInstruction { }
438+
class CilStind_Ref extends @il_stind_Ref, CilStoreIndirectInstruction { }
437439

438-
class CilStind_I4 extends @il_stind_I4, CilInstruction { }
440+
class CilStind_I1 extends @il_stind_I1, CilStoreIndirectInstruction { }
439441

440-
class CilStind_I8 extends @il_stind_I8, CilInstruction { }
442+
class CilStind_I2 extends @il_stind_I2, CilStoreIndirectInstruction { }
441443

442-
class CilStind_R4 extends @il_stind_R4, CilInstruction { }
444+
class CilStind_I4 extends @il_stind_I4, CilStoreIndirectInstruction { }
443445

444-
class CilStind_R8 extends @il_stind_R8, CilInstruction { }
446+
class CilStind_I8 extends @il_stind_I8, CilStoreIndirectInstruction { }
447+
448+
class CilStind_R4 extends @il_stind_R4, CilStoreIndirectInstruction { }
449+
450+
class CilStind_R8 extends @il_stind_R8, CilStoreIndirectInstruction { }
445451

446452
abstract class CilBinaryInstruction extends CilInstruction { }
447453

@@ -490,21 +496,24 @@ class CilNeg extends @il_neg, CilUnaryInstruction { }
490496

491497
class CilNot extends @il_not, CilUnaryInstruction { }
492498

493-
class CilConv_I1 extends @il_conv_I1, CilUnaryInstruction { }
499+
/** An instruction that converts a value from one type to another. */
500+
abstract class CilConversionInstruction extends CilUnaryInstruction { }
494501

495-
class CilConv_I2 extends @il_conv_I2, CilUnaryInstruction { }
502+
class CilConv_I1 extends @il_conv_I1, CilConversionInstruction { }
496503

497-
class CilConv_I4 extends @il_conv_I4, CilUnaryInstruction { }
504+
class CilConv_I2 extends @il_conv_I2, CilConversionInstruction { }
498505

499-
class CilConv_I8 extends @il_conv_I8, CilUnaryInstruction { }
506+
class CilConv_I4 extends @il_conv_I4, CilConversionInstruction { }
500507

501-
class CilConv_R4 extends @il_conv_R4, CilUnaryInstruction { }
508+
class CilConv_I8 extends @il_conv_I8, CilConversionInstruction { }
502509

503-
class CilConv_R8 extends @il_conv_R8, CilUnaryInstruction { }
510+
class CilConv_R4 extends @il_conv_R4, CilConversionInstruction { }
504511

505-
class CilConv_U4 extends @il_conv_U4, CilUnaryInstruction { }
512+
class CilConv_R8 extends @il_conv_R8, CilConversionInstruction { }
506513

507-
class CilConv_U8 extends @il_conv_U8, CilUnaryInstruction { }
514+
class CilConv_U4 extends @il_conv_U4, CilConversionInstruction { }
515+
516+
class CilConv_U8 extends @il_conv_U8, CilConversionInstruction { }
508517

509518
class CilCallvirt extends @il_callvirt, CilCall { }
510519

@@ -522,45 +531,57 @@ class CilCastclass extends @il_castclass, CilInstruction { }
522531

523532
class CilIsinst extends @il_isinst, CilInstruction { }
524533

525-
class CilConv_R_Un extends @il_conv_R_Un, CilInstruction { }
534+
class CilConv_R_Un extends @il_conv_R_Un, CilConversionInstruction { }
526535

527536
class CilUnbox extends @il_unbox, CilInstruction { }
528537

529538
class CilThrow extends @il_throw, CilInstruction { }
530539

531-
class CilLdfld extends @il_ldfld, CilInstruction { }
540+
/** An instruction that loads a field value. */
541+
abstract class CilLoadFieldInstruction extends CilInstruction { }
542+
543+
/** An instruction that loads an instance field value. */
544+
class CilLdfld extends @il_ldfld, CilLoadFieldInstruction { }
532545

533-
class CilLdflda extends @il_ldflda, CilInstruction { }
546+
/** An instruction that loads the address of an instance field. */
547+
class CilLdflda extends @il_ldflda, CilLoadFieldInstruction { }
534548

535-
class CilStfld extends @il_stfld, CilInstruction { }
549+
/** An instruction that loads a static field value. */
550+
class CilLdsfld extends @il_ldsfld, CilLoadFieldInstruction { }
536551

537-
class CilLdsfld extends @il_ldsfld, CilInstruction { }
552+
/** An instruction that loads the address of a static field. */
553+
class CilLdsflda extends @il_ldsflda, CilLoadFieldInstruction { }
538554

539-
class CilLdsflda extends @il_ldsflda, CilInstruction { }
555+
/** An instruction that stores a value to a field. */
556+
abstract class CilStoreFieldInstruction extends CilInstruction { }
540557

541-
class CilStsfld extends @il_stsfld, CilInstruction { }
558+
/** An instruction that stores a value to an instance field. */
559+
class CilStfld extends @il_stfld, CilStoreFieldInstruction { }
560+
561+
/** An instruction that stores a value to a static field. */
562+
class CilStsfld extends @il_stsfld, CilStoreFieldInstruction { }
542563

543564
class CilStobj extends @il_stobj, CilInstruction { }
544565

545-
class CilConv_ovf_I1_Un extends @il_conv_ovf_I1_Un, CilInstruction { }
566+
class CilConv_ovf_I1_Un extends @il_conv_ovf_I1_Un, CilConversionInstruction { }
546567

547-
class CilConv_ovf_I2_Un extends @il_conv_ovf_I2_Un, CilInstruction { }
568+
class CilConv_ovf_I2_Un extends @il_conv_ovf_I2_Un, CilConversionInstruction { }
548569

549-
class CilConv_ovf_I4_Un extends @il_conv_ovf_I4_Un, CilInstruction { }
570+
class CilConv_ovf_I4_Un extends @il_conv_ovf_I4_Un, CilConversionInstruction { }
550571

551-
class CilConv_ovf_I8_Un extends @il_conv_ovf_I8_Un, CilInstruction { }
572+
class CilConv_ovf_I8_Un extends @il_conv_ovf_I8_Un, CilConversionInstruction { }
552573

553-
class CilConv_ovf_U1_Un extends @il_conv_ovf_U1_Un, CilInstruction { }
574+
class CilConv_ovf_U1_Un extends @il_conv_ovf_U1_Un, CilConversionInstruction { }
554575

555-
class CilConv_ovf_U2_Un extends @il_conv_ovf_U2_Un, CilInstruction { }
576+
class CilConv_ovf_U2_Un extends @il_conv_ovf_U2_Un, CilConversionInstruction { }
556577

557-
class CilConv_ovf_U4_Un extends @il_conv_ovf_U4_Un, CilInstruction { }
578+
class CilConv_ovf_U4_Un extends @il_conv_ovf_U4_Un, CilConversionInstruction { }
558579

559-
class CilConv_ovf_U8_Un extends @il_conv_ovf_U8_Un, CilInstruction { }
580+
class CilConv_ovf_U8_Un extends @il_conv_ovf_U8_Un, CilConversionInstruction { }
560581

561-
class CilConv_ovf_I_Un extends @il_conv_ovf_I_Un, CilInstruction { }
582+
class CilConv_ovf_I_Un extends @il_conv_ovf_I_Un, CilConversionInstruction { }
562583

563-
class CilConv_ovf_U_Un extends @il_conv_ovf_U_Un, CilInstruction { }
584+
class CilConv_ovf_U_Un extends @il_conv_ovf_U_Un, CilConversionInstruction { }
564585

565586
class CilBox extends @il_box, CilInstruction { }
566587

@@ -570,65 +591,71 @@ class CilLdlen extends @il_ldlen, CilInstruction { }
570591

571592
class CilLdelema extends @il_ldelema, CilInstruction { }
572593

573-
class CilLdelem_I1 extends @il_ldelem_I1, CilInstruction { }
594+
/** An instruction that loads an element from an array. */
595+
abstract class CilLoadElementInstruction extends CilInstruction { }
596+
597+
class CilLdelem_I1 extends @il_ldelem_I1, CilLoadElementInstruction { }
598+
599+
class CilLdelem_U1 extends @il_ldelem_U1, CilLoadElementInstruction { }
574600

575-
class CilLdelem_U1 extends @il_ldelem_U1, CilInstruction { }
601+
class CilLdelem_I2 extends @il_ldelem_I2, CilLoadElementInstruction { }
576602

577-
class CilLdelem_I2 extends @il_ldelem_I2, CilInstruction { }
603+
class CilLdelem_U2 extends @il_ldelem_U2, CilLoadElementInstruction { }
578604

579-
class CilLdelem_U2 extends @il_ldelem_U2, CilInstruction { }
605+
class CilLdelem_I4 extends @il_ldelem_I4, CilLoadElementInstruction { }
580606

581-
class CilLdelem_I4 extends @il_ldelem_I4, CilInstruction { }
607+
class CilLdelem_U4 extends @il_ldelem_U4, CilLoadElementInstruction { }
582608

583-
class CilLdelem_U4 extends @il_ldelem_U4, CilInstruction { }
609+
class CilLdelem_I8 extends @il_ldelem_I8, CilLoadElementInstruction { }
584610

585-
class CilLdelem_I8 extends @il_ldelem_I8, CilInstruction { }
611+
class CilLdelem_I extends @il_ldelem_I, CilLoadElementInstruction { }
586612

587-
class CilLdelem_I extends @il_ldelem_I, CilInstruction { }
613+
class CilLdelem_R4 extends @il_ldelem_R4, CilLoadElementInstruction { }
588614

589-
class CilLdelem_R4 extends @il_ldelem_R4, CilInstruction { }
615+
class CilLdelem_R8 extends @il_ldelem_R8, CilLoadElementInstruction { }
590616

591-
class CilLdelem_R8 extends @il_ldelem_R8, CilInstruction { }
617+
class CilLdelem_Ref extends @il_ldelem_Ref, CilLoadElementInstruction { }
592618

593-
class CilLdelem_Ref extends @il_ldelem_Ref, CilInstruction { }
619+
/** An instruction that stores an element to an array. */
620+
abstract class CilStoreElementInstruction extends CilInstruction { }
594621

595-
class CilStelem_I extends @il_stelem_I, CilInstruction { }
622+
class CilStelem_I extends @il_stelem_I, CilStoreElementInstruction { }
596623

597-
class CilStelem_I1 extends @il_stelem_I1, CilInstruction { }
624+
class CilStelem_I1 extends @il_stelem_I1, CilStoreElementInstruction { }
598625

599-
class CilStelem_I2 extends @il_stelem_I2, CilInstruction { }
626+
class CilStelem_I2 extends @il_stelem_I2, CilStoreElementInstruction { }
600627

601-
class CilStelem_I4 extends @il_stelem_I4, CilInstruction { }
628+
class CilStelem_I4 extends @il_stelem_I4, CilStoreElementInstruction { }
602629

603-
class CilStelem_I8 extends @il_stelem_I8, CilInstruction { }
630+
class CilStelem_I8 extends @il_stelem_I8, CilStoreElementInstruction { }
604631

605-
class CilStelem_R4 extends @il_stelem_R4, CilInstruction { }
632+
class CilStelem_R4 extends @il_stelem_R4, CilStoreElementInstruction { }
606633

607-
class CilStelem_R8 extends @il_stelem_R8, CilInstruction { }
634+
class CilStelem_R8 extends @il_stelem_R8, CilStoreElementInstruction { }
608635

609-
class CilStelem_Ref extends @il_stelem_Ref, CilInstruction { }
636+
class CilStelem_Ref extends @il_stelem_Ref, CilStoreElementInstruction { }
610637

611-
class CilLdelem extends @il_ldelem, CilInstruction { }
638+
class CilLdelem extends @il_ldelem, CilLoadElementInstruction { }
612639

613-
class CilStelem extends @il_stelem, CilInstruction { }
640+
class CilStelem extends @il_stelem, CilStoreElementInstruction { }
614641

615642
class CilUnbox_any extends @il_unbox_any, CilInstruction { }
616643

617-
class CilConv_ovf_I1 extends @il_conv_ovf_I1, CilInstruction { }
644+
class CilConv_ovf_I1 extends @il_conv_ovf_I1, CilConversionInstruction { }
618645

619-
class CilConv_ovf_U1 extends @il_conv_ovf_U1, CilInstruction { }
646+
class CilConv_ovf_U1 extends @il_conv_ovf_U1, CilConversionInstruction { }
620647

621-
class CilConv_ovf_I2 extends @il_conv_ovf_I2, CilInstruction { }
648+
class CilConv_ovf_I2 extends @il_conv_ovf_I2, CilConversionInstruction { }
622649

623-
class CilConv_ovf_U2 extends @il_conv_ovf_U2, CilInstruction { }
650+
class CilConv_ovf_U2 extends @il_conv_ovf_U2, CilConversionInstruction { }
624651

625-
class CilConv_ovf_I4 extends @il_conv_ovf_I4, CilInstruction { }
652+
class CilConv_ovf_I4 extends @il_conv_ovf_I4, CilConversionInstruction { }
626653

627-
class CilConv_ovf_U4 extends @il_conv_ovf_U4, CilInstruction { }
654+
class CilConv_ovf_U4 extends @il_conv_ovf_U4, CilConversionInstruction { }
628655

629-
class CilConv_ovf_I8 extends @il_conv_ovf_I8, CilInstruction { }
656+
class CilConv_ovf_I8 extends @il_conv_ovf_I8, CilConversionInstruction { }
630657

631-
class CilConv_ovf_U8 extends @il_conv_ovf_U8, CilInstruction { }
658+
class CilConv_ovf_U8 extends @il_conv_ovf_U8, CilConversionInstruction { }
632659

633660
class CilRefanyval extends @il_refanyval, CilInstruction { }
634661

@@ -638,15 +665,15 @@ class CilMkrefany extends @il_mkrefany, CilInstruction { }
638665

639666
class CilLdtoken extends @il_ldtoken, CilInstruction { }
640667

641-
class CilConv_U2 extends @il_conv_U2, CilInstruction { }
668+
class CilConv_U2 extends @il_conv_U2, CilConversionInstruction { }
642669

643-
class CilConv_U1 extends @il_conv_U1, CilInstruction { }
670+
class CilConv_U1 extends @il_conv_U1, CilConversionInstruction { }
644671

645-
class CilConv_I extends @il_conv_I, CilInstruction { }
672+
class CilConv_I extends @il_conv_I, CilConversionInstruction { }
646673

647-
class CilConv_ovf_I extends @il_conv_ovf_I, CilInstruction { }
674+
class CilConv_ovf_I extends @il_conv_ovf_I, CilConversionInstruction { }
648675

649-
class CilConv_ovf_U extends @il_conv_ovf_U, CilInstruction { }
676+
class CilConv_ovf_U extends @il_conv_ovf_U, CilConversionInstruction { }
650677

651678
class CilAdd_ovf extends @il_add_ovf, CilAddInstruction { }
652679

@@ -666,9 +693,9 @@ class CilLeave extends @il_leave, CilInstruction { }
666693

667694
class CilLeave_s extends @il_leave_s, CilInstruction { }
668695

669-
class CilStind_i extends @il_stind_i, CilInstruction { }
696+
class CilStind_i extends @il_stind_i, CilStoreIndirectInstruction { }
670697

671-
class CilConv_U extends @il_conv_U, CilInstruction { }
698+
class CilConv_U extends @il_conv_U, CilConversionInstruction { }
672699

673700
class CilPrefix7 extends @il_prefix7, CilInstruction { }
674701

0 commit comments

Comments
 (0)