]>
Commit | Line | Data |
---|---|---|
3072d30e | 1 | /* This file contains the list of the debug counter for GCC. |
f1717362 | 2 | Copyright (C) 2006-2016 Free Software Foundation, Inc. |
3072d30e | 3 | |
4 | This file is part of GCC. | |
5 | ||
6 | GCC is free software; you can redistribute it and/or modify it under | |
7 | the terms of the GNU General Public License as published by the Free | |
8c4c00c1 | 8 | Software Foundation; either version 3, or (at your option) any later |
3072d30e | 9 | version. |
10 | ||
11 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
12 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 | for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
8c4c00c1 | 17 | along with GCC; see the file COPYING3. If not see |
18 | <http://www.gnu.org/licenses/>. */ | |
3072d30e | 19 | |
20 | ||
21 | /* A debug counter provides you a way to count an event | |
22 | and return false after the counter has exceeded the threshold | |
23 | specified by the option. | |
24 | ||
25 | What is it used for ? | |
26 | ||
27 | This is primarily used to speed up the search for the bad transformation | |
28 | an optimization pass does. By doing a binary search on N, | |
29 | you can quickly narrow down to one transformation | |
30 | which is bad, or which triggers the bad behavior downstream | |
31 | (usually in the form of the badly generated code). | |
32 | ||
33 | How does it work ? | |
34 | ||
bef304b8 | 35 | Every time dbg_cnt(named-counter) is called, |
3072d30e | 36 | the counter is incremented for the named-counter. |
37 | And the incremented value is compared against the threshold (limit) | |
38 | specified by the option. | |
39 | dbg_cnt () returns true if it is at or below threshold, and false if above. | |
40 | ||
41 | How to add a new one ? | |
42 | ||
43 | To add a new counter, simply add an entry below with some descriptive name, | |
44 | and add call(s) to dbg_cnt(your-counter-name) in appropriate places. | |
45 | Usually, you want to control at the finest granularity | |
46 | any particular transformation can happen. | |
47 | e.g. for each instruction in a dead code elimination, | |
48 | or for each copy instruction in register coalescing, | |
49 | or constant-propagation for each insn, | |
50 | or a block straightening, etc. | |
51 | See dce.c for an example. With the dbg_cnt () call in dce.c, | |
52 | now a developer can use -fdbg-cnt=dce:N | |
53 | to stop doing the dead code elimination after N times. | |
54 | ||
55 | How to use it ? | |
56 | ||
57 | By default, all limits are UINT_MAX. | |
58 | Since debug count is unsigned int, <= UINT_MAX returns true always. | |
59 | i.e. dbg_cnt() returns true always regardless of the counter value | |
60 | (although it still counts the event). | |
61 | Use -fdbg-cnt=counter1:N,counter2:M,... | |
62 | which sets the limit for counter1 to N, and the limit for counter2 to M, etc. | |
63 | e.g. setting a limit to zero will make dbg_cnt () return false *always*. | |
bf1f8fbc | 64 | |
65 | The following shell file can then be used to binary search for | |
66 | exact transformation that causes the bug. A second shell script | |
67 | should be written, say "tryTest", which exits with 1 if the | |
68 | compiled program fails and exits with 0 if the program succeeds. | |
69 | This shell script should take 1 parameter, the value to be passed | |
70 | to set the counter of the compilation command in tryTest. Then, | |
71 | assuming that the following script is called binarySearch, | |
72 | the command: | |
73 | ||
48e1416a | 74 | binarySearch tryTest |
bf1f8fbc | 75 | |
76 | will automatically find the highest value of the counter for which | |
77 | the program fails. If tryTest never fails, binarySearch will | |
78 | produce unpredictable results as it will try to find an upper bound | |
79 | that does not exist. | |
80 | ||
81 | When dbgcnt does hits the limit, it writes a comment in the current | |
82 | dump_file of the form: | |
83 | ||
84 | ***dbgcnt: limit reached for %s.*** | |
48e1416a | 85 | |
bf1f8fbc | 86 | Assuming that the dump file is logging the analysis/transformations |
87 | it is making, this pinpoints the exact position in the log file | |
88 | where the problem transformation is being logged. | |
89 | ||
90 | ===================================== | |
91 | #!/bin/bash | |
92 | ||
93 | while getopts "l:u:i:" opt | |
94 | do | |
95 | case $opt in | |
96 | l) lb="$OPTARG";; | |
97 | u) ub="$OPTARG";; | |
98 | i) init="$OPTARG";; | |
99 | ?) usage; exit 3;; | |
100 | esac | |
101 | done | |
102 | ||
103 | shift $(($OPTIND - 1)) | |
104 | echo $@ | |
105 | cmd=${1+"${@}"} | |
106 | ||
107 | lb=${lb:=0} | |
108 | init=${init:=100} | |
109 | ||
110 | $cmd $lb | |
111 | lb_val=$? | |
112 | if [ -z "$ub" ]; then | |
113 | # find the upper bound | |
114 | ub=$(($init + $lb)) | |
115 | true | |
116 | while [ $? -eq $lb_val ]; do | |
117 | ub=$(($ub * 10)) | |
118 | #ub=`expr $ub \* 10` | |
119 | $cmd $ub | |
120 | done | |
121 | fi | |
122 | ||
123 | echo command: $cmd | |
124 | ||
125 | true | |
126 | while [ `expr $ub - $lb` -gt 1 ]; do | |
127 | try=$(($lb + ( $ub - $lb ) / 2)) | |
128 | $cmd $try | |
129 | if [ $? -eq $lb_val ]; then | |
130 | lb=$try | |
131 | else | |
132 | ub=$try | |
133 | fi | |
134 | done | |
135 | ||
136 | echo lbound: $lb | |
137 | echo ubound: $ub | |
138 | ||
139 | ===================================== | |
140 | ||
3072d30e | 141 | */ |
142 | ||
143 | /* Debug counter definitions. */ | |
144 | DEBUG_COUNTER (auto_inc_dec) | |
43fb76c1 | 145 | DEBUG_COUNTER (ccp) |
4ff06051 | 146 | DEBUG_COUNTER (cfg_cleanup) |
d743aba2 | 147 | DEBUG_COUNTER (cprop) |
0c976409 | 148 | DEBUG_COUNTER (cse2_move2add) |
3072d30e | 149 | DEBUG_COUNTER (dce) |
4ff06051 | 150 | DEBUG_COUNTER (dce_fast) |
151 | DEBUG_COUNTER (dce_ud) | |
3072d30e | 152 | DEBUG_COUNTER (delete_trivial_dead) |
ceb49bba | 153 | DEBUG_COUNTER (devirt) |
bf1f8fbc | 154 | DEBUG_COUNTER (df_byte_scan) |
3072d30e | 155 | DEBUG_COUNTER (dse) |
4ff06051 | 156 | DEBUG_COUNTER (dse1) |
157 | DEBUG_COUNTER (dse2) | |
0c976409 | 158 | DEBUG_COUNTER (eipa_sra) |
3072d30e | 159 | DEBUG_COUNTER (gcse2_delete) |
4ff06051 | 160 | DEBUG_COUNTER (global_alloc_at_func) |
161 | DEBUG_COUNTER (global_alloc_at_reg) | |
e819c864 | 162 | DEBUG_COUNTER (graphite_scop) |
d743aba2 | 163 | DEBUG_COUNTER (hoist) |
da54886a | 164 | DEBUG_COUNTER (hoist_insn) |
3072d30e | 165 | DEBUG_COUNTER (ia64_sched2) |
4ff06051 | 166 | DEBUG_COUNTER (if_after_combine) |
167 | DEBUG_COUNTER (if_after_reload) | |
0c976409 | 168 | DEBUG_COUNTER (if_conversion) |
169 | DEBUG_COUNTER (if_conversion_tree) | |
170 | DEBUG_COUNTER (ira_move) | |
3072d30e | 171 | DEBUG_COUNTER (local_alloc_for_sched) |
0c976409 | 172 | DEBUG_COUNTER (merged_ipa_icf) |
3072d30e | 173 | DEBUG_COUNTER (postreload_cse) |
d743aba2 | 174 | DEBUG_COUNTER (pre) |
3072d30e | 175 | DEBUG_COUNTER (pre_insn) |
0c976409 | 176 | DEBUG_COUNTER (registered_jump_thread) |
3072d30e | 177 | DEBUG_COUNTER (sched2_func) |
178 | DEBUG_COUNTER (sched_block) | |
0c976409 | 179 | DEBUG_COUNTER (sched_breakdep) |
3072d30e | 180 | DEBUG_COUNTER (sched_func) |
181 | DEBUG_COUNTER (sched_insn) | |
182 | DEBUG_COUNTER (sched_region) | |
e1ab7874 | 183 | DEBUG_COUNTER (sel_sched_cnt) |
e1ab7874 | 184 | DEBUG_COUNTER (sel_sched_insn_cnt) |
0c976409 | 185 | DEBUG_COUNTER (sel_sched_region_cnt) |
4ff06051 | 186 | DEBUG_COUNTER (sms_sched_loop) |
3072d30e | 187 | DEBUG_COUNTER (split_for_sched2) |
0c976409 | 188 | DEBUG_COUNTER (store_motion) |
3ef16338 | 189 | DEBUG_COUNTER (stv_conversion) |
3072d30e | 190 | DEBUG_COUNTER (tail_call) |
0c976409 | 191 | DEBUG_COUNTER (treepre_insert) |
192 | DEBUG_COUNTER (tree_sra) | |
193 | DEBUG_COUNTER (vect_loop) | |
194 | DEBUG_COUNTER (vect_slp) | |
b865d47e | 195 | DEBUG_COUNTER (dom_unreachable_edges) |