Mercurial > hg > CbC > CbC_gcc
annotate gcc/config/v850/v850-c.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
rev | line source |
---|---|
0 | 1 /* v850 specific, C compiler specific functions. |
131 | 2 Copyright (C) 2000-2018 Free Software Foundation, Inc. |
0 | 3 Contributed by Jeff Law (law@cygnus.com). |
4 | |
5 This file is part of GCC. | |
6 | |
7 GCC is free software; you can redistribute it and/or modify | |
8 it under the terms of the GNU General Public License as published by | |
9 the Free Software Foundation; either version 3, or (at your option) | |
10 any later version. | |
11 | |
12 GCC is distributed in the hope that it will be useful, | |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 GNU General Public License for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with GCC; see the file COPYING3. If not see | |
19 <http://www.gnu.org/licenses/>. */ | |
20 | |
131 | 21 #define IN_TARGET_CODE 1 |
22 | |
0 | 23 #include "config.h" |
24 #include "system.h" | |
25 #include "coretypes.h" | |
26 #include "tm.h" | |
27 #include "tree.h" | |
111 | 28 #include "stringpool.h" |
29 #include "diagnostic-core.h" | |
30 #include "attribs.h" | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
31 #include "c-family/c-pragma.h" |
0 | 32 |
33 #ifndef streq | |
34 #define streq(a,b) (strcmp (a, b) == 0) | |
35 #endif | |
36 | |
37 static int pop_data_area (v850_data_area); | |
38 static int push_data_area (v850_data_area); | |
39 static void mark_current_function_as_interrupt (void); | |
40 | |
41 /* Push a data area onto the stack. */ | |
42 | |
43 static int | |
44 push_data_area (v850_data_area data_area) | |
45 { | |
46 data_area_stack_element * elem; | |
47 | |
48 elem = (data_area_stack_element *) xmalloc (sizeof (* elem)); | |
49 | |
50 if (elem == NULL) | |
51 return 0; | |
52 | |
53 elem->prev = data_area_stack; | |
54 elem->data_area = data_area; | |
55 | |
56 data_area_stack = elem; | |
57 | |
58 return 1; | |
59 } | |
60 | |
61 /* Remove a data area from the stack. */ | |
62 | |
63 static int | |
64 pop_data_area (v850_data_area data_area) | |
65 { | |
66 if (data_area_stack == NULL) | |
67 warning (OPT_Wpragmas, "#pragma GHS endXXXX found without " | |
68 "previous startXXX"); | |
69 else if (data_area != data_area_stack->data_area) | |
70 warning (OPT_Wpragmas, "#pragma GHS endXXX does not match " | |
71 "previous startXXX"); | |
72 else | |
73 { | |
74 data_area_stack_element * elem; | |
75 | |
76 elem = data_area_stack; | |
77 data_area_stack = data_area_stack->prev; | |
78 | |
79 free (elem); | |
80 | |
81 return 1; | |
82 } | |
83 | |
84 return 0; | |
85 } | |
86 | |
87 /* Set the machine specific 'interrupt' attribute on the current function. */ | |
88 | |
89 static void | |
90 mark_current_function_as_interrupt (void) | |
91 { | |
92 tree name; | |
93 | |
94 if (current_function_decl == NULL_TREE) | |
95 { | |
96 warning (0, "cannot set interrupt attribute: no current function"); | |
97 return; | |
98 } | |
99 | |
100 name = get_identifier ("interrupt"); | |
101 | |
102 if (name == NULL_TREE || TREE_CODE (name) != IDENTIFIER_NODE) | |
103 { | |
104 warning (0, "cannot set interrupt attribute: no such identifier"); | |
105 return; | |
106 } | |
107 | |
108 decl_attributes (¤t_function_decl, | |
109 tree_cons (name, NULL_TREE, NULL_TREE), 0); | |
110 } | |
111 | |
112 | |
113 /* Support for GHS pragmata. */ | |
114 | |
115 void | |
116 ghs_pragma_section (cpp_reader * pfile ATTRIBUTE_UNUSED) | |
117 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
118 int repeat = 0; |
0 | 119 |
120 /* #pragma ghs section [name = alias [, name = alias [, ...]]] */ | |
121 do | |
122 { | |
123 tree x; | |
124 enum cpp_ttype type; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
125 tree sect_ident; |
0 | 126 const char *sect, *alias; |
127 enum GHS_section_kind kind; | |
128 | |
129 type = pragma_lex (&x); | |
130 | |
131 if (type == CPP_EOF && !repeat) | |
132 goto reset; | |
133 else if (type == CPP_NAME) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
134 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
135 sect_ident = x; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
136 sect = IDENTIFIER_POINTER (sect_ident); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
137 } |
0 | 138 else |
139 goto bad; | |
140 repeat = 0; | |
141 | |
142 if (pragma_lex (&x) != CPP_EQ) | |
143 goto bad; | |
144 if (pragma_lex (&x) != CPP_NAME) | |
145 goto bad; | |
146 | |
147 alias = IDENTIFIER_POINTER (x); | |
148 | |
149 type = pragma_lex (&x); | |
150 if (type == CPP_COMMA) | |
151 repeat = 1; | |
152 else if (type != CPP_EOF) | |
153 warning (OPT_Wpragmas, "junk at end of #pragma ghs section"); | |
154 | |
155 if (streq (sect, "data")) kind = GHS_SECTION_KIND_DATA; | |
156 else if (streq (sect, "text")) kind = GHS_SECTION_KIND_TEXT; | |
157 else if (streq (sect, "rodata")) kind = GHS_SECTION_KIND_RODATA; | |
158 else if (streq (sect, "const")) kind = GHS_SECTION_KIND_RODATA; | |
159 else if (streq (sect, "rosdata")) kind = GHS_SECTION_KIND_ROSDATA; | |
160 else if (streq (sect, "rozdata")) kind = GHS_SECTION_KIND_ROZDATA; | |
161 else if (streq (sect, "sdata")) kind = GHS_SECTION_KIND_SDATA; | |
162 else if (streq (sect, "tdata")) kind = GHS_SECTION_KIND_TDATA; | |
163 else if (streq (sect, "zdata")) kind = GHS_SECTION_KIND_ZDATA; | |
164 /* According to GHS beta documentation, the following should not be | |
165 allowed! */ | |
166 else if (streq (sect, "bss")) kind = GHS_SECTION_KIND_BSS; | |
167 else if (streq (sect, "zbss")) kind = GHS_SECTION_KIND_ZDATA; | |
168 else | |
169 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
170 warning (0, "unrecognized section name %qE", sect_ident); |
0 | 171 return; |
172 } | |
173 | |
174 if (streq (alias, "default")) | |
175 GHS_current_section_names [kind] = NULL; | |
176 else | |
111 | 177 GHS_current_section_names [kind] = alias; |
0 | 178 } |
179 while (repeat); | |
180 | |
181 return; | |
182 | |
183 bad: | |
184 warning (OPT_Wpragmas, "malformed #pragma ghs section"); | |
185 return; | |
186 | |
187 reset: | |
188 /* #pragma ghs section \n: Reset all section names back to their defaults. */ | |
189 { | |
190 int i; | |
191 | |
192 for (i = COUNT_OF_GHS_SECTION_KINDS; i--;) | |
193 GHS_current_section_names [i] = NULL; | |
194 } | |
195 } | |
196 | |
197 void | |
198 ghs_pragma_interrupt (cpp_reader * pfile ATTRIBUTE_UNUSED) | |
199 { | |
200 tree x; | |
201 | |
202 if (pragma_lex (&x) != CPP_EOF) | |
203 warning (OPT_Wpragmas, "junk at end of #pragma ghs interrupt"); | |
204 | |
205 mark_current_function_as_interrupt (); | |
206 } | |
207 | |
208 void | |
209 ghs_pragma_starttda (cpp_reader * pfile ATTRIBUTE_UNUSED) | |
210 { | |
211 tree x; | |
212 | |
213 if (pragma_lex (&x) != CPP_EOF) | |
214 warning (OPT_Wpragmas, "junk at end of #pragma ghs starttda"); | |
215 | |
216 push_data_area (DATA_AREA_TDA); | |
217 } | |
218 | |
219 void | |
220 ghs_pragma_startsda (cpp_reader * pfile ATTRIBUTE_UNUSED) | |
221 { | |
222 tree x; | |
223 | |
224 if (pragma_lex (&x) != CPP_EOF) | |
225 warning (OPT_Wpragmas, "junk at end of #pragma ghs startsda"); | |
226 | |
227 push_data_area (DATA_AREA_SDA); | |
228 } | |
229 | |
230 void | |
231 ghs_pragma_startzda (cpp_reader * pfile ATTRIBUTE_UNUSED) | |
232 { | |
233 tree x; | |
234 | |
235 if (pragma_lex (&x) != CPP_EOF) | |
236 warning (OPT_Wpragmas, "junk at end of #pragma ghs startzda"); | |
237 | |
238 push_data_area (DATA_AREA_ZDA); | |
239 } | |
240 | |
241 void | |
242 ghs_pragma_endtda (cpp_reader * pfile ATTRIBUTE_UNUSED) | |
243 { | |
244 tree x; | |
245 | |
246 if (pragma_lex (&x) != CPP_EOF) | |
247 warning (OPT_Wpragmas, "junk at end of #pragma ghs endtda"); | |
248 | |
249 pop_data_area (DATA_AREA_TDA); | |
250 } | |
251 | |
252 void | |
253 ghs_pragma_endsda (cpp_reader * pfile ATTRIBUTE_UNUSED) | |
254 { | |
255 tree x; | |
256 | |
257 if (pragma_lex (&x) != CPP_EOF) | |
258 warning (OPT_Wpragmas, "junk at end of #pragma ghs endsda"); | |
259 | |
260 pop_data_area (DATA_AREA_SDA); | |
261 } | |
262 | |
263 void | |
264 ghs_pragma_endzda (cpp_reader * pfile ATTRIBUTE_UNUSED) | |
265 { | |
266 tree x; | |
267 | |
268 if (pragma_lex (&x) != CPP_EOF) | |
269 warning (OPT_Wpragmas, "junk at end of #pragma ghs endzda"); | |
270 | |
271 pop_data_area (DATA_AREA_ZDA); | |
272 } |