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