Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

kconfig: add comments to expression transformations

Provide explanations for complex transformations.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

+37 -6
+37 -6
scripts/kconfig/expr.c
··· 442 442 } 443 443 } 444 444 if (sym1->type == S_BOOLEAN) { 445 + // a || !a -> y 445 446 if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) || 446 447 (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL)) 447 448 return expr_alloc_symbol(&symbol_yes); ··· 648 647 * Performs various simplifications involving logical operators and 649 648 * comparisons. 650 649 * 650 + * For bool type: 651 + * A=n -> !A 652 + * A=m -> n 653 + * A=y -> A 654 + * A!=n -> A 655 + * A!=m -> y 656 + * A!=y -> !A 657 + * 658 + * For any type: 659 + * !!A -> A 660 + * !(A=B) -> A!=B 661 + * !(A!=B) -> A=B 662 + * !(A<=B) -> A>B 663 + * !(A>=B) -> A<B 664 + * !(A<B) -> A>=B 665 + * !(A>B) -> A<=B 666 + * !(A || B) -> !A && !B 667 + * !(A && B) -> !A || !B 668 + * 669 + * For constant: 670 + * !y -> n 671 + * !m -> m 672 + * !n -> y 673 + * 651 674 * Allocates and returns a new expression. 652 675 */ 653 676 struct expr *expr_transform(struct expr *e) ··· 699 674 if (e->left.sym->type != S_BOOLEAN) 700 675 break; 701 676 if (e->right.sym == &symbol_no) { 677 + // A=n -> !A 702 678 e->type = E_NOT; 703 679 e->left.expr = expr_alloc_symbol(e->left.sym); 704 680 e->right.sym = NULL; 705 681 break; 706 682 } 707 683 if (e->right.sym == &symbol_mod) { 684 + // A=m -> n 708 685 printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name); 709 686 e->type = E_SYMBOL; 710 687 e->left.sym = &symbol_no; ··· 714 687 break; 715 688 } 716 689 if (e->right.sym == &symbol_yes) { 690 + // A=y -> A 717 691 e->type = E_SYMBOL; 718 692 e->right.sym = NULL; 719 693 break; ··· 724 696 if (e->left.sym->type != S_BOOLEAN) 725 697 break; 726 698 if (e->right.sym == &symbol_no) { 699 + // A!=n -> A 727 700 e->type = E_SYMBOL; 728 701 e->right.sym = NULL; 729 702 break; 730 703 } 731 704 if (e->right.sym == &symbol_mod) { 705 + // A!=m -> y 732 706 printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name); 733 707 e->type = E_SYMBOL; 734 708 e->left.sym = &symbol_yes; ··· 738 708 break; 739 709 } 740 710 if (e->right.sym == &symbol_yes) { 711 + // A!=y -> !A 741 712 e->type = E_NOT; 742 713 e->left.expr = expr_alloc_symbol(e->left.sym); 743 714 e->right.sym = NULL; ··· 748 717 case E_NOT: 749 718 switch (e->left.expr->type) { 750 719 case E_NOT: 751 - // !!a -> a 720 + // !!A -> A 752 721 tmp = e->left.expr->left.expr; 753 722 free(e->left.expr); 754 723 free(e); ··· 757 726 break; 758 727 case E_EQUAL: 759 728 case E_UNEQUAL: 760 - // !a='x' -> a!='x' 729 + // !(A=B) -> A!=B 761 730 tmp = e->left.expr; 762 731 free(e); 763 732 e = tmp; ··· 765 734 break; 766 735 case E_LEQ: 767 736 case E_GEQ: 768 - // !a<='x' -> a>'x' 737 + // !(A<=B) -> A>B 769 738 tmp = e->left.expr; 770 739 free(e); 771 740 e = tmp; ··· 773 742 break; 774 743 case E_LTH: 775 744 case E_GTH: 776 - // !a<'x' -> a>='x' 745 + // !(A<B) -> A>=B 777 746 tmp = e->left.expr; 778 747 free(e); 779 748 e = tmp; 780 749 e->type = e->type == E_LTH ? E_GEQ : E_LEQ; 781 750 break; 782 751 case E_OR: 783 - // !(a || b) -> !a && !b 752 + // !(A || B) -> !A && !B 784 753 tmp = e->left.expr; 785 754 e->type = E_AND; 786 755 e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); ··· 789 758 e = expr_transform(e); 790 759 break; 791 760 case E_AND: 792 - // !(a && b) -> !a || !b 761 + // !(A && B) -> !A || !B 793 762 tmp = e->left.expr; 794 763 e->type = E_OR; 795 764 e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);