Mercurial > hg > CbC > CbC_gcc
annotate libcpp/directives.c @ 109:78d3881f2882
add CbC-example/rectype
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 14 Jun 2012 20:43:12 +0900 |
parents | f6334be47118 |
children | 04ced10e8804 |
rev | line source |
---|---|
0 | 1 /* CPP Library. (Directive handling.) |
2 Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, | |
3 1999, 2000, 2001, 2002, 2003, 2004, 2005, | |
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
|
4 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
0 | 5 Contributed by Per Bothner, 1994-95. |
6 Based on CCCP program by Paul Rubin, June 1986 | |
7 Adapted to ANSI C, Richard Stallman, Jan 1987 | |
8 | |
9 This program is free software; you can redistribute it and/or modify it | |
10 under the terms of the GNU General Public License as published by the | |
11 Free Software Foundation; either version 3, or (at your option) any | |
12 later version. | |
13 | |
14 This program is distributed in the hope that it will be useful, | |
15 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 GNU General Public License for more details. | |
18 | |
19 You should have received a copy of the GNU General Public License | |
20 along with this program; see the file COPYING3. If not see | |
21 <http://www.gnu.org/licenses/>. */ | |
22 | |
23 #include "config.h" | |
24 #include "system.h" | |
25 #include "cpplib.h" | |
26 #include "internal.h" | |
27 #include "mkdeps.h" | |
28 #include "obstack.h" | |
29 | |
30 /* Stack of conditionals currently in progress | |
31 (including both successful and failing conditionals). */ | |
32 struct if_stack | |
33 { | |
34 struct if_stack *next; | |
35 linenum_type line; /* Line where condition started. */ | |
36 const cpp_hashnode *mi_cmacro;/* macro name for #ifndef around entire file */ | |
37 bool skip_elses; /* Can future #else / #elif be skipped? */ | |
38 bool was_skipping; /* If were skipping on entry. */ | |
39 int type; /* Most recent conditional for diagnostics. */ | |
40 }; | |
41 | |
42 /* Contains a registered pragma or pragma namespace. */ | |
43 typedef void (*pragma_cb) (cpp_reader *); | |
44 struct pragma_entry | |
45 { | |
46 struct pragma_entry *next; | |
47 const cpp_hashnode *pragma; /* Name and length. */ | |
48 bool is_nspace; | |
49 bool is_internal; | |
50 bool is_deferred; | |
51 bool allow_expansion; | |
52 union { | |
53 pragma_cb handler; | |
54 struct pragma_entry *space; | |
55 unsigned int ident; | |
56 } u; | |
57 }; | |
58 | |
59 /* Values for the origin field of struct directive. KANDR directives | |
60 come from traditional (K&R) C. STDC89 directives come from the | |
61 1989 C standard. EXTENSION directives are extensions. */ | |
62 #define KANDR 0 | |
63 #define STDC89 1 | |
64 #define EXTENSION 2 | |
65 | |
66 /* Values for the flags field of struct directive. COND indicates a | |
67 conditional; IF_COND an opening conditional. INCL means to treat | |
68 "..." and <...> as q-char and h-char sequences respectively. IN_I | |
69 means this directive should be handled even if -fpreprocessed is in | |
70 effect (these are the directives with callback hooks). | |
71 | |
72 EXPAND is set on directives that are always macro-expanded. */ | |
73 #define COND (1 << 0) | |
74 #define IF_COND (1 << 1) | |
75 #define INCL (1 << 2) | |
76 #define IN_I (1 << 3) | |
77 #define EXPAND (1 << 4) | |
78 #define DEPRECATED (1 << 5) | |
79 | |
80 /* Defines one #-directive, including how to handle it. */ | |
81 typedef void (*directive_handler) (cpp_reader *); | |
82 typedef struct directive directive; | |
83 struct directive | |
84 { | |
85 directive_handler handler; /* Function to handle directive. */ | |
86 const uchar *name; /* Name of directive. */ | |
87 unsigned short length; /* Length of name. */ | |
88 unsigned char origin; /* Origin of directive. */ | |
89 unsigned char flags; /* Flags describing this directive. */ | |
90 }; | |
91 | |
92 /* Forward declarations. */ | |
93 | |
94 static void skip_rest_of_line (cpp_reader *); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
95 static void check_eol (cpp_reader *, bool); |
0 | 96 static void start_directive (cpp_reader *); |
97 static void prepare_directive_trad (cpp_reader *); | |
98 static void end_directive (cpp_reader *, int); | |
99 static void directive_diagnostics (cpp_reader *, const directive *, int); | |
100 static void run_directive (cpp_reader *, int, const char *, size_t); | |
101 static char *glue_header_name (cpp_reader *); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
102 static const char *parse_include (cpp_reader *, int *, const cpp_token ***, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
103 source_location *); |
0 | 104 static void push_conditional (cpp_reader *, int, int, const cpp_hashnode *); |
105 static unsigned int read_flag (cpp_reader *, unsigned int); | |
106 static bool strtolinenum (const uchar *, size_t, linenum_type *, bool *); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
107 static void do_diagnostic (cpp_reader *, int, int, int); |
0 | 108 static cpp_hashnode *lex_macro_node (cpp_reader *, bool); |
109 static int undefine_macros (cpp_reader *, cpp_hashnode *, void *); | |
110 static void do_include_common (cpp_reader *, enum include_type); | |
111 static struct pragma_entry *lookup_pragma_entry (struct pragma_entry *, | |
112 const cpp_hashnode *); | |
113 static int count_registered_pragmas (struct pragma_entry *); | |
114 static char ** save_registered_pragmas (struct pragma_entry *, char **); | |
115 static char ** restore_registered_pragmas (cpp_reader *, struct pragma_entry *, | |
116 char **); | |
117 static void do_pragma_once (cpp_reader *); | |
118 static void do_pragma_poison (cpp_reader *); | |
119 static void do_pragma_system_header (cpp_reader *); | |
120 static void do_pragma_dependency (cpp_reader *); | |
121 static void do_linemarker (cpp_reader *); | |
122 static const cpp_token *get_token_no_padding (cpp_reader *); | |
123 static const cpp_token *get__Pragma_string (cpp_reader *); | |
124 static void destringize_and_run (cpp_reader *, const cpp_string *); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
125 static int parse_answer (cpp_reader *, struct answer **, int, source_location); |
0 | 126 static cpp_hashnode *parse_assertion (cpp_reader *, struct answer **, int); |
127 static struct answer ** find_answer (cpp_hashnode *, const struct answer *); | |
128 static void handle_assertion (cpp_reader *, const char *, int); | |
47
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
129 static void do_pragma_push_macro (cpp_reader *); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
130 static void do_pragma_pop_macro (cpp_reader *); |
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
|
131 static void cpp_pop_definition (cpp_reader *, struct def_pragma_macro *); |
0 | 132 |
133 /* This is the table of directive handlers. It is ordered by | |
134 frequency of occurrence; the numbers at the end are directive | |
135 counts from all the source code I have lying around (egcs and libc | |
136 CVS as of 1999-05-18, plus grub-0.5.91, linux-2.2.9, and | |
137 pcmcia-cs-3.0.9). This is no longer important as directive lookup | |
138 is now O(1). All extensions other than #warning, #include_next, | |
139 and #import are deprecated. The name is where the extension | |
140 appears to have come from. */ | |
141 | |
142 #define DIRECTIVE_TABLE \ | |
143 D(define, T_DEFINE = 0, KANDR, IN_I) /* 270554 */ \ | |
144 D(include, T_INCLUDE, KANDR, INCL | EXPAND) /* 52262 */ \ | |
145 D(endif, T_ENDIF, KANDR, COND) /* 45855 */ \ | |
146 D(ifdef, T_IFDEF, KANDR, COND | IF_COND) /* 22000 */ \ | |
147 D(if, T_IF, KANDR, COND | IF_COND | EXPAND) /* 18162 */ \ | |
148 D(else, T_ELSE, KANDR, COND) /* 9863 */ \ | |
149 D(ifndef, T_IFNDEF, KANDR, COND | IF_COND) /* 9675 */ \ | |
150 D(undef, T_UNDEF, KANDR, IN_I) /* 4837 */ \ | |
151 D(line, T_LINE, KANDR, EXPAND) /* 2465 */ \ | |
152 D(elif, T_ELIF, STDC89, COND | EXPAND) /* 610 */ \ | |
153 D(error, T_ERROR, STDC89, 0) /* 475 */ \ | |
154 D(pragma, T_PRAGMA, STDC89, IN_I) /* 195 */ \ | |
155 D(warning, T_WARNING, EXTENSION, 0) /* 22 */ \ | |
156 D(include_next, T_INCLUDE_NEXT, EXTENSION, INCL | EXPAND) /* 19 */ \ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
157 D(ident, T_IDENT, EXTENSION, IN_I) /* 11 */ \ |
0 | 158 D(import, T_IMPORT, EXTENSION, INCL | EXPAND) /* 0 ObjC */ \ |
159 D(assert, T_ASSERT, EXTENSION, DEPRECATED) /* 0 SVR4 */ \ | |
160 D(unassert, T_UNASSERT, EXTENSION, DEPRECATED) /* 0 SVR4 */ \ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
161 D(sccs, T_SCCS, EXTENSION, IN_I) /* 0 SVR4? */ |
0 | 162 |
163 /* #sccs is synonymous with #ident. */ | |
164 #define do_sccs do_ident | |
165 | |
166 /* Use the table to generate a series of prototypes, an enum for the | |
167 directive names, and an array of directive handlers. */ | |
168 | |
169 #define D(name, t, o, f) static void do_##name (cpp_reader *); | |
170 DIRECTIVE_TABLE | |
171 #undef D | |
172 | |
173 #define D(n, tag, o, f) tag, | |
174 enum | |
175 { | |
176 DIRECTIVE_TABLE | |
177 N_DIRECTIVES | |
178 }; | |
179 #undef D | |
180 | |
181 #define D(name, t, origin, flags) \ | |
182 { do_##name, (const uchar *) #name, \ | |
183 sizeof #name - 1, origin, flags }, | |
184 static const directive dtable[] = | |
185 { | |
186 DIRECTIVE_TABLE | |
187 }; | |
188 #undef D | |
189 #undef DIRECTIVE_TABLE | |
190 | |
191 /* Wrapper struct directive for linemarkers. | |
192 The origin is more or less true - the original K+R cpp | |
193 did use this notation in its preprocessed output. */ | |
194 static const directive linemarker_dir = | |
195 { | |
196 do_linemarker, UC"#", 1, KANDR, IN_I | |
197 }; | |
198 | |
199 #define SEEN_EOL() (pfile->cur_token[-1].type == CPP_EOF) | |
200 | |
201 /* Skip any remaining tokens in a directive. */ | |
202 static void | |
203 skip_rest_of_line (cpp_reader *pfile) | |
204 { | |
205 /* Discard all stacked contexts. */ | |
206 while (pfile->context->prev) | |
207 _cpp_pop_context (pfile); | |
208 | |
209 /* Sweep up all tokens remaining on the line. */ | |
210 if (! SEEN_EOL ()) | |
211 while (_cpp_lex_token (pfile)->type != CPP_EOF) | |
212 ; | |
213 } | |
214 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
215 /* Ensure there are no stray tokens at the end of a directive. If |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
216 EXPAND is true, tokens macro-expanding to nothing are allowed. */ |
0 | 217 static void |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
218 check_eol (cpp_reader *pfile, bool expand) |
0 | 219 { |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
220 if (! SEEN_EOL () && (expand |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
221 ? cpp_get_token (pfile) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
222 : _cpp_lex_token (pfile))->type != CPP_EOF) |
0 | 223 cpp_error (pfile, CPP_DL_PEDWARN, "extra tokens at end of #%s directive", |
224 pfile->directive->name); | |
225 } | |
226 | |
227 /* Ensure there are no stray tokens other than comments at the end of | |
228 a directive, and gather the comments. */ | |
229 static const cpp_token ** | |
230 check_eol_return_comments (cpp_reader *pfile) | |
231 { | |
232 size_t c; | |
233 size_t capacity = 8; | |
234 const cpp_token **buf; | |
235 | |
236 buf = XNEWVEC (const cpp_token *, capacity); | |
237 c = 0; | |
238 if (! SEEN_EOL ()) | |
239 { | |
240 while (1) | |
241 { | |
242 const cpp_token *tok; | |
243 | |
244 tok = _cpp_lex_token (pfile); | |
245 if (tok->type == CPP_EOF) | |
246 break; | |
247 if (tok->type != CPP_COMMENT) | |
248 cpp_error (pfile, CPP_DL_PEDWARN, | |
249 "extra tokens at end of #%s directive", | |
250 pfile->directive->name); | |
251 else | |
252 { | |
253 if (c + 1 >= capacity) | |
254 { | |
255 capacity *= 2; | |
256 buf = XRESIZEVEC (const cpp_token *, buf, capacity); | |
257 } | |
258 buf[c] = tok; | |
259 ++c; | |
260 } | |
261 } | |
262 } | |
263 buf[c] = NULL; | |
264 return buf; | |
265 } | |
266 | |
267 /* Called when entering a directive, _Pragma or command-line directive. */ | |
268 static void | |
269 start_directive (cpp_reader *pfile) | |
270 { | |
271 /* Setup in-directive state. */ | |
272 pfile->state.in_directive = 1; | |
273 pfile->state.save_comments = 0; | |
274 pfile->directive_result.type = CPP_PADDING; | |
275 | |
276 /* Some handlers need the position of the # for diagnostics. */ | |
277 pfile->directive_line = pfile->line_table->highest_line; | |
278 } | |
279 | |
280 /* Called when leaving a directive, _Pragma or command-line directive. */ | |
281 static void | |
282 end_directive (cpp_reader *pfile, int skip_line) | |
283 { | |
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
|
284 if (CPP_OPTION (pfile, traditional)) |
0 | 285 { |
286 /* Revert change of prepare_directive_trad. */ | |
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
|
287 if (!pfile->state.in_deferred_pragma) |
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
|
288 pfile->state.prevent_expansion--; |
0 | 289 |
290 if (pfile->directive != &dtable[T_DEFINE]) | |
291 _cpp_remove_overlay (pfile); | |
292 } | |
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
|
293 else if (pfile->state.in_deferred_pragma) |
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
|
294 ; |
0 | 295 /* We don't skip for an assembler #. */ |
296 else if (skip_line) | |
297 { | |
298 skip_rest_of_line (pfile); | |
299 if (!pfile->keep_tokens) | |
300 { | |
301 pfile->cur_run = &pfile->base_run; | |
302 pfile->cur_token = pfile->base_run.base; | |
303 } | |
304 } | |
305 | |
306 /* Restore state. */ | |
307 pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments); | |
308 pfile->state.in_directive = 0; | |
309 pfile->state.in_expression = 0; | |
310 pfile->state.angled_headers = 0; | |
311 pfile->directive = 0; | |
312 } | |
313 | |
314 /* Prepare to handle the directive in pfile->directive. */ | |
315 static void | |
316 prepare_directive_trad (cpp_reader *pfile) | |
317 { | |
318 if (pfile->directive != &dtable[T_DEFINE]) | |
319 { | |
320 bool no_expand = (pfile->directive | |
321 && ! (pfile->directive->flags & EXPAND)); | |
322 bool was_skipping = pfile->state.skipping; | |
323 | |
324 pfile->state.in_expression = (pfile->directive == &dtable[T_IF] | |
325 || pfile->directive == &dtable[T_ELIF]); | |
326 if (pfile->state.in_expression) | |
327 pfile->state.skipping = false; | |
328 | |
329 if (no_expand) | |
330 pfile->state.prevent_expansion++; | |
331 _cpp_scan_out_logical_line (pfile, NULL); | |
332 if (no_expand) | |
333 pfile->state.prevent_expansion--; | |
334 | |
335 pfile->state.skipping = was_skipping; | |
336 _cpp_overlay_buffer (pfile, pfile->out.base, | |
337 pfile->out.cur - pfile->out.base); | |
338 } | |
339 | |
340 /* Stop ISO C from expanding anything. */ | |
341 pfile->state.prevent_expansion++; | |
342 } | |
343 | |
344 /* Output diagnostics for a directive DIR. INDENTED is nonzero if | |
345 the '#' was indented. */ | |
346 static void | |
347 directive_diagnostics (cpp_reader *pfile, const directive *dir, int indented) | |
348 { | |
349 /* Issue -pedantic or deprecated warnings for extensions. We let | |
350 -pedantic take precedence if both are applicable. */ | |
351 if (! pfile->state.skipping) | |
352 { | |
353 if (dir->origin == EXTENSION | |
354 && !(dir == &dtable[T_IMPORT] && CPP_OPTION (pfile, objc)) | |
355 && CPP_PEDANTIC (pfile)) | |
356 cpp_error (pfile, CPP_DL_PEDWARN, "#%s is a GCC extension", dir->name); | |
357 else if (((dir->flags & DEPRECATED) != 0 | |
358 || (dir == &dtable[T_IMPORT] && !CPP_OPTION (pfile, objc))) | |
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
|
359 && CPP_OPTION (pfile, cpp_warn_deprecated)) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
360 cpp_warning (pfile, CPP_W_DEPRECATED, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
361 "#%s is a deprecated GCC extension", dir->name); |
0 | 362 } |
363 | |
364 /* Traditionally, a directive is ignored unless its # is in | |
365 column 1. Therefore in code intended to work with K+R | |
366 compilers, directives added by C89 must have their # | |
367 indented, and directives present in traditional C must not. | |
368 This is true even of directives in skipped conditional | |
369 blocks. #elif cannot be used at all. */ | |
370 if (CPP_WTRADITIONAL (pfile)) | |
371 { | |
372 if (dir == &dtable[T_ELIF]) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
373 cpp_warning (pfile, CPP_W_TRADITIONAL, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
374 "suggest not using #elif in traditional C"); |
0 | 375 else if (indented && dir->origin == KANDR) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
376 cpp_warning (pfile, CPP_W_TRADITIONAL, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
377 "traditional C ignores #%s with the # indented", |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
378 dir->name); |
0 | 379 else if (!indented && dir->origin != KANDR) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
380 cpp_warning (pfile, CPP_W_TRADITIONAL, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
381 "suggest hiding #%s from traditional C with an indented #", |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
382 dir->name); |
0 | 383 } |
384 } | |
385 | |
386 /* Check if we have a known directive. INDENTED is nonzero if the | |
387 '#' of the directive was indented. This function is in this file | |
388 to save unnecessarily exporting dtable etc. to lex.c. Returns | |
389 nonzero if the line of tokens has been handled, zero if we should | |
390 continue processing the line. */ | |
391 int | |
392 _cpp_handle_directive (cpp_reader *pfile, int indented) | |
393 { | |
394 const directive *dir = 0; | |
395 const cpp_token *dname; | |
396 bool was_parsing_args = pfile->state.parsing_args; | |
397 bool was_discarding_output = pfile->state.discarding_output; | |
398 int skip = 1; | |
399 | |
400 if (was_discarding_output) | |
401 pfile->state.prevent_expansion = 0; | |
402 | |
403 if (was_parsing_args) | |
404 { | |
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
|
405 if (CPP_OPTION (pfile, cpp_pedantic)) |
0 | 406 cpp_error (pfile, CPP_DL_PEDWARN, |
407 "embedding a directive within macro arguments is not portable"); | |
408 pfile->state.parsing_args = 0; | |
409 pfile->state.prevent_expansion = 0; | |
410 } | |
411 start_directive (pfile); | |
412 dname = _cpp_lex_token (pfile); | |
413 | |
414 if (dname->type == CPP_NAME) | |
415 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
416 if (dname->val.node.node->is_directive) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
417 dir = &dtable[dname->val.node.node->directive_index]; |
0 | 418 } |
419 /* We do not recognize the # followed by a number extension in | |
420 assembler code. */ | |
421 else if (dname->type == CPP_NUMBER && CPP_OPTION (pfile, lang) != CLK_ASM) | |
422 { | |
423 dir = &linemarker_dir; | |
424 if (CPP_PEDANTIC (pfile) && ! CPP_OPTION (pfile, preprocessed) | |
425 && ! pfile->state.skipping) | |
426 cpp_error (pfile, CPP_DL_PEDWARN, | |
427 "style of line directive is a GCC extension"); | |
428 } | |
429 | |
430 if (dir) | |
431 { | |
432 /* If we have a directive that is not an opening conditional, | |
433 invalidate any control macro. */ | |
434 if (! (dir->flags & IF_COND)) | |
435 pfile->mi_valid = false; | |
436 | |
437 /* Kluge alert. In order to be sure that code like this | |
438 | |
439 #define HASH # | |
440 HASH define foo bar | |
441 | |
442 does not cause '#define foo bar' to get executed when | |
443 compiled with -save-temps, we recognize directives in | |
444 -fpreprocessed mode only if the # is in column 1. macro.c | |
445 puts a space in front of any '#' at the start of a macro. | |
446 | |
447 We exclude the -fdirectives-only case because macro expansion | |
448 has not been performed yet, and block comments can cause spaces | |
449 to preceed the directive. */ | |
450 if (CPP_OPTION (pfile, preprocessed) | |
451 && !CPP_OPTION (pfile, directives_only) | |
452 && (indented || !(dir->flags & IN_I))) | |
453 { | |
454 skip = 0; | |
455 dir = 0; | |
456 } | |
457 else | |
458 { | |
459 /* In failed conditional groups, all non-conditional | |
460 directives are ignored. Before doing that, whether | |
461 skipping or not, we should lex angle-bracketed headers | |
462 correctly, and maybe output some diagnostics. */ | |
463 pfile->state.angled_headers = dir->flags & INCL; | |
464 pfile->state.directive_wants_padding = dir->flags & INCL; | |
465 if (! CPP_OPTION (pfile, preprocessed)) | |
466 directive_diagnostics (pfile, dir, indented); | |
467 if (pfile->state.skipping && !(dir->flags & COND)) | |
468 dir = 0; | |
469 } | |
470 } | |
471 else if (dname->type == CPP_EOF) | |
472 ; /* CPP_EOF is the "null directive". */ | |
473 else | |
474 { | |
475 /* An unknown directive. Don't complain about it in assembly | |
476 source: we don't know where the comments are, and # may | |
477 introduce assembler pseudo-ops. Don't complain about invalid | |
478 directives in skipped conditional groups (6.10 p4). */ | |
479 if (CPP_OPTION (pfile, lang) == CLK_ASM) | |
480 skip = 0; | |
481 else if (!pfile->state.skipping) | |
482 cpp_error (pfile, CPP_DL_ERROR, "invalid preprocessing directive #%s", | |
483 cpp_token_as_text (pfile, dname)); | |
484 } | |
485 | |
486 pfile->directive = dir; | |
487 if (CPP_OPTION (pfile, traditional)) | |
488 prepare_directive_trad (pfile); | |
489 | |
490 if (dir) | |
491 pfile->directive->handler (pfile); | |
492 else if (skip == 0) | |
493 _cpp_backup_tokens (pfile, 1); | |
494 | |
495 end_directive (pfile, skip); | |
496 if (was_parsing_args && !pfile->state.in_deferred_pragma) | |
497 { | |
498 /* Restore state when within macro args. */ | |
499 pfile->state.parsing_args = 2; | |
500 pfile->state.prevent_expansion = 1; | |
501 } | |
502 if (was_discarding_output) | |
503 pfile->state.prevent_expansion = 1; | |
504 return skip; | |
505 } | |
506 | |
507 /* Directive handler wrapper used by the command line option | |
508 processor. BUF is \n terminated. */ | |
509 static void | |
510 run_directive (cpp_reader *pfile, int dir_no, const char *buf, size_t count) | |
511 { | |
512 cpp_push_buffer (pfile, (const uchar *) buf, count, | |
513 /* from_stage3 */ true); | |
514 start_directive (pfile); | |
515 | |
516 /* This is a short-term fix to prevent a leading '#' being | |
517 interpreted as a directive. */ | |
518 _cpp_clean_line (pfile); | |
519 | |
520 pfile->directive = &dtable[dir_no]; | |
521 if (CPP_OPTION (pfile, traditional)) | |
522 prepare_directive_trad (pfile); | |
523 pfile->directive->handler (pfile); | |
524 end_directive (pfile, 1); | |
525 _cpp_pop_buffer (pfile); | |
526 } | |
527 | |
528 /* Checks for validity the macro name in #define, #undef, #ifdef and | |
529 #ifndef directives. IS_DEF_OR_UNDEF is true if this call is | |
530 processing a #define or #undefine directive, and false | |
531 otherwise. */ | |
532 static cpp_hashnode * | |
533 lex_macro_node (cpp_reader *pfile, bool is_def_or_undef) | |
534 { | |
535 const cpp_token *token = _cpp_lex_token (pfile); | |
536 | |
537 /* The token immediately after #define must be an identifier. That | |
538 identifier may not be "defined", per C99 6.10.8p4. | |
539 In C++, it may not be any of the "named operators" either, | |
540 per C++98 [lex.digraph], [lex.key]. | |
541 Finally, the identifier may not have been poisoned. (In that case | |
542 the lexer has issued the error message for us.) */ | |
543 | |
544 if (token->type == CPP_NAME) | |
545 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
546 cpp_hashnode *node = token->val.node.node; |
0 | 547 |
548 if (is_def_or_undef && node == pfile->spec_nodes.n_defined) | |
549 cpp_error (pfile, CPP_DL_ERROR, | |
550 "\"defined\" cannot be used as a macro name"); | |
551 else if (! (node->flags & NODE_POISONED)) | |
552 return node; | |
553 } | |
554 else if (token->flags & NAMED_OP) | |
555 cpp_error (pfile, CPP_DL_ERROR, | |
556 "\"%s\" cannot be used as a macro name as it is an operator in C++", | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
557 NODE_NAME (token->val.node.node)); |
0 | 558 else if (token->type == CPP_EOF) |
559 cpp_error (pfile, CPP_DL_ERROR, "no macro name given in #%s directive", | |
560 pfile->directive->name); | |
561 else | |
562 cpp_error (pfile, CPP_DL_ERROR, "macro names must be identifiers"); | |
563 | |
564 return NULL; | |
565 } | |
566 | |
567 /* Process a #define directive. Most work is done in macro.c. */ | |
568 static void | |
569 do_define (cpp_reader *pfile) | |
570 { | |
571 cpp_hashnode *node = lex_macro_node (pfile, true); | |
572 | |
573 if (node) | |
574 { | |
575 /* If we have been requested to expand comments into macros, | |
576 then re-enable saving of comments. */ | |
577 pfile->state.save_comments = | |
578 ! CPP_OPTION (pfile, discard_comments_in_macro_exp); | |
579 | |
580 if (pfile->cb.before_define) | |
581 pfile->cb.before_define (pfile); | |
582 | |
583 if (_cpp_create_definition (pfile, node)) | |
584 if (pfile->cb.define) | |
585 pfile->cb.define (pfile, pfile->directive_line, node); | |
586 | |
587 node->flags &= ~NODE_USED; | |
588 } | |
589 } | |
590 | |
591 /* Handle #undef. Mark the identifier NT_VOID in the hash table. */ | |
592 static void | |
593 do_undef (cpp_reader *pfile) | |
594 { | |
595 cpp_hashnode *node = lex_macro_node (pfile, true); | |
596 | |
597 if (node) | |
598 { | |
599 if (pfile->cb.before_define) | |
600 pfile->cb.before_define (pfile); | |
601 | |
602 if (pfile->cb.undef) | |
603 pfile->cb.undef (pfile, pfile->directive_line, node); | |
604 | |
605 /* 6.10.3.5 paragraph 2: [#undef] is ignored if the specified | |
606 identifier is not currently defined as a macro name. */ | |
607 if (node->type == NT_MACRO) | |
608 { | |
609 if (node->flags & NODE_WARN) | |
610 cpp_error (pfile, CPP_DL_WARNING, | |
611 "undefining \"%s\"", NODE_NAME (node)); | |
612 | |
613 if (CPP_OPTION (pfile, warn_unused_macros)) | |
614 _cpp_warn_if_unused_macro (pfile, node, NULL); | |
615 | |
616 _cpp_free_definition (node); | |
617 } | |
618 } | |
619 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
620 check_eol (pfile, false); |
0 | 621 } |
622 | |
623 /* Undefine a single macro/assertion/whatever. */ | |
624 | |
625 static int | |
626 undefine_macros (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *h, | |
627 void *data_p ATTRIBUTE_UNUSED) | |
628 { | |
629 /* Body of _cpp_free_definition inlined here for speed. | |
630 Macros and assertions no longer have anything to free. */ | |
631 h->type = NT_VOID; | |
632 h->flags &= ~(NODE_POISONED|NODE_BUILTIN|NODE_DISABLED|NODE_USED); | |
633 return 1; | |
634 } | |
635 | |
636 /* Undefine all macros and assertions. */ | |
637 | |
638 void | |
639 cpp_undef_all (cpp_reader *pfile) | |
640 { | |
641 cpp_forall_identifiers (pfile, undefine_macros, NULL); | |
642 } | |
643 | |
644 | |
645 /* Helper routine used by parse_include. Reinterpret the current line | |
646 as an h-char-sequence (< ... >); we are looking at the first token | |
647 after the <. Returns a malloced filename. */ | |
648 static char * | |
649 glue_header_name (cpp_reader *pfile) | |
650 { | |
651 const cpp_token *token; | |
652 char *buffer; | |
653 size_t len, total_len = 0, capacity = 1024; | |
654 | |
655 /* To avoid lexed tokens overwriting our glued name, we can only | |
656 allocate from the string pool once we've lexed everything. */ | |
657 buffer = XNEWVEC (char, capacity); | |
658 for (;;) | |
659 { | |
660 token = get_token_no_padding (pfile); | |
661 | |
662 if (token->type == CPP_GREATER) | |
663 break; | |
664 if (token->type == CPP_EOF) | |
665 { | |
666 cpp_error (pfile, CPP_DL_ERROR, "missing terminating > character"); | |
667 break; | |
668 } | |
669 | |
670 len = cpp_token_len (token) + 2; /* Leading space, terminating \0. */ | |
671 if (total_len + len > capacity) | |
672 { | |
673 capacity = (capacity + len) * 2; | |
674 buffer = XRESIZEVEC (char, buffer, capacity); | |
675 } | |
676 | |
677 if (token->flags & PREV_WHITE) | |
678 buffer[total_len++] = ' '; | |
679 | |
680 total_len = (cpp_spell_token (pfile, token, (uchar *) &buffer[total_len], | |
681 true) | |
682 - (uchar *) buffer); | |
683 } | |
684 | |
685 buffer[total_len] = '\0'; | |
686 return buffer; | |
687 } | |
688 | |
689 /* Returns the file name of #include, #include_next, #import and | |
690 #pragma dependency. The string is malloced and the caller should | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
691 free it. Returns NULL on error. LOCATION is the source location |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
692 of the file name. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
693 |
0 | 694 static const char * |
695 parse_include (cpp_reader *pfile, int *pangle_brackets, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
696 const cpp_token ***buf, source_location *location) |
0 | 697 { |
698 char *fname; | |
699 const cpp_token *header; | |
700 | |
701 /* Allow macro expansion. */ | |
702 header = get_token_no_padding (pfile); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
703 *location = header->src_loc; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
704 if ((header->type == CPP_STRING && header->val.str.text[0] != 'R') |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
705 || header->type == CPP_HEADER_NAME) |
0 | 706 { |
707 fname = XNEWVEC (char, header->val.str.len - 1); | |
708 memcpy (fname, header->val.str.text + 1, header->val.str.len - 2); | |
709 fname[header->val.str.len - 2] = '\0'; | |
710 *pangle_brackets = header->type == CPP_HEADER_NAME; | |
711 } | |
712 else if (header->type == CPP_LESS) | |
713 { | |
714 fname = glue_header_name (pfile); | |
715 *pangle_brackets = 1; | |
716 } | |
717 else | |
718 { | |
719 const unsigned char *dir; | |
720 | |
721 if (pfile->directive == &dtable[T_PRAGMA]) | |
722 dir = UC"pragma dependency"; | |
723 else | |
724 dir = pfile->directive->name; | |
725 cpp_error (pfile, CPP_DL_ERROR, "#%s expects \"FILENAME\" or <FILENAME>", | |
726 dir); | |
727 | |
728 return NULL; | |
729 } | |
730 | |
731 if (pfile->directive == &dtable[T_PRAGMA]) | |
732 { | |
733 /* This pragma allows extra tokens after the file name. */ | |
734 } | |
735 else if (buf == NULL || CPP_OPTION (pfile, discard_comments)) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
736 check_eol (pfile, true); |
0 | 737 else |
738 { | |
739 /* If we are not discarding comments, then gather them while | |
740 doing the eol check. */ | |
741 *buf = check_eol_return_comments (pfile); | |
742 } | |
743 | |
744 return fname; | |
745 } | |
746 | |
747 /* Handle #include, #include_next and #import. */ | |
748 static void | |
749 do_include_common (cpp_reader *pfile, enum include_type type) | |
750 { | |
751 const char *fname; | |
752 int angle_brackets; | |
753 const cpp_token **buf = NULL; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
754 source_location location; |
0 | 755 |
756 /* Re-enable saving of comments if requested, so that the include | |
757 callback can dump comments which follow #include. */ | |
758 pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments); | |
759 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
760 fname = parse_include (pfile, &angle_brackets, &buf, &location); |
0 | 761 if (!fname) |
762 { | |
763 if (buf) | |
764 XDELETEVEC (buf); | |
765 return; | |
766 } | |
767 | |
768 if (!*fname) | |
769 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
770 cpp_error_with_line (pfile, CPP_DL_ERROR, location, 0, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
771 "empty filename in #%s", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
772 pfile->directive->name); |
0 | 773 XDELETEVEC (fname); |
774 if (buf) | |
775 XDELETEVEC (buf); | |
776 return; | |
777 } | |
778 | |
779 /* Prevent #include recursion. */ | |
780 if (pfile->line_table->depth >= CPP_STACK_MAX) | |
781 cpp_error (pfile, CPP_DL_ERROR, "#include nested too deeply"); | |
782 else | |
783 { | |
784 /* Get out of macro context, if we are. */ | |
785 skip_rest_of_line (pfile); | |
786 | |
787 if (pfile->cb.include) | |
788 pfile->cb.include (pfile, pfile->directive_line, | |
789 pfile->directive->name, fname, angle_brackets, | |
790 buf); | |
791 | |
792 _cpp_stack_include (pfile, fname, angle_brackets, type); | |
793 } | |
794 | |
795 XDELETEVEC (fname); | |
796 if (buf) | |
797 XDELETEVEC (buf); | |
798 } | |
799 | |
800 static void | |
801 do_include (cpp_reader *pfile) | |
802 { | |
803 do_include_common (pfile, IT_INCLUDE); | |
804 } | |
805 | |
806 static void | |
807 do_import (cpp_reader *pfile) | |
808 { | |
809 do_include_common (pfile, IT_IMPORT); | |
810 } | |
811 | |
812 static void | |
813 do_include_next (cpp_reader *pfile) | |
814 { | |
815 enum include_type type = IT_INCLUDE_NEXT; | |
816 | |
817 /* If this is the primary source file, warn and use the normal | |
818 search logic. */ | |
819 if (cpp_in_primary_file (pfile)) | |
820 { | |
821 cpp_error (pfile, CPP_DL_WARNING, | |
822 "#include_next in primary source file"); | |
823 type = IT_INCLUDE; | |
824 } | |
825 do_include_common (pfile, type); | |
826 } | |
827 | |
828 /* Subroutine of do_linemarker. Read possible flags after file name. | |
829 LAST is the last flag seen; 0 if this is the first flag. Return the | |
830 flag if it is valid, 0 at the end of the directive. Otherwise | |
831 complain. */ | |
832 static unsigned int | |
833 read_flag (cpp_reader *pfile, unsigned int last) | |
834 { | |
835 const cpp_token *token = _cpp_lex_token (pfile); | |
836 | |
837 if (token->type == CPP_NUMBER && token->val.str.len == 1) | |
838 { | |
839 unsigned int flag = token->val.str.text[0] - '0'; | |
840 | |
841 if (flag > last && flag <= 4 | |
842 && (flag != 4 || last == 3) | |
843 && (flag != 2 || last == 0)) | |
844 return flag; | |
845 } | |
846 | |
847 if (token->type != CPP_EOF) | |
848 cpp_error (pfile, CPP_DL_ERROR, "invalid flag \"%s\" in line directive", | |
849 cpp_token_as_text (pfile, token)); | |
850 return 0; | |
851 } | |
852 | |
853 /* Subroutine of do_line and do_linemarker. Convert a number in STR, | |
854 of length LEN, to binary; store it in NUMP, and return false if the | |
855 number was well-formed, true if not. WRAPPED is set to true if the | |
856 number did not fit into 'unsigned long'. */ | |
857 static bool | |
858 strtolinenum (const uchar *str, size_t len, linenum_type *nump, bool *wrapped) | |
859 { | |
860 linenum_type reg = 0; | |
861 linenum_type reg_prev = 0; | |
862 | |
863 uchar c; | |
864 *wrapped = false; | |
865 while (len--) | |
866 { | |
867 c = *str++; | |
868 if (!ISDIGIT (c)) | |
869 return true; | |
870 reg *= 10; | |
871 reg += c - '0'; | |
872 if (reg < reg_prev) | |
873 *wrapped = true; | |
874 reg_prev = reg; | |
875 } | |
876 *nump = reg; | |
877 return false; | |
878 } | |
879 | |
880 /* Interpret #line command. | |
881 Note that the filename string (if any) is a true string constant | |
882 (escapes are interpreted), unlike in #line. */ | |
883 static void | |
884 do_line (cpp_reader *pfile) | |
885 { | |
886 const struct line_maps *line_table = pfile->line_table; | |
887 const struct line_map *map = &line_table->maps[line_table->used - 1]; | |
888 | |
889 /* skip_rest_of_line() may cause line table to be realloc()ed so note down | |
890 sysp right now. */ | |
891 | |
892 unsigned char map_sysp = map->sysp; | |
893 const cpp_token *token; | |
894 const char *new_file = map->to_file; | |
895 linenum_type new_lineno; | |
896 | |
897 /* C99 raised the minimum limit on #line numbers. */ | |
898 linenum_type cap = CPP_OPTION (pfile, c99) ? 2147483647 : 32767; | |
899 bool wrapped; | |
900 | |
901 /* #line commands expand macros. */ | |
902 token = cpp_get_token (pfile); | |
903 if (token->type != CPP_NUMBER | |
904 || strtolinenum (token->val.str.text, token->val.str.len, | |
905 &new_lineno, &wrapped)) | |
906 { | |
907 if (token->type == CPP_EOF) | |
908 cpp_error (pfile, CPP_DL_ERROR, "unexpected end of file after #line"); | |
909 else | |
910 cpp_error (pfile, CPP_DL_ERROR, | |
911 "\"%s\" after #line is not a positive integer", | |
912 cpp_token_as_text (pfile, token)); | |
913 return; | |
914 } | |
915 | |
916 if (CPP_PEDANTIC (pfile) && (new_lineno == 0 || new_lineno > cap || wrapped)) | |
917 cpp_error (pfile, CPP_DL_PEDWARN, "line number out of range"); | |
918 else if (wrapped) | |
919 cpp_error (pfile, CPP_DL_WARNING, "line number out of range"); | |
920 | |
921 token = cpp_get_token (pfile); | |
922 if (token->type == CPP_STRING) | |
923 { | |
924 cpp_string s = { 0, 0 }; | |
925 if (cpp_interpret_string_notranslate (pfile, &token->val.str, 1, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
926 &s, CPP_STRING)) |
0 | 927 new_file = (const char *)s.text; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
928 check_eol (pfile, true); |
0 | 929 } |
930 else if (token->type != CPP_EOF) | |
931 { | |
932 cpp_error (pfile, CPP_DL_ERROR, "\"%s\" is not a valid filename", | |
933 cpp_token_as_text (pfile, token)); | |
934 return; | |
935 } | |
936 | |
937 skip_rest_of_line (pfile); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
938 _cpp_do_file_change (pfile, LC_RENAME_VERBATIM, new_file, new_lineno, |
0 | 939 map_sysp); |
940 } | |
941 | |
942 /* Interpret the # 44 "file" [flags] notation, which has slightly | |
943 different syntax and semantics from #line: Flags are allowed, | |
944 and we never complain about the line number being too big. */ | |
945 static void | |
946 do_linemarker (cpp_reader *pfile) | |
947 { | |
948 const struct line_maps *line_table = pfile->line_table; | |
949 const struct line_map *map = &line_table->maps[line_table->used - 1]; | |
950 const cpp_token *token; | |
951 const char *new_file = map->to_file; | |
952 linenum_type new_lineno; | |
953 unsigned int new_sysp = map->sysp; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
954 enum lc_reason reason = LC_RENAME_VERBATIM; |
0 | 955 int flag; |
956 bool wrapped; | |
957 | |
958 /* Back up so we can get the number again. Putting this in | |
959 _cpp_handle_directive risks two calls to _cpp_backup_tokens in | |
960 some circumstances, which can segfault. */ | |
961 _cpp_backup_tokens (pfile, 1); | |
962 | |
963 /* #line commands expand macros. */ | |
964 token = cpp_get_token (pfile); | |
965 if (token->type != CPP_NUMBER | |
966 || strtolinenum (token->val.str.text, token->val.str.len, | |
967 &new_lineno, &wrapped)) | |
968 { | |
969 /* Unlike #line, there does not seem to be a way to get an EOF | |
970 here. So, it should be safe to always spell the token. */ | |
971 cpp_error (pfile, CPP_DL_ERROR, | |
972 "\"%s\" after # is not a positive integer", | |
973 cpp_token_as_text (pfile, token)); | |
974 return; | |
975 } | |
976 | |
977 token = cpp_get_token (pfile); | |
978 if (token->type == CPP_STRING) | |
979 { | |
980 cpp_string s = { 0, 0 }; | |
981 if (cpp_interpret_string_notranslate (pfile, &token->val.str, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
982 1, &s, CPP_STRING)) |
0 | 983 new_file = (const char *)s.text; |
984 | |
985 new_sysp = 0; | |
986 flag = read_flag (pfile, 0); | |
987 if (flag == 1) | |
988 { | |
989 reason = LC_ENTER; | |
990 /* Fake an include for cpp_included (). */ | |
991 _cpp_fake_include (pfile, new_file); | |
992 flag = read_flag (pfile, flag); | |
993 } | |
994 else if (flag == 2) | |
995 { | |
996 reason = LC_LEAVE; | |
997 flag = read_flag (pfile, flag); | |
998 } | |
999 if (flag == 3) | |
1000 { | |
1001 new_sysp = 1; | |
1002 flag = read_flag (pfile, flag); | |
1003 if (flag == 4) | |
1004 new_sysp = 2; | |
1005 } | |
1006 pfile->buffer->sysp = new_sysp; | |
1007 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1008 check_eol (pfile, false); |
0 | 1009 } |
1010 else if (token->type != CPP_EOF) | |
1011 { | |
1012 cpp_error (pfile, CPP_DL_ERROR, "\"%s\" is not a valid filename", | |
1013 cpp_token_as_text (pfile, token)); | |
1014 return; | |
1015 } | |
1016 | |
1017 skip_rest_of_line (pfile); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1018 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1019 /* Compensate for the increment in linemap_add that occurs in |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1020 _cpp_do_file_change. We're currently at the start of the line |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1021 *following* the #line directive. A separate source_location for this |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1022 location makes no sense (until we do the LC_LEAVE), and |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1023 complicates LAST_SOURCE_LINE_LOCATION. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1024 pfile->line_table->highest_location--; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1025 |
0 | 1026 _cpp_do_file_change (pfile, reason, new_file, new_lineno, new_sysp); |
1027 } | |
1028 | |
1029 /* Arrange the file_change callback. pfile->line has changed to | |
1030 FILE_LINE of TO_FILE, for reason REASON. SYSP is 1 for a system | |
1031 header, 2 for a system header that needs to be extern "C" protected, | |
1032 and zero otherwise. */ | |
1033 void | |
1034 _cpp_do_file_change (cpp_reader *pfile, enum lc_reason reason, | |
1035 const char *to_file, linenum_type file_line, | |
1036 unsigned int sysp) | |
1037 { | |
1038 const struct line_map *map = linemap_add (pfile->line_table, reason, sysp, | |
1039 to_file, file_line); | |
1040 if (map != NULL) | |
1041 linemap_line_start (pfile->line_table, map->to_line, 127); | |
1042 | |
1043 if (pfile->cb.file_change) | |
1044 pfile->cb.file_change (pfile, map); | |
1045 } | |
1046 | |
1047 /* Report a warning or error detected by the program we are | |
1048 processing. Use the directive's tokens in the error message. */ | |
1049 static void | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1050 do_diagnostic (cpp_reader *pfile, int code, int reason, int print_dir) |
0 | 1051 { |
1052 const unsigned char *dir_name; | |
1053 unsigned char *line; | |
1054 source_location src_loc = pfile->cur_token[-1].src_loc; | |
1055 | |
1056 if (print_dir) | |
1057 dir_name = pfile->directive->name; | |
1058 else | |
1059 dir_name = NULL; | |
1060 pfile->state.prevent_expansion++; | |
1061 line = cpp_output_line_to_string (pfile, dir_name); | |
1062 pfile->state.prevent_expansion--; | |
1063 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1064 if (code == CPP_DL_WARNING_SYSHDR && reason) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1065 cpp_warning_with_line_syshdr (pfile, reason, src_loc, 0, "%s", line); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1066 else if (code == CPP_DL_WARNING && reason) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1067 cpp_warning_with_line (pfile, reason, src_loc, 0, "%s", line); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1068 else |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1069 cpp_error_with_line (pfile, code, src_loc, 0, "%s", line); |
0 | 1070 free (line); |
1071 } | |
1072 | |
1073 static void | |
1074 do_error (cpp_reader *pfile) | |
1075 { | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1076 do_diagnostic (pfile, CPP_DL_ERROR, 0, 1); |
0 | 1077 } |
1078 | |
1079 static void | |
1080 do_warning (cpp_reader *pfile) | |
1081 { | |
1082 /* We want #warning diagnostics to be emitted in system headers too. */ | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1083 do_diagnostic (pfile, CPP_DL_WARNING_SYSHDR, CPP_W_WARNING_DIRECTIVE, 1); |
0 | 1084 } |
1085 | |
1086 /* Report program identification. */ | |
1087 static void | |
1088 do_ident (cpp_reader *pfile) | |
1089 { | |
1090 const cpp_token *str = cpp_get_token (pfile); | |
1091 | |
1092 if (str->type != CPP_STRING) | |
1093 cpp_error (pfile, CPP_DL_ERROR, "invalid #%s directive", | |
1094 pfile->directive->name); | |
1095 else if (pfile->cb.ident) | |
1096 pfile->cb.ident (pfile, pfile->directive_line, &str->val.str); | |
1097 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1098 check_eol (pfile, false); |
0 | 1099 } |
1100 | |
1101 /* Lookup a PRAGMA name in a singly-linked CHAIN. Returns the | |
1102 matching entry, or NULL if none is found. The returned entry could | |
1103 be the start of a namespace chain, or a pragma. */ | |
1104 static struct pragma_entry * | |
1105 lookup_pragma_entry (struct pragma_entry *chain, const cpp_hashnode *pragma) | |
1106 { | |
1107 while (chain && chain->pragma != pragma) | |
1108 chain = chain->next; | |
1109 | |
1110 return chain; | |
1111 } | |
1112 | |
1113 /* Create and insert a blank pragma entry at the beginning of a | |
1114 singly-linked CHAIN. */ | |
1115 static struct pragma_entry * | |
1116 new_pragma_entry (cpp_reader *pfile, struct pragma_entry **chain) | |
1117 { | |
1118 struct pragma_entry *new_entry; | |
1119 | |
1120 new_entry = (struct pragma_entry *) | |
1121 _cpp_aligned_alloc (pfile, sizeof (struct pragma_entry)); | |
1122 | |
1123 memset (new_entry, 0, sizeof (struct pragma_entry)); | |
1124 new_entry->next = *chain; | |
1125 | |
1126 *chain = new_entry; | |
1127 return new_entry; | |
1128 } | |
1129 | |
1130 /* Register a pragma NAME in namespace SPACE. If SPACE is null, it | |
1131 goes in the global namespace. */ | |
1132 static struct pragma_entry * | |
1133 register_pragma_1 (cpp_reader *pfile, const char *space, const char *name, | |
1134 bool allow_name_expansion) | |
1135 { | |
1136 struct pragma_entry **chain = &pfile->pragmas; | |
1137 struct pragma_entry *entry; | |
1138 const cpp_hashnode *node; | |
1139 | |
1140 if (space) | |
1141 { | |
1142 node = cpp_lookup (pfile, UC space, strlen (space)); | |
1143 entry = lookup_pragma_entry (*chain, node); | |
1144 if (!entry) | |
1145 { | |
1146 entry = new_pragma_entry (pfile, chain); | |
1147 entry->pragma = node; | |
1148 entry->is_nspace = true; | |
1149 entry->allow_expansion = allow_name_expansion; | |
1150 } | |
1151 else if (!entry->is_nspace) | |
1152 goto clash; | |
1153 else if (entry->allow_expansion != allow_name_expansion) | |
1154 { | |
1155 cpp_error (pfile, CPP_DL_ICE, | |
1156 "registering pragmas in namespace \"%s\" with mismatched " | |
1157 "name expansion", space); | |
1158 return NULL; | |
1159 } | |
1160 chain = &entry->u.space; | |
1161 } | |
1162 else if (allow_name_expansion) | |
1163 { | |
1164 cpp_error (pfile, CPP_DL_ICE, | |
1165 "registering pragma \"%s\" with name expansion " | |
1166 "and no namespace", name); | |
1167 return NULL; | |
1168 } | |
1169 | |
1170 /* Check for duplicates. */ | |
1171 node = cpp_lookup (pfile, UC name, strlen (name)); | |
1172 entry = lookup_pragma_entry (*chain, node); | |
1173 if (entry == NULL) | |
1174 { | |
1175 entry = new_pragma_entry (pfile, chain); | |
1176 entry->pragma = node; | |
1177 return entry; | |
1178 } | |
1179 | |
1180 if (entry->is_nspace) | |
1181 clash: | |
1182 cpp_error (pfile, CPP_DL_ICE, | |
1183 "registering \"%s\" as both a pragma and a pragma namespace", | |
1184 NODE_NAME (node)); | |
1185 else if (space) | |
1186 cpp_error (pfile, CPP_DL_ICE, "#pragma %s %s is already registered", | |
1187 space, name); | |
1188 else | |
1189 cpp_error (pfile, CPP_DL_ICE, "#pragma %s is already registered", name); | |
1190 | |
1191 return NULL; | |
1192 } | |
1193 | |
1194 /* Register a cpplib internal pragma SPACE NAME with HANDLER. */ | |
1195 static void | |
1196 register_pragma_internal (cpp_reader *pfile, const char *space, | |
1197 const char *name, pragma_cb handler) | |
1198 { | |
1199 struct pragma_entry *entry; | |
1200 | |
1201 entry = register_pragma_1 (pfile, space, name, false); | |
1202 entry->is_internal = true; | |
1203 entry->u.handler = handler; | |
1204 } | |
1205 | |
1206 /* Register a pragma NAME in namespace SPACE. If SPACE is null, it | |
1207 goes in the global namespace. HANDLER is the handler it will call, | |
1208 which must be non-NULL. If ALLOW_EXPANSION is set, allow macro | |
1209 expansion while parsing pragma NAME. This function is exported | |
1210 from libcpp. */ | |
1211 void | |
1212 cpp_register_pragma (cpp_reader *pfile, const char *space, const char *name, | |
1213 pragma_cb handler, bool allow_expansion) | |
1214 { | |
1215 struct pragma_entry *entry; | |
1216 | |
1217 if (!handler) | |
1218 { | |
1219 cpp_error (pfile, CPP_DL_ICE, "registering pragma with NULL handler"); | |
1220 return; | |
1221 } | |
1222 | |
1223 entry = register_pragma_1 (pfile, space, name, false); | |
1224 if (entry) | |
1225 { | |
1226 entry->allow_expansion = allow_expansion; | |
1227 entry->u.handler = handler; | |
1228 } | |
1229 } | |
1230 | |
1231 /* Similarly, but create mark the pragma for deferred processing. | |
1232 When found, a CPP_PRAGMA token will be insertted into the stream | |
1233 with IDENT in the token->u.pragma slot. */ | |
1234 void | |
1235 cpp_register_deferred_pragma (cpp_reader *pfile, const char *space, | |
1236 const char *name, unsigned int ident, | |
1237 bool allow_expansion, bool allow_name_expansion) | |
1238 { | |
1239 struct pragma_entry *entry; | |
1240 | |
1241 entry = register_pragma_1 (pfile, space, name, allow_name_expansion); | |
1242 if (entry) | |
1243 { | |
1244 entry->is_deferred = true; | |
1245 entry->allow_expansion = allow_expansion; | |
1246 entry->u.ident = ident; | |
1247 } | |
1248 } | |
1249 | |
1250 /* Register the pragmas the preprocessor itself handles. */ | |
1251 void | |
1252 _cpp_init_internal_pragmas (cpp_reader *pfile) | |
1253 { | |
1254 /* Pragmas in the global namespace. */ | |
1255 register_pragma_internal (pfile, 0, "once", do_pragma_once); | |
47
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1256 register_pragma_internal (pfile, 0, "push_macro", do_pragma_push_macro); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1257 register_pragma_internal (pfile, 0, "pop_macro", do_pragma_pop_macro); |
0 | 1258 |
1259 /* New GCC-specific pragmas should be put in the GCC namespace. */ | |
1260 register_pragma_internal (pfile, "GCC", "poison", do_pragma_poison); | |
1261 register_pragma_internal (pfile, "GCC", "system_header", | |
1262 do_pragma_system_header); | |
1263 register_pragma_internal (pfile, "GCC", "dependency", do_pragma_dependency); | |
1264 } | |
1265 | |
1266 /* Return the number of registered pragmas in PE. */ | |
1267 | |
1268 static int | |
1269 count_registered_pragmas (struct pragma_entry *pe) | |
1270 { | |
1271 int ct = 0; | |
1272 for (; pe != NULL; pe = pe->next) | |
1273 { | |
1274 if (pe->is_nspace) | |
1275 ct += count_registered_pragmas (pe->u.space); | |
1276 ct++; | |
1277 } | |
1278 return ct; | |
1279 } | |
1280 | |
1281 /* Save into SD the names of the registered pragmas referenced by PE, | |
1282 and return a pointer to the next free space in SD. */ | |
1283 | |
1284 static char ** | |
1285 save_registered_pragmas (struct pragma_entry *pe, char **sd) | |
1286 { | |
1287 for (; pe != NULL; pe = pe->next) | |
1288 { | |
1289 if (pe->is_nspace) | |
1290 sd = save_registered_pragmas (pe->u.space, sd); | |
1291 *sd++ = (char *) xmemdup (HT_STR (&pe->pragma->ident), | |
1292 HT_LEN (&pe->pragma->ident), | |
1293 HT_LEN (&pe->pragma->ident) + 1); | |
1294 } | |
1295 return sd; | |
1296 } | |
1297 | |
1298 /* Return a newly-allocated array which saves the names of the | |
1299 registered pragmas. */ | |
1300 | |
1301 char ** | |
1302 _cpp_save_pragma_names (cpp_reader *pfile) | |
1303 { | |
1304 int ct = count_registered_pragmas (pfile->pragmas); | |
1305 char **result = XNEWVEC (char *, ct); | |
1306 (void) save_registered_pragmas (pfile->pragmas, result); | |
1307 return result; | |
1308 } | |
1309 | |
1310 /* Restore from SD the names of the registered pragmas referenced by PE, | |
1311 and return a pointer to the next unused name in SD. */ | |
1312 | |
1313 static char ** | |
1314 restore_registered_pragmas (cpp_reader *pfile, struct pragma_entry *pe, | |
1315 char **sd) | |
1316 { | |
1317 for (; pe != NULL; pe = pe->next) | |
1318 { | |
1319 if (pe->is_nspace) | |
1320 sd = restore_registered_pragmas (pfile, pe->u.space, sd); | |
1321 pe->pragma = cpp_lookup (pfile, UC *sd, strlen (*sd)); | |
1322 free (*sd); | |
1323 sd++; | |
1324 } | |
1325 return sd; | |
1326 } | |
1327 | |
1328 /* Restore the names of the registered pragmas from SAVED. */ | |
1329 | |
1330 void | |
1331 _cpp_restore_pragma_names (cpp_reader *pfile, char **saved) | |
1332 { | |
1333 (void) restore_registered_pragmas (pfile, pfile->pragmas, saved); | |
1334 free (saved); | |
1335 } | |
1336 | |
1337 /* Pragmata handling. We handle some, and pass the rest on to the | |
1338 front end. C99 defines three pragmas and says that no macro | |
1339 expansion is to be performed on them; whether or not macro | |
1340 expansion happens for other pragmas is implementation defined. | |
1341 This implementation allows for a mix of both, since GCC did not | |
1342 traditionally macro expand its (few) pragmas, whereas OpenMP | |
1343 specifies that macro expansion should happen. */ | |
1344 static void | |
1345 do_pragma (cpp_reader *pfile) | |
1346 { | |
1347 const struct pragma_entry *p = NULL; | |
1348 const cpp_token *token, *pragma_token = pfile->cur_token; | |
1349 cpp_token ns_token; | |
1350 unsigned int count = 1; | |
1351 | |
1352 pfile->state.prevent_expansion++; | |
1353 | |
1354 token = cpp_get_token (pfile); | |
1355 ns_token = *token; | |
1356 if (token->type == CPP_NAME) | |
1357 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1358 p = lookup_pragma_entry (pfile->pragmas, token->val.node.node); |
0 | 1359 if (p && p->is_nspace) |
1360 { | |
1361 bool allow_name_expansion = p->allow_expansion; | |
1362 if (allow_name_expansion) | |
1363 pfile->state.prevent_expansion--; | |
1364 token = cpp_get_token (pfile); | |
1365 if (token->type == CPP_NAME) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1366 p = lookup_pragma_entry (p->u.space, token->val.node.node); |
0 | 1367 else |
1368 p = NULL; | |
1369 if (allow_name_expansion) | |
1370 pfile->state.prevent_expansion++; | |
1371 count = 2; | |
1372 } | |
1373 } | |
1374 | |
1375 if (p) | |
1376 { | |
1377 if (p->is_deferred) | |
1378 { | |
1379 pfile->directive_result.src_loc = pragma_token->src_loc; | |
1380 pfile->directive_result.type = CPP_PRAGMA; | |
1381 pfile->directive_result.flags = pragma_token->flags; | |
1382 pfile->directive_result.val.pragma = p->u.ident; | |
1383 pfile->state.in_deferred_pragma = true; | |
1384 pfile->state.pragma_allow_expansion = p->allow_expansion; | |
1385 if (!p->allow_expansion) | |
1386 pfile->state.prevent_expansion++; | |
1387 } | |
1388 else | |
1389 { | |
1390 /* Since the handler below doesn't get the line number, that | |
1391 it might need for diagnostics, make sure it has the right | |
1392 numbers in place. */ | |
1393 if (pfile->cb.line_change) | |
1394 (*pfile->cb.line_change) (pfile, pragma_token, false); | |
1395 if (p->allow_expansion) | |
1396 pfile->state.prevent_expansion--; | |
1397 (*p->u.handler) (pfile); | |
1398 if (p->allow_expansion) | |
1399 pfile->state.prevent_expansion++; | |
1400 } | |
1401 } | |
1402 else if (pfile->cb.def_pragma) | |
1403 { | |
1404 if (count == 1 || pfile->context->prev == NULL) | |
1405 _cpp_backup_tokens (pfile, count); | |
1406 else | |
1407 { | |
1408 /* Invalid name comes from macro expansion, _cpp_backup_tokens | |
1409 won't allow backing 2 tokens. */ | |
1410 /* ??? The token buffer is leaked. Perhaps if def_pragma hook | |
1411 reads both tokens, we could perhaps free it, but if it doesn't, | |
1412 we don't know the exact lifespan. */ | |
1413 cpp_token *toks = XNEWVEC (cpp_token, 2); | |
1414 toks[0] = ns_token; | |
1415 toks[0].flags |= NO_EXPAND; | |
1416 toks[1] = *token; | |
1417 toks[1].flags |= NO_EXPAND; | |
1418 _cpp_push_token_context (pfile, NULL, toks, 2); | |
1419 } | |
1420 pfile->cb.def_pragma (pfile, pfile->directive_line); | |
1421 } | |
1422 | |
1423 pfile->state.prevent_expansion--; | |
1424 } | |
1425 | |
1426 /* Handle #pragma once. */ | |
1427 static void | |
1428 do_pragma_once (cpp_reader *pfile) | |
1429 { | |
1430 if (cpp_in_primary_file (pfile)) | |
1431 cpp_error (pfile, CPP_DL_WARNING, "#pragma once in main file"); | |
1432 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1433 check_eol (pfile, false); |
0 | 1434 _cpp_mark_file_once_only (pfile, pfile->buffer->file); |
1435 } | |
1436 | |
47
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1437 /* Handle #pragma push_macro(STRING). */ |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1438 static void |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1439 do_pragma_push_macro (cpp_reader *pfile) |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1440 { |
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
|
1441 cpp_hashnode *node; |
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
|
1442 size_t defnlen; |
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
|
1443 const uchar *defn = NULL; |
47
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1444 char *macroname, *dest; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1445 const char *limit, *src; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1446 const cpp_token *txt; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1447 struct def_pragma_macro *c; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1448 |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1449 txt = get__Pragma_string (pfile); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1450 if (!txt) |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1451 { |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1452 source_location src_loc = pfile->cur_token[-1].src_loc; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1453 cpp_error_with_line (pfile, CPP_DL_ERROR, src_loc, 0, |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1454 "invalid #pragma push_macro directive"); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1455 check_eol (pfile, false); |
47
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1456 skip_rest_of_line (pfile); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1457 return; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1458 } |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1459 dest = macroname = (char *) alloca (txt->val.str.len + 2); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1460 src = (const char *) (txt->val.str.text + 1 + (txt->val.str.text[0] == 'L')); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1461 limit = (const char *) (txt->val.str.text + txt->val.str.len - 1); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1462 while (src < limit) |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1463 { |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1464 /* We know there is a character following the backslash. */ |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1465 if (*src == '\\' && (src[1] == '\\' || src[1] == '"')) |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1466 src++; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1467 *dest++ = *src++; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1468 } |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1469 *dest = 0; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1470 check_eol (pfile, false); |
47
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1471 skip_rest_of_line (pfile); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1472 c = XNEW (struct def_pragma_macro); |
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
|
1473 memset (c, 0, sizeof (struct def_pragma_macro)); |
47
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1474 c->name = XNEWVAR (char, strlen (macroname) + 1); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1475 strcpy (c->name, macroname); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1476 c->next = pfile->pushed_macros; |
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
|
1477 node = _cpp_lex_identifier (pfile, c->name); |
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
|
1478 if (node->type == NT_VOID) |
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
|
1479 c->is_undef = 1; |
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
|
1480 else |
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
|
1481 { |
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
|
1482 defn = cpp_macro_definition (pfile, node); |
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
|
1483 defnlen = ustrlen (defn); |
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
|
1484 c->definition = XNEWVEC (uchar, defnlen + 2); |
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
|
1485 c->definition[defnlen] = '\n'; |
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
|
1486 c->definition[defnlen + 1] = 0; |
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
|
1487 c->line = node->value.macro->line; |
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
|
1488 c->syshdr = node->value.macro->syshdr; |
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
|
1489 c->used = node->value.macro->used; |
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
|
1490 memcpy (c->definition, defn, defnlen); |
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
|
1491 } |
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
|
1492 |
47
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1493 pfile->pushed_macros = c; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1494 } |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1495 |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1496 /* Handle #pragma pop_macro(STRING). */ |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1497 static void |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1498 do_pragma_pop_macro (cpp_reader *pfile) |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1499 { |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1500 char *macroname, *dest; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1501 const char *limit, *src; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1502 const cpp_token *txt; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1503 struct def_pragma_macro *l = NULL, *c = pfile->pushed_macros; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1504 txt = get__Pragma_string (pfile); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1505 if (!txt) |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1506 { |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1507 source_location src_loc = pfile->cur_token[-1].src_loc; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1508 cpp_error_with_line (pfile, CPP_DL_ERROR, src_loc, 0, |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1509 "invalid #pragma pop_macro directive"); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1510 check_eol (pfile, false); |
47
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1511 skip_rest_of_line (pfile); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1512 return; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1513 } |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1514 dest = macroname = (char *) alloca (txt->val.str.len + 2); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1515 src = (const char *) (txt->val.str.text + 1 + (txt->val.str.text[0] == 'L')); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1516 limit = (const char *) (txt->val.str.text + txt->val.str.len - 1); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1517 while (src < limit) |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1518 { |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1519 /* We know there is a character following the backslash. */ |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1520 if (*src == '\\' && (src[1] == '\\' || src[1] == '"')) |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1521 src++; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1522 *dest++ = *src++; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1523 } |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1524 *dest = 0; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1525 check_eol (pfile, false); |
47
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1526 skip_rest_of_line (pfile); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1527 |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1528 while (c != NULL) |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1529 { |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1530 if (!strcmp (c->name, macroname)) |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1531 { |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1532 if (!l) |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1533 pfile->pushed_macros = c->next; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1534 else |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1535 l->next = c->next; |
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
|
1536 cpp_pop_definition (pfile, c); |
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
|
1537 free (c->definition); |
47
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1538 free (c->name); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1539 free (c); |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1540 break; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1541 } |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1542 l = c; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1543 c = c->next; |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1544 } |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1545 } |
3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1546 |
0 | 1547 /* Handle #pragma GCC poison, to poison one or more identifiers so |
1548 that the lexer produces a hard error for each subsequent usage. */ | |
1549 static void | |
1550 do_pragma_poison (cpp_reader *pfile) | |
1551 { | |
1552 const cpp_token *tok; | |
1553 cpp_hashnode *hp; | |
1554 | |
1555 pfile->state.poisoned_ok = 1; | |
1556 for (;;) | |
1557 { | |
1558 tok = _cpp_lex_token (pfile); | |
1559 if (tok->type == CPP_EOF) | |
1560 break; | |
1561 if (tok->type != CPP_NAME) | |
1562 { | |
1563 cpp_error (pfile, CPP_DL_ERROR, | |
1564 "invalid #pragma GCC poison directive"); | |
1565 break; | |
1566 } | |
1567 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1568 hp = tok->val.node.node; |
0 | 1569 if (hp->flags & NODE_POISONED) |
1570 continue; | |
1571 | |
1572 if (hp->type == NT_MACRO) | |
1573 cpp_error (pfile, CPP_DL_WARNING, "poisoning existing macro \"%s\"", | |
1574 NODE_NAME (hp)); | |
1575 _cpp_free_definition (hp); | |
1576 hp->flags |= NODE_POISONED | NODE_DIAGNOSTIC; | |
1577 } | |
1578 pfile->state.poisoned_ok = 0; | |
1579 } | |
1580 | |
1581 /* Mark the current header as a system header. This will suppress | |
1582 some categories of warnings (notably those from -pedantic). It is | |
1583 intended for use in system libraries that cannot be implemented in | |
1584 conforming C, but cannot be certain that their headers appear in a | |
1585 system include directory. To prevent abuse, it is rejected in the | |
1586 primary source file. */ | |
1587 static void | |
1588 do_pragma_system_header (cpp_reader *pfile) | |
1589 { | |
1590 if (cpp_in_primary_file (pfile)) | |
1591 cpp_error (pfile, CPP_DL_WARNING, | |
1592 "#pragma system_header ignored outside include file"); | |
1593 else | |
1594 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1595 check_eol (pfile, false); |
0 | 1596 skip_rest_of_line (pfile); |
1597 cpp_make_system_header (pfile, 1, 0); | |
1598 } | |
1599 } | |
1600 | |
1601 /* Check the modified date of the current include file against a specified | |
1602 file. Issue a diagnostic, if the specified file is newer. We use this to | |
1603 determine if a fixed header should be refixed. */ | |
1604 static void | |
1605 do_pragma_dependency (cpp_reader *pfile) | |
1606 { | |
1607 const char *fname; | |
1608 int angle_brackets, ordering; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1609 source_location location; |
0 | 1610 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1611 fname = parse_include (pfile, &angle_brackets, NULL, &location); |
0 | 1612 if (!fname) |
1613 return; | |
1614 | |
1615 ordering = _cpp_compare_file_date (pfile, fname, angle_brackets); | |
1616 if (ordering < 0) | |
1617 cpp_error (pfile, CPP_DL_WARNING, "cannot find source file %s", fname); | |
1618 else if (ordering > 0) | |
1619 { | |
1620 cpp_error (pfile, CPP_DL_WARNING, | |
1621 "current file is older than %s", fname); | |
1622 if (cpp_get_token (pfile)->type != CPP_EOF) | |
1623 { | |
1624 _cpp_backup_tokens (pfile, 1); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1625 do_diagnostic (pfile, CPP_DL_WARNING, 0, 0); |
0 | 1626 } |
1627 } | |
1628 | |
1629 free ((void *) fname); | |
1630 } | |
1631 | |
1632 /* Get a token but skip padding. */ | |
1633 static const cpp_token * | |
1634 get_token_no_padding (cpp_reader *pfile) | |
1635 { | |
1636 for (;;) | |
1637 { | |
1638 const cpp_token *result = cpp_get_token (pfile); | |
1639 if (result->type != CPP_PADDING) | |
1640 return result; | |
1641 } | |
1642 } | |
1643 | |
1644 /* Check syntax is "(string-literal)". Returns the string on success, | |
1645 or NULL on failure. */ | |
1646 static const cpp_token * | |
1647 get__Pragma_string (cpp_reader *pfile) | |
1648 { | |
1649 const cpp_token *string; | |
1650 const cpp_token *paren; | |
1651 | |
1652 paren = get_token_no_padding (pfile); | |
1653 if (paren->type == CPP_EOF) | |
1654 _cpp_backup_tokens (pfile, 1); | |
1655 if (paren->type != CPP_OPEN_PAREN) | |
1656 return NULL; | |
1657 | |
1658 string = get_token_no_padding (pfile); | |
1659 if (string->type == CPP_EOF) | |
1660 _cpp_backup_tokens (pfile, 1); | |
1661 if (string->type != CPP_STRING && string->type != CPP_WSTRING | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1662 && string->type != CPP_STRING32 && string->type != CPP_STRING16 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1663 && string->type != CPP_UTF8STRING) |
0 | 1664 return NULL; |
1665 | |
1666 paren = get_token_no_padding (pfile); | |
1667 if (paren->type == CPP_EOF) | |
1668 _cpp_backup_tokens (pfile, 1); | |
1669 if (paren->type != CPP_CLOSE_PAREN) | |
1670 return NULL; | |
1671 | |
1672 return string; | |
1673 } | |
1674 | |
1675 /* Destringize IN into a temporary buffer, by removing the first \ of | |
1676 \" and \\ sequences, and process the result as a #pragma directive. */ | |
1677 static void | |
1678 destringize_and_run (cpp_reader *pfile, const cpp_string *in) | |
1679 { | |
1680 const unsigned char *src, *limit; | |
1681 char *dest, *result; | |
1682 cpp_context *saved_context; | |
1683 cpp_token *saved_cur_token; | |
1684 tokenrun *saved_cur_run; | |
1685 cpp_token *toks; | |
1686 int count; | |
1687 const struct directive *save_directive; | |
1688 | |
1689 dest = result = (char *) alloca (in->len - 1); | |
1690 src = in->text + 1 + (in->text[0] == 'L'); | |
1691 limit = in->text + in->len - 1; | |
1692 while (src < limit) | |
1693 { | |
1694 /* We know there is a character following the backslash. */ | |
1695 if (*src == '\\' && (src[1] == '\\' || src[1] == '"')) | |
1696 src++; | |
1697 *dest++ = *src++; | |
1698 } | |
1699 *dest = '\n'; | |
1700 | |
1701 /* Ugh; an awful kludge. We are really not set up to be lexing | |
1702 tokens when in the middle of a macro expansion. Use a new | |
1703 context to force cpp_get_token to lex, and so skip_rest_of_line | |
1704 doesn't go beyond the end of the text. Also, remember the | |
1705 current lexing position so we can return to it later. | |
1706 | |
1707 Something like line-at-a-time lexing should remove the need for | |
1708 this. */ | |
1709 saved_context = pfile->context; | |
1710 saved_cur_token = pfile->cur_token; | |
1711 saved_cur_run = pfile->cur_run; | |
1712 | |
1713 pfile->context = XNEW (cpp_context); | |
1714 pfile->context->macro = 0; | |
1715 pfile->context->prev = 0; | |
1716 pfile->context->next = 0; | |
1717 | |
1718 /* Inline run_directive, since we need to delay the _cpp_pop_buffer | |
1719 until we've read all of the tokens that we want. */ | |
1720 cpp_push_buffer (pfile, (const uchar *) result, dest - result, | |
1721 /* from_stage3 */ true); | |
1722 /* ??? Antique Disgusting Hack. What does this do? */ | |
1723 if (pfile->buffer->prev) | |
1724 pfile->buffer->file = pfile->buffer->prev->file; | |
1725 | |
1726 start_directive (pfile); | |
1727 _cpp_clean_line (pfile); | |
1728 save_directive = pfile->directive; | |
1729 pfile->directive = &dtable[T_PRAGMA]; | |
1730 do_pragma (pfile); | |
1731 end_directive (pfile, 1); | |
1732 pfile->directive = save_directive; | |
1733 | |
1734 /* We always insert at least one token, the directive result. It'll | |
1735 either be a CPP_PADDING or a CPP_PRAGMA. In the later case, we | |
1736 need to insert *all* of the tokens, including the CPP_PRAGMA_EOL. */ | |
1737 | |
1738 /* If we're not handling the pragma internally, read all of the tokens from | |
1739 the string buffer now, while the string buffer is still installed. */ | |
1740 /* ??? Note that the token buffer allocated here is leaked. It's not clear | |
1741 to me what the true lifespan of the tokens are. It would appear that | |
1742 the lifespan is the entire parse of the main input stream, in which case | |
1743 this may not be wrong. */ | |
1744 if (pfile->directive_result.type == CPP_PRAGMA) | |
1745 { | |
1746 int maxcount; | |
1747 | |
1748 count = 1; | |
1749 maxcount = 50; | |
1750 toks = XNEWVEC (cpp_token, maxcount); | |
1751 toks[0] = pfile->directive_result; | |
1752 | |
1753 do | |
1754 { | |
1755 if (count == maxcount) | |
1756 { | |
1757 maxcount = maxcount * 3 / 2; | |
1758 toks = XRESIZEVEC (cpp_token, toks, maxcount); | |
1759 } | |
1760 toks[count] = *cpp_get_token (pfile); | |
1761 /* Macros have been already expanded by cpp_get_token | |
1762 if the pragma allowed expansion. */ | |
1763 toks[count++].flags |= NO_EXPAND; | |
1764 } | |
1765 while (toks[count-1].type != CPP_PRAGMA_EOL); | |
1766 } | |
1767 else | |
1768 { | |
1769 count = 1; | |
1770 toks = XNEW (cpp_token); | |
1771 toks[0] = pfile->directive_result; | |
1772 | |
1773 /* If we handled the entire pragma internally, make sure we get the | |
1774 line number correct for the next token. */ | |
1775 if (pfile->cb.line_change) | |
1776 pfile->cb.line_change (pfile, pfile->cur_token, false); | |
1777 } | |
1778 | |
1779 /* Finish inlining run_directive. */ | |
1780 pfile->buffer->file = NULL; | |
1781 _cpp_pop_buffer (pfile); | |
1782 | |
1783 /* Reset the old macro state before ... */ | |
1784 XDELETE (pfile->context); | |
1785 pfile->context = saved_context; | |
1786 pfile->cur_token = saved_cur_token; | |
1787 pfile->cur_run = saved_cur_run; | |
1788 | |
1789 /* ... inserting the new tokens we collected. */ | |
1790 _cpp_push_token_context (pfile, NULL, toks, count); | |
1791 } | |
1792 | |
1793 /* Handle the _Pragma operator. Return 0 on error, 1 if ok. */ | |
1794 int | |
1795 _cpp_do__Pragma (cpp_reader *pfile) | |
1796 { | |
1797 const cpp_token *string = get__Pragma_string (pfile); | |
1798 pfile->directive_result.type = CPP_PADDING; | |
1799 | |
1800 if (string) | |
1801 { | |
1802 destringize_and_run (pfile, &string->val.str); | |
1803 return 1; | |
1804 } | |
1805 cpp_error (pfile, CPP_DL_ERROR, | |
1806 "_Pragma takes a parenthesized string literal"); | |
1807 return 0; | |
1808 } | |
1809 | |
1810 /* Handle #ifdef. */ | |
1811 static void | |
1812 do_ifdef (cpp_reader *pfile) | |
1813 { | |
1814 int skip = 1; | |
1815 | |
1816 if (! pfile->state.skipping) | |
1817 { | |
1818 cpp_hashnode *node = lex_macro_node (pfile, false); | |
1819 | |
1820 if (node) | |
1821 { | |
1822 skip = node->type != NT_MACRO; | |
1823 _cpp_mark_macro_used (node); | |
1824 if (!(node->flags & NODE_USED)) | |
1825 { | |
1826 node->flags |= NODE_USED; | |
1827 if (node->type == NT_MACRO) | |
1828 { | |
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
|
1829 if ((node->flags & NODE_BUILTIN) |
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
|
1830 && pfile->cb.user_builtin_macro) |
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
|
1831 pfile->cb.user_builtin_macro (pfile, node); |
0 | 1832 if (pfile->cb.used_define) |
1833 pfile->cb.used_define (pfile, pfile->directive_line, node); | |
1834 } | |
1835 else | |
1836 { | |
1837 if (pfile->cb.used_undef) | |
1838 pfile->cb.used_undef (pfile, pfile->directive_line, node); | |
1839 } | |
1840 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1841 if (pfile->cb.used) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1842 pfile->cb.used (pfile, pfile->directive_line, node); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1843 check_eol (pfile, false); |
0 | 1844 } |
1845 } | |
1846 | |
1847 push_conditional (pfile, skip, T_IFDEF, 0); | |
1848 } | |
1849 | |
1850 /* Handle #ifndef. */ | |
1851 static void | |
1852 do_ifndef (cpp_reader *pfile) | |
1853 { | |
1854 int skip = 1; | |
1855 cpp_hashnode *node = 0; | |
1856 | |
1857 if (! pfile->state.skipping) | |
1858 { | |
1859 node = lex_macro_node (pfile, false); | |
1860 | |
1861 if (node) | |
1862 { | |
1863 skip = node->type == NT_MACRO; | |
1864 _cpp_mark_macro_used (node); | |
1865 if (!(node->flags & NODE_USED)) | |
1866 { | |
1867 node->flags |= NODE_USED; | |
1868 if (node->type == NT_MACRO) | |
1869 { | |
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
|
1870 if ((node->flags & NODE_BUILTIN) |
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
|
1871 && pfile->cb.user_builtin_macro) |
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
|
1872 pfile->cb.user_builtin_macro (pfile, node); |
0 | 1873 if (pfile->cb.used_define) |
1874 pfile->cb.used_define (pfile, pfile->directive_line, node); | |
1875 } | |
1876 else | |
1877 { | |
1878 if (pfile->cb.used_undef) | |
1879 pfile->cb.used_undef (pfile, pfile->directive_line, node); | |
1880 } | |
1881 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1882 if (pfile->cb.used) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1883 pfile->cb.used (pfile, pfile->directive_line, node); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1884 check_eol (pfile, false); |
0 | 1885 } |
1886 } | |
1887 | |
1888 push_conditional (pfile, skip, T_IFNDEF, node); | |
1889 } | |
1890 | |
1891 /* _cpp_parse_expr puts a macro in a "#if !defined ()" expression in | |
1892 pfile->mi_ind_cmacro so we can handle multiple-include | |
1893 optimizations. If macro expansion occurs in the expression, we | |
1894 cannot treat it as a controlling conditional, since the expansion | |
1895 could change in the future. That is handled by cpp_get_token. */ | |
1896 static void | |
1897 do_if (cpp_reader *pfile) | |
1898 { | |
1899 int skip = 1; | |
1900 | |
1901 if (! pfile->state.skipping) | |
1902 skip = _cpp_parse_expr (pfile, true) == false; | |
1903 | |
1904 push_conditional (pfile, skip, T_IF, pfile->mi_ind_cmacro); | |
1905 } | |
1906 | |
1907 /* Flip skipping state if appropriate and continue without changing | |
1908 if_stack; this is so that the error message for missing #endif's | |
1909 etc. will point to the original #if. */ | |
1910 static void | |
1911 do_else (cpp_reader *pfile) | |
1912 { | |
1913 cpp_buffer *buffer = pfile->buffer; | |
1914 struct if_stack *ifs = buffer->if_stack; | |
1915 | |
1916 if (ifs == NULL) | |
1917 cpp_error (pfile, CPP_DL_ERROR, "#else without #if"); | |
1918 else | |
1919 { | |
1920 if (ifs->type == T_ELSE) | |
1921 { | |
1922 cpp_error (pfile, CPP_DL_ERROR, "#else after #else"); | |
1923 cpp_error_with_line (pfile, CPP_DL_ERROR, ifs->line, 0, | |
1924 "the conditional began here"); | |
1925 } | |
1926 ifs->type = T_ELSE; | |
1927 | |
1928 /* Skip any future (erroneous) #elses or #elifs. */ | |
1929 pfile->state.skipping = ifs->skip_elses; | |
1930 ifs->skip_elses = true; | |
1931 | |
1932 /* Invalidate any controlling macro. */ | |
1933 ifs->mi_cmacro = 0; | |
1934 | |
1935 /* Only check EOL if was not originally skipping. */ | |
1936 if (!ifs->was_skipping && CPP_OPTION (pfile, warn_endif_labels)) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1937 check_eol (pfile, false); |
0 | 1938 } |
1939 } | |
1940 | |
1941 /* Handle a #elif directive by not changing if_stack either. See the | |
1942 comment above do_else. */ | |
1943 static void | |
1944 do_elif (cpp_reader *pfile) | |
1945 { | |
1946 cpp_buffer *buffer = pfile->buffer; | |
1947 struct if_stack *ifs = buffer->if_stack; | |
1948 | |
1949 if (ifs == NULL) | |
1950 cpp_error (pfile, CPP_DL_ERROR, "#elif without #if"); | |
1951 else | |
1952 { | |
1953 if (ifs->type == T_ELSE) | |
1954 { | |
1955 cpp_error (pfile, CPP_DL_ERROR, "#elif after #else"); | |
1956 cpp_error_with_line (pfile, CPP_DL_ERROR, ifs->line, 0, | |
1957 "the conditional began here"); | |
1958 } | |
1959 ifs->type = T_ELIF; | |
1960 | |
1961 if (! ifs->was_skipping) | |
1962 { | |
1963 bool value; | |
1964 /* The standard mandates that the expression be parsed even | |
1965 if we are skipping elses at this point -- the lexical | |
1966 restrictions on #elif only apply to skipped groups, but | |
1967 this group is not being skipped. Temporarily set | |
1968 skipping to false to get lexer warnings. */ | |
1969 pfile->state.skipping = 0; | |
1970 value = _cpp_parse_expr (pfile, false); | |
1971 if (ifs->skip_elses) | |
1972 pfile->state.skipping = 1; | |
1973 else | |
1974 { | |
1975 pfile->state.skipping = ! value; | |
1976 ifs->skip_elses = value; | |
1977 } | |
1978 } | |
1979 | |
1980 /* Invalidate any controlling macro. */ | |
1981 ifs->mi_cmacro = 0; | |
1982 } | |
1983 } | |
1984 | |
1985 /* #endif pops the if stack and resets pfile->state.skipping. */ | |
1986 static void | |
1987 do_endif (cpp_reader *pfile) | |
1988 { | |
1989 cpp_buffer *buffer = pfile->buffer; | |
1990 struct if_stack *ifs = buffer->if_stack; | |
1991 | |
1992 if (ifs == NULL) | |
1993 cpp_error (pfile, CPP_DL_ERROR, "#endif without #if"); | |
1994 else | |
1995 { | |
1996 /* Only check EOL if was not originally skipping. */ | |
1997 if (!ifs->was_skipping && CPP_OPTION (pfile, warn_endif_labels)) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1998 check_eol (pfile, false); |
0 | 1999 |
2000 /* If potential control macro, we go back outside again. */ | |
2001 if (ifs->next == 0 && ifs->mi_cmacro) | |
2002 { | |
2003 pfile->mi_valid = true; | |
2004 pfile->mi_cmacro = ifs->mi_cmacro; | |
2005 } | |
2006 | |
2007 buffer->if_stack = ifs->next; | |
2008 pfile->state.skipping = ifs->was_skipping; | |
2009 obstack_free (&pfile->buffer_ob, ifs); | |
2010 } | |
2011 } | |
2012 | |
2013 /* Push an if_stack entry for a preprocessor conditional, and set | |
2014 pfile->state.skipping to SKIP. If TYPE indicates the conditional | |
2015 is #if or #ifndef, CMACRO is a potentially controlling macro, and | |
2016 we need to check here that we are at the top of the file. */ | |
2017 static void | |
2018 push_conditional (cpp_reader *pfile, int skip, int type, | |
2019 const cpp_hashnode *cmacro) | |
2020 { | |
2021 struct if_stack *ifs; | |
2022 cpp_buffer *buffer = pfile->buffer; | |
2023 | |
2024 ifs = XOBNEW (&pfile->buffer_ob, struct if_stack); | |
2025 ifs->line = pfile->directive_line; | |
2026 ifs->next = buffer->if_stack; | |
2027 ifs->skip_elses = pfile->state.skipping || !skip; | |
2028 ifs->was_skipping = pfile->state.skipping; | |
2029 ifs->type = type; | |
2030 /* This condition is effectively a test for top-of-file. */ | |
2031 if (pfile->mi_valid && pfile->mi_cmacro == 0) | |
2032 ifs->mi_cmacro = cmacro; | |
2033 else | |
2034 ifs->mi_cmacro = 0; | |
2035 | |
2036 pfile->state.skipping = skip; | |
2037 buffer->if_stack = ifs; | |
2038 } | |
2039 | |
2040 /* Read the tokens of the answer into the macro pool, in a directive | |
2041 of type TYPE. Only commit the memory if we intend it as permanent | |
2042 storage, i.e. the #assert case. Returns 0 on success, and sets | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2043 ANSWERP to point to the answer. PRED_LOC is the location of the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2044 predicate. */ |
0 | 2045 static int |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2046 parse_answer (cpp_reader *pfile, struct answer **answerp, int type, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2047 source_location pred_loc) |
0 | 2048 { |
2049 const cpp_token *paren; | |
2050 struct answer *answer; | |
2051 unsigned int acount; | |
2052 | |
2053 /* In a conditional, it is legal to not have an open paren. We | |
2054 should save the following token in this case. */ | |
2055 paren = cpp_get_token (pfile); | |
2056 | |
2057 /* If not a paren, see if we're OK. */ | |
2058 if (paren->type != CPP_OPEN_PAREN) | |
2059 { | |
2060 /* In a conditional no answer is a test for any answer. It | |
2061 could be followed by any token. */ | |
2062 if (type == T_IF) | |
2063 { | |
2064 _cpp_backup_tokens (pfile, 1); | |
2065 return 0; | |
2066 } | |
2067 | |
2068 /* #unassert with no answer is valid - it removes all answers. */ | |
2069 if (type == T_UNASSERT && paren->type == CPP_EOF) | |
2070 return 0; | |
2071 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2072 cpp_error_with_line (pfile, CPP_DL_ERROR, pred_loc, 0, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2073 "missing '(' after predicate"); |
0 | 2074 return 1; |
2075 } | |
2076 | |
2077 for (acount = 0;; acount++) | |
2078 { | |
2079 size_t room_needed; | |
2080 const cpp_token *token = cpp_get_token (pfile); | |
2081 cpp_token *dest; | |
2082 | |
2083 if (token->type == CPP_CLOSE_PAREN) | |
2084 break; | |
2085 | |
2086 if (token->type == CPP_EOF) | |
2087 { | |
2088 cpp_error (pfile, CPP_DL_ERROR, "missing ')' to complete answer"); | |
2089 return 1; | |
2090 } | |
2091 | |
2092 /* struct answer includes the space for one token. */ | |
2093 room_needed = (sizeof (struct answer) + acount * sizeof (cpp_token)); | |
2094 | |
2095 if (BUFF_ROOM (pfile->a_buff) < room_needed) | |
2096 _cpp_extend_buff (pfile, &pfile->a_buff, sizeof (struct answer)); | |
2097 | |
2098 dest = &((struct answer *) BUFF_FRONT (pfile->a_buff))->first[acount]; | |
2099 *dest = *token; | |
2100 | |
2101 /* Drop whitespace at start, for answer equivalence purposes. */ | |
2102 if (acount == 0) | |
2103 dest->flags &= ~PREV_WHITE; | |
2104 } | |
2105 | |
2106 if (acount == 0) | |
2107 { | |
2108 cpp_error (pfile, CPP_DL_ERROR, "predicate's answer is empty"); | |
2109 return 1; | |
2110 } | |
2111 | |
2112 answer = (struct answer *) BUFF_FRONT (pfile->a_buff); | |
2113 answer->count = acount; | |
2114 answer->next = NULL; | |
2115 *answerp = answer; | |
2116 | |
2117 return 0; | |
2118 } | |
2119 | |
2120 /* Parses an assertion directive of type TYPE, returning a pointer to | |
2121 the hash node of the predicate, or 0 on error. If an answer was | |
2122 supplied, it is placed in ANSWERP, otherwise it is set to 0. */ | |
2123 static cpp_hashnode * | |
2124 parse_assertion (cpp_reader *pfile, struct answer **answerp, int type) | |
2125 { | |
2126 cpp_hashnode *result = 0; | |
2127 const cpp_token *predicate; | |
2128 | |
2129 /* We don't expand predicates or answers. */ | |
2130 pfile->state.prevent_expansion++; | |
2131 | |
2132 *answerp = 0; | |
2133 predicate = cpp_get_token (pfile); | |
2134 if (predicate->type == CPP_EOF) | |
2135 cpp_error (pfile, CPP_DL_ERROR, "assertion without predicate"); | |
2136 else if (predicate->type != CPP_NAME) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2137 cpp_error_with_line (pfile, CPP_DL_ERROR, predicate->src_loc, 0, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2138 "predicate must be an identifier"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2139 else if (parse_answer (pfile, answerp, type, predicate->src_loc) == 0) |
0 | 2140 { |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2141 unsigned int len = NODE_LEN (predicate->val.node.node); |
0 | 2142 unsigned char *sym = (unsigned char *) alloca (len + 1); |
2143 | |
2144 /* Prefix '#' to get it out of macro namespace. */ | |
2145 sym[0] = '#'; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2146 memcpy (sym + 1, NODE_NAME (predicate->val.node.node), len); |
0 | 2147 result = cpp_lookup (pfile, sym, len + 1); |
2148 } | |
2149 | |
2150 pfile->state.prevent_expansion--; | |
2151 return result; | |
2152 } | |
2153 | |
2154 /* Returns a pointer to the pointer to CANDIDATE in the answer chain, | |
2155 or a pointer to NULL if the answer is not in the chain. */ | |
2156 static struct answer ** | |
2157 find_answer (cpp_hashnode *node, const struct answer *candidate) | |
2158 { | |
2159 unsigned int i; | |
2160 struct answer **result; | |
2161 | |
2162 for (result = &node->value.answers; *result; result = &(*result)->next) | |
2163 { | |
2164 struct answer *answer = *result; | |
2165 | |
2166 if (answer->count == candidate->count) | |
2167 { | |
2168 for (i = 0; i < answer->count; i++) | |
2169 if (! _cpp_equiv_tokens (&answer->first[i], &candidate->first[i])) | |
2170 break; | |
2171 | |
2172 if (i == answer->count) | |
2173 break; | |
2174 } | |
2175 } | |
2176 | |
2177 return result; | |
2178 } | |
2179 | |
2180 /* Test an assertion within a preprocessor conditional. Returns | |
2181 nonzero on failure, zero on success. On success, the result of | |
2182 the test is written into VALUE, otherwise the value 0. */ | |
2183 int | |
2184 _cpp_test_assertion (cpp_reader *pfile, unsigned int *value) | |
2185 { | |
2186 struct answer *answer; | |
2187 cpp_hashnode *node; | |
2188 | |
2189 node = parse_assertion (pfile, &answer, T_IF); | |
2190 | |
2191 /* For recovery, an erroneous assertion expression is handled as a | |
2192 failing assertion. */ | |
2193 *value = 0; | |
2194 | |
2195 if (node) | |
2196 *value = (node->type == NT_ASSERTION && | |
2197 (answer == 0 || *find_answer (node, answer) != 0)); | |
2198 else if (pfile->cur_token[-1].type == CPP_EOF) | |
2199 _cpp_backup_tokens (pfile, 1); | |
2200 | |
2201 /* We don't commit the memory for the answer - it's temporary only. */ | |
2202 return node == 0; | |
2203 } | |
2204 | |
2205 /* Handle #assert. */ | |
2206 static void | |
2207 do_assert (cpp_reader *pfile) | |
2208 { | |
2209 struct answer *new_answer; | |
2210 cpp_hashnode *node; | |
2211 | |
2212 node = parse_assertion (pfile, &new_answer, T_ASSERT); | |
2213 if (node) | |
2214 { | |
2215 size_t answer_size; | |
2216 | |
2217 /* Place the new answer in the answer list. First check there | |
2218 is not a duplicate. */ | |
2219 new_answer->next = 0; | |
2220 if (node->type == NT_ASSERTION) | |
2221 { | |
2222 if (*find_answer (node, new_answer)) | |
2223 { | |
2224 cpp_error (pfile, CPP_DL_WARNING, "\"%s\" re-asserted", | |
2225 NODE_NAME (node) + 1); | |
2226 return; | |
2227 } | |
2228 new_answer->next = node->value.answers; | |
2229 } | |
2230 | |
2231 answer_size = sizeof (struct answer) + ((new_answer->count - 1) | |
2232 * sizeof (cpp_token)); | |
2233 /* Commit or allocate storage for the object. */ | |
2234 if (pfile->hash_table->alloc_subobject) | |
2235 { | |
2236 struct answer *temp_answer = new_answer; | |
2237 new_answer = (struct answer *) pfile->hash_table->alloc_subobject | |
2238 (answer_size); | |
2239 memcpy (new_answer, temp_answer, answer_size); | |
2240 } | |
2241 else | |
2242 BUFF_FRONT (pfile->a_buff) += answer_size; | |
2243 | |
2244 node->type = NT_ASSERTION; | |
2245 node->value.answers = new_answer; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2246 check_eol (pfile, false); |
0 | 2247 } |
2248 } | |
2249 | |
2250 /* Handle #unassert. */ | |
2251 static void | |
2252 do_unassert (cpp_reader *pfile) | |
2253 { | |
2254 cpp_hashnode *node; | |
2255 struct answer *answer; | |
2256 | |
2257 node = parse_assertion (pfile, &answer, T_UNASSERT); | |
2258 /* It isn't an error to #unassert something that isn't asserted. */ | |
2259 if (node && node->type == NT_ASSERTION) | |
2260 { | |
2261 if (answer) | |
2262 { | |
2263 struct answer **p = find_answer (node, answer), *temp; | |
2264 | |
2265 /* Remove the answer from the list. */ | |
2266 temp = *p; | |
2267 if (temp) | |
2268 *p = temp->next; | |
2269 | |
2270 /* Did we free the last answer? */ | |
2271 if (node->value.answers == 0) | |
2272 node->type = NT_VOID; | |
2273 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2274 check_eol (pfile, false); |
0 | 2275 } |
2276 else | |
2277 _cpp_free_definition (node); | |
2278 } | |
2279 | |
2280 /* We don't commit the memory for the answer - it's temporary only. */ | |
2281 } | |
2282 | |
2283 /* These are for -D, -U, -A. */ | |
2284 | |
2285 /* Process the string STR as if it appeared as the body of a #define. | |
2286 If STR is just an identifier, define it with value 1. | |
2287 If STR has anything after the identifier, then it should | |
2288 be identifier=definition. */ | |
2289 void | |
2290 cpp_define (cpp_reader *pfile, const char *str) | |
2291 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2292 char *buf; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2293 const char *p; |
0 | 2294 size_t count; |
2295 | |
2296 /* Copy the entire option so we can modify it. | |
2297 Change the first "=" in the string to a space. If there is none, | |
2298 tack " 1" on the end. */ | |
2299 | |
2300 count = strlen (str); | |
2301 buf = (char *) alloca (count + 3); | |
2302 memcpy (buf, str, count); | |
2303 | |
2304 p = strchr (str, '='); | |
2305 if (p) | |
2306 buf[p - str] = ' '; | |
2307 else | |
2308 { | |
2309 buf[count++] = ' '; | |
2310 buf[count++] = '1'; | |
2311 } | |
2312 buf[count] = '\n'; | |
2313 | |
2314 run_directive (pfile, T_DEFINE, buf, count); | |
2315 } | |
2316 | |
2317 | |
2318 /* Use to build macros to be run through cpp_define() as | |
2319 described above. | |
2320 Example: cpp_define_formatted (pfile, "MACRO=%d", value); */ | |
2321 | |
2322 void | |
2323 cpp_define_formatted (cpp_reader *pfile, const char *fmt, ...) | |
2324 { | |
2325 char *ptr = NULL; | |
2326 | |
2327 va_list ap; | |
2328 va_start (ap, fmt); | |
2329 vasprintf (&ptr, fmt, ap); | |
2330 va_end (ap); | |
2331 | |
2332 cpp_define (pfile, ptr); | |
2333 free (ptr); | |
2334 } | |
2335 | |
2336 | |
2337 /* Slight variant of the above for use by initialize_builtins. */ | |
2338 void | |
2339 _cpp_define_builtin (cpp_reader *pfile, const char *str) | |
2340 { | |
2341 size_t len = strlen (str); | |
2342 char *buf = (char *) alloca (len + 1); | |
2343 memcpy (buf, str, len); | |
2344 buf[len] = '\n'; | |
2345 run_directive (pfile, T_DEFINE, buf, len); | |
2346 } | |
2347 | |
2348 /* Process MACRO as if it appeared as the body of an #undef. */ | |
2349 void | |
2350 cpp_undef (cpp_reader *pfile, const char *macro) | |
2351 { | |
2352 size_t len = strlen (macro); | |
2353 char *buf = (char *) alloca (len + 1); | |
2354 memcpy (buf, macro, len); | |
2355 buf[len] = '\n'; | |
2356 run_directive (pfile, T_UNDEF, buf, len); | |
2357 } | |
2358 | |
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
|
2359 /* Replace a previous definition DEF of the macro STR. If DEF is NULL, |
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
|
2360 or first element is zero, then the macro should be undefined. */ |
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
|
2361 static void |
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
|
2362 cpp_pop_definition (cpp_reader *pfile, struct def_pragma_macro *c) |
0 | 2363 { |
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
|
2364 cpp_hashnode *node = _cpp_lex_identifier (pfile, c->name); |
0 | 2365 if (node == NULL) |
2366 return; | |
2367 | |
2368 if (pfile->cb.before_define) | |
2369 pfile->cb.before_define (pfile); | |
2370 | |
2371 if (node->type == NT_MACRO) | |
2372 { | |
2373 if (pfile->cb.undef) | |
2374 pfile->cb.undef (pfile, pfile->directive_line, node); | |
2375 if (CPP_OPTION (pfile, warn_unused_macros)) | |
2376 _cpp_warn_if_unused_macro (pfile, node, NULL); | |
2377 } | |
2378 if (node->type != NT_VOID) | |
2379 _cpp_free_definition (node); | |
2380 | |
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
|
2381 if (c->is_undef) |
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
|
2382 return; |
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
|
2383 { |
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
|
2384 size_t namelen; |
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
|
2385 const uchar *dn; |
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
|
2386 cpp_hashnode *h = NULL; |
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
|
2387 cpp_buffer *nbuf; |
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
|
2388 |
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
|
2389 namelen = ustrcspn (c->definition, "( \n"); |
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
|
2390 h = cpp_lookup (pfile, c->definition, namelen); |
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
|
2391 dn = c->definition + namelen; |
0 | 2392 |
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
|
2393 h->type = NT_VOID; |
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
|
2394 h->flags &= ~(NODE_POISONED|NODE_BUILTIN|NODE_DISABLED|NODE_USED); |
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
|
2395 nbuf = cpp_push_buffer (pfile, dn, ustrchr (dn, '\n') - dn, true); |
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
|
2396 if (nbuf != NULL) |
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
|
2397 { |
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
|
2398 _cpp_clean_line (pfile); |
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
|
2399 nbuf->sysp = 1; |
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
|
2400 if (!_cpp_create_definition (pfile, h)) |
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
|
2401 abort (); |
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
|
2402 _cpp_pop_buffer (pfile); |
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
|
2403 } |
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
|
2404 else |
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
|
2405 abort (); |
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
|
2406 h->value.macro->line = c->line; |
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
|
2407 h->value.macro->syshdr = c->syshdr; |
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
|
2408 h->value.macro->used = c->used; |
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
|
2409 } |
0 | 2410 } |
2411 | |
2412 /* Process the string STR as if it appeared as the body of a #assert. */ | |
2413 void | |
2414 cpp_assert (cpp_reader *pfile, const char *str) | |
2415 { | |
2416 handle_assertion (pfile, str, T_ASSERT); | |
2417 } | |
2418 | |
2419 /* Process STR as if it appeared as the body of an #unassert. */ | |
2420 void | |
2421 cpp_unassert (cpp_reader *pfile, const char *str) | |
2422 { | |
2423 handle_assertion (pfile, str, T_UNASSERT); | |
2424 } | |
2425 | |
2426 /* Common code for cpp_assert (-A) and cpp_unassert (-A-). */ | |
2427 static void | |
2428 handle_assertion (cpp_reader *pfile, const char *str, int type) | |
2429 { | |
2430 size_t count = strlen (str); | |
2431 const char *p = strchr (str, '='); | |
2432 | |
2433 /* Copy the entire option so we can modify it. Change the first | |
2434 "=" in the string to a '(', and tack a ')' on the end. */ | |
2435 char *buf = (char *) alloca (count + 2); | |
2436 | |
2437 memcpy (buf, str, count); | |
2438 if (p) | |
2439 { | |
2440 buf[p - str] = '('; | |
2441 buf[count++] = ')'; | |
2442 } | |
2443 buf[count] = '\n'; | |
2444 str = buf; | |
2445 | |
2446 run_directive (pfile, type, str, count); | |
2447 } | |
2448 | |
2449 /* The options structure. */ | |
2450 cpp_options * | |
2451 cpp_get_options (cpp_reader *pfile) | |
2452 { | |
2453 return &pfile->opts; | |
2454 } | |
2455 | |
2456 /* The callbacks structure. */ | |
2457 cpp_callbacks * | |
2458 cpp_get_callbacks (cpp_reader *pfile) | |
2459 { | |
2460 return &pfile->cb; | |
2461 } | |
2462 | |
2463 /* Copy the given callbacks structure to our own. */ | |
2464 void | |
2465 cpp_set_callbacks (cpp_reader *pfile, cpp_callbacks *cb) | |
2466 { | |
2467 pfile->cb = *cb; | |
2468 } | |
2469 | |
2470 /* The dependencies structure. (Creates one if it hasn't already been.) */ | |
2471 struct deps * | |
2472 cpp_get_deps (cpp_reader *pfile) | |
2473 { | |
2474 if (!pfile->deps) | |
2475 pfile->deps = deps_init (); | |
2476 return pfile->deps; | |
2477 } | |
2478 | |
2479 /* Push a new buffer on the buffer stack. Returns the new buffer; it | |
2480 doesn't fail. It does not generate a file change call back; that | |
2481 is the responsibility of the caller. */ | |
2482 cpp_buffer * | |
2483 cpp_push_buffer (cpp_reader *pfile, const uchar *buffer, size_t len, | |
2484 int from_stage3) | |
2485 { | |
2486 cpp_buffer *new_buffer = XOBNEW (&pfile->buffer_ob, cpp_buffer); | |
2487 | |
2488 /* Clears, amongst other things, if_stack and mi_cmacro. */ | |
2489 memset (new_buffer, 0, sizeof (cpp_buffer)); | |
2490 | |
2491 new_buffer->next_line = new_buffer->buf = buffer; | |
2492 new_buffer->rlimit = buffer + len; | |
2493 new_buffer->from_stage3 = from_stage3; | |
2494 new_buffer->prev = pfile->buffer; | |
2495 new_buffer->need_line = true; | |
2496 | |
2497 pfile->buffer = new_buffer; | |
2498 | |
2499 return new_buffer; | |
2500 } | |
2501 | |
2502 /* Pops a single buffer, with a file change call-back if appropriate. | |
2503 Then pushes the next -include file, if any remain. */ | |
2504 void | |
2505 _cpp_pop_buffer (cpp_reader *pfile) | |
2506 { | |
2507 cpp_buffer *buffer = pfile->buffer; | |
2508 struct _cpp_file *inc = buffer->file; | |
2509 struct if_stack *ifs; | |
2510 | |
2511 /* Walk back up the conditional stack till we reach its level at | |
2512 entry to this file, issuing error messages. */ | |
2513 for (ifs = buffer->if_stack; ifs; ifs = ifs->next) | |
2514 cpp_error_with_line (pfile, CPP_DL_ERROR, ifs->line, 0, | |
2515 "unterminated #%s", dtable[ifs->type].name); | |
2516 | |
2517 /* In case of a missing #endif. */ | |
2518 pfile->state.skipping = 0; | |
2519 | |
2520 /* _cpp_do_file_change expects pfile->buffer to be the new one. */ | |
2521 pfile->buffer = buffer->prev; | |
2522 | |
2523 free (buffer->notes); | |
2524 | |
2525 /* Free the buffer object now; we may want to push a new buffer | |
2526 in _cpp_push_next_include_file. */ | |
2527 obstack_free (&pfile->buffer_ob, buffer); | |
2528 | |
2529 if (inc) | |
2530 { | |
2531 _cpp_pop_file_buffer (pfile, inc); | |
2532 | |
2533 _cpp_do_file_change (pfile, LC_LEAVE, 0, 0, 0); | |
2534 } | |
2535 } | |
2536 | |
2537 /* Enter all recognized directives in the hash table. */ | |
2538 void | |
2539 _cpp_init_directives (cpp_reader *pfile) | |
2540 { | |
2541 unsigned int i; | |
2542 cpp_hashnode *node; | |
2543 | |
2544 for (i = 0; i < (unsigned int) N_DIRECTIVES; i++) | |
2545 { | |
2546 node = cpp_lookup (pfile, dtable[i].name, dtable[i].length); | |
2547 node->is_directive = 1; | |
2548 node->directive_index = i; | |
2549 } | |
2550 } |