Mercurial > hg > CbC > CbC_gcc
annotate gcc/dbgcnt.c @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | f6334be47118 |
children | 84e7813d76e9 |
rev | line source |
---|---|
0 | 1 /* Debug counter for debugging support |
111 | 2 Copyright (C) 2006-2017 Free Software Foundation, Inc. |
0 | 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 | |
8 Software Foundation; either version 3, or (at your option) any later | |
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 | |
17 along with GCC; see the file COPYING3. If not see | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
18 <http://www.gnu.org/licenses/>. |
0 | 19 |
20 See dbgcnt.def for usage information. */ | |
21 | |
22 #include "config.h" | |
23 #include "system.h" | |
24 #include "coretypes.h" | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
25 #include "diagnostic-core.h" |
111 | 26 #include "dumpfile.h" |
0 | 27 |
28 #include "dbgcnt.h" | |
29 | |
30 struct string2counter_map { | |
31 const char *name; | |
32 enum debug_counter counter; | |
33 }; | |
34 | |
35 #define DEBUG_COUNTER(a) { #a , a }, | |
36 | |
37 static struct string2counter_map map[debug_counter_number_of_counters] = | |
38 { | |
39 #include "dbgcnt.def" | |
40 }; | |
41 #undef DEBUG_COUNTER | |
42 | |
43 #define DEBUG_COUNTER(a) UINT_MAX, | |
44 static unsigned int limit[debug_counter_number_of_counters] = | |
45 { | |
46 #include "dbgcnt.def" | |
47 }; | |
48 #undef DEBUG_COUNTER | |
49 | |
50 static unsigned int count[debug_counter_number_of_counters]; | |
51 | |
52 bool | |
53 dbg_cnt_is_enabled (enum debug_counter index) | |
54 { | |
55 return count[index] <= limit[index]; | |
56 } | |
57 | |
58 bool | |
59 dbg_cnt (enum debug_counter index) | |
60 { | |
61 count[index]++; | |
62 if (dump_file && count[index] == limit[index]) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
63 fprintf (dump_file, "***dbgcnt: limit reached for %s.***\n", |
0 | 64 map[index].name); |
65 | |
66 return dbg_cnt_is_enabled (index); | |
67 } | |
68 | |
69 | |
70 static void | |
71 dbg_cnt_set_limit_by_index (enum debug_counter index, int value) | |
72 { | |
73 limit[index] = value; | |
74 | |
75 fprintf (stderr, "dbg_cnt '%s' set to %d\n", map[index].name, value); | |
76 } | |
77 | |
78 static bool | |
79 dbg_cnt_set_limit_by_name (const char *name, int len, int value) | |
80 { | |
81 int i; | |
82 for (i = debug_counter_number_of_counters - 1; i >= 0; i--) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
83 if (strncmp (map[i].name, name, len) == 0 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
84 && map[i].name[len] == '\0') |
0 | 85 break; |
86 | |
87 if (i < 0) | |
88 return false; | |
89 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
90 dbg_cnt_set_limit_by_index ((enum debug_counter) i, value); |
0 | 91 return true; |
92 } | |
93 | |
94 | |
95 /* Process a single "name:value" pair. | |
96 Returns NULL if there's no valid pair is found. | |
97 Otherwise returns a pointer to the end of the pair. */ | |
98 | |
99 static const char * | |
100 dbg_cnt_process_single_pair (const char *arg) | |
101 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
102 const char *colon = strchr (arg, ':'); |
0 | 103 char *endptr = NULL; |
104 int value; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
105 |
0 | 106 if (colon == NULL) |
107 return NULL; | |
108 | |
109 value = strtol (colon + 1, &endptr, 10); | |
110 | |
111 if (endptr != NULL && endptr != colon + 1 | |
112 && dbg_cnt_set_limit_by_name (arg, colon - arg, value)) | |
113 return endptr; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
114 |
0 | 115 return NULL; |
116 } | |
117 | |
118 void | |
119 dbg_cnt_process_opt (const char *arg) | |
120 { | |
121 const char *start = arg; | |
122 const char *next; | |
123 do { | |
124 next = dbg_cnt_process_single_pair (arg); | |
125 if (next == NULL) | |
126 break; | |
127 } while (*next == ',' && (arg = next + 1)); | |
128 | |
129 if (next == NULL || *next != 0) | |
130 { | |
131 char *buffer = XALLOCAVEC (char, arg - start + 2); | |
132 sprintf (buffer, "%*c", (int)(1 + (arg - start)), '^'); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
133 error ("cannot find a valid counter:value pair:"); |
0 | 134 error ("-fdbg-cnt=%s", start); |
135 error (" %s", buffer); | |
136 } | |
137 } | |
138 | |
139 /* Print name, limit and count of all counters. */ | |
140 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
141 void |
0 | 142 dbg_cnt_list_all_counters (void) |
143 { | |
144 int i; | |
145 printf (" %-30s %-5s %-5s\n", "counter name", "limit", "value"); | |
146 printf ("----------------------------------------------\n"); | |
147 for (i = 0; i < debug_counter_number_of_counters; i++) | |
148 printf (" %-30s %5d %5u\n", | |
149 map[i].name, limit[map[i].counter], count[map[i].counter]); | |
150 printf ("\n"); | |
151 } |