└── gcc-opt-enabled.sh /gcc-opt-enabled.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # set -x 3 | nr=${#*} 4 | 5 | if [ -t 1 ]; then 6 | redfg="\e[31;1m" 7 | redbg="\e[41;30;1m" 8 | greenfg="\e[32m" 9 | greenbg="\e[42;30;1m" 10 | bluebg="\e[44m" 11 | darkfg="\e[30;1m" 12 | off="\e[0m" 13 | disa="\e[9;2m" 14 | else 15 | redbg="" 16 | greenbg="" 17 | bluebg="" 18 | off="" 19 | fi 20 | ena="" 21 | 22 | LANG=C 23 | LC_ALL=C 24 | 25 | nostr="✘" 26 | nostrlen=${#nostr} 27 | yesstr="✔" 28 | yesstrlen=${#yesstr} 29 | 30 | w=11 31 | 32 | declare -a flags=(0 g 1 s 2 3 fast) 33 | 34 | check_flag() { 35 | local fl="$1" 36 | declare -i i 37 | for i in $(seq 0 $((${#flags[*]} - 1))); do 38 | if [ "$fl" == ${flags[$i]} ]; then 39 | return 40 | fi 41 | done 42 | printf "Error: Unknown flag %s\n" "$fl" 43 | exit 1 44 | } 45 | 46 | print_state() { 47 | local s="$1" 48 | local l="$2" 49 | local w="$3" 50 | local d="$4" 51 | if [ "$s" == '[enabled]' ]; then 52 | printf "%b %*s %b" "$greenbg" "$w" "O$l" "$off " 53 | elif [ "$s" == '[disabled]' ]; then 54 | printf "%b %*s %b" "$redbg" "$w" "O$l" "$off " 55 | elif [ "$d" -eq 2 ]; then 56 | printf "%b%*s%b" "$greenbg" $(($w + 2)) "$s" "$off " 57 | else 58 | printf "%b%*s%b" "$redbg" $(($w + 2)) "$s" "$off " 59 | fi 60 | } 61 | 62 | helpdummy='help-dummy.o' 63 | compiler() { 64 | local level="$1" 65 | local hasdummy=0 66 | if [ -f $helpdummy ]; then 67 | hasdummy=1 68 | fi 69 | ${CC:-gcc} -c -Q -O$level --help=optimizers | 70 | sed '/^[[:blank:]]*[^-[:blank:]]/d;/^[[:blank:]]*-[^f]/d;/^[[:blank:]]*$/d;s/=/ /' | 71 | sort | 72 | awk 'BEGIN { noopt["-fopt-info"]=1; noopt["-fshort-wchar"]=1; noopt["-fsave-optimization-record"]=1; noopt["-fpack-struct"]=1; noopt["-fstack-check"]=1; noopt["-flive-patching"]=1; noopt["-fasynchronous-unwind-tables"]=1 } { if (NF>1 && noopt[$1] == "") { if (prev != "" && prev != $1) print(prevline); else { if (val == "[disabled]" || $2 == "[enabled]") next; } prev=$1; val=$2; prevline=$0 } } END { print(prevline) }' 73 | if [ $hasdummy -eq 0 -a -f $helpdummy ]; then 74 | rm $helpdummy 75 | fi 76 | } 77 | 78 | show_diff2() { 79 | local l="$1" 80 | local r="$2" 81 | check_flag "$l" 82 | check_flag "$r" 83 | 84 | paste -d ' ' <(compiler $l) <(compiler $r) | 85 | while read -r line; do 86 | set -- $line 87 | if [ "${#*}" -eq 4 ]; then 88 | opt="$1" 89 | local lstate="$2" 90 | local rstate="$4" 91 | if [ "$lstate" != "$rstate" ]; then 92 | print_state "$lstate" "$l" "$w" 1 93 | print_state "$rstate" "$r" "$w" 2 94 | printf "%s\n" "$opt" 95 | else 96 | if [ "$rstate" == '[disabled]' ]; then 97 | printf "%*s%b%s%b\n" $((2 * ($w + 3))) "" "$disa" "$opt" "$off" 98 | else 99 | printf "%*s%s\n" $((2 * ($w + 3))) "" "$opt" 100 | fi 101 | fi 102 | fi 103 | done 104 | } 105 | 106 | show_header() { 107 | local longest=$1 108 | local w=$2 109 | 110 | printf "%*s%b" $longest "" "$bluebg" 111 | for o in ${flags[*]}; do 112 | printf "│%b %*s %b" "$darkfg" "$w" "$o" "$off$bluebg" 113 | done 114 | printf "│%b\n" "$off" 115 | } 116 | 117 | format_value() { 118 | local w="$1" 119 | local v="$2" 120 | if [ "$v" == '[disabled]' ]; then 121 | printf " %b%*s%b " "$redfg" $(($w + nostrlen - 1)) "$nostr" "$off" 122 | elif [ "$v" == '[enabled]' ]; then 123 | printf " %b%*s%b " "$greenfg" $(($w + yesstrlen - 1)) "$yesstr" "$off" 124 | elif [ ${#v} -eq $(($w + 2)) ]; then 125 | printf "%b%*s%b" "$greenfg" $(($w + 2)) "$v" "$off" 126 | else 127 | printf "%b%*s%b " "$greenfg" $(($w + 1)) "$v" "$off" 128 | fi 129 | } 130 | 131 | show_all() { 132 | declare -a tempN 133 | for i in $(seq 0 $((${#flags[*]} - 1))); do 134 | eval "tempN[$i]=$(mktemp)" 135 | done 136 | trap "rm ${tempN[*]}" INT TERM 137 | 138 | declare -i i 139 | for i in $(seq 0 $((${#flags[*]} - 1))); do 140 | compiler ${flags[$i]} > ${tempN[$i]} 141 | done 142 | 143 | longest=$(awk '{ if (length($1) > max) max = length($1) } END { print(max) }' ${tempN[0]}) 144 | 145 | paste -d ' ' ${tempN[*]} | 146 | { 147 | nl=0 148 | while read -r line; do 149 | set -- $line 150 | if [ "${#*}" -eq $((${#flags[*]} * 2)) ]; then 151 | if [ $(($nl % 20)) -eq 0 ]; then 152 | show_header $longest $w 153 | fi 154 | printf "%*s" $longest $1 155 | 156 | for i in $(seq 2 2 $((${#flags[*]} * 2))); do 157 | printf "│%s" "$(eval format_value $w \${$i})" 158 | done 159 | printf "│\n" 160 | nl=$(($nl + 1)) 161 | elif [ "${#*}" -eq $((${#flags[*]} * 3)) ]; then 162 | if [ $(($nl % 20)) -eq 0 ]; then 163 | show_header $longest $w 164 | fi 165 | printf "%*s" $longest $1 166 | 167 | for i in $(seq 3 3 $((${#flags[*]} * 3))); do 168 | printf "│%s" "$(eval format_value $w \${$i})" 169 | done 170 | printf "│\n" 171 | nl=$(($nl + 1)) 172 | fi 173 | done 174 | } 175 | rm ${tempN[*]} 176 | } 177 | 178 | 179 | if [ $nr -eq 0 ]; then 180 | show_all 181 | elif [ $nr -eq 2 ]; then 182 | show_diff2 $1 $2 183 | else 184 | sflags='' 185 | for o in ${flags[*]}; do 186 | if [ -z "$sflags" ]; then 187 | sflags='[' 188 | else 189 | sflags="$sflags|" 190 | fi 191 | sflags="$sflags$o" 192 | done 193 | sflags="$sflags]" 194 | printf "Usage: %s\nor: %s %s %s\n" "$0" "$0" "$sflags" "$sflags" 195 | fi 196 | --------------------------------------------------------------------------------