annotate gcc/config/avr/avr-c.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents f6334be47118
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents: 67
diff changeset
1 /* Copyright (C) 2009-2017 Free Software Foundation, Inc.
kono
parents: 67
diff changeset
2 Contributed by Anatoly Sokolov (aesok@post.ru)
kono
parents: 67
diff changeset
3
kono
parents: 67
diff changeset
4 This file is part of GCC.
kono
parents: 67
diff changeset
5
kono
parents: 67
diff changeset
6 GCC is free software; you can redistribute it and/or modify
kono
parents: 67
diff changeset
7 it under the terms of the GNU General Public License as published by
kono
parents: 67
diff changeset
8 the Free Software Foundation; either version 3, or (at your option)
kono
parents: 67
diff changeset
9 any later version.
kono
parents: 67
diff changeset
10
kono
parents: 67
diff changeset
11 GCC is distributed in the hope that it will be useful,
kono
parents: 67
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents: 67
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
kono
parents: 67
diff changeset
14 GNU General Public License for more details.
kono
parents: 67
diff changeset
15
kono
parents: 67
diff changeset
16 You should have received a copy of the GNU General Public License
kono
parents: 67
diff changeset
17 along with GCC; see the file COPYING3. If not see
kono
parents: 67
diff changeset
18 <http://www.gnu.org/licenses/>. */
kono
parents: 67
diff changeset
19
kono
parents: 67
diff changeset
20 /* Not included in avr.c since this requires C front end. */
kono
parents: 67
diff changeset
21
kono
parents: 67
diff changeset
22 #include "config.h"
kono
parents: 67
diff changeset
23 #include "system.h"
kono
parents: 67
diff changeset
24 #include "coretypes.h"
kono
parents: 67
diff changeset
25 #include "target.h"
kono
parents: 67
diff changeset
26 #include "c-family/c-common.h"
kono
parents: 67
diff changeset
27 #include "stor-layout.h"
kono
parents: 67
diff changeset
28 #include "langhooks.h"
kono
parents: 67
diff changeset
29 #include "memmodel.h"
kono
parents: 67
diff changeset
30 #include "tm_p.h"
kono
parents: 67
diff changeset
31
kono
parents: 67
diff changeset
32 /* IDs for all the AVR builtins. */
kono
parents: 67
diff changeset
33
kono
parents: 67
diff changeset
34 enum avr_builtin_id
kono
parents: 67
diff changeset
35 {
kono
parents: 67
diff changeset
36 #define DEF_BUILTIN(NAME, N_ARGS, TYPE, CODE, LIBNAME) \
kono
parents: 67
diff changeset
37 AVR_BUILTIN_ ## NAME,
kono
parents: 67
diff changeset
38 #include "builtins.def"
kono
parents: 67
diff changeset
39 #undef DEF_BUILTIN
kono
parents: 67
diff changeset
40
kono
parents: 67
diff changeset
41 AVR_BUILTIN_COUNT
kono
parents: 67
diff changeset
42 };
kono
parents: 67
diff changeset
43
kono
parents: 67
diff changeset
44
kono
parents: 67
diff changeset
45 /* Implement `TARGET_RESOLVE_OVERLOADED_PLUGIN'. */
kono
parents: 67
diff changeset
46
kono
parents: 67
diff changeset
47 static tree
kono
parents: 67
diff changeset
48 avr_resolve_overloaded_builtin (unsigned int iloc, tree fndecl, void *vargs)
kono
parents: 67
diff changeset
49 {
kono
parents: 67
diff changeset
50 tree type0, type1, fold = NULL_TREE;
kono
parents: 67
diff changeset
51 enum avr_builtin_id id = AVR_BUILTIN_COUNT;
kono
parents: 67
diff changeset
52 location_t loc = (location_t) iloc;
kono
parents: 67
diff changeset
53 vec<tree, va_gc> &args = * (vec<tree, va_gc>*) vargs;
kono
parents: 67
diff changeset
54
kono
parents: 67
diff changeset
55 switch (DECL_FUNCTION_CODE (fndecl))
kono
parents: 67
diff changeset
56 {
kono
parents: 67
diff changeset
57 default:
kono
parents: 67
diff changeset
58 break;
kono
parents: 67
diff changeset
59
kono
parents: 67
diff changeset
60 case AVR_BUILTIN_ABSFX:
kono
parents: 67
diff changeset
61 if (args.length() != 1)
kono
parents: 67
diff changeset
62 {
kono
parents: 67
diff changeset
63 error_at (loc, "%qs expects 1 argument but %d given",
kono
parents: 67
diff changeset
64 "absfx", (int) args.length());
kono
parents: 67
diff changeset
65
kono
parents: 67
diff changeset
66 fold = error_mark_node;
kono
parents: 67
diff changeset
67 break;
kono
parents: 67
diff changeset
68 }
kono
parents: 67
diff changeset
69
kono
parents: 67
diff changeset
70 type0 = TREE_TYPE (args[0]);
kono
parents: 67
diff changeset
71
kono
parents: 67
diff changeset
72 if (!FIXED_POINT_TYPE_P (type0))
kono
parents: 67
diff changeset
73 {
kono
parents: 67
diff changeset
74 error_at (loc, "%qs expects a fixed-point value as argument",
kono
parents: 67
diff changeset
75 "absfx");
kono
parents: 67
diff changeset
76
kono
parents: 67
diff changeset
77 fold = error_mark_node;
kono
parents: 67
diff changeset
78 }
kono
parents: 67
diff changeset
79
kono
parents: 67
diff changeset
80 switch (TYPE_MODE (type0))
kono
parents: 67
diff changeset
81 {
kono
parents: 67
diff changeset
82 case E_QQmode: id = AVR_BUILTIN_ABSHR; break;
kono
parents: 67
diff changeset
83 case E_HQmode: id = AVR_BUILTIN_ABSR; break;
kono
parents: 67
diff changeset
84 case E_SQmode: id = AVR_BUILTIN_ABSLR; break;
kono
parents: 67
diff changeset
85 case E_DQmode: id = AVR_BUILTIN_ABSLLR; break;
kono
parents: 67
diff changeset
86
kono
parents: 67
diff changeset
87 case E_HAmode: id = AVR_BUILTIN_ABSHK; break;
kono
parents: 67
diff changeset
88 case E_SAmode: id = AVR_BUILTIN_ABSK; break;
kono
parents: 67
diff changeset
89 case E_DAmode: id = AVR_BUILTIN_ABSLK; break;
kono
parents: 67
diff changeset
90 case E_TAmode: id = AVR_BUILTIN_ABSLLK; break;
kono
parents: 67
diff changeset
91
kono
parents: 67
diff changeset
92 case E_UQQmode:
kono
parents: 67
diff changeset
93 case E_UHQmode:
kono
parents: 67
diff changeset
94 case E_USQmode:
kono
parents: 67
diff changeset
95 case E_UDQmode:
kono
parents: 67
diff changeset
96 case E_UHAmode:
kono
parents: 67
diff changeset
97 case E_USAmode:
kono
parents: 67
diff changeset
98 case E_UDAmode:
kono
parents: 67
diff changeset
99 case E_UTAmode:
kono
parents: 67
diff changeset
100 warning_at (loc, 0, "using %qs with unsigned type has no effect",
kono
parents: 67
diff changeset
101 "absfx");
kono
parents: 67
diff changeset
102 return args[0];
kono
parents: 67
diff changeset
103
kono
parents: 67
diff changeset
104 default:
kono
parents: 67
diff changeset
105 error_at (loc, "no matching fixed-point overload found for %qs",
kono
parents: 67
diff changeset
106 "absfx");
kono
parents: 67
diff changeset
107
kono
parents: 67
diff changeset
108 fold = error_mark_node;
kono
parents: 67
diff changeset
109 break;
kono
parents: 67
diff changeset
110 }
kono
parents: 67
diff changeset
111
kono
parents: 67
diff changeset
112 fold = targetm.builtin_decl (id, true);
kono
parents: 67
diff changeset
113
kono
parents: 67
diff changeset
114 if (fold != error_mark_node)
kono
parents: 67
diff changeset
115 fold = build_function_call_vec (loc, vNULL, fold, &args, NULL);
kono
parents: 67
diff changeset
116
kono
parents: 67
diff changeset
117 break; // absfx
kono
parents: 67
diff changeset
118
kono
parents: 67
diff changeset
119 case AVR_BUILTIN_ROUNDFX:
kono
parents: 67
diff changeset
120 if (args.length() != 2)
kono
parents: 67
diff changeset
121 {
kono
parents: 67
diff changeset
122 error_at (loc, "%qs expects 2 arguments but %d given",
kono
parents: 67
diff changeset
123 "roundfx", (int) args.length());
kono
parents: 67
diff changeset
124
kono
parents: 67
diff changeset
125 fold = error_mark_node;
kono
parents: 67
diff changeset
126 break;
kono
parents: 67
diff changeset
127 }
kono
parents: 67
diff changeset
128
kono
parents: 67
diff changeset
129 type0 = TREE_TYPE (args[0]);
kono
parents: 67
diff changeset
130 type1 = TREE_TYPE (args[1]);
kono
parents: 67
diff changeset
131
kono
parents: 67
diff changeset
132 if (!FIXED_POINT_TYPE_P (type0))
kono
parents: 67
diff changeset
133 {
kono
parents: 67
diff changeset
134 error_at (loc, "%qs expects a fixed-point value as first argument",
kono
parents: 67
diff changeset
135 "roundfx");
kono
parents: 67
diff changeset
136
kono
parents: 67
diff changeset
137 fold = error_mark_node;
kono
parents: 67
diff changeset
138 }
kono
parents: 67
diff changeset
139
kono
parents: 67
diff changeset
140 if (!INTEGRAL_TYPE_P (type1))
kono
parents: 67
diff changeset
141 {
kono
parents: 67
diff changeset
142 error_at (loc, "%qs expects an integer value as second argument",
kono
parents: 67
diff changeset
143 "roundfx");
kono
parents: 67
diff changeset
144
kono
parents: 67
diff changeset
145 fold = error_mark_node;
kono
parents: 67
diff changeset
146 }
kono
parents: 67
diff changeset
147
kono
parents: 67
diff changeset
148 switch (TYPE_MODE (type0))
kono
parents: 67
diff changeset
149 {
kono
parents: 67
diff changeset
150 case E_QQmode: id = AVR_BUILTIN_ROUNDHR; break;
kono
parents: 67
diff changeset
151 case E_HQmode: id = AVR_BUILTIN_ROUNDR; break;
kono
parents: 67
diff changeset
152 case E_SQmode: id = AVR_BUILTIN_ROUNDLR; break;
kono
parents: 67
diff changeset
153 case E_DQmode: id = AVR_BUILTIN_ROUNDLLR; break;
kono
parents: 67
diff changeset
154
kono
parents: 67
diff changeset
155 case E_UQQmode: id = AVR_BUILTIN_ROUNDUHR; break;
kono
parents: 67
diff changeset
156 case E_UHQmode: id = AVR_BUILTIN_ROUNDUR; break;
kono
parents: 67
diff changeset
157 case E_USQmode: id = AVR_BUILTIN_ROUNDULR; break;
kono
parents: 67
diff changeset
158 case E_UDQmode: id = AVR_BUILTIN_ROUNDULLR; break;
kono
parents: 67
diff changeset
159
kono
parents: 67
diff changeset
160 case E_HAmode: id = AVR_BUILTIN_ROUNDHK; break;
kono
parents: 67
diff changeset
161 case E_SAmode: id = AVR_BUILTIN_ROUNDK; break;
kono
parents: 67
diff changeset
162 case E_DAmode: id = AVR_BUILTIN_ROUNDLK; break;
kono
parents: 67
diff changeset
163 case E_TAmode: id = AVR_BUILTIN_ROUNDLLK; break;
kono
parents: 67
diff changeset
164
kono
parents: 67
diff changeset
165 case E_UHAmode: id = AVR_BUILTIN_ROUNDUHK; break;
kono
parents: 67
diff changeset
166 case E_USAmode: id = AVR_BUILTIN_ROUNDUK; break;
kono
parents: 67
diff changeset
167 case E_UDAmode: id = AVR_BUILTIN_ROUNDULK; break;
kono
parents: 67
diff changeset
168 case E_UTAmode: id = AVR_BUILTIN_ROUNDULLK; break;
kono
parents: 67
diff changeset
169
kono
parents: 67
diff changeset
170 default:
kono
parents: 67
diff changeset
171 error_at (loc, "no matching fixed-point overload found for %qs",
kono
parents: 67
diff changeset
172 "roundfx");
kono
parents: 67
diff changeset
173
kono
parents: 67
diff changeset
174 fold = error_mark_node;
kono
parents: 67
diff changeset
175 break;
kono
parents: 67
diff changeset
176 }
kono
parents: 67
diff changeset
177
kono
parents: 67
diff changeset
178 fold = targetm.builtin_decl (id, true);
kono
parents: 67
diff changeset
179
kono
parents: 67
diff changeset
180 if (fold != error_mark_node)
kono
parents: 67
diff changeset
181 fold = build_function_call_vec (loc, vNULL, fold, &args, NULL);
kono
parents: 67
diff changeset
182
kono
parents: 67
diff changeset
183 break; // roundfx
kono
parents: 67
diff changeset
184
kono
parents: 67
diff changeset
185 case AVR_BUILTIN_COUNTLSFX:
kono
parents: 67
diff changeset
186 if (args.length() != 1)
kono
parents: 67
diff changeset
187 {
kono
parents: 67
diff changeset
188 error_at (loc, "%qs expects 1 argument but %d given",
kono
parents: 67
diff changeset
189 "countlsfx", (int) args.length());
kono
parents: 67
diff changeset
190
kono
parents: 67
diff changeset
191 fold = error_mark_node;
kono
parents: 67
diff changeset
192 break;
kono
parents: 67
diff changeset
193 }
kono
parents: 67
diff changeset
194
kono
parents: 67
diff changeset
195 type0 = TREE_TYPE (args[0]);
kono
parents: 67
diff changeset
196
kono
parents: 67
diff changeset
197 if (!FIXED_POINT_TYPE_P (type0))
kono
parents: 67
diff changeset
198 {
kono
parents: 67
diff changeset
199 error_at (loc, "%qs expects a fixed-point value as first argument",
kono
parents: 67
diff changeset
200 "countlsfx");
kono
parents: 67
diff changeset
201
kono
parents: 67
diff changeset
202 fold = error_mark_node;
kono
parents: 67
diff changeset
203 }
kono
parents: 67
diff changeset
204
kono
parents: 67
diff changeset
205 switch (TYPE_MODE (type0))
kono
parents: 67
diff changeset
206 {
kono
parents: 67
diff changeset
207 case E_QQmode: id = AVR_BUILTIN_COUNTLSHR; break;
kono
parents: 67
diff changeset
208 case E_HQmode: id = AVR_BUILTIN_COUNTLSR; break;
kono
parents: 67
diff changeset
209 case E_SQmode: id = AVR_BUILTIN_COUNTLSLR; break;
kono
parents: 67
diff changeset
210 case E_DQmode: id = AVR_BUILTIN_COUNTLSLLR; break;
kono
parents: 67
diff changeset
211
kono
parents: 67
diff changeset
212 case E_UQQmode: id = AVR_BUILTIN_COUNTLSUHR; break;
kono
parents: 67
diff changeset
213 case E_UHQmode: id = AVR_BUILTIN_COUNTLSUR; break;
kono
parents: 67
diff changeset
214 case E_USQmode: id = AVR_BUILTIN_COUNTLSULR; break;
kono
parents: 67
diff changeset
215 case E_UDQmode: id = AVR_BUILTIN_COUNTLSULLR; break;
kono
parents: 67
diff changeset
216
kono
parents: 67
diff changeset
217 case E_HAmode: id = AVR_BUILTIN_COUNTLSHK; break;
kono
parents: 67
diff changeset
218 case E_SAmode: id = AVR_BUILTIN_COUNTLSK; break;
kono
parents: 67
diff changeset
219 case E_DAmode: id = AVR_BUILTIN_COUNTLSLK; break;
kono
parents: 67
diff changeset
220 case E_TAmode: id = AVR_BUILTIN_COUNTLSLLK; break;
kono
parents: 67
diff changeset
221
kono
parents: 67
diff changeset
222 case E_UHAmode: id = AVR_BUILTIN_COUNTLSUHK; break;
kono
parents: 67
diff changeset
223 case E_USAmode: id = AVR_BUILTIN_COUNTLSUK; break;
kono
parents: 67
diff changeset
224 case E_UDAmode: id = AVR_BUILTIN_COUNTLSULK; break;
kono
parents: 67
diff changeset
225 case E_UTAmode: id = AVR_BUILTIN_COUNTLSULLK; break;
kono
parents: 67
diff changeset
226
kono
parents: 67
diff changeset
227 default:
kono
parents: 67
diff changeset
228 error_at (loc, "no matching fixed-point overload found for %qs",
kono
parents: 67
diff changeset
229 "countlsfx");
kono
parents: 67
diff changeset
230
kono
parents: 67
diff changeset
231 fold = error_mark_node;
kono
parents: 67
diff changeset
232 break;
kono
parents: 67
diff changeset
233 }
kono
parents: 67
diff changeset
234
kono
parents: 67
diff changeset
235 fold = targetm.builtin_decl (id, true);
kono
parents: 67
diff changeset
236
kono
parents: 67
diff changeset
237 if (fold != error_mark_node)
kono
parents: 67
diff changeset
238 fold = build_function_call_vec (loc, vNULL, fold, &args, NULL);
kono
parents: 67
diff changeset
239
kono
parents: 67
diff changeset
240 break; // countlsfx
kono
parents: 67
diff changeset
241 }
kono
parents: 67
diff changeset
242
kono
parents: 67
diff changeset
243 return fold;
kono
parents: 67
diff changeset
244 }
kono
parents: 67
diff changeset
245
kono
parents: 67
diff changeset
246
kono
parents: 67
diff changeset
247 /* Implement `REGISTER_TARGET_PRAGMAS'. */
kono
parents: 67
diff changeset
248
kono
parents: 67
diff changeset
249 void
kono
parents: 67
diff changeset
250 avr_register_target_pragmas (void)
kono
parents: 67
diff changeset
251 {
kono
parents: 67
diff changeset
252 gcc_assert (ADDR_SPACE_GENERIC == ADDR_SPACE_RAM);
kono
parents: 67
diff changeset
253
kono
parents: 67
diff changeset
254 /* Register address spaces. The order must be the same as in the respective
kono
parents: 67
diff changeset
255 enum from avr.h (or designated initializers must be used in avr.c).
kono
parents: 67
diff changeset
256 We always register all address spaces even if some of them make no
kono
parents: 67
diff changeset
257 sense for some targets. Diagnose for non-supported spaces will be
kono
parents: 67
diff changeset
258 emit by TARGET_ADDR_SPACE_DIAGNOSE_USAGE. */
kono
parents: 67
diff changeset
259
kono
parents: 67
diff changeset
260 for (int i = 0; i < ADDR_SPACE_COUNT; i++)
kono
parents: 67
diff changeset
261 {
kono
parents: 67
diff changeset
262 gcc_assert (i == avr_addrspace[i].id);
kono
parents: 67
diff changeset
263
kono
parents: 67
diff changeset
264 if (!ADDR_SPACE_GENERIC_P (i))
kono
parents: 67
diff changeset
265 c_register_addr_space (avr_addrspace[i].name, avr_addrspace[i].id);
kono
parents: 67
diff changeset
266 }
kono
parents: 67
diff changeset
267
kono
parents: 67
diff changeset
268 targetm.resolve_overloaded_builtin = avr_resolve_overloaded_builtin;
kono
parents: 67
diff changeset
269 }
kono
parents: 67
diff changeset
270
kono
parents: 67
diff changeset
271
kono
parents: 67
diff changeset
272 /* Transform LO into uppercase and write the result to UP.
kono
parents: 67
diff changeset
273 You must provide enough space for UP. Return UP. */
kono
parents: 67
diff changeset
274
kono
parents: 67
diff changeset
275 static char*
kono
parents: 67
diff changeset
276 avr_toupper (char *up, const char *lo)
kono
parents: 67
diff changeset
277 {
kono
parents: 67
diff changeset
278 char *up0 = up;
kono
parents: 67
diff changeset
279
kono
parents: 67
diff changeset
280 for (; *lo; lo++, up++)
kono
parents: 67
diff changeset
281 *up = TOUPPER (*lo);
kono
parents: 67
diff changeset
282
kono
parents: 67
diff changeset
283 *up = '\0';
kono
parents: 67
diff changeset
284
kono
parents: 67
diff changeset
285 return up0;
kono
parents: 67
diff changeset
286 }
kono
parents: 67
diff changeset
287
kono
parents: 67
diff changeset
288 /* Worker function for TARGET_CPU_CPP_BUILTINS. */
kono
parents: 67
diff changeset
289
kono
parents: 67
diff changeset
290 void
kono
parents: 67
diff changeset
291 avr_cpu_cpp_builtins (struct cpp_reader *pfile)
kono
parents: 67
diff changeset
292 {
kono
parents: 67
diff changeset
293 builtin_define_std ("AVR");
kono
parents: 67
diff changeset
294
kono
parents: 67
diff changeset
295 /* __AVR_DEVICE_NAME__ and avr_mcu_types[].macro like __AVR_ATmega8__
kono
parents: 67
diff changeset
296 are defined by -D command option, see device-specs file. */
kono
parents: 67
diff changeset
297
kono
parents: 67
diff changeset
298 if (avr_arch->macro)
kono
parents: 67
diff changeset
299 cpp_define_formatted (pfile, "__AVR_ARCH__=%s", avr_arch->macro);
kono
parents: 67
diff changeset
300 if (AVR_HAVE_RAMPD) cpp_define (pfile, "__AVR_HAVE_RAMPD__");
kono
parents: 67
diff changeset
301 if (AVR_HAVE_RAMPX) cpp_define (pfile, "__AVR_HAVE_RAMPX__");
kono
parents: 67
diff changeset
302 if (AVR_HAVE_RAMPY) cpp_define (pfile, "__AVR_HAVE_RAMPY__");
kono
parents: 67
diff changeset
303 if (AVR_HAVE_RAMPZ) cpp_define (pfile, "__AVR_HAVE_RAMPZ__");
kono
parents: 67
diff changeset
304 if (AVR_HAVE_ELPM) cpp_define (pfile, "__AVR_HAVE_ELPM__");
kono
parents: 67
diff changeset
305 if (AVR_HAVE_ELPMX) cpp_define (pfile, "__AVR_HAVE_ELPMX__");
kono
parents: 67
diff changeset
306 if (AVR_HAVE_MOVW) cpp_define (pfile, "__AVR_HAVE_MOVW__");
kono
parents: 67
diff changeset
307 if (AVR_HAVE_LPMX) cpp_define (pfile, "__AVR_HAVE_LPMX__");
kono
parents: 67
diff changeset
308
kono
parents: 67
diff changeset
309 if (avr_arch->asm_only)
kono
parents: 67
diff changeset
310 cpp_define (pfile, "__AVR_ASM_ONLY__");
kono
parents: 67
diff changeset
311 if (AVR_HAVE_MUL)
kono
parents: 67
diff changeset
312 {
kono
parents: 67
diff changeset
313 cpp_define (pfile, "__AVR_ENHANCED__");
kono
parents: 67
diff changeset
314 cpp_define (pfile, "__AVR_HAVE_MUL__");
kono
parents: 67
diff changeset
315 }
kono
parents: 67
diff changeset
316
kono
parents: 67
diff changeset
317 if (AVR_HAVE_JMP_CALL)
kono
parents: 67
diff changeset
318 cpp_define (pfile, "__AVR_HAVE_JMP_CALL__");
kono
parents: 67
diff changeset
319
kono
parents: 67
diff changeset
320 if (avr_arch->have_jmp_call)
kono
parents: 67
diff changeset
321 cpp_define (pfile, "__AVR_MEGA__");
kono
parents: 67
diff changeset
322
kono
parents: 67
diff changeset
323 if (AVR_SHORT_CALLS)
kono
parents: 67
diff changeset
324 cpp_define (pfile, "__AVR_SHORT_CALLS__");
kono
parents: 67
diff changeset
325
kono
parents: 67
diff changeset
326 if (AVR_XMEGA)
kono
parents: 67
diff changeset
327 cpp_define (pfile, "__AVR_XMEGA__");
kono
parents: 67
diff changeset
328
kono
parents: 67
diff changeset
329 if (AVR_TINY)
kono
parents: 67
diff changeset
330 {
kono
parents: 67
diff changeset
331 cpp_define (pfile, "__AVR_TINY__");
kono
parents: 67
diff changeset
332
kono
parents: 67
diff changeset
333 /* Define macro "__AVR_TINY_PM_BASE_ADDRESS__" with mapped program memory
kono
parents: 67
diff changeset
334 start address. This macro shall be used where mapped program
kono
parents: 67
diff changeset
335 memory is accessed, eg. copying data section (__do_copy_data)
kono
parents: 67
diff changeset
336 contents to data memory region.
kono
parents: 67
diff changeset
337 NOTE:
kono
parents: 67
diff changeset
338 Program memory of AVR_TINY devices cannot be accessed directly,
kono
parents: 67
diff changeset
339 it has been mapped to the data memory. For AVR_TINY devices
kono
parents: 67
diff changeset
340 (ATtiny4/5/9/10/20 and 40) mapped program memory starts at 0x4000. */
kono
parents: 67
diff changeset
341
kono
parents: 67
diff changeset
342 cpp_define_formatted (pfile, "__AVR_TINY_PM_BASE_ADDRESS__=0x%x",
kono
parents: 67
diff changeset
343 avr_arch->flash_pm_offset);
kono
parents: 67
diff changeset
344 }
kono
parents: 67
diff changeset
345
kono
parents: 67
diff changeset
346 if (avr_arch->flash_pm_offset)
kono
parents: 67
diff changeset
347 cpp_define_formatted (pfile, "__AVR_PM_BASE_ADDRESS__=0x%x",
kono
parents: 67
diff changeset
348 avr_arch->flash_pm_offset);
kono
parents: 67
diff changeset
349
kono
parents: 67
diff changeset
350 if (AVR_HAVE_EIJMP_EICALL)
kono
parents: 67
diff changeset
351 {
kono
parents: 67
diff changeset
352 cpp_define (pfile, "__AVR_HAVE_EIJMP_EICALL__");
kono
parents: 67
diff changeset
353 cpp_define (pfile, "__AVR_3_BYTE_PC__");
kono
parents: 67
diff changeset
354 }
kono
parents: 67
diff changeset
355 else
kono
parents: 67
diff changeset
356 {
kono
parents: 67
diff changeset
357 cpp_define (pfile, "__AVR_2_BYTE_PC__");
kono
parents: 67
diff changeset
358 }
kono
parents: 67
diff changeset
359
kono
parents: 67
diff changeset
360 if (AVR_HAVE_8BIT_SP)
kono
parents: 67
diff changeset
361 cpp_define (pfile, "__AVR_HAVE_8BIT_SP__");
kono
parents: 67
diff changeset
362 else
kono
parents: 67
diff changeset
363 cpp_define (pfile, "__AVR_HAVE_16BIT_SP__");
kono
parents: 67
diff changeset
364
kono
parents: 67
diff changeset
365 if (AVR_HAVE_SPH)
kono
parents: 67
diff changeset
366 cpp_define (pfile, "__AVR_HAVE_SPH__");
kono
parents: 67
diff changeset
367 else
kono
parents: 67
diff changeset
368 cpp_define (pfile, "__AVR_SP8__");
kono
parents: 67
diff changeset
369
kono
parents: 67
diff changeset
370 if (TARGET_NO_INTERRUPTS)
kono
parents: 67
diff changeset
371 cpp_define (pfile, "__NO_INTERRUPTS__");
kono
parents: 67
diff changeset
372
kono
parents: 67
diff changeset
373 if (TARGET_SKIP_BUG)
kono
parents: 67
diff changeset
374 {
kono
parents: 67
diff changeset
375 cpp_define (pfile, "__AVR_ERRATA_SKIP__");
kono
parents: 67
diff changeset
376
kono
parents: 67
diff changeset
377 if (AVR_HAVE_JMP_CALL)
kono
parents: 67
diff changeset
378 cpp_define (pfile, "__AVR_ERRATA_SKIP_JMP_CALL__");
kono
parents: 67
diff changeset
379 }
kono
parents: 67
diff changeset
380
kono
parents: 67
diff changeset
381 if (TARGET_RMW)
kono
parents: 67
diff changeset
382 cpp_define (pfile, "__AVR_ISA_RMW__");
kono
parents: 67
diff changeset
383
kono
parents: 67
diff changeset
384 cpp_define_formatted (pfile, "__AVR_SFR_OFFSET__=0x%x",
kono
parents: 67
diff changeset
385 avr_arch->sfr_offset);
kono
parents: 67
diff changeset
386
kono
parents: 67
diff changeset
387 #ifdef WITH_AVRLIBC
kono
parents: 67
diff changeset
388 cpp_define (pfile, "__WITH_AVRLIBC__");
kono
parents: 67
diff changeset
389 #endif /* WITH_AVRLIBC */
kono
parents: 67
diff changeset
390
kono
parents: 67
diff changeset
391 /* Define builtin macros so that the user can easily query whether
kono
parents: 67
diff changeset
392 non-generic address spaces (and which) are supported or not.
kono
parents: 67
diff changeset
393 This is only supported for C. For C++, a language extension is needed
kono
parents: 67
diff changeset
394 (as mentioned in ISO/IEC DTR 18037; Annex F.2) which is not
kono
parents: 67
diff changeset
395 implemented in GCC up to now. */
kono
parents: 67
diff changeset
396
kono
parents: 67
diff changeset
397 if (lang_GNU_C ())
kono
parents: 67
diff changeset
398 {
kono
parents: 67
diff changeset
399 for (int i = 0; i < ADDR_SPACE_COUNT; i++)
kono
parents: 67
diff changeset
400 if (!ADDR_SPACE_GENERIC_P (i)
kono
parents: 67
diff changeset
401 /* Only supply __FLASH<n> macro if the address space is reasonable
kono
parents: 67
diff changeset
402 for this target. The address space qualifier itself is still
kono
parents: 67
diff changeset
403 supported, but using it will throw an error. */
kono
parents: 67
diff changeset
404 && avr_addr_space_supported_p ((addr_space_t) i))
kono
parents: 67
diff changeset
405 {
kono
parents: 67
diff changeset
406 const char *name = avr_addrspace[i].name;
kono
parents: 67
diff changeset
407 char *Name = (char*) alloca (1 + strlen (name));
kono
parents: 67
diff changeset
408
kono
parents: 67
diff changeset
409 cpp_define (pfile, avr_toupper (Name, name));
kono
parents: 67
diff changeset
410 }
kono
parents: 67
diff changeset
411 }
kono
parents: 67
diff changeset
412
kono
parents: 67
diff changeset
413 /* Define builtin macros so that the user can easily query whether or
kono
parents: 67
diff changeset
414 not a specific builtin is available. */
kono
parents: 67
diff changeset
415
kono
parents: 67
diff changeset
416 #define DEF_BUILTIN(NAME, N_ARGS, TYPE, CODE, LIBNAME) \
kono
parents: 67
diff changeset
417 cpp_define (pfile, "__BUILTIN_AVR_" #NAME);
kono
parents: 67
diff changeset
418 #include "builtins.def"
kono
parents: 67
diff changeset
419 #undef DEF_BUILTIN
kono
parents: 67
diff changeset
420
kono
parents: 67
diff changeset
421 /* Builtin macros for the __int24 and __uint24 type. */
kono
parents: 67
diff changeset
422
kono
parents: 67
diff changeset
423 cpp_define_formatted (pfile, "__INT24_MAX__=8388607%s",
kono
parents: 67
diff changeset
424 INT_TYPE_SIZE == 8 ? "LL" : "L");
kono
parents: 67
diff changeset
425 cpp_define (pfile, "__INT24_MIN__=(-__INT24_MAX__-1)");
kono
parents: 67
diff changeset
426 cpp_define_formatted (pfile, "__UINT24_MAX__=16777215%s",
kono
parents: 67
diff changeset
427 INT_TYPE_SIZE == 8 ? "ULL" : "UL");
kono
parents: 67
diff changeset
428 }