blob: 73356a966a077fd64a72889abf7af2bd3932a06f [file] [log] [blame]
Zack Weinbergb0699da2000-03-07 20:58:47 +00001/* Parse C expressions for cpplib.
Neil Booth5d8ebbd2002-01-03 21:43:09 +00002 Copyright (C) 1987, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2001,
Kazu Hirataca2b05b2004-03-15 18:20:51 +00003 2002, 2004 Free Software Foundation.
Richard Kennere38992e2000-04-18 20:42:00 +00004 Contributed by Per Bothner, 1994.
Per Bothner7f2935c1995-03-16 13:59:07 -08005
6This program is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
8Free Software Foundation; either version 2, or (at your option) any
9later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
Richard Kenner940d9d61995-06-15 07:33:25 -040018Foundation, 59 Temple Place - Suite 330,
Richard Kennere38992e2000-04-18 20:42:00 +000019Boston, MA 02111-1307, USA. */
Per Bothner7f2935c1995-03-16 13:59:07 -080020
Per Bothner7f2935c1995-03-16 13:59:07 -080021#include "config.h"
Kaveh R. Ghazib04cd5071998-03-30 12:05:54 +000022#include "system.h"
Kaveh R. Ghazi487a6e01998-05-19 08:42:48 +000023#include "cpplib.h"
Paolo Bonzini4f4e53dd2004-05-24 10:50:45 +000024#include "internal.h"
Per Bothner7f2935c1995-03-16 13:59:07 -080025
Neil Booth91318902002-05-26 18:42:21 +000026#define PART_PRECISION (sizeof (cpp_num_part) * CHAR_BIT)
27#define HALF_MASK (~(cpp_num_part) 0 >> (PART_PRECISION / 2))
28#define LOW_PART(num_part) (num_part & HALF_MASK)
29#define HIGH_PART(num_part) (num_part >> (PART_PRECISION / 2))
30
Zack Weinbergcf00a882000-07-08 02:33:00 +000031struct op
Zack Weinbergb0699da2000-03-07 20:58:47 +000032{
Neil Booth68e652752002-07-20 13:31:56 +000033 const cpp_token *token; /* The token forming op (for diagnostics). */
Neil Boothad28cff2002-07-18 22:08:35 +000034 cpp_num value; /* The value logically "right" of op. */
Zack Weinbergcf00a882000-07-08 02:33:00 +000035 enum cpp_ttype op;
Per Bothner7f2935c1995-03-16 13:59:07 -080036};
Per Bothner7f2935c1995-03-16 13:59:07 -080037
Neil Booth91318902002-05-26 18:42:21 +000038/* Some simple utility routines on double integers. */
39#define num_zerop(num) ((num.low | num.high) == 0)
40#define num_eq(num1, num2) (num1.low == num2.low && num1.high == num2.high)
Zack Weinberg6cf87ca2003-06-17 06:17:44 +000041static bool num_positive (cpp_num, size_t);
42static bool num_greater_eq (cpp_num, cpp_num, size_t);
43static cpp_num num_trim (cpp_num, size_t);
44static cpp_num num_part_mul (cpp_num_part, cpp_num_part);
Neil Booth91318902002-05-26 18:42:21 +000045
Zack Weinberg6cf87ca2003-06-17 06:17:44 +000046static cpp_num num_unary_op (cpp_reader *, cpp_num, enum cpp_ttype);
47static cpp_num num_binary_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype);
48static cpp_num num_negate (cpp_num, size_t);
49static cpp_num num_bitwise_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype);
50static cpp_num num_inequality_op (cpp_reader *, cpp_num, cpp_num,
51 enum cpp_ttype);
52static cpp_num num_equality_op (cpp_reader *, cpp_num, cpp_num,
53 enum cpp_ttype);
54static cpp_num num_mul (cpp_reader *, cpp_num, cpp_num);
55static cpp_num num_div_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype);
56static cpp_num num_lshift (cpp_num, size_t, size_t);
57static cpp_num num_rshift (cpp_num, size_t, size_t);
Neil Booth91318902002-05-26 18:42:21 +000058
Zack Weinberg6cf87ca2003-06-17 06:17:44 +000059static cpp_num append_digit (cpp_num, int, int, size_t);
60static cpp_num parse_defined (cpp_reader *);
61static cpp_num eval_token (cpp_reader *, const cpp_token *);
62static struct op *reduce (cpp_reader *, struct op *, enum cpp_ttype);
63static unsigned int interpret_float_suffix (const uchar *, size_t);
64static unsigned int interpret_int_suffix (const uchar *, size_t);
65static void check_promotion (cpp_reader *, const struct op *);
Neil Booth91318902002-05-26 18:42:21 +000066
Neil Boothcd7ab832002-05-29 17:15:42 +000067/* Token type abuse to create unary plus and minus operators. */
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +000068#define CPP_UPLUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 1))
69#define CPP_UMINUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 2))
Zack Weinbergcf00a882000-07-08 02:33:00 +000070
Zack Weinberg15dad1d2000-05-18 15:55:46 +000071/* With -O2, gcc appears to produce nice code, moving the error
72 message load and subsequent jump completely out of the main path. */
Zack Weinberg15dad1d2000-05-18 15:55:46 +000073#define SYNTAX_ERROR(msgid) \
John David Anglin0527bc42003-11-01 22:56:54 +000074 do { cpp_error (pfile, CPP_DL_ERROR, msgid); goto syntax_error; } while(0)
Zack Weinberg15dad1d2000-05-18 15:55:46 +000075#define SYNTAX_ERROR2(msgid, arg) \
John David Anglin0527bc42003-11-01 22:56:54 +000076 do { cpp_error (pfile, CPP_DL_ERROR, msgid, arg); goto syntax_error; } \
77 while(0)
Zack Weinberg15dad1d2000-05-18 15:55:46 +000078
Neil Boothcd7ab832002-05-29 17:15:42 +000079/* Subroutine of cpp_classify_number. S points to a float suffix of
80 length LEN, possibly zero. Returns 0 for an invalid suffix, or a
81 flag vector describing the suffix. */
82static unsigned int
Zack Weinberg6cf87ca2003-06-17 06:17:44 +000083interpret_float_suffix (const uchar *s, size_t len)
Per Bothner7f2935c1995-03-16 13:59:07 -080084{
Neil Boothcd7ab832002-05-29 17:15:42 +000085 size_t f = 0, l = 0, i = 0;
Zack Weinbergcf00a882000-07-08 02:33:00 +000086
Neil Boothcd7ab832002-05-29 17:15:42 +000087 while (len--)
88 switch (s[len])
89 {
90 case 'f': case 'F': f++; break;
91 case 'l': case 'L': l++; break;
92 case 'i': case 'I':
93 case 'j': case 'J': i++; break;
94 default:
95 return 0;
96 }
Zack Weinbergcf00a882000-07-08 02:33:00 +000097
Neil Boothcd7ab832002-05-29 17:15:42 +000098 if (f + l > 1 || i > 1)
99 return 0;
Zack Weinbergcf00a882000-07-08 02:33:00 +0000100
Neil Boothcd7ab832002-05-29 17:15:42 +0000101 return ((i ? CPP_N_IMAGINARY : 0)
102 | (f ? CPP_N_SMALL :
103 l ? CPP_N_LARGE : CPP_N_MEDIUM));
104}
105
106/* Subroutine of cpp_classify_number. S points to an integer suffix
107 of length LEN, possibly zero. Returns 0 for an invalid suffix, or a
108 flag vector describing the suffix. */
109static unsigned int
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000110interpret_int_suffix (const uchar *s, size_t len)
Neil Boothcd7ab832002-05-29 17:15:42 +0000111{
112 size_t u, l, i;
113
114 u = l = i = 0;
115
116 while (len--)
117 switch (s[len])
118 {
119 case 'u': case 'U': u++; break;
120 case 'i': case 'I':
121 case 'j': case 'J': i++; break;
122 case 'l': case 'L': l++;
123 /* If there are two Ls, they must be adjacent and the same case. */
124 if (l == 2 && s[len] != s[len + 1])
125 return 0;
126 break;
127 default:
128 return 0;
129 }
130
131 if (l > 2 || u > 1 || i > 1)
132 return 0;
133
134 return ((i ? CPP_N_IMAGINARY : 0)
135 | (u ? CPP_N_UNSIGNED : 0)
136 | ((l == 0) ? CPP_N_SMALL
137 : (l == 1) ? CPP_N_MEDIUM : CPP_N_LARGE));
138}
139
140/* Categorize numeric constants according to their field (integer,
141 floating point, or invalid), radix (decimal, octal, hexadecimal),
142 and type suffixes. */
143unsigned int
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000144cpp_classify_number (cpp_reader *pfile, const cpp_token *token)
Neil Boothcd7ab832002-05-29 17:15:42 +0000145{
146 const uchar *str = token->val.str.text;
147 const uchar *limit;
148 unsigned int max_digit, result, radix;
149 enum {NOT_FLOAT = 0, AFTER_POINT, AFTER_EXPON} float_flag;
150
151 /* If the lexer has done its job, length one can only be a single
152 digit. Fast-path this very common case. */
153 if (token->val.str.len == 1)
154 return CPP_N_INTEGER | CPP_N_SMALL | CPP_N_DECIMAL;
155
156 limit = str + token->val.str.len;
157 float_flag = NOT_FLOAT;
158 max_digit = 0;
159 radix = 10;
160
161 /* First, interpret the radix. */
162 if (*str == '0')
163 {
164 radix = 8;
165 str++;
166
167 /* Require at least one hex digit to classify it as hex. */
Michael Matz7f1fc382003-03-31 15:50:53 +0000168 if ((*str == 'x' || *str == 'X')
169 && (str[1] == '.' || ISXDIGIT (str[1])))
Neil Boothcd7ab832002-05-29 17:15:42 +0000170 {
171 radix = 16;
172 str++;
173 }
174 }
175
176 /* Now scan for a well-formed integer or float. */
177 for (;;)
178 {
179 unsigned int c = *str++;
180
181 if (ISDIGIT (c) || (ISXDIGIT (c) && radix == 16))
182 {
183 c = hex_value (c);
184 if (c > max_digit)
185 max_digit = c;
186 }
187 else if (c == '.')
188 {
189 if (float_flag == NOT_FLOAT)
190 float_flag = AFTER_POINT;
191 else
192 SYNTAX_ERROR ("too many decimal points in number");
193 }
194 else if ((radix <= 10 && (c == 'e' || c == 'E'))
195 || (radix == 16 && (c == 'p' || c == 'P')))
196 {
197 float_flag = AFTER_EXPON;
198 break;
199 }
200 else
201 {
202 /* Start of suffix. */
203 str--;
204 break;
205 }
206 }
207
208 if (float_flag != NOT_FLOAT && radix == 8)
209 radix = 10;
210
211 if (max_digit >= radix)
212 SYNTAX_ERROR2 ("invalid digit \"%c\" in octal constant", '0' + max_digit);
213
214 if (float_flag != NOT_FLOAT)
215 {
216 if (radix == 16 && CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, c99))
John David Anglin0527bc42003-11-01 22:56:54 +0000217 cpp_error (pfile, CPP_DL_PEDWARN,
Neil Boothcd7ab832002-05-29 17:15:42 +0000218 "use of C99 hexadecimal floating constant");
219
220 if (float_flag == AFTER_EXPON)
221 {
222 if (*str == '+' || *str == '-')
223 str++;
224
225 /* Exponent is decimal, even if string is a hex float. */
226 if (!ISDIGIT (*str))
227 SYNTAX_ERROR ("exponent has no digits");
228
229 do
230 str++;
231 while (ISDIGIT (*str));
232 }
233 else if (radix == 16)
234 SYNTAX_ERROR ("hexadecimal floating constants require an exponent");
235
236 result = interpret_float_suffix (str, limit - str);
237 if (result == 0)
238 {
John David Anglin0527bc42003-11-01 22:56:54 +0000239 cpp_error (pfile, CPP_DL_ERROR,
Neil Boothcd7ab832002-05-29 17:15:42 +0000240 "invalid suffix \"%.*s\" on floating constant",
Andreas Jaeger91b12472002-06-01 16:11:45 +0200241 (int) (limit - str), str);
Neil Boothcd7ab832002-05-29 17:15:42 +0000242 return CPP_N_INVALID;
243 }
244
245 /* Traditional C didn't accept any floating suffixes. */
246 if (limit != str
247 && CPP_WTRADITIONAL (pfile)
248 && ! cpp_sys_macro_p (pfile))
John David Anglin0527bc42003-11-01 22:56:54 +0000249 cpp_error (pfile, CPP_DL_WARNING,
Neil Boothcd7ab832002-05-29 17:15:42 +0000250 "traditional C rejects the \"%.*s\" suffix",
Andreas Jaeger91b12472002-06-01 16:11:45 +0200251 (int) (limit - str), str);
Neil Boothcd7ab832002-05-29 17:15:42 +0000252
253 result |= CPP_N_FLOATING;
254 }
255 else
256 {
257 result = interpret_int_suffix (str, limit - str);
258 if (result == 0)
259 {
John David Anglin0527bc42003-11-01 22:56:54 +0000260 cpp_error (pfile, CPP_DL_ERROR,
Neil Boothcd7ab832002-05-29 17:15:42 +0000261 "invalid suffix \"%.*s\" on integer constant",
Andreas Jaeger91b12472002-06-01 16:11:45 +0200262 (int) (limit - str), str);
Neil Boothcd7ab832002-05-29 17:15:42 +0000263 return CPP_N_INVALID;
264 }
265
Zack Weinberg56da7202002-08-02 04:18:16 +0000266 /* Traditional C only accepted the 'L' suffix.
267 Suppress warning about 'LL' with -Wno-long-long. */
268 if (CPP_WTRADITIONAL (pfile) && ! cpp_sys_macro_p (pfile))
269 {
270 int u_or_i = (result & (CPP_N_UNSIGNED|CPP_N_IMAGINARY));
271 int large = (result & CPP_N_WIDTH) == CPP_N_LARGE;
272
273 if (u_or_i || (large && CPP_OPTION (pfile, warn_long_long)))
John David Anglin0527bc42003-11-01 22:56:54 +0000274 cpp_error (pfile, CPP_DL_WARNING,
Zack Weinberg56da7202002-08-02 04:18:16 +0000275 "traditional C rejects the \"%.*s\" suffix",
276 (int) (limit - str), str);
277 }
Neil Boothcd7ab832002-05-29 17:15:42 +0000278
279 if ((result & CPP_N_WIDTH) == CPP_N_LARGE
280 && ! CPP_OPTION (pfile, c99)
281 && CPP_OPTION (pfile, warn_long_long))
John David Anglin0527bc42003-11-01 22:56:54 +0000282 cpp_error (pfile, CPP_DL_PEDWARN,
283 "use of C99 long long integer constant");
Neil Boothcd7ab832002-05-29 17:15:42 +0000284
285 result |= CPP_N_INTEGER;
286 }
287
288 if ((result & CPP_N_IMAGINARY) && CPP_PEDANTIC (pfile))
John David Anglin0527bc42003-11-01 22:56:54 +0000289 cpp_error (pfile, CPP_DL_PEDWARN,
290 "imaginary constants are a GCC extension");
Neil Boothcd7ab832002-05-29 17:15:42 +0000291
292 if (radix == 10)
293 result |= CPP_N_DECIMAL;
294 else if (radix == 16)
295 result |= CPP_N_HEX;
296 else
297 result |= CPP_N_OCTAL;
298
299 return result;
300
301 syntax_error:
302 return CPP_N_INVALID;
303}
304
305/* cpp_interpret_integer converts an integer constant into a cpp_num,
306 of precision options->precision.
307
308 We do not provide any interface for decimal->float conversion,
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000309 because the preprocessor doesn't need it and we don't want to
310 drag in GCC's floating point emulator. */
Neil Boothcd7ab832002-05-29 17:15:42 +0000311cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000312cpp_interpret_integer (cpp_reader *pfile, const cpp_token *token,
313 unsigned int type)
Neil Boothcd7ab832002-05-29 17:15:42 +0000314{
315 const uchar *p, *end;
316 cpp_num result;
317
318 result.low = 0;
319 result.high = 0;
Neil Booth23ff0222002-07-17 17:27:14 +0000320 result.unsignedp = !!(type & CPP_N_UNSIGNED);
321 result.overflow = false;
Neil Boothcd7ab832002-05-29 17:15:42 +0000322
323 p = token->val.str.text;
324 end = p + token->val.str.len;
325
326 /* Common case of a single digit. */
327 if (token->val.str.len == 1)
328 result.low = p[0] - '0';
329 else
330 {
331 cpp_num_part max;
332 size_t precision = CPP_OPTION (pfile, precision);
333 unsigned int base = 10, c = 0;
334 bool overflow = false;
335
336 if ((type & CPP_N_RADIX) == CPP_N_OCTAL)
337 {
338 base = 8;
339 p++;
340 }
341 else if ((type & CPP_N_RADIX) == CPP_N_HEX)
342 {
343 base = 16;
344 p += 2;
345 }
346
347 /* We can add a digit to numbers strictly less than this without
348 needing the precision and slowness of double integers. */
349 max = ~(cpp_num_part) 0;
350 if (precision < PART_PRECISION)
351 max >>= PART_PRECISION - precision;
352 max = (max - base + 1) / base + 1;
353
354 for (; p < end; p++)
355 {
356 c = *p;
357
358 if (ISDIGIT (c) || (base == 16 && ISXDIGIT (c)))
359 c = hex_value (c);
360 else
361 break;
362
363 /* Strict inequality for when max is set to zero. */
364 if (result.low < max)
365 result.low = result.low * base + c;
366 else
367 {
368 result = append_digit (result, c, base, precision);
369 overflow |= result.overflow;
370 max = 0;
371 }
372 }
373
374 if (overflow)
John David Anglin0527bc42003-11-01 22:56:54 +0000375 cpp_error (pfile, CPP_DL_PEDWARN,
Neil Boothcd7ab832002-05-29 17:15:42 +0000376 "integer constant is too large for its type");
Neil Booth017acb42002-06-20 20:34:19 +0000377 /* If too big to be signed, consider it unsigned. Only warn for
378 decimal numbers. Traditional numbers were always signed (but
Kazu Hirata8d9afc4e2002-09-16 11:42:00 +0000379 we still honor an explicit U suffix); but we only have
Neil Boothcd98faa2002-07-09 22:21:37 +0000380 traditional semantics in directives. */
Neil Booth017acb42002-06-20 20:34:19 +0000381 else if (!result.unsignedp
Neil Boothcd98faa2002-07-09 22:21:37 +0000382 && !(CPP_OPTION (pfile, traditional)
383 && pfile->state.in_directive)
Neil Booth017acb42002-06-20 20:34:19 +0000384 && !num_positive (result, precision))
Neil Boothcd7ab832002-05-29 17:15:42 +0000385 {
Neil Boothcd7ab832002-05-29 17:15:42 +0000386 if (base == 10)
John David Anglin0527bc42003-11-01 22:56:54 +0000387 cpp_error (pfile, CPP_DL_WARNING,
Neil Boothcd7ab832002-05-29 17:15:42 +0000388 "integer constant is so large that it is unsigned");
Neil Booth23ff0222002-07-17 17:27:14 +0000389 result.unsignedp = true;
Neil Boothcd7ab832002-05-29 17:15:42 +0000390 }
391 }
392
393 return result;
394}
Zack Weinbergcf00a882000-07-08 02:33:00 +0000395
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000396/* Append DIGIT to NUM, a number of PRECISION bits being read in base BASE. */
Neil Booth91318902002-05-26 18:42:21 +0000397static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000398append_digit (cpp_num num, int digit, int base, size_t precision)
Neil Booth91318902002-05-26 18:42:21 +0000399{
400 cpp_num result;
401 unsigned int shift = 3 + (base == 16);
402 bool overflow;
403 cpp_num_part add_high, add_low;
404
405 /* Multiply by 8 or 16. Catching this overflow here means we don't
406 need to worry about add_high overflowing. */
Neil Booth23ff0222002-07-17 17:27:14 +0000407 overflow = !!(num.high >> (PART_PRECISION - shift));
Neil Booth91318902002-05-26 18:42:21 +0000408 result.high = num.high << shift;
409 result.low = num.low << shift;
410 result.high |= num.low >> (PART_PRECISION - shift);
Diego Novillo6de9cd92004-05-13 02:41:07 -0400411 result.unsignedp = num.unsignedp;
Neil Booth91318902002-05-26 18:42:21 +0000412
413 if (base == 10)
414 {
415 add_low = num.low << 1;
416 add_high = (num.high << 1) + (num.low >> (PART_PRECISION - 1));
417 }
418 else
419 add_high = add_low = 0;
420
421 if (add_low + digit < add_low)
422 add_high++;
423 add_low += digit;
424
425 if (result.low + add_low < result.low)
426 add_high++;
427 if (result.high + add_high < result.high)
428 overflow = true;
429
430 result.low += add_low;
431 result.high += add_high;
Diego Novillo6de9cd92004-05-13 02:41:07 -0400432 result.overflow = overflow;
Neil Booth91318902002-05-26 18:42:21 +0000433
434 /* The above code catches overflow of a cpp_num type. This catches
435 overflow of the (possibly shorter) target precision. */
436 num.low = result.low;
437 num.high = result.high;
438 result = num_trim (result, precision);
439 if (!num_eq (result, num))
Diego Novillo6de9cd92004-05-13 02:41:07 -0400440 result.overflow = true;
Neil Booth91318902002-05-26 18:42:21 +0000441
Neil Booth91318902002-05-26 18:42:21 +0000442 return result;
443}
444
Neil Booth5d8ebbd2002-01-03 21:43:09 +0000445/* Handle meeting "defined" in a preprocessor expression. */
Neil Booth91318902002-05-26 18:42:21 +0000446static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000447parse_defined (cpp_reader *pfile)
Zack Weinbergba412f12000-03-01 00:57:09 +0000448{
Neil Booth91318902002-05-26 18:42:21 +0000449 cpp_num result;
Neil Booth93c803682000-10-28 17:59:06 +0000450 int paren = 0;
451 cpp_hashnode *node = 0;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000452 const cpp_token *token;
Neil Booth63d75002001-11-05 22:26:13 +0000453 cpp_context *initial_context = pfile->context;
Zack Weinbergcf00a882000-07-08 02:33:00 +0000454
Neil Booth93c803682000-10-28 17:59:06 +0000455 /* Don't expand macros. */
456 pfile->state.prevent_expansion++;
457
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000458 token = cpp_get_token (pfile);
459 if (token->type == CPP_OPEN_PAREN)
Zack Weinbergcf00a882000-07-08 02:33:00 +0000460 {
461 paren = 1;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000462 token = cpp_get_token (pfile);
Zack Weinbergcf00a882000-07-08 02:33:00 +0000463 }
464
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000465 if (token->type == CPP_NAME)
Zack Weinberg041c3192000-07-04 01:58:21 +0000466 {
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000467 node = token->val.node;
468 if (paren && cpp_get_token (pfile)->type != CPP_CLOSE_PAREN)
Neil Booth93c803682000-10-28 17:59:06 +0000469 {
John David Anglin0527bc42003-11-01 22:56:54 +0000470 cpp_error (pfile, CPP_DL_ERROR, "missing ')' after \"defined\"");
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000471 node = 0;
Neil Booth93c803682000-10-28 17:59:06 +0000472 }
Zack Weinberg041c3192000-07-04 01:58:21 +0000473 }
Neil Booth93c803682000-10-28 17:59:06 +0000474 else
Neil Booth3c8465d2001-02-06 20:07:07 +0000475 {
John David Anglin0527bc42003-11-01 22:56:54 +0000476 cpp_error (pfile, CPP_DL_ERROR,
Neil Boothebef4e82002-04-14 18:42:47 +0000477 "operator \"defined\" requires an identifier");
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000478 if (token->flags & NAMED_OP)
Neil Booth3c8465d2001-02-06 20:07:07 +0000479 {
480 cpp_token op;
481
482 op.flags = 0;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000483 op.type = token->type;
John David Anglin0527bc42003-11-01 22:56:54 +0000484 cpp_error (pfile, CPP_DL_ERROR,
Neil Booth3c8465d2001-02-06 20:07:07 +0000485 "(\"%s\" is an alternative token for \"%s\" in C++)",
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000486 cpp_token_as_text (pfile, token),
Neil Booth3c8465d2001-02-06 20:07:07 +0000487 cpp_token_as_text (pfile, &op));
488 }
489 }
Neil Booth93c803682000-10-28 17:59:06 +0000490
Neil Booth91318902002-05-26 18:42:21 +0000491 if (node)
Neil Booth93c803682000-10-28 17:59:06 +0000492 {
Neil Booth335d03e2003-08-03 12:23:46 +0000493 if (pfile->context != initial_context && CPP_PEDANTIC (pfile))
John David Anglin0527bc42003-11-01 22:56:54 +0000494 cpp_error (pfile, CPP_DL_WARNING,
Neil Boothebef4e82002-04-14 18:42:47 +0000495 "this use of \"defined\" may not be portable");
Neil Booth63d75002001-11-05 22:26:13 +0000496
Neil Bootha69cbaa2002-07-23 22:57:49 +0000497 _cpp_mark_macro_used (node);
498
Neil Booth6d18adb2001-07-29 17:27:57 +0000499 /* A possible controlling macro of the form #if !defined ().
500 _cpp_parse_expr checks there was no other junk on the line. */
501 pfile->mi_ind_cmacro = node;
Neil Booth93c803682000-10-28 17:59:06 +0000502 }
503
504 pfile->state.prevent_expansion--;
Neil Booth91318902002-05-26 18:42:21 +0000505
Neil Booth23ff0222002-07-17 17:27:14 +0000506 result.unsignedp = false;
Neil Booth91318902002-05-26 18:42:21 +0000507 result.high = 0;
Neil Booth23ff0222002-07-17 17:27:14 +0000508 result.overflow = false;
Neil Booth91318902002-05-26 18:42:21 +0000509 result.low = node && node->type == NT_MACRO;
510 return result;
Zack Weinberg15dad1d2000-05-18 15:55:46 +0000511}
512
Neil Booth60284a52002-04-28 23:14:56 +0000513/* Convert a token into a CPP_NUMBER (an interpreted preprocessing
514 number or character constant, or the result of the "defined" or "#"
Neil Boothcd7ab832002-05-29 17:15:42 +0000515 operators). */
Neil Booth91318902002-05-26 18:42:21 +0000516static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000517eval_token (cpp_reader *pfile, const cpp_token *token)
Per Bothner7f2935c1995-03-16 13:59:07 -0800518{
Neil Booth91318902002-05-26 18:42:21 +0000519 cpp_num result;
Neil Booth60284a52002-04-28 23:14:56 +0000520 unsigned int temp;
Neil Booth4268e8b2002-05-04 07:30:32 +0000521 int unsignedp = 0;
Zack Weinberg041c3192000-07-04 01:58:21 +0000522
Diego Novillo6de9cd92004-05-13 02:41:07 -0400523 result.unsignedp = false;
524 result.overflow = false;
525
Neil Booth93c803682000-10-28 17:59:06 +0000526 switch (token->type)
Zack Weinbergba412f12000-03-01 00:57:09 +0000527 {
Per Bothner7f2935c1995-03-16 13:59:07 -0800528 case CPP_NUMBER:
Neil Boothcd7ab832002-05-29 17:15:42 +0000529 temp = cpp_classify_number (pfile, token);
530 switch (temp & CPP_N_CATEGORY)
531 {
532 case CPP_N_FLOATING:
John David Anglin0527bc42003-11-01 22:56:54 +0000533 cpp_error (pfile, CPP_DL_ERROR,
Neil Boothcd7ab832002-05-29 17:15:42 +0000534 "floating constant in preprocessor expression");
535 break;
536 case CPP_N_INTEGER:
537 if (!(temp & CPP_N_IMAGINARY))
538 return cpp_interpret_integer (pfile, token, temp);
John David Anglin0527bc42003-11-01 22:56:54 +0000539 cpp_error (pfile, CPP_DL_ERROR,
Neil Boothcd7ab832002-05-29 17:15:42 +0000540 "imaginary number in preprocessor expression");
541 break;
542
543 case CPP_N_INVALID:
544 /* Error already issued. */
545 break;
546 }
547 result.high = result.low = 0;
548 break;
Neil Booth7f2f1a62000-11-14 18:32:06 +0000549
Alexandre Oliva525bc952000-02-23 19:21:07 +0000550 case CPP_WCHAR:
Neil Booth4268e8b2002-05-04 07:30:32 +0000551 case CPP_CHAR:
Neil Bootha5a49442002-05-06 22:53:10 +0000552 {
Neil Booth91318902002-05-26 18:42:21 +0000553 cppchar_t cc = cpp_interpret_charconst (pfile, token,
554 &temp, &unsignedp);
555
556 result.high = 0;
557 result.low = cc;
Neil Bootha5a49442002-05-06 22:53:10 +0000558 /* Sign-extend the result if necessary. */
Neil Booth91318902002-05-26 18:42:21 +0000559 if (!unsignedp && (cppchar_signed_t) cc < 0)
560 {
561 if (PART_PRECISION > BITS_PER_CPPCHAR_T)
562 result.low |= ~(~(cpp_num_part) 0
563 >> (PART_PRECISION - BITS_PER_CPPCHAR_T));
564 result.high = ~(cpp_num_part) 0;
565 result = num_trim (result, CPP_OPTION (pfile, precision));
566 }
Neil Bootha5a49442002-05-06 22:53:10 +0000567 }
Neil Booth60284a52002-04-28 23:14:56 +0000568 break;
Zack Weinbergba412f12000-03-01 00:57:09 +0000569
Zack Weinberg92936ec2000-07-19 20:18:08 +0000570 case CPP_NAME:
Neil Booth93c803682000-10-28 17:59:06 +0000571 if (token->val.node == pfile->spec_nodes.n_defined)
Neil Booth63d75002001-11-05 22:26:13 +0000572 return parse_defined (pfile);
Zack Weinberg7d4918a2001-02-07 18:32:42 +0000573 else if (CPP_OPTION (pfile, cplusplus)
574 && (token->val.node == pfile->spec_nodes.n_true
575 || token->val.node == pfile->spec_nodes.n_false))
576 {
Neil Booth91318902002-05-26 18:42:21 +0000577 result.high = 0;
578 result.low = (token->val.node == pfile->spec_nodes.n_true);
Zack Weinberg7d4918a2001-02-07 18:32:42 +0000579 }
580 else
581 {
Neil Booth91318902002-05-26 18:42:21 +0000582 result.high = 0;
583 result.low = 0;
Neil Booth87ed1092002-04-28 19:42:54 +0000584 if (CPP_OPTION (pfile, warn_undef) && !pfile->state.skip_eval)
John David Anglin0527bc42003-11-01 22:56:54 +0000585 cpp_error (pfile, CPP_DL_WARNING, "\"%s\" is not defined",
Neil Boothebef4e82002-04-14 18:42:47 +0000586 NODE_NAME (token->val.node));
Zack Weinberg7d4918a2001-02-07 18:32:42 +0000587 }
Neil Booth60284a52002-04-28 23:14:56 +0000588 break;
Zack Weinberg5dfa4da1999-02-08 20:27:27 +0000589
Neil Booth60284a52002-04-28 23:14:56 +0000590 default: /* CPP_HASH */
Neil Booth91318902002-05-26 18:42:21 +0000591 _cpp_test_assertion (pfile, &temp);
592 result.high = 0;
593 result.low = temp;
Neil Booth93c803682000-10-28 17:59:06 +0000594 }
Per Bothner7f2935c1995-03-16 13:59:07 -0800595
Neil Booth23ff0222002-07-17 17:27:14 +0000596 result.unsignedp = !!unsignedp;
Neil Booth91318902002-05-26 18:42:21 +0000597 return result;
Per Bothner7f2935c1995-03-16 13:59:07 -0800598}
599
Neil Booth4063b942000-04-02 08:27:23 +0000600/* Operator precedence and flags table.
Neil Boothdbac4af2000-04-01 07:48:59 +0000601
602After an operator is returned from the lexer, if it has priority less
Neil Booth87ed1092002-04-28 19:42:54 +0000603than the operator on the top of the stack, we reduce the stack by one
604operator and repeat the test. Since equal priorities do not reduce,
605this is naturally right-associative.
Neil Boothdbac4af2000-04-01 07:48:59 +0000606
Neil Booth87ed1092002-04-28 19:42:54 +0000607We handle left-associative operators by decrementing the priority of
608just-lexed operators by one, but retaining the priority of operators
609already on the stack.
Neil Boothdbac4af2000-04-01 07:48:59 +0000610
611The remaining cases are '(' and ')'. We handle '(' by skipping the
612reduction phase completely. ')' is given lower priority than
613everything else, including '(', effectively forcing a reduction of the
Kazu Hirata272d0be2002-12-19 05:18:13 +0000614parenthesized expression. If there is a matching '(', the routine
Neil Booth87ed1092002-04-28 19:42:54 +0000615reduce() exits immediately. If the normal exit route sees a ')', then
616there cannot have been a matching '(' and an error message is output.
Neil Boothdbac4af2000-04-01 07:48:59 +0000617
Neil Boothf8b954f2002-04-26 06:32:50 +0000618The parser assumes all shifted operators require a left operand unless
619the flag NO_L_OPERAND is set. These semantics are automatic; any
620extra semantics need to be handled with operator-specific code. */
Per Bothner7f2935c1995-03-16 13:59:07 -0800621
Neil Booth68e652752002-07-20 13:31:56 +0000622/* Flags. If CHECK_PROMOTION, we warn if the effective sign of an
623 operand changes because of integer promotions. */
Neil Booth87ed1092002-04-28 19:42:54 +0000624#define NO_L_OPERAND (1 << 0)
625#define LEFT_ASSOC (1 << 1)
Neil Booth68e652752002-07-20 13:31:56 +0000626#define CHECK_PROMOTION (1 << 2)
Neil Bootheba30522000-03-31 22:23:59 +0000627
Zack Weinbergcf00a882000-07-08 02:33:00 +0000628/* Operator to priority map. Must be in the same order as the first
629 N entries of enum cpp_ttype. */
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +0000630static const struct cpp_operator
Zack Weinbergcf00a882000-07-08 02:33:00 +0000631{
Neil Booth60284a52002-04-28 23:14:56 +0000632 uchar prio;
Neil Booth87ed1092002-04-28 19:42:54 +0000633 uchar flags;
634} optab[] =
635{
Neil Boothad28cff2002-07-18 22:08:35 +0000636 /* EQ */ {0, 0}, /* Shouldn't happen. */
637 /* NOT */ {16, NO_L_OPERAND},
Neil Booth68e652752002-07-20 13:31:56 +0000638 /* GREATER */ {12, LEFT_ASSOC | CHECK_PROMOTION},
639 /* LESS */ {12, LEFT_ASSOC | CHECK_PROMOTION},
640 /* PLUS */ {14, LEFT_ASSOC | CHECK_PROMOTION},
641 /* MINUS */ {14, LEFT_ASSOC | CHECK_PROMOTION},
642 /* MULT */ {15, LEFT_ASSOC | CHECK_PROMOTION},
643 /* DIV */ {15, LEFT_ASSOC | CHECK_PROMOTION},
644 /* MOD */ {15, LEFT_ASSOC | CHECK_PROMOTION},
645 /* AND */ {9, LEFT_ASSOC | CHECK_PROMOTION},
646 /* OR */ {7, LEFT_ASSOC | CHECK_PROMOTION},
647 /* XOR */ {8, LEFT_ASSOC | CHECK_PROMOTION},
Neil Boothad28cff2002-07-18 22:08:35 +0000648 /* RSHIFT */ {13, LEFT_ASSOC},
649 /* LSHIFT */ {13, LEFT_ASSOC},
Zack Weinbergcf00a882000-07-08 02:33:00 +0000650
Neil Booth68e652752002-07-20 13:31:56 +0000651 /* MIN */ {10, LEFT_ASSOC | CHECK_PROMOTION},
652 /* MAX */ {10, LEFT_ASSOC | CHECK_PROMOTION},
Neil Booth91318902002-05-26 18:42:21 +0000653
Neil Boothad28cff2002-07-18 22:08:35 +0000654 /* COMPL */ {16, NO_L_OPERAND},
Neil Booth75aef482002-07-19 19:24:43 +0000655 /* AND_AND */ {6, LEFT_ASSOC},
656 /* OR_OR */ {5, LEFT_ASSOC},
657 /* QUERY */ {3, 0},
Neil Booth68e652752002-07-20 13:31:56 +0000658 /* COLON */ {4, LEFT_ASSOC | CHECK_PROMOTION},
Neil Boothad28cff2002-07-18 22:08:35 +0000659 /* COMMA */ {2, LEFT_ASSOC},
Neil Booth75aef482002-07-19 19:24:43 +0000660 /* OPEN_PAREN */ {1, NO_L_OPERAND},
Neil Boothad28cff2002-07-18 22:08:35 +0000661 /* CLOSE_PAREN */ {0, 0},
662 /* EOF */ {0, 0},
663 /* EQ_EQ */ {11, LEFT_ASSOC},
664 /* NOT_EQ */ {11, LEFT_ASSOC},
Neil Booth68e652752002-07-20 13:31:56 +0000665 /* GREATER_EQ */ {12, LEFT_ASSOC | CHECK_PROMOTION},
666 /* LESS_EQ */ {12, LEFT_ASSOC | CHECK_PROMOTION},
Neil Boothad28cff2002-07-18 22:08:35 +0000667 /* UPLUS */ {16, NO_L_OPERAND},
668 /* UMINUS */ {16, NO_L_OPERAND}
Zack Weinbergcf00a882000-07-08 02:33:00 +0000669};
670
Per Bothner7f2935c1995-03-16 13:59:07 -0800671/* Parse and evaluate a C expression, reading from PFILE.
Kazu Hiratadf383482002-05-22 22:02:16 +0000672 Returns the truth value of the expression.
Neil Booth87ed1092002-04-28 19:42:54 +0000673
674 The implementation is an operator precedence parser, i.e. a
675 bottom-up parser, using a stack for not-yet-reduced tokens.
676
677 The stack base is op_stack, and the current stack pointer is 'top'.
678 There is a stack element for each operator (only), and the most
679 recently pushed operator is 'top->op'. An operand (value) is
680 stored in the 'value' field of the stack element of the operator
681 that precedes it. */
682bool
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000683_cpp_parse_expr (cpp_reader *pfile)
Per Bothner7f2935c1995-03-16 13:59:07 -0800684{
Neil Booth87ed1092002-04-28 19:42:54 +0000685 struct op *top = pfile->op_stack;
686 unsigned int lex_count;
687 bool saw_leading_not, want_value = true;
Per Bothner7f2935c1995-03-16 13:59:07 -0800688
Neil Booth87ed1092002-04-28 19:42:54 +0000689 pfile->state.skip_eval = 0;
Per Bothner7f2935c1995-03-16 13:59:07 -0800690
Neil Booth93c803682000-10-28 17:59:06 +0000691 /* Set up detection of #if ! defined(). */
Neil Booth6d18adb2001-07-29 17:27:57 +0000692 pfile->mi_ind_cmacro = 0;
Neil Booth87ed1092002-04-28 19:42:54 +0000693 saw_leading_not = false;
Neil Booth6d18adb2001-07-29 17:27:57 +0000694 lex_count = 0;
Neil Booth93c803682000-10-28 17:59:06 +0000695
Neil Booth87ed1092002-04-28 19:42:54 +0000696 /* Lowest priority operator prevents further reductions. */
Zack Weinbergcf00a882000-07-08 02:33:00 +0000697 top->op = CPP_EOF;
Neil Booth4063b942000-04-02 08:27:23 +0000698
Per Bothner7f2935c1995-03-16 13:59:07 -0800699 for (;;)
700 {
Zack Weinbergcf00a882000-07-08 02:33:00 +0000701 struct op op;
Per Bothner7f2935c1995-03-16 13:59:07 -0800702
Neil Booth6d18adb2001-07-29 17:27:57 +0000703 lex_count++;
Neil Booth68e652752002-07-20 13:31:56 +0000704 op.token = cpp_get_token (pfile);
705 op.op = op.token->type;
Per Bothner7f2935c1995-03-16 13:59:07 -0800706
Per Bothner7f2935c1995-03-16 13:59:07 -0800707 switch (op.op)
708 {
Neil Booth60284a52002-04-28 23:14:56 +0000709 /* These tokens convert into values. */
Neil Boothc60e94a2001-07-19 06:12:50 +0000710 case CPP_NUMBER:
Neil Booth60284a52002-04-28 23:14:56 +0000711 case CPP_CHAR:
712 case CPP_WCHAR:
713 case CPP_NAME:
714 case CPP_HASH:
Neil Boothf8b954f2002-04-26 06:32:50 +0000715 if (!want_value)
Neil Booth60284a52002-04-28 23:14:56 +0000716 SYNTAX_ERROR2 ("missing binary operator before token \"%s\"",
Neil Booth68e652752002-07-20 13:31:56 +0000717 cpp_token_as_text (pfile, op.token));
Neil Boothf8b954f2002-04-26 06:32:50 +0000718 want_value = false;
Neil Booth68e652752002-07-20 13:31:56 +0000719 top->value = eval_token (pfile, op.token);
Neil Booth9ee703132000-04-01 07:42:37 +0000720 continue;
721
Neil Booth6d18adb2001-07-29 17:27:57 +0000722 case CPP_NOT:
723 saw_leading_not = lex_count == 1;
Neil Booth6d18adb2001-07-29 17:27:57 +0000724 break;
Zack Weinbergcf00a882000-07-08 02:33:00 +0000725 case CPP_PLUS:
Neil Boothf8b954f2002-04-26 06:32:50 +0000726 if (want_value)
727 op.op = CPP_UPLUS;
728 break;
729 case CPP_MINUS:
730 if (want_value)
731 op.op = CPP_UMINUS;
732 break;
Neil Booth60284a52002-04-28 23:14:56 +0000733
Neil Boothf8b954f2002-04-26 06:32:50 +0000734 default:
Neil Booth60284a52002-04-28 23:14:56 +0000735 if ((int) op.op <= (int) CPP_EQ || (int) op.op >= (int) CPP_PLUS_EQ)
Neil Boothcd7ab832002-05-29 17:15:42 +0000736 SYNTAX_ERROR2 ("token \"%s\" is not valid in preprocessor expressions",
Neil Booth68e652752002-07-20 13:31:56 +0000737 cpp_token_as_text (pfile, op.token));
Neil Boothf8b954f2002-04-26 06:32:50 +0000738 break;
Per Bothner7f2935c1995-03-16 13:59:07 -0800739 }
740
Neil Booth87ed1092002-04-28 19:42:54 +0000741 /* Check we have a value or operator as appropriate. */
742 if (optab[op.op].flags & NO_L_OPERAND)
Neil Booth4063b942000-04-02 08:27:23 +0000743 {
Neil Boothf8b954f2002-04-26 06:32:50 +0000744 if (!want_value)
Neil Booth60284a52002-04-28 23:14:56 +0000745 SYNTAX_ERROR2 ("missing binary operator before token \"%s\"",
Neil Booth68e652752002-07-20 13:31:56 +0000746 cpp_token_as_text (pfile, op.token));
Neil Boothb22ef132000-04-03 22:33:12 +0000747 }
Neil Booth87ed1092002-04-28 19:42:54 +0000748 else if (want_value)
Neil Boothb22ef132000-04-03 22:33:12 +0000749 {
Neil Bootha09d4742004-07-04 12:57:50 +0000750 /* We want a number (or expression) and haven't got one.
751 Try to emit a specific diagnostic. */
752 if (op.op == CPP_CLOSE_PAREN && top->op == CPP_OPEN_PAREN)
753 SYNTAX_ERROR ("missing expression between '(' and ')'");
754
755 if (op.op == CPP_EOF && top->op == CPP_EOF)
756 SYNTAX_ERROR ("#if with no expression");
757
758 if (top->op != CPP_EOF && top->op != CPP_OPEN_PAREN)
759 SYNTAX_ERROR2 ("operator '%s' has no right operand",
760 cpp_token_as_text (pfile, top->token));
761 else if (op.op == CPP_CLOSE_PAREN || op.op == CPP_EOF)
762 /* Complain about missing paren during reduction. */;
763 else
764 SYNTAX_ERROR2 ("operator '%s' has no left operand",
765 cpp_token_as_text (pfile, op.token));
Neil Booth4063b942000-04-02 08:27:23 +0000766 }
Neil Booth87ed1092002-04-28 19:42:54 +0000767
768 top = reduce (pfile, top, op.op);
769 if (!top)
770 goto syntax_error;
771
Neil Booth60284a52002-04-28 23:14:56 +0000772 if (op.op == CPP_EOF)
773 break;
774
Neil Booth87ed1092002-04-28 19:42:54 +0000775 switch (op.op)
776 {
777 case CPP_CLOSE_PAREN:
778 continue;
Neil Booth87ed1092002-04-28 19:42:54 +0000779 case CPP_OR_OR:
Neil Booth91318902002-05-26 18:42:21 +0000780 if (!num_zerop (top->value))
Neil Booth87ed1092002-04-28 19:42:54 +0000781 pfile->state.skip_eval++;
782 break;
783 case CPP_AND_AND:
784 case CPP_QUERY:
Neil Booth91318902002-05-26 18:42:21 +0000785 if (num_zerop (top->value))
Neil Booth87ed1092002-04-28 19:42:54 +0000786 pfile->state.skip_eval++;
787 break;
788 case CPP_COLON:
Neil Booth60284a52002-04-28 23:14:56 +0000789 if (top->op != CPP_QUERY)
790 SYNTAX_ERROR (" ':' without preceding '?'");
Neil Booth91318902002-05-26 18:42:21 +0000791 if (!num_zerop (top[-1].value)) /* Was '?' condition true? */
Neil Booth87ed1092002-04-28 19:42:54 +0000792 pfile->state.skip_eval++;
793 else
794 pfile->state.skip_eval--;
795 default:
796 break;
797 }
798
Neil Boothf8b954f2002-04-26 06:32:50 +0000799 want_value = true;
Neil Booth4063b942000-04-02 08:27:23 +0000800
Mike Stump0f413021996-07-03 22:07:53 +0000801 /* Check for and handle stack overflow. */
Neil Booth87ed1092002-04-28 19:42:54 +0000802 if (++top == pfile->op_limit)
803 top = _cpp_expand_op_stack (pfile);
Kazu Hiratadf383482002-05-22 22:02:16 +0000804
Per Bothner7f2935c1995-03-16 13:59:07 -0800805 top->op = op.op;
Neil Booth68e652752002-07-20 13:31:56 +0000806 top->token = op.token;
Per Bothner7f2935c1995-03-16 13:59:07 -0800807 }
Neil Booth9ee703132000-04-01 07:42:37 +0000808
Neil Booth6d18adb2001-07-29 17:27:57 +0000809 /* The controlling macro expression is only valid if we called lex 3
810 times: <!> <defined expression> and <EOF>. push_conditional ()
811 checks that we are at top-of-file. */
812 if (pfile->mi_ind_cmacro && !(saw_leading_not && lex_count == 3))
813 pfile->mi_ind_cmacro = 0;
814
Neil Booth87ed1092002-04-28 19:42:54 +0000815 if (top != pfile->op_stack)
Neil Boothebef4e82002-04-14 18:42:47 +0000816 {
John David Anglin0527bc42003-11-01 22:56:54 +0000817 cpp_error (pfile, CPP_DL_ICE, "unbalanced stack in #if");
Neil Booth4063b942000-04-02 08:27:23 +0000818 syntax_error:
Neil Booth87ed1092002-04-28 19:42:54 +0000819 return false; /* Return false on syntax error. */
Neil Booth4063b942000-04-02 08:27:23 +0000820 }
Neil Booth9ee703132000-04-01 07:42:37 +0000821
Neil Booth91318902002-05-26 18:42:21 +0000822 return !num_zerop (top->value);
Neil Booth87ed1092002-04-28 19:42:54 +0000823}
824
825/* Reduce the operator / value stack if possible, in preparation for
826 pushing operator OP. Returns NULL on error, otherwise the top of
827 the stack. */
828static struct op *
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000829reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
Neil Booth87ed1092002-04-28 19:42:54 +0000830{
831 unsigned int prio;
832
Neil Booth91318902002-05-26 18:42:21 +0000833 if (top->op <= CPP_EQ || top->op > CPP_LAST_CPP_OP + 2)
834 {
835 bad_op:
John David Anglin0527bc42003-11-01 22:56:54 +0000836 cpp_error (pfile, CPP_DL_ICE, "impossible operator '%u'", top->op);
Neil Booth91318902002-05-26 18:42:21 +0000837 return 0;
838 }
839
Neil Booth87ed1092002-04-28 19:42:54 +0000840 if (op == CPP_OPEN_PAREN)
841 return top;
842
843 /* Decrement the priority of left-associative operators to force a
844 reduction with operators of otherwise equal priority. */
845 prio = optab[op].prio - ((optab[op].flags & LEFT_ASSOC) != 0);
846 while (prio < optab[top->op].prio)
847 {
Neil Booth68e652752002-07-20 13:31:56 +0000848 if (CPP_OPTION (pfile, warn_num_sign_change)
849 && optab[top->op].flags & CHECK_PROMOTION)
850 check_promotion (pfile, top);
851
Neil Booth75aef482002-07-19 19:24:43 +0000852 switch (top->op)
853 {
854 case CPP_UPLUS:
855 case CPP_UMINUS:
856 case CPP_NOT:
857 case CPP_COMPL:
858 top[-1].value = num_unary_op (pfile, top->value, top->op);
859 break;
Neil Booth91318902002-05-26 18:42:21 +0000860
Neil Booth75aef482002-07-19 19:24:43 +0000861 case CPP_PLUS:
862 case CPP_MINUS:
863 case CPP_RSHIFT:
864 case CPP_LSHIFT:
865 case CPP_MIN:
866 case CPP_MAX:
867 case CPP_COMMA:
868 top[-1].value = num_binary_op (pfile, top[-1].value,
869 top->value, top->op);
870 break;
Neil Booth91318902002-05-26 18:42:21 +0000871
Neil Booth75aef482002-07-19 19:24:43 +0000872 case CPP_GREATER:
873 case CPP_LESS:
874 case CPP_GREATER_EQ:
875 case CPP_LESS_EQ:
876 top[-1].value
877 = num_inequality_op (pfile, top[-1].value, top->value, top->op);
878 break;
Neil Booth91318902002-05-26 18:42:21 +0000879
Neil Booth75aef482002-07-19 19:24:43 +0000880 case CPP_EQ_EQ:
881 case CPP_NOT_EQ:
882 top[-1].value
883 = num_equality_op (pfile, top[-1].value, top->value, top->op);
884 break;
Neil Boothad28cff2002-07-18 22:08:35 +0000885
Neil Booth75aef482002-07-19 19:24:43 +0000886 case CPP_AND:
887 case CPP_OR:
888 case CPP_XOR:
889 top[-1].value
890 = num_bitwise_op (pfile, top[-1].value, top->value, top->op);
891 break;
Neil Boothad28cff2002-07-18 22:08:35 +0000892
Neil Booth75aef482002-07-19 19:24:43 +0000893 case CPP_MULT:
894 top[-1].value = num_mul (pfile, top[-1].value, top->value);
895 break;
Neil Boothad28cff2002-07-18 22:08:35 +0000896
Neil Booth75aef482002-07-19 19:24:43 +0000897 case CPP_DIV:
898 case CPP_MOD:
899 top[-1].value = num_div_op (pfile, top[-1].value,
900 top->value, top->op);
901 break;
Neil Boothad28cff2002-07-18 22:08:35 +0000902
Neil Booth75aef482002-07-19 19:24:43 +0000903 case CPP_OR_OR:
904 top--;
905 if (!num_zerop (top->value))
906 pfile->state.skip_eval--;
907 top->value.low = (!num_zerop (top->value)
908 || !num_zerop (top[1].value));
909 top->value.high = 0;
910 top->value.unsignedp = false;
911 top->value.overflow = false;
912 continue;
913
914 case CPP_AND_AND:
915 top--;
916 if (num_zerop (top->value))
917 pfile->state.skip_eval--;
918 top->value.low = (!num_zerop (top->value)
919 && !num_zerop (top[1].value));
920 top->value.high = 0;
921 top->value.unsignedp = false;
922 top->value.overflow = false;
923 continue;
924
925 case CPP_OPEN_PAREN:
926 if (op != CPP_CLOSE_PAREN)
927 {
John David Anglin0527bc42003-11-01 22:56:54 +0000928 cpp_error (pfile, CPP_DL_ERROR, "missing ')' in expression");
Neil Booth75aef482002-07-19 19:24:43 +0000929 return 0;
930 }
931 top--;
932 top->value = top[1].value;
933 return top;
934
935 case CPP_COLON:
936 top -= 2;
937 if (!num_zerop (top->value))
938 {
Neil Booth91318902002-05-26 18:42:21 +0000939 pfile->state.skip_eval--;
Neil Booth75aef482002-07-19 19:24:43 +0000940 top->value = top[1].value;
941 }
942 else
943 top->value = top[2].value;
944 top->value.unsignedp = (top[1].value.unsignedp
945 || top[2].value.unsignedp);
946 continue;
Neil Booth91318902002-05-26 18:42:21 +0000947
Neil Booth75aef482002-07-19 19:24:43 +0000948 case CPP_QUERY:
John David Anglin0527bc42003-11-01 22:56:54 +0000949 cpp_error (pfile, CPP_DL_ERROR, "'?' without following ':'");
Neil Booth75aef482002-07-19 19:24:43 +0000950 return 0;
Neil Booth91318902002-05-26 18:42:21 +0000951
Neil Booth75aef482002-07-19 19:24:43 +0000952 default:
953 goto bad_op;
954 }
Neil Boothad28cff2002-07-18 22:08:35 +0000955
956 top--;
Neil Booth91318902002-05-26 18:42:21 +0000957 if (top->value.overflow && !pfile->state.skip_eval)
John David Anglin0527bc42003-11-01 22:56:54 +0000958 cpp_error (pfile, CPP_DL_PEDWARN,
Neil Booth91318902002-05-26 18:42:21 +0000959 "integer overflow in preprocessor expression");
Neil Booth87ed1092002-04-28 19:42:54 +0000960 }
961
962 if (op == CPP_CLOSE_PAREN)
963 {
John David Anglin0527bc42003-11-01 22:56:54 +0000964 cpp_error (pfile, CPP_DL_ERROR, "missing '(' in expression");
Neil Booth87ed1092002-04-28 19:42:54 +0000965 return 0;
966 }
967
968 return top;
969}
970
971/* Returns the position of the old top of stack after expansion. */
972struct op *
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000973_cpp_expand_op_stack (cpp_reader *pfile)
Neil Booth87ed1092002-04-28 19:42:54 +0000974{
Neil Booth32fa4562002-05-09 22:27:31 +0000975 size_t old_size = (size_t) (pfile->op_limit - pfile->op_stack);
976 size_t new_size = old_size * 2 + 20;
Neil Booth87ed1092002-04-28 19:42:54 +0000977
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +0000978 pfile->op_stack = XRESIZEVEC (struct op, pfile->op_stack, new_size);
Neil Booth32fa4562002-05-09 22:27:31 +0000979 pfile->op_limit = pfile->op_stack + new_size;
Neil Booth87ed1092002-04-28 19:42:54 +0000980
Neil Booth32fa4562002-05-09 22:27:31 +0000981 return pfile->op_stack + old_size;
Per Bothner7f2935c1995-03-16 13:59:07 -0800982}
Neil Booth91318902002-05-26 18:42:21 +0000983
Neil Booth68e652752002-07-20 13:31:56 +0000984/* Emits a warning if the effective sign of either operand of OP
985 changes because of integer promotions. */
986static void
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000987check_promotion (cpp_reader *pfile, const struct op *op)
Neil Booth68e652752002-07-20 13:31:56 +0000988{
989 if (op->value.unsignedp == op[-1].value.unsignedp)
990 return;
991
992 if (op->value.unsignedp)
993 {
994 if (!num_positive (op[-1].value, CPP_OPTION (pfile, precision)))
John David Anglin0527bc42003-11-01 22:56:54 +0000995 cpp_error (pfile, CPP_DL_WARNING,
Neil Booth68e652752002-07-20 13:31:56 +0000996 "the left operand of \"%s\" changes sign when promoted",
997 cpp_token_as_text (pfile, op->token));
998 }
999 else if (!num_positive (op->value, CPP_OPTION (pfile, precision)))
John David Anglin0527bc42003-11-01 22:56:54 +00001000 cpp_error (pfile, CPP_DL_WARNING,
Neil Booth68e652752002-07-20 13:31:56 +00001001 "the right operand of \"%s\" changes sign when promoted",
1002 cpp_token_as_text (pfile, op->token));
1003}
1004
Neil Booth91318902002-05-26 18:42:21 +00001005/* Clears the unused high order bits of the number pointed to by PNUM. */
1006static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001007num_trim (cpp_num num, size_t precision)
Neil Booth91318902002-05-26 18:42:21 +00001008{
1009 if (precision > PART_PRECISION)
1010 {
1011 precision -= PART_PRECISION;
1012 if (precision < PART_PRECISION)
Neil Booth359b0be2002-05-28 05:44:06 +00001013 num.high &= ((cpp_num_part) 1 << precision) - 1;
Neil Booth91318902002-05-26 18:42:21 +00001014 }
1015 else
1016 {
1017 if (precision < PART_PRECISION)
Neil Booth359b0be2002-05-28 05:44:06 +00001018 num.low &= ((cpp_num_part) 1 << precision) - 1;
Neil Booth91318902002-05-26 18:42:21 +00001019 num.high = 0;
1020 }
1021
1022 return num;
1023}
1024
1025/* True iff A (presumed signed) >= 0. */
1026static bool
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001027num_positive (cpp_num num, size_t precision)
Neil Booth91318902002-05-26 18:42:21 +00001028{
1029 if (precision > PART_PRECISION)
1030 {
1031 precision -= PART_PRECISION;
Neil Booth359b0be2002-05-28 05:44:06 +00001032 return (num.high & (cpp_num_part) 1 << (precision - 1)) == 0;
Neil Booth91318902002-05-26 18:42:21 +00001033 }
1034
Neil Booth359b0be2002-05-28 05:44:06 +00001035 return (num.low & (cpp_num_part) 1 << (precision - 1)) == 0;
Neil Booth91318902002-05-26 18:42:21 +00001036}
1037
Neil Boothceeedfc2002-06-02 19:37:34 +00001038/* Sign extend a number, with PRECISION significant bits and all
1039 others assumed clear, to fill out a cpp_num structure. */
1040cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001041cpp_num_sign_extend (cpp_num num, size_t precision)
Neil Boothceeedfc2002-06-02 19:37:34 +00001042{
1043 if (!num.unsignedp)
1044 {
1045 if (precision > PART_PRECISION)
1046 {
1047 precision -= PART_PRECISION;
1048 if (precision < PART_PRECISION
1049 && (num.high & (cpp_num_part) 1 << (precision - 1)))
1050 num.high |= ~(~(cpp_num_part) 0 >> (PART_PRECISION - precision));
1051 }
1052 else if (num.low & (cpp_num_part) 1 << (precision - 1))
1053 {
1054 if (precision < PART_PRECISION)
1055 num.low |= ~(~(cpp_num_part) 0 >> (PART_PRECISION - precision));
1056 num.high = ~(cpp_num_part) 0;
1057 }
1058 }
1059
1060 return num;
1061}
1062
Neil Booth91318902002-05-26 18:42:21 +00001063/* Returns the negative of NUM. */
1064static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001065num_negate (cpp_num num, size_t precision)
Neil Booth91318902002-05-26 18:42:21 +00001066{
1067 cpp_num copy;
1068
1069 copy = num;
1070 num.high = ~num.high;
1071 num.low = ~num.low;
1072 if (++num.low == 0)
1073 num.high++;
1074 num = num_trim (num, precision);
1075 num.overflow = (!num.unsignedp && num_eq (num, copy) && !num_zerop (num));
1076
1077 return num;
1078}
1079
1080/* Returns true if A >= B. */
1081static bool
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001082num_greater_eq (cpp_num pa, cpp_num pb, size_t precision)
Neil Booth91318902002-05-26 18:42:21 +00001083{
1084 bool unsignedp;
1085
1086 unsignedp = pa.unsignedp || pb.unsignedp;
1087
1088 if (!unsignedp)
1089 {
1090 /* Both numbers have signed type. If they are of different
1091 sign, the answer is the sign of A. */
1092 unsignedp = num_positive (pa, precision);
1093
1094 if (unsignedp != num_positive (pb, precision))
1095 return unsignedp;
1096
1097 /* Otherwise we can do an unsigned comparison. */
1098 }
1099
1100 return (pa.high > pb.high) || (pa.high == pb.high && pa.low >= pb.low);
1101}
1102
1103/* Returns LHS OP RHS, where OP is a bit-wise operation. */
1104static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001105num_bitwise_op (cpp_reader *pfile ATTRIBUTE_UNUSED,
1106 cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
Neil Booth91318902002-05-26 18:42:21 +00001107{
1108 lhs.overflow = false;
1109 lhs.unsignedp = lhs.unsignedp || rhs.unsignedp;
1110
1111 /* As excess precision is zeroed, there is no need to num_trim () as
1112 these operations cannot introduce a set bit there. */
1113 if (op == CPP_AND)
1114 {
1115 lhs.low &= rhs.low;
1116 lhs.high &= rhs.high;
1117 }
1118 else if (op == CPP_OR)
1119 {
1120 lhs.low |= rhs.low;
1121 lhs.high |= rhs.high;
1122 }
1123 else
1124 {
1125 lhs.low ^= rhs.low;
1126 lhs.high ^= rhs.high;
1127 }
1128
1129 return lhs;
1130}
1131
1132/* Returns LHS OP RHS, where OP is an inequality. */
1133static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001134num_inequality_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs,
1135 enum cpp_ttype op)
Neil Booth91318902002-05-26 18:42:21 +00001136{
1137 bool gte = num_greater_eq (lhs, rhs, CPP_OPTION (pfile, precision));
1138
1139 if (op == CPP_GREATER_EQ)
1140 lhs.low = gte;
1141 else if (op == CPP_LESS)
1142 lhs.low = !gte;
1143 else if (op == CPP_GREATER)
1144 lhs.low = gte && !num_eq (lhs, rhs);
1145 else /* CPP_LESS_EQ. */
1146 lhs.low = !gte || num_eq (lhs, rhs);
1147
1148 lhs.high = 0;
1149 lhs.overflow = false;
1150 lhs.unsignedp = false;
1151 return lhs;
1152}
1153
1154/* Returns LHS OP RHS, where OP is == or !=. */
1155static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001156num_equality_op (cpp_reader *pfile ATTRIBUTE_UNUSED,
1157 cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
Neil Booth91318902002-05-26 18:42:21 +00001158{
Jason Merrill97459792002-06-07 09:29:17 -04001159 /* Work around a 3.0.4 bug; see PR 6950. */
1160 bool eq = num_eq (lhs, rhs);
Neil Booth91318902002-05-26 18:42:21 +00001161 if (op == CPP_NOT_EQ)
Jason Merrill97459792002-06-07 09:29:17 -04001162 eq = !eq;
1163 lhs.low = eq;
Neil Booth91318902002-05-26 18:42:21 +00001164 lhs.high = 0;
1165 lhs.overflow = false;
1166 lhs.unsignedp = false;
1167 return lhs;
1168}
1169
1170/* Shift NUM, of width PRECISION, right by N bits. */
1171static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001172num_rshift (cpp_num num, size_t precision, size_t n)
Neil Booth91318902002-05-26 18:42:21 +00001173{
1174 cpp_num_part sign_mask;
Diego Novillo6de9cd92004-05-13 02:41:07 -04001175 bool x = num_positive (num, precision);
Neil Booth91318902002-05-26 18:42:21 +00001176
Diego Novillo6de9cd92004-05-13 02:41:07 -04001177 if (num.unsignedp || x)
Neil Booth91318902002-05-26 18:42:21 +00001178 sign_mask = 0;
1179 else
1180 sign_mask = ~(cpp_num_part) 0;
1181
1182 if (n >= precision)
1183 num.high = num.low = sign_mask;
1184 else
1185 {
1186 /* Sign-extend. */
1187 if (precision < PART_PRECISION)
1188 num.high = sign_mask, num.low |= sign_mask << precision;
1189 else if (precision < 2 * PART_PRECISION)
1190 num.high |= sign_mask << (precision - PART_PRECISION);
1191
1192 if (n >= PART_PRECISION)
1193 {
1194 n -= PART_PRECISION;
1195 num.low = num.high;
1196 num.high = sign_mask;
1197 }
1198
1199 if (n)
1200 {
1201 num.low = (num.low >> n) | (num.high << (PART_PRECISION - n));
1202 num.high = (num.high >> n) | (sign_mask << (PART_PRECISION - n));
1203 }
1204 }
1205
1206 num = num_trim (num, precision);
1207 num.overflow = false;
1208 return num;
1209}
1210
1211/* Shift NUM, of width PRECISION, left by N bits. */
1212static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001213num_lshift (cpp_num num, size_t precision, size_t n)
Neil Booth91318902002-05-26 18:42:21 +00001214{
1215 if (n >= precision)
1216 {
1217 num.overflow = !num.unsignedp && !num_zerop (num);
1218 num.high = num.low = 0;
1219 }
1220 else
1221 {
1222 cpp_num orig, maybe_orig;
1223 size_t m = n;
1224
1225 orig = num;
1226 if (m >= PART_PRECISION)
1227 {
1228 m -= PART_PRECISION;
1229 num.high = num.low;
1230 num.low = 0;
1231 }
1232 if (m)
1233 {
1234 num.high = (num.high << m) | (num.low >> (PART_PRECISION - m));
1235 num.low <<= m;
1236 }
1237 num = num_trim (num, precision);
1238
1239 if (num.unsignedp)
1240 num.overflow = false;
1241 else
1242 {
1243 maybe_orig = num_rshift (num, precision, n);
1244 num.overflow = !num_eq (orig, maybe_orig);
1245 }
1246 }
1247
1248 return num;
1249}
1250
1251/* The four unary operators: +, -, ! and ~. */
1252static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001253num_unary_op (cpp_reader *pfile, cpp_num num, enum cpp_ttype op)
Neil Booth91318902002-05-26 18:42:21 +00001254{
1255 switch (op)
1256 {
1257 case CPP_UPLUS:
Neil Booth75aef482002-07-19 19:24:43 +00001258 if (CPP_WTRADITIONAL (pfile) && !pfile->state.skip_eval)
John David Anglin0527bc42003-11-01 22:56:54 +00001259 cpp_error (pfile, CPP_DL_WARNING,
Neil Booth91318902002-05-26 18:42:21 +00001260 "traditional C rejects the unary plus operator");
1261 num.overflow = false;
1262 break;
1263
1264 case CPP_UMINUS:
1265 num = num_negate (num, CPP_OPTION (pfile, precision));
1266 break;
1267
1268 case CPP_COMPL:
1269 num.high = ~num.high;
1270 num.low = ~num.low;
1271 num = num_trim (num, CPP_OPTION (pfile, precision));
1272 num.overflow = false;
1273 break;
1274
1275 default: /* case CPP_NOT: */
1276 num.low = num_zerop (num);
1277 num.high = 0;
1278 num.overflow = false;
1279 num.unsignedp = false;
1280 break;
1281 }
1282
1283 return num;
1284}
1285
1286/* The various binary operators. */
1287static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001288num_binary_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
Neil Booth91318902002-05-26 18:42:21 +00001289{
1290 cpp_num result;
1291 size_t precision = CPP_OPTION (pfile, precision);
1292 bool gte;
1293 size_t n;
1294
1295 switch (op)
1296 {
1297 /* Shifts. */
1298 case CPP_LSHIFT:
1299 case CPP_RSHIFT:
1300 if (!rhs.unsignedp && !num_positive (rhs, precision))
1301 {
1302 /* A negative shift is a positive shift the other way. */
1303 if (op == CPP_LSHIFT)
1304 op = CPP_RSHIFT;
1305 else
1306 op = CPP_LSHIFT;
1307 rhs = num_negate (rhs, precision);
1308 }
1309 if (rhs.high)
1310 n = ~0; /* Maximal. */
1311 else
1312 n = rhs.low;
1313 if (op == CPP_LSHIFT)
1314 lhs = num_lshift (lhs, precision, n);
1315 else
1316 lhs = num_rshift (lhs, precision, n);
1317 break;
1318
1319 /* Min / Max. */
1320 case CPP_MIN:
1321 case CPP_MAX:
1322 {
1323 bool unsignedp = lhs.unsignedp || rhs.unsignedp;
1324
1325 gte = num_greater_eq (lhs, rhs, precision);
1326 if (op == CPP_MIN)
1327 gte = !gte;
1328 if (!gte)
1329 lhs = rhs;
1330 lhs.unsignedp = unsignedp;
1331 }
1332 break;
1333
1334 /* Arithmetic. */
1335 case CPP_MINUS:
1336 rhs = num_negate (rhs, precision);
1337 case CPP_PLUS:
1338 result.low = lhs.low + rhs.low;
1339 result.high = lhs.high + rhs.high;
1340 if (result.low < lhs.low)
1341 result.high++;
Diego Novillo6de9cd92004-05-13 02:41:07 -04001342 result.unsignedp = lhs.unsignedp || rhs.unsignedp;
1343 result.overflow = false;
Neil Booth91318902002-05-26 18:42:21 +00001344
1345 result = num_trim (result, precision);
Diego Novillo6de9cd92004-05-13 02:41:07 -04001346 if (!result.unsignedp)
Neil Booth91318902002-05-26 18:42:21 +00001347 {
1348 bool lhsp = num_positive (lhs, precision);
1349 result.overflow = (lhsp == num_positive (rhs, precision)
1350 && lhsp != num_positive (result, precision));
1351 }
1352 return result;
1353
1354 /* Comma. */
1355 default: /* case CPP_COMMA: */
Joseph Myers32e8aa92004-02-11 23:50:45 +00001356 if (CPP_PEDANTIC (pfile) && (!CPP_OPTION (pfile, c99)
1357 || !pfile->state.skip_eval))
John David Anglin0527bc42003-11-01 22:56:54 +00001358 cpp_error (pfile, CPP_DL_PEDWARN,
Neil Booth91318902002-05-26 18:42:21 +00001359 "comma operator in operand of #if");
1360 lhs = rhs;
1361 break;
1362 }
1363
1364 return lhs;
1365}
1366
1367/* Multiplies two unsigned cpp_num_parts to give a cpp_num. This
1368 cannot overflow. */
1369static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001370num_part_mul (cpp_num_part lhs, cpp_num_part rhs)
Neil Booth91318902002-05-26 18:42:21 +00001371{
1372 cpp_num result;
1373 cpp_num_part middle[2], temp;
1374
1375 result.low = LOW_PART (lhs) * LOW_PART (rhs);
1376 result.high = HIGH_PART (lhs) * HIGH_PART (rhs);
1377
1378 middle[0] = LOW_PART (lhs) * HIGH_PART (rhs);
1379 middle[1] = HIGH_PART (lhs) * LOW_PART (rhs);
1380
1381 temp = result.low;
1382 result.low += LOW_PART (middle[0]) << (PART_PRECISION / 2);
1383 if (result.low < temp)
1384 result.high++;
1385
1386 temp = result.low;
1387 result.low += LOW_PART (middle[1]) << (PART_PRECISION / 2);
1388 if (result.low < temp)
1389 result.high++;
1390
1391 result.high += HIGH_PART (middle[0]);
1392 result.high += HIGH_PART (middle[1]);
Diego Novillo6de9cd92004-05-13 02:41:07 -04001393 result.unsignedp = true;
1394 result.overflow = false;
Neil Booth91318902002-05-26 18:42:21 +00001395
1396 return result;
1397}
1398
1399/* Multiply two preprocessing numbers. */
1400static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001401num_mul (cpp_reader *pfile, cpp_num lhs, cpp_num rhs)
Neil Booth91318902002-05-26 18:42:21 +00001402{
1403 cpp_num result, temp;
1404 bool unsignedp = lhs.unsignedp || rhs.unsignedp;
1405 bool overflow, negate = false;
1406 size_t precision = CPP_OPTION (pfile, precision);
1407
1408 /* Prepare for unsigned multiplication. */
1409 if (!unsignedp)
1410 {
1411 if (!num_positive (lhs, precision))
1412 negate = !negate, lhs = num_negate (lhs, precision);
1413 if (!num_positive (rhs, precision))
1414 negate = !negate, rhs = num_negate (rhs, precision);
1415 }
1416
1417 overflow = lhs.high && rhs.high;
1418 result = num_part_mul (lhs.low, rhs.low);
1419
1420 temp = num_part_mul (lhs.high, rhs.low);
1421 result.high += temp.low;
1422 if (temp.high)
1423 overflow = true;
1424
1425 temp = num_part_mul (lhs.low, rhs.high);
1426 result.high += temp.low;
1427 if (temp.high)
1428 overflow = true;
1429
1430 temp.low = result.low, temp.high = result.high;
1431 result = num_trim (result, precision);
1432 if (!num_eq (result, temp))
1433 overflow = true;
1434
1435 if (negate)
1436 result = num_negate (result, precision);
1437
1438 if (unsignedp)
1439 result.overflow = false;
1440 else
1441 result.overflow = overflow || (num_positive (result, precision) ^ !negate
1442 && !num_zerop (result));
1443 result.unsignedp = unsignedp;
1444
1445 return result;
1446}
1447
1448/* Divide two preprocessing numbers, returning the answer or the
1449 remainder depending upon OP. */
1450static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001451num_div_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
Neil Booth91318902002-05-26 18:42:21 +00001452{
1453 cpp_num result, sub;
1454 cpp_num_part mask;
1455 bool unsignedp = lhs.unsignedp || rhs.unsignedp;
1456 bool negate = false, lhs_neg = false;
1457 size_t i, precision = CPP_OPTION (pfile, precision);
1458
1459 /* Prepare for unsigned division. */
1460 if (!unsignedp)
1461 {
1462 if (!num_positive (lhs, precision))
1463 negate = !negate, lhs_neg = true, lhs = num_negate (lhs, precision);
1464 if (!num_positive (rhs, precision))
1465 negate = !negate, rhs = num_negate (rhs, precision);
1466 }
1467
1468 /* Find the high bit. */
1469 if (rhs.high)
1470 {
1471 i = precision - 1;
Neil Booth359b0be2002-05-28 05:44:06 +00001472 mask = (cpp_num_part) 1 << (i - PART_PRECISION);
Neil Booth91318902002-05-26 18:42:21 +00001473 for (; ; i--, mask >>= 1)
1474 if (rhs.high & mask)
1475 break;
1476 }
1477 else if (rhs.low)
1478 {
1479 if (precision > PART_PRECISION)
1480 i = precision - PART_PRECISION - 1;
1481 else
1482 i = precision - 1;
Neil Booth359b0be2002-05-28 05:44:06 +00001483 mask = (cpp_num_part) 1 << i;
Neil Booth91318902002-05-26 18:42:21 +00001484 for (; ; i--, mask >>= 1)
1485 if (rhs.low & mask)
1486 break;
1487 }
1488 else
1489 {
Neil Booth75aef482002-07-19 19:24:43 +00001490 if (!pfile->state.skip_eval)
John David Anglin0527bc42003-11-01 22:56:54 +00001491 cpp_error (pfile, CPP_DL_ERROR, "division by zero in #if");
Neil Booth91318902002-05-26 18:42:21 +00001492 return lhs;
1493 }
1494
Kazu Hiratada7d8302002-09-22 02:03:17 +00001495 /* First nonzero bit of RHS is bit I. Do naive division by
Neil Booth91318902002-05-26 18:42:21 +00001496 shifting the RHS fully left, and subtracting from LHS if LHS is
1497 at least as big, and then repeating but with one less shift.
1498 This is not very efficient, but is easy to understand. */
1499
1500 rhs.unsignedp = true;
1501 lhs.unsignedp = true;
1502 i = precision - i - 1;
1503 sub = num_lshift (rhs, precision, i);
1504
1505 result.high = result.low = 0;
1506 for (;;)
1507 {
1508 if (num_greater_eq (lhs, sub, precision))
1509 {
1510 lhs = num_binary_op (pfile, lhs, sub, CPP_MINUS);
1511 if (i >= PART_PRECISION)
Neil Booth359b0be2002-05-28 05:44:06 +00001512 result.high |= (cpp_num_part) 1 << (i - PART_PRECISION);
Neil Booth91318902002-05-26 18:42:21 +00001513 else
Neil Booth359b0be2002-05-28 05:44:06 +00001514 result.low |= (cpp_num_part) 1 << i;
Neil Booth91318902002-05-26 18:42:21 +00001515 }
1516 if (i-- == 0)
1517 break;
1518 sub.low = (sub.low >> 1) | (sub.high << (PART_PRECISION - 1));
1519 sub.high >>= 1;
1520 }
1521
1522 /* We divide so that the remainder has the sign of the LHS. */
1523 if (op == CPP_DIV)
1524 {
1525 result.unsignedp = unsignedp;
Diego Novillo6de9cd92004-05-13 02:41:07 -04001526 result.overflow = false;
1527 if (!unsignedp)
Neil Booth91318902002-05-26 18:42:21 +00001528 {
1529 if (negate)
1530 result = num_negate (result, precision);
1531 result.overflow = num_positive (result, precision) ^ !negate;
1532 }
1533
1534 return result;
1535 }
1536
1537 /* CPP_MOD. */
1538 lhs.unsignedp = unsignedp;
1539 lhs.overflow = false;
1540 if (lhs_neg)
1541 lhs = num_negate (lhs, precision);
1542
1543 return lhs;
1544}