macro.c 99.3 KB
Newer Older
Neil Booth committed
1
/* Part of CPP library.  (Macro and #define handling.)
Zack Weinberg committed
2
   Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1998,
3
   1999, 2000, 2001, 2002, 2003, 2004, 2005,
4
   2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
Zack Weinberg committed
5 6 7 8 9 10
   Written by Per Bothner, 1994.
   Based on CCCP program by Paul Rubin, June 1986
   Adapted to ANSI C, Richard Stallman, Jan 1987

This program is free software; you can redistribute it and/or modify it
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
Zack Weinberg committed
12 13 14 15 16 17 18 19
later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
20 21
along with this program; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.
Zack Weinberg committed
22 23 24 25 26 27 28 29

 In other words, you are welcome to use, share and improve this program.
 You are forbidden to forbid anyone else to use, share and improve
 what you give them.   Help stamp out software-hoarding!  */

#include "config.h"
#include "system.h"
#include "cpplib.h"
30
#include "internal.h"
Zack Weinberg committed
31

Neil Booth committed
32
typedef struct macro_arg macro_arg;
33 34 35 36
/* This structure represents the tokens of a macro argument.  These
   tokens can be macro themselves, in which case they can be either
   expanded or unexpanded.  When they are expanded, this data
   structure keeps both the expanded and unexpanded forms.  */
Neil Booth committed
37 38
struct macro_arg
{
39
  const cpp_token **first;	/* First token in unexpanded argument.  */
Kazu Hirata committed
40
  const cpp_token **expanded;	/* Macro-expanded argument.  */
41
  const cpp_token *stringified;	/* Stringified argument.  */
Neil Booth committed
42 43
  unsigned int count;		/* # of tokens in argument.  */
  unsigned int expanded_count;	/* # of tokens in expanded argument.  */
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
  source_location *virt_locs;	/* Where virtual locations for
				   unexpanded tokens are stored.  */
  source_location *expanded_virt_locs; /* Where virtual locations for
					  expanded tokens are
					  stored.  */
};

/* The kind of macro tokens which the instance of
   macro_arg_token_iter is supposed to iterate over.  */
enum macro_arg_token_kind {
  MACRO_ARG_TOKEN_NORMAL,
  /* This is a macro argument token that got transformed into a string
     litteral, e.g. #foo.  */
  MACRO_ARG_TOKEN_STRINGIFIED,
  /* This is a token resulting from the expansion of a macro
     argument that was itself a macro.  */
  MACRO_ARG_TOKEN_EXPANDED
};

/* An iterator over tokens coming from a function-like macro
   argument.  */
typedef struct macro_arg_token_iter macro_arg_token_iter;
struct macro_arg_token_iter
{
  /* Whether or not -ftrack-macro-expansion is used.  */
  bool track_macro_exp_p;
  /* The kind of token over which we are supposed to iterate.  */
  enum macro_arg_token_kind kind;
  /* A pointer to the current token pointed to by the iterator.  */
  const cpp_token **token_ptr;
  /* A pointer to the "full" location of the current token.  If
     -ftrack-macro-expansion is used this location tracks loci accross
     macro expansion.  */
  const source_location *location_ptr;
#ifdef ENABLE_CHECKING
  /* The number of times the iterator went forward. This useful only
     when checking is enabled.  */
  size_t num_forwards;
#endif
Zack Weinberg committed
83 84
};

Neil Booth committed
85 86
/* Macro expansion.  */

87
static int enter_macro_context (cpp_reader *, cpp_hashnode *,
88
				const cpp_token *, source_location);
89 90 91
static int builtin_macro (cpp_reader *, cpp_hashnode *);
static void push_ptoken_context (cpp_reader *, cpp_hashnode *, _cpp_buff *,
				 const cpp_token **, unsigned int);
92 93 94
static void push_extended_tokens_context (cpp_reader *, cpp_hashnode *,
					  _cpp_buff *, source_location *,
					  const cpp_token **, unsigned int);
95
static _cpp_buff *collect_args (cpp_reader *, const cpp_hashnode *,
96
				_cpp_buff **, unsigned *);
97 98 99 100 101 102 103
static cpp_context *next_context (cpp_reader *);
static const cpp_token *padding_token (cpp_reader *, const cpp_token *);
static void expand_arg (cpp_reader *, macro_arg *);
static const cpp_token *new_string_token (cpp_reader *, uchar *, unsigned int);
static const cpp_token *stringify_arg (cpp_reader *, macro_arg *);
static void paste_all_tokens (cpp_reader *, const cpp_token *);
static bool paste_tokens (cpp_reader *, const cpp_token **, const cpp_token *);
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
static void alloc_expanded_arg_mem (cpp_reader *, macro_arg *, size_t);
static void ensure_expanded_arg_room (cpp_reader *, macro_arg *, size_t, size_t *);
static void delete_macro_args (_cpp_buff*, unsigned num_args);
static void set_arg_token (macro_arg *, const cpp_token *,
			   source_location, size_t,
			   enum macro_arg_token_kind,
			   bool);
static const source_location *get_arg_token_location (const macro_arg *,
						      enum macro_arg_token_kind);
static const cpp_token **arg_token_ptr_at (const macro_arg *,
					   size_t,
					   enum macro_arg_token_kind,
					   source_location **virt_location);

static void macro_arg_token_iter_init (macro_arg_token_iter *, bool,
				       enum macro_arg_token_kind,
				       const macro_arg *,
				       const cpp_token **);
static const cpp_token *macro_arg_token_iter_get_token
(const macro_arg_token_iter *it);
static source_location macro_arg_token_iter_get_location
(const macro_arg_token_iter *);
static void macro_arg_token_iter_forward (macro_arg_token_iter *);
static _cpp_buff *tokens_buff_new (cpp_reader *, size_t,
				   source_location **);
static size_t tokens_buff_count (_cpp_buff *);
static const cpp_token **tokens_buff_last_token_ptr (_cpp_buff *);
static const cpp_token **tokens_buff_put_token_to (const cpp_token **,
						   source_location *, 
						   const cpp_token *,
						   source_location,
						   source_location,
						   const struct line_map *,
						   unsigned int);

static const cpp_token **tokens_buff_add_token (_cpp_buff *,
						source_location *,
						const cpp_token *,
						source_location,
						source_location,
						const struct line_map *,
						unsigned int);
static void tokens_buff_remove_last_token (_cpp_buff *);
147
static void replace_args (cpp_reader *, cpp_hashnode *, cpp_macro *,
148
			  macro_arg *, source_location);
149
static _cpp_buff *funlike_invocation_p (cpp_reader *, cpp_hashnode *,
150
					_cpp_buff **, unsigned *);
151
static bool create_iso_definition (cpp_reader *, cpp_macro *);
Neil Booth committed
152 153 154

/* #define directive parsing and handling.  */

155 156
static cpp_token *alloc_expansion_token (cpp_reader *, cpp_macro *);
static cpp_token *lex_expansion_token (cpp_reader *, cpp_macro *);
157
static bool warn_of_redefinition (cpp_reader *, cpp_hashnode *,
158 159 160 161
				  const cpp_macro *);
static bool parse_params (cpp_reader *, cpp_macro *);
static void check_trad_stringification (cpp_reader *, const cpp_macro *,
					const cpp_string *);
162 163 164 165 166
static bool reached_end_of_context (cpp_context *);
static void consume_next_token_from_context (cpp_reader *pfile,
					     const cpp_token **,
					     source_location *);
static const cpp_token* cpp_get_token_1 (cpp_reader *, source_location *);
Zack Weinberg committed
167

168 169 170 171 172 173 174
/* Statistical counter tracking the number of macros that got
   expanded.  */
unsigned num_expanded_macros_counter = 0;
/* Statistical counter tracking the total number tokens resulting
   from macro expansion.  */
unsigned num_macro_tokens_counter = 0;

175 176 177
/* Emits a warning if NODE is a macro defined in the main file that
   has not been used.  */
int
178 179
_cpp_warn_if_unused_macro (cpp_reader *pfile, cpp_hashnode *node,
			   void *v ATTRIBUTE_UNUSED)
180 181 182 183 184 185
{
  if (node->type == NT_MACRO && !(node->flags & NODE_BUILTIN))
    {
      cpp_macro *macro = node->value.macro;

      if (!macro->used
186
	  && MAIN_FILE_P (linemap_lookup (pfile->line_table, macro->line)))
187 188
	cpp_warning_with_line (pfile, CPP_W_UNUSED_MACROS, macro->line, 0,
			       "macro \"%s\" is not used", NODE_NAME (node));
189 190 191 192 193
    }

  return 1;
}

194 195 196
/* Allocates and returns a CPP_STRING token, containing TEXT of length
   LEN, after null-terminating it.  TEXT must be in permanent storage.  */
static const cpp_token *
197
new_string_token (cpp_reader *pfile, unsigned char *text, unsigned int len)
Neil Booth committed
198
{
199
  cpp_token *token = _cpp_temp_token (pfile);
Neil Booth committed
200

201
  text[len] = '\0';
Neil Booth committed
202
  token->type = CPP_STRING;
203 204
  token->val.str.len = len;
  token->val.str.text = text;
Neil Booth committed
205
  token->flags = 0;
206
  return token;
Neil Booth committed
207 208 209 210 211 212 213 214
}

static const char * const monthnames[] =
{
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

215 216
/* Helper function for builtin_macro.  Returns the text generated by
   a builtin macro. */
217
const uchar *
218
_cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node)
Neil Booth committed
219
{
220
  const struct line_map *map;
221
  const uchar *result = NULL;
222
  linenum_type number = 1;
Neil Booth committed
223

Neil Booth committed
224 225
  switch (node->value.builtin)
    {
226
    default:
227
      cpp_error (pfile, CPP_DL_ICE, "invalid built-in macro \"%s\"",
228
		 NODE_NAME (node));
229
      break;
230

231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
    case BT_TIMESTAMP:
      {
	cpp_buffer *pbuffer = cpp_get_buffer (pfile);
	if (pbuffer->timestamp == NULL)
	  {
	    /* Initialize timestamp value of the assotiated file. */
            struct _cpp_file *file = cpp_get_file (pbuffer);
	    if (file)
	      {
    		/* Generate __TIMESTAMP__ string, that represents 
		   the date and time of the last modification 
		   of the current source file. The string constant 
		   looks like "Sun Sep 16 01:03:52 1973".  */
		struct tm *tb = NULL;
		struct stat *st = _cpp_get_file_stat (file);
		if (st)
		  tb = localtime (&st->st_mtime);
		if (tb)
		  {
		    char *str = asctime (tb);
		    size_t len = strlen (str);
		    unsigned char *buf = _cpp_unaligned_alloc (pfile, len + 2);
		    buf[0] = '"';
		    strcpy ((char *) buf + 1, str);
		    buf[len] = '"';
		    pbuffer->timestamp = buf;
		  }
		else
		  {
		    cpp_errno (pfile, CPP_DL_WARNING,
			"could not determine file timestamp");
262
		    pbuffer->timestamp = UC"\"??? ??? ?? ??:??:?? ????\"";
263 264 265 266 267 268
		  }
	      }
	  }
	result = pbuffer->timestamp;
      }
      break;
Neil Booth committed
269 270
    case BT_FILE:
    case BT_BASE_FILE:
Zack Weinberg committed
271
      {
272
	unsigned int len;
273
	const char *name;
274
	uchar *buf;
275 276 277 278 279 280 281 282 283 284 285
	
	if (node->value.builtin == BT_FILE)
	  name = linemap_get_expansion_filename (pfile->line_table,
						 pfile->line_table->highest_line);
	else
	  {
	    map = linemap_lookup (pfile->line_table, pfile->line_table->highest_line);
	    while (! MAIN_FILE_P (map))
	      map = INCLUDED_FROM (pfile->line_table, map);
	    name = ORDINARY_MAP_FILE_NAME (map);
	  }
286
	len = strlen (name);
287
	buf = _cpp_unaligned_alloc (pfile, len * 2 + 3);
288 289 290 291 292
	result = buf;
	*buf = '"';
	buf = cpp_quote_string (buf + 1, (const unsigned char *) name, len);
	*buf++ = '"';
	*buf = '\0';
Zack Weinberg committed
293
      }
Neil Booth committed
294 295
      break;

Neil Booth committed
296
    case BT_INCLUDE_LEVEL:
297 298 299
      /* The line map depth counts the primary source as level 1, but
	 historically __INCLUDE_DEPTH__ has called the primary source
	 level 0.  */
300
      number = pfile->line_table->depth - 1;
Neil Booth committed
301
      break;
Neil Booth committed
302 303

    case BT_SPECLINE:
304
      map = LINEMAPS_LAST_ORDINARY_MAP (pfile->line_table);
Neil Booth committed
305 306 307
      /* If __LINE__ is embedded in a macro, it must expand to the
	 line of the macro's invocation, not its definition.
	 Otherwise things like assert() will not work properly.  */
308 309 310 311
      number = linemap_get_expansion_line (pfile->line_table,
					   CPP_OPTION (pfile, traditional)
					   ? pfile->line_table->highest_line
					   : pfile->cur_token[-1].src_loc);
Neil Booth committed
312
      break;
Neil Booth committed
313

314 315
      /* __STDC__ has the value 1 under normal circumstances.
	 However, if (a) we are in a system header, (b) the option
316 317
	 stdc_0_in_system_headers is true (set by target config), and
	 (c) we are not in strictly conforming mode, then it has the
318
	 value 0.  (b) and (c) are already checked in cpp_init_builtins.  */
Neil Booth committed
319
    case BT_STDC:
320 321 322 323
      if (cpp_in_system_header (pfile))
	number = 0;
      else
	number = 1;
Neil Booth committed
324
      break;
Zack Weinberg committed
325

Neil Booth committed
326 327
    case BT_DATE:
    case BT_TIME:
328
      if (pfile->date == NULL)
Neil Booth committed
329
	{
330 331 332 333
	  /* Allocate __DATE__ and __TIME__ strings from permanent
	     storage.  We only do this once, and don't generate them
	     at init time, because time() and localtime() are very
	     slow on some systems.  */
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
	  time_t tt;
	  struct tm *tb = NULL;

	  /* (time_t) -1 is a legitimate value for "number of seconds
	     since the Epoch", so we have to do a little dance to
	     distinguish that from a genuine error.  */
	  errno = 0;
	  tt = time(NULL);
	  if (tt != (time_t)-1 || errno == 0)
	    tb = localtime (&tt);

	  if (tb)
	    {
	      pfile->date = _cpp_unaligned_alloc (pfile,
						  sizeof ("\"Oct 11 1347\""));
	      sprintf ((char *) pfile->date, "\"%s %2d %4d\"",
350 351
		       monthnames[tb->tm_mon], tb->tm_mday,
		       tb->tm_year + 1900);
352 353 354 355 356 357 358 359

	      pfile->time = _cpp_unaligned_alloc (pfile,
						  sizeof ("\"12:34:56\""));
	      sprintf ((char *) pfile->time, "\"%02d:%02d:%02d\"",
		       tb->tm_hour, tb->tm_min, tb->tm_sec);
	    }
	  else
	    {
360
	      cpp_errno (pfile, CPP_DL_WARNING,
361 362
			 "could not determine date and time");
		
363 364
	      pfile->date = UC"\"??? ?? ????\"";
	      pfile->time = UC"\"??:??:??\"";
365
	    }
Neil Booth committed
366 367
	}

Neil Booth committed
368
      if (node->value.builtin == BT_DATE)
369
	result = pfile->date;
Neil Booth committed
370
      else
371
	result = pfile->time;
Neil Booth committed
372
      break;
373 374

    case BT_COUNTER:
375 376 377
      if (CPP_OPTION (pfile, directives_only) && pfile->state.in_directive)
	cpp_error (pfile, CPP_DL_ERROR,
	    "__COUNTER__ expanded inside directive with -fdirectives-only");
378 379
      number = pfile->counter++;
      break;
380 381 382 383 384 385 386 387 388 389 390 391 392
    }

  if (result == NULL)
    {
      /* 21 bytes holds all NUL-terminated unsigned 64-bit numbers.  */
      result = _cpp_unaligned_alloc (pfile, 21);
      sprintf ((char *) result, "%u", number);
    }

  return result;      
}

/* Convert builtin macros like __FILE__ to a token and push it on the
393 394
   context stack.  Also handles _Pragma, for which a new token may not
   be created.  Returns 1 if it generates a new token context, 0 to
395 396
   return the token to the caller.  */
static int
397
builtin_macro (cpp_reader *pfile, cpp_hashnode *node)
398 399
{
  const uchar *buf;
400 401
  size_t len;
  char *nbuf;
Neil Booth committed
402

403 404
  if (node->value.builtin == BT_PRAGMA)
    {
Neil Booth committed
405 406 407 408 409
      /* Don't interpret _Pragma within directives.  The standard is
         not clear on this, but to me this makes most sense.  */
      if (pfile->state.in_directive)
	return 0;

410
      return _cpp_do__Pragma (pfile);
Neil Booth committed
411
    }
Neil Booth committed
412

413
  buf = _cpp_builtin_macro_text (pfile, node);
414
  len = ustrlen (buf);
415
  nbuf = (char *) alloca (len + 1);
416 417
  memcpy (nbuf, buf, len);
  nbuf[len]='\n';
418

419
  cpp_push_buffer (pfile, (uchar *) nbuf, len, /* from_stage3 */ true);
420
  _cpp_clean_line (pfile);
421 422 423

  /* Set pfile->cur_token as required by _cpp_lex_direct.  */
  pfile->cur_token = _cpp_temp_token (pfile);
424
  _cpp_push_token_context (pfile, NULL, _cpp_lex_direct (pfile), 1);
425
  if (pfile->buffer->cur != pfile->buffer->rlimit)
426
    cpp_error (pfile, CPP_DL_ICE, "invalid built-in macro \"%s\"",
427 428 429
	       NODE_NAME (node));
  _cpp_pop_buffer (pfile);

Neil Booth committed
430
  return 1;
Zack Weinberg committed
431 432
}

433
/* Copies SRC, of length LEN, to DEST, adding backslashes before all
434 435
   backslashes and double quotes. DEST must be of sufficient size.
   Returns a pointer to the end of the string.  */
436
uchar *
437
cpp_quote_string (uchar *dest, const uchar *src, unsigned int len)
Neil Booth committed
438 439 440
{
  while (len--)
    {
441
      uchar c = *src++;
Zack Weinberg committed
442

Neil Booth committed
443 444 445 446 447 448
      if (c == '\\' || c == '"')
	{
	  *dest++ = '\\';
	  *dest++ = c;
	}
      else
449
	  *dest++ = c;
Neil Booth committed
450
    }
Zack Weinberg committed
451

Neil Booth committed
452 453
  return dest;
}
Zack Weinberg committed
454

455 456
/* Convert a token sequence ARG to a single string token according to
   the rules of the ISO C #-operator.  */
457
static const cpp_token *
458
stringify_arg (cpp_reader *pfile, macro_arg *arg)
Neil Booth committed
459
{
460
  unsigned char *dest;
461
  unsigned int i, escape_it, backslash_count = 0;
462
  const cpp_token *source = NULL;
463
  size_t len;
Zack Weinberg committed
464

465 466 467 468 469
  if (BUFF_ROOM (pfile->u_buff) < 3)
    _cpp_extend_buff (pfile, &pfile->u_buff, 3);
  dest = BUFF_FRONT (pfile->u_buff);
  *dest++ = '"';

Neil Booth committed
470 471 472
  /* Loop, reading in the argument's tokens.  */
  for (i = 0; i < arg->count; i++)
    {
473 474 475 476
      const cpp_token *token = arg->first[i];

      if (token->type == CPP_PADDING)
	{
477 478 479
	  if (source == NULL
	      || (!(source->flags & PREV_WHITE)
		  && token->val.source == NULL))
480 481 482
	    source = token->val.source;
	  continue;
	}
Zack Weinberg committed
483

484
      escape_it = (token->type == CPP_STRING || token->type == CPP_CHAR
485
		   || token->type == CPP_WSTRING || token->type == CPP_WCHAR
486
		   || token->type == CPP_STRING32 || token->type == CPP_CHAR32
487 488
		   || token->type == CPP_STRING16 || token->type == CPP_CHAR16
		   || token->type == CPP_UTF8STRING);
Zack Weinberg committed
489

490
      /* Room for each char being written in octal, initial space and
491
	 final quote and NUL.  */
492
      len = cpp_token_len (token);
Neil Booth committed
493 494
      if (escape_it)
	len *= 4;
495
      len += 3;
Zack Weinberg committed
496

497
      if ((size_t) (BUFF_LIMIT (pfile->u_buff) - dest) < len)
Neil Booth committed
498
	{
499
	  size_t len_so_far = dest - BUFF_FRONT (pfile->u_buff);
500
	  _cpp_extend_buff (pfile, &pfile->u_buff, len);
501
	  dest = BUFF_FRONT (pfile->u_buff) + len_so_far;
Neil Booth committed
502
	}
Zack Weinberg committed
503

504
      /* Leading white space?  */
505
      if (dest - 1 != BUFF_FRONT (pfile->u_buff))
506 507 508 509 510 511 512
	{
	  if (source == NULL)
	    source = token;
	  if (source->flags & PREV_WHITE)
	    *dest++ = ' ';
	}
      source = NULL;
Zack Weinberg committed
513

Neil Booth committed
514 515
      if (escape_it)
	{
516 517
	  _cpp_buff *buff = _cpp_get_buff (pfile, len);
	  unsigned char *buf = BUFF_FRONT (buff);
518
	  len = cpp_spell_token (pfile, token, buf, true) - buf;
519
	  dest = cpp_quote_string (dest, buf, len);
520
	  _cpp_release_buff (pfile, buff);
Neil Booth committed
521 522
	}
      else
523
	dest = cpp_spell_token (pfile, token, dest, true);
Neil Booth committed
524

525
      if (token->type == CPP_OTHER && token->val.str.text[0] == '\\')
Neil Booth committed
526 527 528 529 530 531 532 533
	backslash_count++;
      else
	backslash_count = 0;
    }

  /* Ignore the final \ of invalid string literals.  */
  if (backslash_count & 1)
    {
534
      cpp_error (pfile, CPP_DL_WARNING,
535
		 "invalid string literal, ignoring final '\\'");
536
      dest--;
Neil Booth committed
537 538
    }

539
  /* Commit the memory, including NUL, and return the token.  */
540
  *dest++ = '"';
541 542 543
  len = dest - BUFF_FRONT (pfile->u_buff);
  BUFF_FRONT (pfile->u_buff) = dest + 1;
  return new_string_token (pfile, dest - len, len);
Neil Booth committed
544 545
}

546
/* Try to paste two tokens.  On success, return nonzero.  In any
Neil Booth committed
547 548 549
   case, PLHS is updated to point to the pasted token, which is
   guaranteed to not have the PASTE_LEFT flag set.  */
static bool
550
paste_tokens (cpp_reader *pfile, const cpp_token **plhs, const cpp_token *rhs)
551
{
552
  unsigned char *buf, *end, *lhsend;
553
  cpp_token *lhs;
Neil Booth committed
554 555
  unsigned int len;

556
  len = cpp_token_len (*plhs) + cpp_token_len (rhs) + 1;
557
  buf = (unsigned char *) alloca (len);
558
  end = lhsend = cpp_spell_token (pfile, *plhs, buf, false);
Neil Booth committed
559 560 561 562 563

  /* Avoid comment headers, since they are still processed in stage 3.
     It is simpler to insert a space here, rather than modifying the
     lexer to ignore comments in some circumstances.  Simply returning
     false doesn't work, since we want to clear the PASTE_LEFT flag.  */
564
  if ((*plhs)->type == CPP_DIV && rhs->type != CPP_EQ)
Neil Booth committed
565
    *end++ = ' ';
566 567 568
  /* In one obscure case we might see padding here.  */
  if (rhs->type != CPP_PADDING)
    end = cpp_spell_token (pfile, rhs, end, false);
569
  *end = '\n';
Neil Booth committed
570

571
  cpp_push_buffer (pfile, buf, end - buf, /* from_stage3 */ true);
572
  _cpp_clean_line (pfile);
Neil Booth committed
573 574 575

  /* Set pfile->cur_token as required by _cpp_lex_direct.  */
  pfile->cur_token = _cpp_temp_token (pfile);
576
  lhs = _cpp_lex_direct (pfile);
577 578
  if (pfile->buffer->cur != pfile->buffer->rlimit)
    {
579 580
      source_location saved_loc = lhs->src_loc;

581 582 583 584
      _cpp_pop_buffer (pfile);
      _cpp_backup_tokens (pfile, 1);
      *lhsend = '\0';

585 586 587 588 589 590 591
      /* We have to remove the PASTE_LEFT flag from the old lhs, but
	 we want to keep the new location.  */
      *lhs = **plhs;
      *plhs = lhs;
      lhs->src_loc = saved_loc;
      lhs->flags &= ~PASTE_LEFT;

592 593 594 595 596 597 598
      /* Mandatory error for all apart from assembler.  */
      if (CPP_OPTION (pfile, lang) != CLK_ASM)
	cpp_error (pfile, CPP_DL_ERROR,
	 "pasting \"%s\" and \"%s\" does not give a valid preprocessing token",
		   buf, cpp_token_as_text (pfile, rhs));
      return false;
    }
Neil Booth committed
599

600
  *plhs = lhs;
601 602
  _cpp_pop_buffer (pfile);
  return true;
603 604
}

605 606 607 608 609 610 611
/* Handles an arbitrarily long sequence of ## operators, with initial
   operand LHS.  This implementation is left-associative,
   non-recursive, and finishes a paste before handling succeeding
   ones.  If a paste fails, we back up to the RHS of the failing ##
   operator before pushing the context containing the result of prior
   successful pastes, with the effect that the RHS appears in the
   output stream after the pasted LHS normally.  */
Neil Booth committed
612
static void
613
paste_all_tokens (cpp_reader *pfile, const cpp_token *lhs)
Neil Booth committed
614
{
615
  const cpp_token *rhs = NULL;
616 617
  cpp_context *context = pfile->context;

Neil Booth committed
618 619 620 621 622 623
  do
    {
      /* Take the token directly from the current context.  We can do
	 this, because we are in the replacement list of either an
	 object-like macro, or a function-like macro with arguments
	 inserted.  In either case, the constraints to #define
624
	 guarantee we have at least one more token.  */
625
      if (context->tokens_kind == TOKENS_KIND_DIRECT)
626
	rhs = FIRST (context).token++;
627
      else if (context->tokens_kind == TOKENS_KIND_INDIRECT)
628
	rhs = *FIRST (context).ptoken++;
629 630 631 632 633 634 635 636 637 638 639 640 641 642 643
      else if (context->tokens_kind == TOKENS_KIND_EXTENDED)
	{
	  /* So we are in presence of an extended token context, which
	     means that each token in this context has a virtual
	     location attached to it.  So let's not forget to update
	     the pointer to the current virtual location of the
	     current token when we update the pointer to the current
	     token */

	  rhs = *FIRST (context).ptoken++;
	  /* context->c.mc must be non-null, as if we were not in a
	     macro context, context->tokens_kind could not be equal to
	     TOKENS_KIND_EXTENDED.  */
	  context->c.mc->cur_virt_loc++;
	}
644 645

      if (rhs->type == CPP_PADDING)
646 647 648 649
	{
	  if (rhs->flags & PASTE_LEFT)
	    abort ();
	}
Neil Booth committed
650
      if (!paste_tokens (pfile, &lhs, rhs))
651
	break;
Neil Booth committed
652 653 654
    }
  while (rhs->flags & PASTE_LEFT);

Neil Booth committed
655
  /* Put the resulting token in its own context.  */
656
  _cpp_push_token_context (pfile, NULL, lhs, 1);
Neil Booth committed
657 658
}

659 660 661 662 663 664 665
/* Returns TRUE if the number of arguments ARGC supplied in an
   invocation of the MACRO referenced by NODE is valid.  An empty
   invocation to a macro with no parameters should pass ARGC as zero.

   Note that MACRO cannot necessarily be deduced from NODE, in case
   NODE was redefined whilst collecting arguments.  */
bool
666
_cpp_arguments_ok (cpp_reader *pfile, cpp_macro *macro, const cpp_hashnode *node, unsigned int argc)
667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683
{
  if (argc == macro->paramc)
    return true;

  if (argc < macro->paramc)
    {
      /* As an extension, a rest argument is allowed to not appear in
	 the invocation at all.
	 e.g. #define debug(format, args...) something
	 debug("string");

	 This is exactly the same as if there had been an empty rest
	 argument - debug("string", ).  */

      if (argc + 1 == macro->paramc && macro->variadic)
	{
	  if (CPP_PEDANTIC (pfile) && ! macro->syshdr)
684
	    cpp_error (pfile, CPP_DL_PEDWARN,
685 686 687 688
		       "ISO C99 requires rest arguments to be used");
	  return true;
	}

689
      cpp_error (pfile, CPP_DL_ERROR,
690 691 692 693
		 "macro \"%s\" requires %u arguments, but only %u given",
		 NODE_NAME (node), macro->paramc, argc);
    }
  else
694
    cpp_error (pfile, CPP_DL_ERROR,
695 696 697 698 699 700
	       "macro \"%s\" passed %u arguments, but takes just %u",
	       NODE_NAME (node), argc, macro->paramc);

  return false;
}

701 702 703 704
/* Reads and returns the arguments to a function-like macro
   invocation.  Assumes the opening parenthesis has been processed.
   If there is an error, emits an appropriate diagnostic and returns
   NULL.  Each argument is terminated by a CPP_EOF token, for the
705 706
   future benefit of expand_arg().  If there are any deferred
   #pragma directives among macro arguments, store pointers to the
707 708 709 710 711 712 713
   CPP_PRAGMA ... CPP_PRAGMA_EOL tokens into *PRAGMA_BUFF buffer.

   What is returned is the buffer that contains the memory allocated
   to hold the macro arguments.  NODE is the name of the macro this
   function is dealing with.  If NUM_ARGS is non-NULL, *NUM_ARGS is
   set to the actual number of macro arguments allocated in the
   returned buffer.  */
714
static _cpp_buff *
715
collect_args (cpp_reader *pfile, const cpp_hashnode *node,
716
	      _cpp_buff **pragma_buff, unsigned *num_args)
Neil Booth committed
717
{
718 719 720 721 722
  _cpp_buff *buff, *base_buff;
  cpp_macro *macro;
  macro_arg *args, *arg;
  const cpp_token *token;
  unsigned int argc;
723 724 725
  source_location virt_loc;
  bool track_macro_expansion_p = CPP_OPTION (pfile, track_macro_expansion);
  unsigned num_args_alloced = 0;
726 727 728 729 730 731

  macro = node->value.macro;
  if (macro->paramc)
    argc = macro->paramc;
  else
    argc = 1;
732 733 734 735 736 737

#define DEFAULT_NUM_TOKENS_PER_MACRO_ARG 50
#define ARG_TOKENS_EXTENT 1000

  buff = _cpp_get_buff (pfile, argc * (DEFAULT_NUM_TOKENS_PER_MACRO_ARG
				       * sizeof (cpp_token *)
738 739 740 741
				       + sizeof (macro_arg)));
  base_buff = buff;
  args = (macro_arg *) buff->base;
  memset (args, 0, argc * sizeof (macro_arg));
742
  buff->cur = (unsigned char *) &args[argc];
743 744 745 746 747 748
  arg = args, argc = 0;

  /* Collect the tokens making up each argument.  We don't yet know
     how many arguments have been supplied, whether too many or too
     few.  Hence the slightly bizarre usage of "argc" and "arg".  */
  do
Neil Booth committed
749
    {
750 751
      unsigned int paren_depth = 0;
      unsigned int ntokens = 0;
752 753
      unsigned virt_locs_capacity = DEFAULT_NUM_TOKENS_PER_MACRO_ARG;
      num_args_alloced++;
Neil Booth committed
754

755 756
      argc++;
      arg->first = (const cpp_token **) buff->cur;
757 758 759 760 761 762
      if (track_macro_expansion_p)
	{
	  virt_locs_capacity = DEFAULT_NUM_TOKENS_PER_MACRO_ARG;
	  arg->virt_locs = XNEWVEC (source_location,
				    virt_locs_capacity);
	}
Zack Weinberg committed
763

764 765 766
      for (;;)
	{
	  /* Require space for 2 new tokens (including a CPP_EOF).  */
767
	  if ((unsigned char *) &arg->first[ntokens + 2] > buff->limit)
768
	    {
769
	      buff = _cpp_append_extend_buff (pfile, buff,
770 771
					      ARG_TOKENS_EXTENT
					      * sizeof (cpp_token *));
772 773
	      arg->first = (const cpp_token **) buff->cur;
	    }
774 775 776 777 778 779 780 781
	  if (track_macro_expansion_p
	      && (ntokens + 2 > virt_locs_capacity))
	    {
	      virt_locs_capacity += ARG_TOKENS_EXTENT;
	      arg->virt_locs = XRESIZEVEC (source_location,
					   arg->virt_locs,
					   virt_locs_capacity);
	    }
782

783
	  token = cpp_get_token_1 (pfile, &virt_loc);
Zack Weinberg committed
784

785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808
	  if (token->type == CPP_PADDING)
	    {
	      /* Drop leading padding.  */
	      if (ntokens == 0)
		continue;
	    }
	  else if (token->type == CPP_OPEN_PAREN)
	    paren_depth++;
	  else if (token->type == CPP_CLOSE_PAREN)
	    {
	      if (paren_depth-- == 0)
		break;
	    }
	  else if (token->type == CPP_COMMA)
	    {
	      /* A comma does not terminate an argument within
		 parentheses or as part of a variable argument.  */
	      if (paren_depth == 0
		  && ! (macro->variadic && argc == macro->paramc))
		break;
	    }
	  else if (token->type == CPP_EOF
		   || (token->type == CPP_HASH && token->flags & BOL))
	    break;
809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839
	  else if (token->type == CPP_PRAGMA)
	    {
	      cpp_token *newtok = _cpp_temp_token (pfile);

	      /* CPP_PRAGMA token lives in directive_result, which will
		 be overwritten on the next directive.  */
	      *newtok = *token;
	      token = newtok;
	      do
		{
		  if (*pragma_buff == NULL
		      || BUFF_ROOM (*pragma_buff) < sizeof (cpp_token *))
		    {
		      _cpp_buff *next;
		      if (*pragma_buff == NULL)
			*pragma_buff
			  = _cpp_get_buff (pfile, 32 * sizeof (cpp_token *));
		      else
			{
			  next = *pragma_buff;
			  *pragma_buff
			    = _cpp_get_buff (pfile,
					     (BUFF_FRONT (*pragma_buff)
					      - (*pragma_buff)->base) * 2);
			  (*pragma_buff)->next = next;
			}
		    }
		  *(const cpp_token **) BUFF_FRONT (*pragma_buff) = token;
		  BUFF_FRONT (*pragma_buff) += sizeof (cpp_token *);
		  if (token->type == CPP_PRAGMA_EOL)
		    break;
840
		  token = cpp_get_token_1 (pfile, &virt_loc);
841 842 843 844 845 846 847 848 849 850 851 852 853
		}
	      while (token->type != CPP_EOF);

	      /* In deferred pragmas parsing_args and prevent_expansion
		 had been changed, reset it.  */
	      pfile->state.parsing_args = 2;
	      pfile->state.prevent_expansion = 1;

	      if (token->type == CPP_EOF)
		break;
	      else
		continue;
	    }
854 855 856 857
	  set_arg_token (arg, token, virt_loc,
			 ntokens, MACRO_ARG_TOKEN_NORMAL,
			 CPP_OPTION (pfile, track_macro_expansion));
	  ntokens++;
858
	}
Neil Booth committed
859

860 861 862
      /* Drop trailing padding.  */
      while (ntokens > 0 && arg->first[ntokens - 1]->type == CPP_PADDING)
	ntokens--;
Neil Booth committed
863

864
      arg->count = ntokens;
865 866 867
      set_arg_token (arg, &pfile->eof, pfile->eof.src_loc,
		     ntokens, MACRO_ARG_TOKEN_NORMAL,
		     CPP_OPTION (pfile, track_macro_expansion));
Neil Booth committed
868

869 870 871 872
      /* Terminate the argument.  Excess arguments loop back and
	 overwrite the final legitimate argument, before failing.  */
      if (argc <= macro->paramc)
	{
873
	  buff->cur = (unsigned char *) &arg->first[ntokens + 1];
874 875 876
	  if (argc != macro->paramc)
	    arg++;
	}
Neil Booth committed
877
    }
878
  while (token->type != CPP_CLOSE_PAREN && token->type != CPP_EOF);
Neil Booth committed
879

880
  if (token->type == CPP_EOF)
Neil Booth committed
881
    {
882 883 884 885
      /* We still need the CPP_EOF to end directives, and to end
	 pre-expansion of a macro argument.  Step back is not
	 unconditional, since we don't want to return a CPP_EOF to our
	 callers at the end of an -include-d file.  */
886
      if (pfile->context->prev || pfile->state.in_directive)
887
	_cpp_backup_tokens (pfile, 1);
888
      cpp_error (pfile, CPP_DL_ERROR,
889
		 "unterminated argument list invoking macro \"%s\"",
890
		 NODE_NAME (node));
Neil Booth committed
891
    }
892
  else
Neil Booth committed
893
    {
894 895 896 897
      /* A single empty argument is counted as no argument.  */
      if (argc == 1 && macro->paramc == 0 && args[0].count == 0)
	argc = 0;
      if (_cpp_arguments_ok (pfile, macro, node, argc))
898 899 900 901 902 903 904 905 906 907 908 909
	{
	  /* GCC has special semantics for , ## b where b is a varargs
	     parameter: we remove the comma if b was omitted entirely.
	     If b was merely an empty argument, the comma is retained.
	     If the macro takes just one (varargs) parameter, then we
	     retain the comma only if we are standards conforming.

	     If FIRST is NULL replace_args () swallows the comma.  */
	  if (macro->variadic && (argc < macro->paramc
				  || (argc == 1 && args[0].count == 0
				      && !CPP_OPTION (pfile, std))))
	    args[macro->paramc - 1].first = NULL;
910 911
	  if (num_args)
	    *num_args = num_args_alloced;
912 913
	  return base_buff;
	}
Neil Booth committed
914 915
    }

916
  /* An error occurred.  */
917 918
  _cpp_release_buff (pfile, base_buff);
  return NULL;
Neil Booth committed
919 920
}

921 922 923
/* Search for an opening parenthesis to the macro of NODE, in such a
   way that, if none is found, we don't lose the information in any
   intervening padding tokens.  If we find the parenthesis, collect
924
   the arguments and return the buffer containing them.  PRAGMA_BUFF
925 926 927
   argument is the same as in collect_args.  If NUM_ARGS is non-NULL,
   *NUM_ARGS is set to the number of arguments contained in the
   returned buffer.  */
928
static _cpp_buff *
929
funlike_invocation_p (cpp_reader *pfile, cpp_hashnode *node,
930
		      _cpp_buff **pragma_buff, unsigned *num_args)
Neil Booth committed
931
{
932
  const cpp_token *token, *padding = NULL;
933

934
  for (;;)
935
    {
936 937 938 939 940 941
      token = cpp_get_token (pfile);
      if (token->type != CPP_PADDING)
	break;
      if (padding == NULL
	  || (!(padding->flags & PREV_WHITE) && token->val.source == NULL))
	padding = token;
942
    }
Neil Booth committed
943

944
  if (token->type == CPP_OPEN_PAREN)
Neil Booth committed
945
    {
946
      pfile->state.parsing_args = 2;
947
      return collect_args (pfile, node, pragma_buff, num_args);
Neil Booth committed
948 949
    }

950 951 952 953 954 955 956 957 958
  /* CPP_EOF can be the end of macro arguments, or the end of the
     file.  We mustn't back up over the latter.  Ugh.  */
  if (token->type != CPP_EOF || token == &pfile->eof)
    {
      /* Back up.  We may have skipped padding, in which case backing
	 up more than one token when expanding macros is in general
	 too difficult.  We re-insert it in its own context.  */
      _cpp_backup_tokens (pfile, 1);
      if (padding)
959
	_cpp_push_token_context (pfile, NULL, padding, 1);
960
    }
961 962

  return NULL;
Neil Booth committed
963 964
}

965 966 967 968 969 970 971 972 973 974 975 976 977
/* Return the real number of tokens in the expansion of MACRO.  */
static inline unsigned int
macro_real_token_count (const cpp_macro *macro)
{
  unsigned int i;
  if (__builtin_expect (!macro->extra_tokens, true))
    return macro->count;
  for (i = 0; i < macro->count; i++)
    if (macro->exp.tokens[i].type == CPP_PASTE)
      return i;
  abort ();
}

978 979 980
/* Push the context of a macro with hash entry NODE onto the context
   stack.  If we can successfully expand the macro, we push a context
   containing its yet-to-be-rescanned replacement list and return one.
981 982 983 984 985 986
   If there were additionally any unexpanded deferred #pragma
   directives among macro arguments, push another context containing
   the pragma tokens before the yet-to-be-rescanned replacement list
   and return two.  Otherwise, we don't push a context and return
   zero. LOCATION is the location of the expansion point of the
   macro.  */
Zack Weinberg committed
987
static int
988
enter_macro_context (cpp_reader *pfile, cpp_hashnode *node,
989
		     const cpp_token *result, source_location location)
Zack Weinberg committed
990
{
991
  /* The presence of a macro invalidates a file's controlling macro.  */
Neil Booth committed
992 993
  pfile->mi_valid = false;

994 995
  pfile->state.angled_headers = false;

996 997 998
  if ((node->flags & NODE_BUILTIN) && !(node->flags & NODE_USED))
    {
      node->flags |= NODE_USED;
999 1000 1001
      if ((!pfile->cb.user_builtin_macro
	   || !pfile->cb.user_builtin_macro (pfile, node))
	  && pfile->cb.used_define)
1002 1003 1004
	pfile->cb.used_define (pfile, pfile->directive_line, node);
    }

1005
  /* Handle standard macros.  */
Neil Booth committed
1006
  if (! (node->flags & NODE_BUILTIN))
Zack Weinberg committed
1007
    {
1008
      cpp_macro *macro = node->value.macro;
1009
      _cpp_buff *pragma_buff = NULL;
Neil Booth committed
1010

1011 1012 1013
      if (macro->fun_like)
	{
	  _cpp_buff *buff;
1014
	  unsigned num_args = 0;
1015 1016 1017 1018

	  pfile->state.prevent_expansion++;
	  pfile->keep_tokens++;
	  pfile->state.parsing_args = 1;
1019 1020
	  buff = funlike_invocation_p (pfile, node, &pragma_buff,
				       &num_args);
1021 1022 1023 1024 1025 1026 1027
	  pfile->state.parsing_args = 0;
	  pfile->keep_tokens--;
	  pfile->state.prevent_expansion--;

	  if (buff == NULL)
	    {
	      if (CPP_WTRADITIONAL (pfile) && ! node->value.macro->syshdr)
1028
		cpp_warning (pfile, CPP_W_TRADITIONAL,
1029
 "function-like macro \"%s\" must be used with arguments in traditional C",
1030
			     NODE_NAME (node));
1031

1032 1033 1034
	      if (pragma_buff)
		_cpp_release_buff (pfile, pragma_buff);

1035 1036 1037
	      return 0;
	    }

1038
	  if (macro->paramc > 0)
1039 1040 1041 1042 1043 1044 1045
	    replace_args (pfile, node, macro,
			  (macro_arg *) buff->base,
			  location);
	  /* Free the memory used by the arguments of this
	     function-like macro.  This memory has been allocated by
	     funlike_invocation_p and by replace_args.  */
	  delete_macro_args (buff, num_args);
1046
	}
Neil Booth committed
1047

1048
      /* Disable the macro within its expansion.  */
Neil Booth committed
1049
      node->flags |= NODE_DISABLED;
Neil Booth committed
1050

1051 1052 1053 1054 1055 1056 1057
      if (!(node->flags & NODE_USED))
	{
	  node->flags |= NODE_USED;
	  if (pfile->cb.used_define)
	    pfile->cb.used_define (pfile, pfile->directive_line, node);
	}

1058
      if (pfile->cb.used)
1059
	pfile->cb.used (pfile, location, node);
1060

1061 1062
      macro->used = 1;

1063
      if (macro->paramc == 0)
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091
	{
	  if (CPP_OPTION (pfile, track_macro_expansion))
	    {
	      unsigned int i, count = macro->count;
	      const cpp_token *src = macro->exp.tokens;
	      const struct line_map *map;
	      source_location *virt_locs = NULL;
	      _cpp_buff *macro_tokens =
		tokens_buff_new (pfile, count, &virt_locs);

	      /* Create a macro map to record the locations of the
		 tokens that are involved in the expansion. LOCATION
		 is the location of the macro expansion point.  */
	      map  = linemap_enter_macro (pfile->line_table,
					  node, location, count);
	      for (i = 0; i < count; ++i)
		{
		  tokens_buff_add_token (macro_tokens, virt_locs,
					 src, src->src_loc,
					 src->src_loc, map, i);
		  ++src;
		}
	      push_extended_tokens_context (pfile, node,
					    macro_tokens,
					    virt_locs,
					    (const cpp_token **)
					    macro_tokens->base,
					    count);
1092
	      num_macro_tokens_counter += count;
1093 1094
	    }
	  else
1095 1096 1097 1098 1099 1100
	    {
	      unsigned tokens_count = macro_real_token_count (macro);
	      _cpp_push_token_context (pfile, node, macro->exp.tokens,
				       tokens_count);
	      num_macro_tokens_counter += tokens_count;
	    }
1101
	}
Neil Booth committed
1102

1103 1104 1105 1106 1107 1108 1109
      if (pragma_buff)
	{
	  if (!pfile->state.in_directive)
	    _cpp_push_token_context (pfile, NULL,
				     padding_token (pfile, result), 1);
	  do
	    {
1110
	      unsigned tokens_count;
1111 1112
	      _cpp_buff *tail = pragma_buff->next;
	      pragma_buff->next = NULL;
1113 1114
	      tokens_count = ((const cpp_token **) BUFF_FRONT (pragma_buff)
			      - (const cpp_token **) pragma_buff->base);
1115 1116
	      push_ptoken_context (pfile, NULL, pragma_buff,
				   (const cpp_token **) pragma_buff->base,
1117
				   tokens_count);
1118
	      pragma_buff = tail;
1119 1120 1121
	      if (!CPP_OPTION (pfile, track_macro_expansion))
		num_macro_tokens_counter += tokens_count;

1122 1123 1124 1125 1126
	    }
	  while (pragma_buff != NULL);
	  return 2;
	}

Neil Booth committed
1127
      return 1;
Zack Weinberg committed
1128
    }
Neil Booth committed
1129

1130
  /* Handle built-in macros and the _Pragma operator.  */
Neil Booth committed
1131
  return builtin_macro (pfile, node);
Neil Booth committed
1132 1133
}

1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280
/* De-allocate the memory used by BUFF which is an array of instances
   of macro_arg.  NUM_ARGS is the number of instances of macro_arg
   present in BUFF.  */
static void
delete_macro_args (_cpp_buff *buff, unsigned num_args)
{
  macro_arg *macro_args;
  unsigned i;

  if (buff == NULL)
    return;

  macro_args = (macro_arg *) buff->base;

  /* Walk instances of macro_arg to free their expanded tokens as well
     as their macro_arg::virt_locs members.  */
  for (i = 0; i < num_args; ++i)
    {
      if (macro_args[i].expanded)
	{
	  free (macro_args[i].expanded);
	  macro_args[i].expanded = NULL;
	}
      if (macro_args[i].virt_locs)
	{
	  free (macro_args[i].virt_locs);
	  macro_args[i].virt_locs = NULL;
	}
      if (macro_args[i].expanded_virt_locs)
	{
	  free (macro_args[i].expanded_virt_locs);
	  macro_args[i].expanded_virt_locs = NULL;
	}
    }
  _cpp_free_buff (buff);
}

/* Set the INDEXth token of the macro argument ARG. TOKEN is the token
   to set, LOCATION is its virtual location.  "Virtual" location means
   the location that encodes loci accross macro expansion. Otherwise
   it has to be TOKEN->SRC_LOC.  KIND is the kind of tokens the
   argument ARG is supposed to contain.  Note that ARG must be
   tailored so that it has enough room to contain INDEX + 1 numbers of
   tokens, at least.  */
static void
set_arg_token (macro_arg *arg, const cpp_token *token,
	       source_location location, size_t index,
	       enum macro_arg_token_kind kind,
	       bool track_macro_exp_p)
{
  const cpp_token **token_ptr;
  source_location *loc = NULL;

  token_ptr =
    arg_token_ptr_at (arg, index, kind,
		      track_macro_exp_p ? &loc : NULL);
  *token_ptr = token;

  if (loc != NULL)
    {
#ifdef ENABLE_CHECKING
      if (kind == MACRO_ARG_TOKEN_STRINGIFIED
	  || !track_macro_exp_p)
	/* We can't set the location of a stringified argument
	   token and we can't set any location if we aren't tracking
	   macro expansion locations.   */
	abort ();
#endif
      *loc = location;
    }
}

/* Get the pointer to the location of the argument token of the
   function-like macro argument ARG.  This function must be called
   only when we -ftrack-macro-expansion is on.  */
static const source_location *
get_arg_token_location (const macro_arg *arg,
			enum macro_arg_token_kind kind)
{
  const source_location *loc = NULL;
  const cpp_token **token_ptr =
    arg_token_ptr_at (arg, 0, kind, (source_location **) &loc);

  if (token_ptr == NULL)
    return NULL;

  return loc;
}

/* Return the pointer to the INDEXth token of the macro argument ARG.
   KIND specifies the kind of token the macro argument ARG contains.
   If VIRT_LOCATION is non NULL, *VIRT_LOCATION is set to the address
   of the virtual location of the returned token if the
   -ftrack-macro-expansion flag is on; otherwise, it's set to the
   spelling location of the returned token.  */
static const cpp_token **
arg_token_ptr_at (const macro_arg *arg, size_t index,
		  enum macro_arg_token_kind kind,
		  source_location **virt_location)
{
  const cpp_token **tokens_ptr = NULL;

  switch (kind)
    {
    case MACRO_ARG_TOKEN_NORMAL:
      tokens_ptr = arg->first;
      break;
    case MACRO_ARG_TOKEN_STRINGIFIED:      
      tokens_ptr = (const cpp_token **) &arg->stringified;
      break;
    case MACRO_ARG_TOKEN_EXPANDED:
	tokens_ptr = arg->expanded;
      break;
    }

  if (tokens_ptr == NULL)
    /* This can happen for e.g, an empty token argument to a
       funtion-like macro.  */
    return tokens_ptr;

  if (virt_location)
    {
      if (kind == MACRO_ARG_TOKEN_NORMAL)
	*virt_location = &arg->virt_locs[index];
      else if (kind == MACRO_ARG_TOKEN_EXPANDED)
	*virt_location = &arg->expanded_virt_locs[index];
      else if (kind == MACRO_ARG_TOKEN_STRINGIFIED)
	*virt_location =
	  (source_location *) &tokens_ptr[index]->src_loc;
    }
  return &tokens_ptr[index];
}

/* Initialize an iterator so that it iterates over the tokens of a
   function-like macro argument.  KIND is the kind of tokens we want
   ITER to iterate over. TOKEN_PTR points the first token ITER will
   iterate over.  */
static void
macro_arg_token_iter_init (macro_arg_token_iter *iter,
			   bool track_macro_exp_p,
			   enum macro_arg_token_kind kind,
			   const macro_arg *arg,
			   const cpp_token **token_ptr)
{
  iter->track_macro_exp_p = track_macro_exp_p;
  iter->kind = kind;
  iter->token_ptr = token_ptr;
1281 1282 1283 1284
  /* Unconditionally initialize this so that the compiler doesn't warn
     about iter->location_ptr being possibly uninitialized later after
     this code has been inlined somewhere.  */
  iter->location_ptr = NULL;
1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403
  if (track_macro_exp_p)
    iter->location_ptr = get_arg_token_location (arg, kind);
#ifdef ENABLE_CHECKING
  iter->num_forwards = 0;
  if (track_macro_exp_p
      && token_ptr != NULL
      && iter->location_ptr == NULL)
    abort ();
#endif
}

/* Move the iterator one token forward. Note that if IT was
   initialized on an argument that has a stringified token, moving it
   foward doesn't make sense as a stringified token is essentially one
   string.  */
static void
macro_arg_token_iter_forward (macro_arg_token_iter *it)
{
  switch (it->kind)
    {
    case MACRO_ARG_TOKEN_NORMAL:
    case MACRO_ARG_TOKEN_EXPANDED:
      it->token_ptr++;
      if (it->track_macro_exp_p)
	it->location_ptr++;
      break;
    case MACRO_ARG_TOKEN_STRINGIFIED:
#ifdef ENABLE_CHECKING
      if (it->num_forwards > 0)
	abort ();
#endif
      break;
    }

#ifdef ENABLE_CHECKING
  it->num_forwards++;
#endif
}

/* Return the token pointed to by the iterator.  */
static const cpp_token *
macro_arg_token_iter_get_token (const macro_arg_token_iter *it)
{
#ifdef ENABLE_CHECKING
  if (it->kind == MACRO_ARG_TOKEN_STRINGIFIED
      && it->num_forwards > 0)
    abort ();
#endif
  if (it->token_ptr == NULL)
    return NULL;
  return *it->token_ptr;
}

/* Return the location of the token pointed to by the iterator.*/
static source_location
macro_arg_token_iter_get_location (const macro_arg_token_iter *it)
{
#ifdef ENABLE_CHECKING
  if (it->kind == MACRO_ARG_TOKEN_STRINGIFIED
      && it->num_forwards > 0)
    abort ();
#endif
  if (it->track_macro_exp_p)
    return *it->location_ptr;
  else
    return (*it->token_ptr)->src_loc;
}

/* Return the index of a token [resulting from macro expansion] inside
   the total list of tokens resulting from a given macro
   expansion. The index can be different depending on whether if we
   want each tokens resulting from function-like macro arguments
   expansion to have a different location or not.

   E.g, consider this function-like macro: 

        #define M(x) x - 3

   Then consider us "calling" it (and thus expanding it) like:
   
       M(1+4)

   It will be expanded into:

       1+4-3

   Let's consider the case of the token '4'.

   Its index can be 2 (it's the third token of the set of tokens
   resulting from the expansion) or it can be 0 if we consider that
   all tokens resulting from the expansion of the argument "1+2" have
   the same index, which is 0. In this later case, the index of token
   '-' would then be 1 and the index of token '3' would be 2.

   The later case is useful to use less memory e.g, for the case of
   the user using the option -ftrack-macro-expansion=1.

   ABSOLUTE_TOKEN_INDEX is the index of the macro argument token we
   are interested in.  CUR_REPLACEMENT_TOKEN is the token of the macro
   parameter (inside the macro replacement list) that corresponds to
   the macro argument for which ABSOLUTE_TOKEN_INDEX is a token index
   of.

   If we refer to the example above, for the '4' argument token,
   ABSOLUTE_TOKEN_INDEX would be set to 2, and CUR_REPLACEMENT_TOKEN
   would be set to the token 'x', in the replacement list "x - 3" of
   macro M.

   This is a subroutine of replace_args.  */
inline static unsigned
expanded_token_index (cpp_reader *pfile, cpp_macro *macro,
		      const cpp_token *cur_replacement_token,
		      unsigned absolute_token_index)
{
  if (CPP_OPTION (pfile, track_macro_expansion) > 1)
    return absolute_token_index;
  return cur_replacement_token - macro->exp.tokens;
}

1404 1405 1406
/* Replace the parameters in a function-like macro of NODE with the
   actual ARGS, and place the result in a newly pushed token context.
   Expand each argument before replacing, unless it is operated upon
1407 1408 1409
   by the # or ## operators. EXPANSION_POINT_LOC is the location of
   the expansion point of the macro. E.g, the location of the
   function-like macro invocation.  */
Neil Booth committed
1410
static void
1411 1412
replace_args (cpp_reader *pfile, cpp_hashnode *node, cpp_macro *macro,
	      macro_arg *args, source_location expansion_point_loc)
Neil Booth committed
1413 1414 1415
{
  unsigned int i, total;
  const cpp_token *src, *limit;
1416
  const cpp_token **first = NULL;
Neil Booth committed
1417
  macro_arg *arg;
1418 1419 1420 1421 1422
  _cpp_buff *buff = NULL;
  source_location *virt_locs = NULL;
  unsigned int exp_count;
  const struct line_map *map = NULL;
  int track_macro_exp;
Neil Booth committed
1423 1424

  /* First, fully macro-expand arguments, calculating the number of
1425 1426 1427
     tokens in the final expansion as we go.  The ordering of the if
     statements below is subtle; we must handle stringification before
     pasting.  */
1428 1429 1430 1431 1432 1433 1434

  /* EXP_COUNT is the number of tokens in the macro replacement
     list.  TOTAL is the number of tokens /after/ macro parameters
     have been replaced by their arguments.   */
  exp_count = macro_real_token_count (macro);
  total = exp_count;
  limit = macro->exp.tokens + exp_count;
1435

1436
  for (src = macro->exp.tokens; src < limit; src++)
Neil Booth committed
1437 1438
    if (src->type == CPP_MACRO_ARG)
      {
1439 1440
	/* Leading and trailing padding tokens.  */
	total += 2;
1441 1442 1443 1444 1445
	/* Account for leading and padding tokens in exp_count too.
	   This is going to be important later down this function,
	   when we want to handle the case of (track_macro_exp <
	   2).  */
	exp_count += 2;
1446

Neil Booth committed
1447 1448
	/* We have an argument.  If it is not being stringified or
	   pasted it is macro-replaced before insertion.  */
1449
	arg = &args[src->val.macro_arg.arg_no - 1];
Neil Booth committed
1450

Neil Booth committed
1451 1452 1453
	if (src->flags & STRINGIFY_ARG)
	  {
	    if (!arg->stringified)
1454
	      arg->stringified = stringify_arg (pfile, arg);
Neil Booth committed
1455 1456
	  }
	else if ((src->flags & PASTE_LEFT)
1457
		 || (src > macro->exp.tokens && (src[-1].flags & PASTE_LEFT)))
Neil Booth committed
1458 1459 1460 1461
	  total += arg->count - 1;
	else
	  {
	    if (!arg->expanded)
1462
	      expand_arg (pfile, arg);
Neil Booth committed
1463 1464 1465 1466
	    total += arg->expanded_count - 1;
	  }
      }

1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501
  /* When the compiler is called with the -ftrack-macro-expansion
     flag, we need to keep track of the location of each token that
     results from macro expansion.

     A token resulting from macro expansion is not a new token. It is
     simply the same token as the token coming from the macro
     definition.  The new things that are allocated are the buffer
     that holds the tokens resulting from macro expansion and a new
     location that records many things like the locus of the expansion
     point as well as the original locus inside the definition of the
     macro.  This location is called a virtual location.
     
     So the buffer BUFF holds a set of cpp_token*, and the buffer
     VIRT_LOCS holds the virtual locations of the tokens held by BUFF.

     Both of these two buffers are going to be hung off of the macro
     context, when the latter is pushed.  The memory allocated to
     store the tokens and their locations is going to be freed once
     the context of macro expansion is popped.
     
     As far as tokens are concerned, the memory overhead of
     -ftrack-macro-expansion is proportional to the number of
     macros that get expanded multiplied by sizeof (source_location).
     The good news is that extra memory gets freed when the macro
     context is freed, i.e shortly after the macro got expanded.  */

  /* Is the -ftrack-macro-expansion flag in effect?  */
  track_macro_exp = CPP_OPTION (pfile, track_macro_expansion);

  /* Now allocate memory space for tokens and locations resulting from
     the macro expansion, copy the tokens and replace the arguments.
     This memory must be freed when the context of the macro MACRO is
     popped.  */
  buff = tokens_buff_new (pfile, total, track_macro_exp ? &virt_locs : NULL);

1502
  first = (const cpp_token **) buff->base;
Neil Booth committed
1503

1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533
  /* Create a macro map to record the locations of the tokens that are
     involved in the expansion.  Note that the expansion point is set
     to the location of the closing parenthesis.  Otherwise, the
     subsequent map created for the first token that comes after the
     macro map might have a wrong line number.  That would lead to
     tokens with wrong line numbers after the macro expansion.  This
     adds up to the memory overhead of the -ftrack-macro-expansion
     flag; for every macro that is expanded, a "macro map" is
     created.  */
  if (track_macro_exp)
    {
      int num_macro_tokens = total;
      if (track_macro_exp < 2)
	/* Then the number of macro tokens won't take in account the
	   fact that function-like macro arguments can expand to
	   multiple tokens. This is to save memory at the expense of
	   accuracy.

	   Suppose we have #define SQARE(A) A * A

	   And then we do SQARE(2+3)

	   Then the tokens 2, +, 3, will have the same location,
	   saying they come from the expansion of the argument A.  */
	num_macro_tokens = exp_count;
      map = linemap_enter_macro (pfile->line_table, node,
				 expansion_point_loc,
				 num_macro_tokens);
    }
  i = 0;
1534
  for (src = macro->exp.tokens; src < limit; src++)
1535
    {
1536 1537 1538 1539
      unsigned int arg_tokens_count;
      macro_arg_token_iter from;
      const cpp_token **paste_flag = NULL;
      const cpp_token **tmp_token_ptr;
Neil Booth committed
1540

1541 1542
      if (src->type != CPP_MACRO_ARG)
	{
1543 1544 1545 1546 1547 1548 1549 1550
	  /* Allocate a virtual location for token SRC, and add that
	     token and its virtual location into the buffers BUFF and
	     VIRT_LOCS.  */
	  unsigned index = expanded_token_index (pfile, macro, src, i);
	  tokens_buff_add_token (buff, virt_locs, src,
				 src->src_loc, src->src_loc,
				 map, index);
	  i += 1;
1551 1552
	  continue;
	}
Neil Booth committed
1553

1554
      paste_flag = 0;
1555
      arg = &args[src->val.macro_arg.arg_no - 1];
1556 1557 1558 1559 1560 1561 1562 1563 1564
      /* SRC is a macro parameter that we need to replace with its
	 corresponding argument.  So at some point we'll need to
	 iterate over the tokens of the macro argument and copy them
	 into the "place" now holding the correspondig macro
	 parameter.  We are going to use the iterator type
	 macro_argo_token_iter to handle that iterating.  The 'if'
	 below is to initialize the iterator depending on the type of
	 tokens the macro argument has.  It also does some adjustment
	 related to padding tokens and some pasting corner cases.  */
1565
      if (src->flags & STRINGIFY_ARG)
1566 1567 1568 1569 1570 1571 1572 1573
	{
	  arg_tokens_count = 1;
	  macro_arg_token_iter_init (&from,
				     CPP_OPTION (pfile,
						 track_macro_expansion),
				     MACRO_ARG_TOKEN_STRINGIFIED,
				     arg, &arg->stringified);
	}
1574
      else if (src->flags & PASTE_LEFT)
1575 1576 1577 1578 1579 1580 1581 1582
	{
	  arg_tokens_count = arg->count;
	  macro_arg_token_iter_init (&from,
				     CPP_OPTION (pfile,
						 track_macro_expansion),
				     MACRO_ARG_TOKEN_NORMAL,
				     arg, arg->first);
	}
1583
      else if (src != macro->exp.tokens && (src[-1].flags & PASTE_LEFT))
1584
	{
1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595
	  int num_toks;
	  arg_tokens_count = arg->count;
	  macro_arg_token_iter_init (&from,
				     CPP_OPTION (pfile,
						 track_macro_expansion),
				     MACRO_ARG_TOKEN_NORMAL,
				     arg, arg->first);

	  num_toks = tokens_buff_count (buff);

	  if (num_toks != 0)
1596
	    {
1597 1598 1599 1600 1601 1602 1603 1604
	      /* So the current parameter token is pasted to the previous
		 token in the replacement list.  Let's look at what
		 we have as previous and current arguments.  */

	      /* This is the previous argument's token ...  */
	      tmp_token_ptr = tokens_buff_last_token_ptr (buff);

	      if ((*tmp_token_ptr)->type == CPP_COMMA
1605
		  && macro->variadic
1606
		  && src->val.macro_arg.arg_no == macro->paramc)
1607
		{
1608 1609 1610 1611 1612 1613 1614
		  /* ... which is a comma; and the current parameter
		     is the last parameter of a variadic function-like
		     macro.  If the argument to the current last
		     parameter is NULL, then swallow the comma,
		     otherwise drop the paste flag.  */
		  if (macro_arg_token_iter_get_token (&from) == NULL)
		    tokens_buff_remove_last_token (buff);
1615
		  else
1616
		    paste_flag = tmp_token_ptr;
1617 1618
		}
	      /* Remove the paste flag if the RHS is a placemarker.  */
1619 1620
	      else if (arg_tokens_count == 0)
		paste_flag = tmp_token_ptr;
1621 1622 1623
	    }
	}
      else
1624 1625 1626 1627 1628 1629 1630 1631
	{
	  arg_tokens_count = arg->expanded_count;
	  macro_arg_token_iter_init (&from,
				     CPP_OPTION (pfile,
						 track_macro_expansion),
				     MACRO_ARG_TOKEN_EXPANDED,
				     arg, arg->expanded);
	}
Neil Booth committed
1632

1633
      /* Padding on the left of an argument (unless RHS of ##).  */
1634
      if ((!pfile->state.in_directive || pfile->state.directive_wants_padding)
1635
	  && src != macro->exp.tokens && !(src[-1].flags & PASTE_LEFT))
1636 1637 1638 1639 1640 1641 1642 1643 1644 1645
	{
	  const cpp_token *t = padding_token (pfile, src);
	  unsigned index = expanded_token_index (pfile, macro, src, i);
	  /* Allocate a virtual location for the padding token and
	     append the token and its location to BUFF and
	     VIRT_LOCS.   */
	  tokens_buff_add_token (buff, virt_locs, t,
				 t->src_loc, t->src_loc,
				 map, index);
	}
Neil Booth committed
1646

1647
      if (arg_tokens_count)
1648
	{
1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684
	  /* So now we've got the number of tokens that make up the
	     argument that is going to replace the current parameter
	     in the macro's replacement list.  */
	  unsigned int j;
	  for (j = 0; j < arg_tokens_count; ++j)
	    {
	      /* So if track_macro_exp is < 2, the user wants to
		 save extra memory while tracking macro expansion
		 locations.  So in that case here is what we do:

		 Suppose we have #define SQARE(A) A * A

		 And then we do SQARE(2+3)

		 Then the tokens 2, +, 3, will have the same location,
		 saying they come from the expansion of the argument
		 A.

	      So that means we are going to ignore the COUNT tokens
	      resulting from the expansion of the current macro
	      arugment. In other words all the ARG_TOKENS_COUNT tokens
	      resulting from the expansion of the macro argument will
	      have the index I. Normally, each of those token should
	      have index I+J.  */
	      unsigned token_index = i;
	      unsigned index;
	      if (track_macro_exp > 1)
		token_index += j;

	      index = expanded_token_index (pfile, macro, src, token_index);
	      tokens_buff_add_token (buff, virt_locs,
				     macro_arg_token_iter_get_token (&from),
				     macro_arg_token_iter_get_location (&from),
				     src->src_loc, map, index);
	      macro_arg_token_iter_forward (&from);
	    }
Neil Booth committed
1685

1686 1687 1688
	  /* With a non-empty argument on the LHS of ##, the last
	     token should be flagged PASTE_LEFT.  */
	  if (src->flags & PASTE_LEFT)
1689 1690
	    paste_flag =
	      (const cpp_token **) tokens_buff_last_token_ptr (buff);
1691
	}
1692 1693 1694 1695 1696 1697 1698 1699 1700
      else if (CPP_PEDANTIC (pfile) && ! macro->syshdr
	       && ! CPP_OPTION (pfile, c99)
	       && ! cpp_in_system_header (pfile))
	{
	  cpp_error (pfile, CPP_DL_PEDWARN,
		     "invoking macro %s argument %d: "
		     "empty macro arguments are undefined"
		     " in ISO C90 and ISO C++98",
		     NODE_NAME (node),
1701
		     src->val.macro_arg.arg_no);
1702
	}
1703

1704 1705
      /* Avoid paste on RHS (even case count == 0).  */
      if (!pfile->state.in_directive && !(src->flags & PASTE_LEFT))
1706 1707 1708 1709 1710 1711
	{
	  const cpp_token *t = &pfile->avoid_paste;
	  tokens_buff_add_token (buff, virt_locs,
				 t, t->src_loc, t->src_loc,
				 NULL, 0);
	}
Neil Booth committed
1712

1713 1714 1715 1716 1717
      /* Add a new paste flag, or remove an unwanted one.  */
      if (paste_flag)
	{
	  cpp_token *token = _cpp_temp_token (pfile);
	  token->type = (*paste_flag)->type;
1718
	  token->val = (*paste_flag)->val;
1719 1720 1721 1722 1723 1724
	  if (src->flags & PASTE_LEFT)
	    token->flags = (*paste_flag)->flags | PASTE_LEFT;
	  else
	    token->flags = (*paste_flag)->flags & ~PASTE_LEFT;
	  *paste_flag = token;
	}
Neil Booth committed
1725

1726 1727
      i += arg_tokens_count;
    }
1728

1729 1730 1731 1732 1733 1734
  if (track_macro_exp)
    push_extended_tokens_context (pfile, node, buff, virt_locs, first,
				  tokens_buff_count (buff));
  else
    push_ptoken_context (pfile, node, buff, first,
			 tokens_buff_count (buff));
1735 1736

  num_macro_tokens_counter += tokens_buff_count (buff);
1737 1738 1739 1740
}

/* Return a special padding token, with padding inherited from SOURCE.  */
static const cpp_token *
1741
padding_token (cpp_reader *pfile, const cpp_token *source)
1742 1743 1744 1745
{
  cpp_token *result = _cpp_temp_token (pfile);

  result->type = CPP_PADDING;
1746 1747 1748 1749

  /* Data in GCed data structures cannot be made const so far, so we
     need a cast here.  */
  result->val.source = (cpp_token *) source;
1750 1751 1752 1753
  result->flags = 0;
  return result;
}

1754 1755
/* Get a new uninitialized context.  Create a new one if we cannot
   re-use an old one.  */
1756
static cpp_context *
1757
next_context (cpp_reader *pfile)
1758 1759 1760 1761
{
  cpp_context *result = pfile->context->next;

  if (result == 0)
Zack Weinberg committed
1762
    {
1763
      result = XNEW (cpp_context);
1764
      memset (result, 0, sizeof (cpp_context));
1765 1766 1767
      result->prev = pfile->context;
      result->next = 0;
      pfile->context->next = result;
Neil Booth committed
1768
    }
1769 1770 1771

  pfile->context = result;
  return result;
Neil Booth committed
1772 1773
}

1774 1775
/* Push a list of pointers to tokens.  */
static void
1776 1777
push_ptoken_context (cpp_reader *pfile, cpp_hashnode *macro, _cpp_buff *buff,
		     const cpp_token **first, unsigned int count)
Neil Booth committed
1778 1779 1780
{
  cpp_context *context = next_context (pfile);

1781 1782
  context->tokens_kind = TOKENS_KIND_INDIRECT;
  context->c.macro = macro;
1783
  context->buff = buff;
1784 1785
  FIRST (context).ptoken = first;
  LAST (context).ptoken = first + count;
1786 1787 1788
}

/* Push a list of tokens.  */
1789 1790 1791
void
_cpp_push_token_context (cpp_reader *pfile, cpp_hashnode *macro,
			 const cpp_token *first, unsigned int count)
1792
{
1793 1794 1795 1796 1797
   cpp_context *context = next_context (pfile);
 
   context->tokens_kind = TOKENS_KIND_DIRECT;
   context->c.macro = macro;
   context->buff = NULL;
1798 1799
  FIRST (context).token = first;
  LAST (context).token = first + count;
Neil Booth committed
1800 1801
}

1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830
/* Build a context containing a list of tokens as well as their
   virtual locations and push it.  TOKENS_BUFF is the buffer that
   contains the tokens pointed to by FIRST.  If TOKENS_BUFF is
   non-NULL, it means that the context owns it, meaning that
   _cpp_pop_context will free it as well as VIRT_LOCS_BUFF that
   contains the virtual locations.  */
static void
push_extended_tokens_context (cpp_reader *pfile,
			      cpp_hashnode *macro,
			      _cpp_buff *token_buff,
			      source_location *virt_locs,
			      const cpp_token **first,
			      unsigned int count)
{
  cpp_context *context = next_context (pfile);
  macro_context *m;

  context->tokens_kind = TOKENS_KIND_EXTENDED;
  context->buff = token_buff;

  m = XNEW (macro_context);
  m->macro_node = macro;
  m->virt_locs = virt_locs;
  m->cur_virt_loc = virt_locs;
  context->c.mc = m;
  FIRST (context).ptoken = first;
  LAST (context).ptoken = first + count;
}

1831 1832
/* Push a traditional macro's replacement text.  */
void
1833 1834
_cpp_push_text_context (cpp_reader *pfile, cpp_hashnode *macro,
			const uchar *start, size_t len)
1835 1836 1837
{
  cpp_context *context = next_context (pfile);

1838 1839
  context->tokens_kind = TOKENS_KIND_DIRECT;
  context->c.macro = macro;
1840 1841
  context->buff = NULL;
  CUR (context) = start;
1842
  RLIMIT (context) = start + len;
1843
  macro->flags |= NODE_DISABLED;
1844 1845
}

1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031
/* Creates a buffer that holds tokens a.k.a "token buffer", usually
   for the purpose of storing them on a cpp_context. If VIRT_LOCS is
   non-null (which means that -ftrack-macro-expansion is on),
   *VIRT_LOCS is set to a newly allocated buffer that is supposed to
   hold the virtual locations of the tokens resulting from macro
   expansion.  */
static _cpp_buff*
tokens_buff_new (cpp_reader *pfile, size_t len,
		 source_location **virt_locs)
{
  size_t tokens_size = len * sizeof (cpp_token *);
  size_t locs_size = len * sizeof (source_location);

  if (virt_locs != NULL)
    *virt_locs = XNEWVEC (source_location, locs_size);
  return _cpp_get_buff (pfile, tokens_size);
}

/* Returns the number of tokens contained in a token buffer.  The
   buffer holds a set of cpp_token*.  */
static size_t
tokens_buff_count (_cpp_buff *buff)
{
  return (BUFF_FRONT (buff) - buff->base) / sizeof (cpp_token *);
}

/* Return a pointer to the last token contained in the token buffer
   BUFF.  */
static const cpp_token **
tokens_buff_last_token_ptr (_cpp_buff *buff)
{
  return &((const cpp_token **) BUFF_FRONT (buff))[-1];
}

/* Remove the last token contained in the token buffer TOKENS_BUFF.
   If VIRT_LOCS_BUFF is non-NULL,  it should point at the buffer
   containing the virtual locations of the tokens in TOKENS_BUFF; in
   which case the function updates that buffer as well.   */
static inline void
tokens_buff_remove_last_token (_cpp_buff *tokens_buff)

{
  if (BUFF_FRONT (tokens_buff) > tokens_buff->base)
    BUFF_FRONT (tokens_buff) =
      (unsigned char *) &((cpp_token **) BUFF_FRONT (tokens_buff))[-1];
}

/* Insert a token into the token buffer at the position pointed to by
   DEST.  Note that the buffer is not enlarged so the previous token
   that was at *DEST is overwritten.  VIRT_LOC_DEST, if non-null,
   means -ftrack-macro-expansion is effect; it then points to where to
   insert the virtual location of TOKEN.  TOKEN is the token to
   insert.  VIRT_LOC is the virtual location of the token, i.e, the
   location possibly encoding its locus accross macro expansion.  If
   TOKEN is an argument of a function-like macro (inside a macro
   replacement list), PARM_DEF_LOC is the spelling location of the
   macro parameter that TOKEN is replacing, in the replacement list of
   the macro.  If TOKEN is not an argument of a function-like macro or
   if it doesn't come from a macro expansion, then VIRT_LOC can just
   be set to the same value as PARM_DEF_LOC.  If MAP is non null, it
   means TOKEN comes from a macro expansion and MAP is the macro map
   associated to the macro.  MACRO_TOKEN_INDEX points to the index of
   the token in the macro map; it is not considered if MAP is NULL.

   Upon successful completion this function returns the a pointer to
   the position of the token coming right after the insertion
   point.  */
static inline const cpp_token **
tokens_buff_put_token_to (const cpp_token **dest,
			  source_location *virt_loc_dest,
			  const cpp_token *token,
			  source_location virt_loc,
			  source_location parm_def_loc,			  
			  const struct line_map *map,
			  unsigned int macro_token_index)
{
  source_location macro_loc = virt_loc;
  const cpp_token **result;

  if (virt_loc_dest)
    {
      /* -ftrack-macro-expansion is on.  */
      if (map)
	macro_loc = linemap_add_macro_token (map, macro_token_index,
					     virt_loc, parm_def_loc);
      *virt_loc_dest = macro_loc;
    }
  *dest = token;
  result = &dest[1];

  return result;
}

/* Adds a token at the end of the tokens contained in BUFFER.  Note
   that this function doesn't enlarge BUFFER when the number of tokens
   reaches BUFFER's size; it aborts in that situation.

   TOKEN is the token to append. VIRT_LOC is the virtual location of
   the token, i.e, the location possibly encoding its locus accross
   macro expansion. If TOKEN is an argument of a function-like macro
   (inside a macro replacement list), PARM_DEF_LOC is the location of
   the macro parameter that TOKEN is replacing.  If TOKEN doesn't come
   from a macro expansion, then VIRT_LOC can just be set to the same
   value as PARM_DEF_LOC.  If MAP is non null, it means TOKEN comes
   from a macro expansion and MAP is the macro map associated to the
   macro.  MACRO_TOKEN_INDEX points to the index of the token in the
   macro map; It is not considered if MAP is NULL.  If VIRT_LOCS is
   non-null, it means -ftrack-macro-expansion is on; in which case
   this function adds the virtual location DEF_LOC to the VIRT_LOCS
   array, at the same index as the one of TOKEN in BUFFER.  Upon
   successful completion this function returns the a pointer to the
   position of the token coming right after the insertion point.  */
static const cpp_token **
tokens_buff_add_token (_cpp_buff *buffer,
		       source_location *virt_locs,
		       const cpp_token *token,
		       source_location virt_loc,
		       source_location parm_def_loc,
		       const struct line_map *map,
		       unsigned int macro_token_index)
{
  const cpp_token **result;
  source_location *virt_loc_dest = NULL;
  unsigned token_index = 
    (BUFF_FRONT (buffer) - buffer->base) / sizeof (cpp_token *);

  /* Abort if we pass the end the buffer.  */
  if (BUFF_FRONT (buffer) > BUFF_LIMIT (buffer))
    abort ();

  if (virt_locs != NULL)
    virt_loc_dest = &virt_locs[token_index];

  result =
    tokens_buff_put_token_to ((const cpp_token **) BUFF_FRONT (buffer),
			      virt_loc_dest, token, virt_loc, parm_def_loc,
			      map, macro_token_index);

  BUFF_FRONT (buffer) = (unsigned char *) result;
  return result;
}

/* Allocate space for the function-like macro argument ARG to store
   the tokens resulting from the macro-expansion of the tokens that
   make up ARG itself. That space is allocated in ARG->expanded and
   needs to be freed using free.  */
static void
alloc_expanded_arg_mem (cpp_reader *pfile, macro_arg *arg, size_t capacity)
{
#ifdef ENABLE_CHECKING
  if (arg->expanded != NULL
      || arg->expanded_virt_locs != NULL)
    abort ();
#endif
  arg->expanded = XNEWVEC (const cpp_token *, capacity);
  if (CPP_OPTION (pfile, track_macro_expansion))
    arg->expanded_virt_locs = XNEWVEC (source_location, capacity);

}

/* If necessary, enlarge ARG->expanded to so that it can contain SIZE
   tokens.  */
static void
ensure_expanded_arg_room (cpp_reader *pfile, macro_arg *arg,
			  size_t size, size_t *expanded_capacity)
{
  if (size <= *expanded_capacity)
    return;

  size *= 2;

  arg->expanded =
    XRESIZEVEC (const cpp_token *, arg->expanded, size);
  *expanded_capacity = size;

  if (CPP_OPTION (pfile, track_macro_expansion))
    {
      if (arg->expanded_virt_locs == NULL)
	arg->expanded_virt_locs = XNEWVEC (source_location, size);
      else
	arg->expanded_virt_locs = XRESIZEVEC (source_location,
					      arg->expanded_virt_locs,
					      size);
    }
}

2032 2033 2034 2035 2036 2037
/* Expand an argument ARG before replacing parameters in a
   function-like macro.  This works by pushing a context with the
   argument's tokens, and then expanding that into a temporary buffer
   as if it were a normal part of the token stream.  collect_args()
   has terminated the argument's tokens with a CPP_EOF so that we know
   when we have fully expanded the argument.  */
Neil Booth committed
2038
static void
2039
expand_arg (cpp_reader *pfile, macro_arg *arg)
Neil Booth committed
2040
{
2041
  size_t capacity;
2042
  bool saved_warn_trad;
2043
  bool track_macro_exp_p = CPP_OPTION (pfile, track_macro_expansion);
2044

2045 2046
  if (arg->count == 0
      || arg->expanded != NULL)
2047
    return;
Neil Booth committed
2048

2049 2050 2051 2052
  /* Don't warn about funlike macros when pre-expanding.  */
  saved_warn_trad = CPP_WTRADITIONAL (pfile);
  CPP_WTRADITIONAL (pfile) = 0;

2053
  /* Loop, reading in the tokens of the argument.  */
2054
  capacity = 256;
2055 2056 2057 2058 2059 2060 2061 2062 2063 2064
  alloc_expanded_arg_mem (pfile, arg, capacity);

  if (track_macro_exp_p)
    push_extended_tokens_context (pfile, NULL, NULL,
				  arg->virt_locs,
				  arg->first,
				  arg->count + 1);
  else
    push_ptoken_context (pfile, NULL, NULL,
			 arg->first, arg->count + 1);
Neil Booth committed
2065

2066
  for (;;)
Neil Booth committed
2067
    {
2068
      const cpp_token *token;
2069
      source_location location;
2070

2071 2072
      ensure_expanded_arg_room (pfile, arg, arg->expanded_count + 1,
				&capacity);
Neil Booth committed
2073

2074
      token = cpp_get_token_1 (pfile, &location);
Neil Booth committed
2075

2076 2077 2078
      if (token->type == CPP_EOF)
	break;

2079 2080 2081 2082
      set_arg_token (arg, token, location,
		     arg->expanded_count, MACRO_ARG_TOKEN_EXPANDED,
		     CPP_OPTION (pfile, track_macro_expansion));
      arg->expanded_count++;
2083 2084
    }

2085
  _cpp_pop_context (pfile);
2086 2087

  CPP_WTRADITIONAL (pfile) = saved_warn_trad;
Neil Booth committed
2088 2089
}

2090
/* Pop the current context off the stack, re-enabling the macro if the
2091 2092 2093
   context represented a macro's replacement list.  Initially the
   context structure was not freed so that we can re-use it later, but
   now we do free it to reduce peak memory consumption.  */
Neil Booth committed
2094
void
2095
_cpp_pop_context (cpp_reader *pfile)
Neil Booth committed
2096
{
2097 2098
  cpp_context *context = pfile->context;

2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128
  if (context->c.macro)
    {
      cpp_hashnode *macro;
      if (context->tokens_kind == TOKENS_KIND_EXTENDED)
	{
	  macro_context *mc = context->c.mc;
	  macro = mc->macro_node;
	  /* If context->buff is set, it means the life time of tokens
	     is bound to the life time of this context; so we must
	     free the tokens; that means we must free the virtual
	     locations of these tokens too.  */
	  if (context->buff && mc->virt_locs)
	    {
	      free (mc->virt_locs);
	      mc->virt_locs = NULL;
	    }
	  free (mc);
	  context->c.mc = NULL;
	}
      else
	macro = context->c.macro;

      /* Beware that MACRO can be NULL in cases like when we are
	 called from expand_arg.  In those cases, a dummy context with
	 tokens is pushed just for the purpose of walking them using
	 cpp_get_token_1.  In that case, no 'macro' field is set into
	 the dummy context.  */
      if (macro != NULL)
	macro->flags &= ~NODE_DISABLED;
    }
2129 2130

  if (context->buff)
2131 2132 2133 2134 2135
    {
      /* Decrease memory peak consumption by freeing the memory used
	 by the context.  */
      _cpp_free_buff (context->buff);
    }
Neil Booth committed
2136

2137
  pfile->context = context->prev;
2138 2139 2140
  /* decrease peak memory consumption by feeing the context.  */
  pfile->context->next = NULL;
  free (context);
Neil Booth committed
2141 2142
}

2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216
/* Return TRUE if we reached the end of the set of tokens stored in
   CONTEXT, FALSE otherwise.  */
static inline bool
reached_end_of_context (cpp_context *context)
{
  if (context->tokens_kind == TOKENS_KIND_DIRECT)
      return FIRST (context).token == LAST (context).token;
  else if (context->tokens_kind == TOKENS_KIND_INDIRECT
	   || context->tokens_kind == TOKENS_KIND_EXTENDED)
    return FIRST (context).ptoken == LAST (context).ptoken;
  else
    abort ();
}

/* Consume the next token contained in the current context of PFILE,
   and return it in *TOKEN. It's "full location" is returned in
   *LOCATION. If -ftrack-macro-location is in effeect, fFull location"
   means the location encoding the locus of the token accross macro
   expansion; otherwise it's just is the "normal" location of the
   token which (*TOKEN)->src_loc.  */
static inline void
consume_next_token_from_context (cpp_reader *pfile,
				 const cpp_token ** token,
				 source_location *location)
{
  cpp_context *c = pfile->context;

  if ((c)->tokens_kind == TOKENS_KIND_DIRECT)
    {
      *token = FIRST (c).token;
      *location = (*token)->src_loc;
      FIRST (c).token++;
    }
  else if ((c)->tokens_kind == TOKENS_KIND_INDIRECT)		
    {
      *token = *FIRST (c).ptoken;
      *location = (*token)->src_loc;
      FIRST (c).ptoken++;
    }
  else if ((c)->tokens_kind == TOKENS_KIND_EXTENDED)
    {
      macro_context *m = c->c.mc;
      *token = *FIRST (c).ptoken;
      if (m->virt_locs)
	{
	  *location = *m->cur_virt_loc;
	  m->cur_virt_loc++;
	}
      else
	*location = (*token)->src_loc;
      FIRST (c).ptoken++;
    }
  else
    abort ();
}

/* In the traditional mode of the preprocessor, if we are currently in
   a directive, the location of a token must be the location of the
   start of the directive line.  This function returns the proper
   location if we are in the traditional mode, and just returns
   LOCATION otherwise.  */

static inline source_location
maybe_adjust_loc_for_trad_cpp (cpp_reader *pfile, source_location location)
{
  if (CPP_OPTION (pfile, traditional))
    {
      if (pfile->state.in_directive)
	return pfile->directive_line;
    }
  return location;
}

/* Routine to get a token as well as its location.
2217 2218 2219 2220 2221 2222 2223

   Macro expansions and directives are transparently handled,
   including entering included files.  Thus tokens are post-macro
   expansion, and after any intervening directives.  External callers
   see CPP_EOF only at EOF.  Internal callers also see it when meeting
   a directive inside a macro call, when at the end of a directive and
   state.in_directive is still 1, and at the end of argument
2224 2225 2226 2227 2228 2229 2230 2231
   pre-expansion.

   LOC is an out parameter; *LOC is set to the location "as expected
   by the user".  Please read the comment of
   cpp_get_token_with_location to learn more about the meaning of this
   location.  */
static const cpp_token*
cpp_get_token_1 (cpp_reader *pfile, source_location *location)
Neil Booth committed
2232
{
2233
  const cpp_token *result;
2234
  bool can_set = pfile->set_invocation_location;
2235 2236 2237
  /* This token is a virtual token that either encodes a location
     related to macro expansion or a spelling location.  */
  source_location virt_loc = 0;
2238
  pfile->set_invocation_location = false;
2239

2240
  for (;;)
Neil Booth committed
2241
    {
2242
      cpp_hashnode *node;
Neil Booth committed
2243 2244 2245
      cpp_context *context = pfile->context;

      /* Context->prev == 0 <=> base context.  */
2246
      if (!context->prev)
2247
	{
2248 2249 2250 2251 2252 2253 2254
	  result = _cpp_lex_token (pfile);
	  virt_loc = result->src_loc;
	}
      else if (!reached_end_of_context (context))
	{
	  consume_next_token_from_context (pfile, &result,
					   &virt_loc);
2255
	  if (result->flags & PASTE_LEFT)
2256
	    {
2257 2258 2259
	      paste_all_tokens (pfile, result);
	      if (pfile->state.in_directive)
		continue;
2260 2261
	      result = padding_token (pfile, result);
	      goto out;
2262
	    }
2263
	}
Neil Booth committed
2264 2265
      else
	{
2266 2267
	  if (pfile->context->c.macro)
	    ++num_expanded_macros_counter;
2268
	  _cpp_pop_context (pfile);
2269 2270
	  if (pfile->state.in_directive)
	    continue;
2271 2272
	  result = &pfile->avoid_paste;
	  goto out;
Neil Booth committed
2273 2274
	}

2275 2276 2277
      if (pfile->state.in_directive && result->type == CPP_COMMENT)
	continue;

2278
      if (result->type != CPP_NAME)
Neil Booth committed
2279 2280
	break;

2281
      node = result->val.node.node;
2282

Neil Booth committed
2283 2284
      if (node->type != NT_MACRO || (result->flags & NO_EXPAND))
	break;
2285

Neil Booth committed
2286
      if (!(node->flags & NODE_DISABLED))
Neil Booth committed
2287
	{
2288
	  int ret = 0;
2289 2290
	  /* If not in a macro context, and we're going to start an
	     expansion, record the location.  */
2291
	  if (can_set && !context->c.macro)
2292
	    pfile->invocation_location = result->src_loc;
2293 2294
	  if (pfile->state.prevent_expansion)
	    break;
2295 2296 2297

	  /* Conditional macros require that a predicate be evaluated
	     first.  */
2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308
	  if ((node->flags & NODE_CONDITIONAL) != 0)
	    {
	      if (pfile->cb.macro_to_expand)
		{
		  bool whitespace_after;
		  const cpp_token *peek_tok = cpp_peek_token (pfile, 0);

		  whitespace_after = (peek_tok->type == CPP_PADDING
				      || (peek_tok->flags & PREV_WHITE));
		  node = pfile->cb.macro_to_expand (pfile, result);
		  if (node)
2309 2310
		    ret = enter_macro_context (pfile, node, result,
					       virt_loc);
2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326
		  else if (whitespace_after)
		    {
		      /* If macro_to_expand hook returned NULL and it
			 ate some tokens, see if we don't need to add
			 a padding token in between this and the
			 next token.  */
		      peek_tok = cpp_peek_token (pfile, 0);
		      if (peek_tok->type != CPP_PADDING
			  && (peek_tok->flags & PREV_WHITE) == 0)
			_cpp_push_token_context (pfile, NULL,
						 padding_token (pfile,
								peek_tok), 1);
		    }
		}
	    }
	  else
2327 2328
	    ret = enter_macro_context (pfile, node, result, 
				       virt_loc);
2329
	  if (ret)
2330
 	    {
2331
	      if (pfile->state.in_directive || ret == 2)
2332
		continue;
2333 2334
	      result = padding_token (pfile, result);
	      goto out;
2335
	    }
Neil Booth committed
2336
	}
Neil Booth committed
2337 2338
      else
	{
2339 2340
	  /* Flag this token as always unexpandable.  FIXME: move this
	     to collect_args()?.  */
Neil Booth committed
2341 2342 2343
	  cpp_token *t = _cpp_temp_token (pfile);
	  t->type = result->type;
	  t->flags = result->flags | NO_EXPAND;
2344
	  t->val = result->val;
Neil Booth committed
2345 2346
	  result = t;
	}
2347

Neil Booth committed
2348
      break;
Neil Booth committed
2349
    }
2350

2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367
 out:
  if (location != NULL)
    {
      if (virt_loc == 0)
	virt_loc = result->src_loc;
      *location = virt_loc;

      if (!CPP_OPTION (pfile, track_macro_expansion)
	  && can_set
	  && pfile->context->c.macro != NULL)
	/* We are in a macro expansion context, are not tracking
	   virtual location, but were asked to report the location
	   of the expansion point of the macro being expanded.  */
	*location = pfile->invocation_location;

      *location = maybe_adjust_loc_for_trad_cpp (pfile, *location);
    }
2368
  return result;
Neil Booth committed
2369 2370
}

2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425
/* External routine to get a token.  Also used nearly everywhere
   internally, except for places where we know we can safely call
   _cpp_lex_token directly, such as lexing a directive name.

   Macro expansions and directives are transparently handled,
   including entering included files.  Thus tokens are post-macro
   expansion, and after any intervening directives.  External callers
   see CPP_EOF only at EOF.  Internal callers also see it when meeting
   a directive inside a macro call, when at the end of a directive and
   state.in_directive is still 1, and at the end of argument
   pre-expansion.  */
const cpp_token *
cpp_get_token (cpp_reader *pfile)
{
  return cpp_get_token_1 (pfile, NULL);
}

/* Like cpp_get_token, but also returns a virtual token location
   separate from the spelling location carried by the returned token.

   LOC is an out parameter; *LOC is set to the location "as expected
   by the user".  This matters when a token results from macro
   expansion; in that case the token's spelling location indicates the
   locus of the token in the definition of the macro but *LOC
   virtually encodes all the other meaningful locuses associated to
   the token.

   What? virtual location? Yes, virtual location.

   If the token results from macro expansion and if macro expansion
   location tracking is enabled its virtual location encodes (at the
   same time):

   - the spelling location of the token

   - the locus of the macro expansion point

   - the locus of the point where the token got instantiated as part
     of the macro expansion process.

   You have to use the linemap API to get the locus you are interested
   in from a given virtual location.

   Note however that virtual locations are not necessarily ordered for
   relations '<' and '>'.  One must use the function
   linemap_location_before_p instead of using the relational operator
   '<'.

   If macro expansion tracking is off and if the token results from
   macro expansion the virtual location is the expansion point of the
   macro that got expanded.

   When the token doesn't result from macro expansion, the virtual
   location is just the same thing as its spelling location.  */

2426 2427 2428 2429 2430 2431
const cpp_token *
cpp_get_token_with_location (cpp_reader *pfile, source_location *loc)
{
  const cpp_token *result;

  pfile->set_invocation_location = true;
2432
  result = cpp_get_token_1 (pfile, loc);
2433 2434 2435
  return result;
}

2436 2437 2438 2439
/* Returns true if we're expanding an object-like macro that was
   defined in a system header.  Just checks the macro at the top of
   the stack.  Used for diagnostic suppression.  */
int
2440
cpp_sys_macro_p (cpp_reader *pfile)
2441
{
2442
  cpp_hashnode *node = pfile->context->c.macro;
2443

Neil Booth committed
2444
  return node && node->value.macro && node->value.macro->syshdr;
2445 2446
}

2447 2448
/* Read each token in, until end of the current file.  Directives are
   transparently processed.  */
Neil Booth committed
2449
void
2450
cpp_scan_nooutput (cpp_reader *pfile)
Neil Booth committed
2451
{
2452 2453 2454 2455
  /* Request a CPP_EOF token at the end of this file, rather than
     transparently continuing with the including file.  */
  pfile->buffer->return_at_eof = true;

2456 2457 2458
  pfile->state.discarding_output++;
  pfile->state.prevent_expansion++;

2459 2460 2461 2462 2463 2464
  if (CPP_OPTION (pfile, traditional))
    while (_cpp_read_logical_line_trad (pfile))
      ;
  else
    while (cpp_get_token (pfile)->type != CPP_EOF)
      ;
2465 2466 2467

  pfile->state.discarding_output--;
  pfile->state.prevent_expansion--;
Neil Booth committed
2468 2469
}

2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487
/* Step back one or more tokens obtained from the lexer.  */
void
_cpp_backup_tokens_direct (cpp_reader *pfile, unsigned int count)
{
  pfile->lookaheads += count;
  while (count--)
    {
      pfile->cur_token--;
      if (pfile->cur_token == pfile->cur_run->base
          /* Possible with -fpreprocessed and no leading #line.  */
          && pfile->cur_run->prev != NULL)
        {
          pfile->cur_run = pfile->cur_run->prev;
          pfile->cur_token = pfile->cur_run->limit;
        }
    }
}

2488
/* Step back one (or more) tokens.  Can only step back more than 1 if
2489
   they are from the lexer, and not from macro expansion.  */
2490
void
2491
_cpp_backup_tokens (cpp_reader *pfile, unsigned int count)
Neil Booth committed
2492
{
2493
  if (pfile->context->prev == NULL)
2494
    _cpp_backup_tokens_direct (pfile, count);
2495
  else
Neil Booth committed
2496
    {
2497 2498
      if (count != 1)
	abort ();
2499
      if (pfile->context->tokens_kind == TOKENS_KIND_DIRECT)
2500
	FIRST (pfile->context).token--;
2501
      else if (pfile->context->tokens_kind == TOKENS_KIND_INDIRECT)
2502
	FIRST (pfile->context).ptoken--;
2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519
      else if (pfile->context->tokens_kind == TOKENS_KIND_EXTENDED)
	{
	  FIRST (pfile->context).ptoken--;
	  if (pfile->context->c.macro)
	    {
	      macro_context *m = pfile->context->c.mc;
	      m->cur_virt_loc--;
#ifdef ENABLE_CHECKING
	      if (m->cur_virt_loc < m->virt_locs)
		abort ();
#endif
	    }
	  else
	    abort ();
	}
      else
	abort ();
Neil Booth committed
2520 2521
    }
}
Zack Weinberg committed
2522

Neil Booth committed
2523 2524
/* #define directive parsing and handling.  */

2525
/* Returns nonzero if a macro redefinition warning is required.  */
2526
static bool
2527
warn_of_redefinition (cpp_reader *pfile, cpp_hashnode *node,
2528
		      const cpp_macro *macro2)
Neil Booth committed
2529 2530 2531 2532
{
  const cpp_macro *macro1;
  unsigned int i;

2533 2534
  /* Some redefinitions need to be warned about regardless.  */
  if (node->flags & NODE_WARN)
2535
    return true;
Neil Booth committed
2536

2537 2538
  /* Suppress warnings for builtins that lack the NODE_WARN flag.  */
  if (node->flags & NODE_BUILTIN)
2539 2540 2541 2542 2543
    {
      if (!pfile->cb.user_builtin_macro
	  || !pfile->cb.user_builtin_macro (pfile, node))
	return false;
    }
2544

2545 2546 2547 2548 2549
  /* Redefinitions of conditional (context-sensitive) macros, on
     the other hand, must be allowed silently.  */
  if (node->flags & NODE_CONDITIONAL)
    return false;

2550
  /* Redefinition of a macro is allowed if and only if the old and new
2551
     definitions are the same.  (6.10.3 paragraph 2).  */
Neil Booth committed
2552 2553
  macro1 = node->value.macro;

2554 2555 2556
  /* Don't check count here as it can be different in valid
     traditional redefinitions with just whitespace differences.  */
  if (macro1->paramc != macro2->paramc
Neil Booth committed
2557
      || macro1->fun_like != macro2->fun_like
2558
      || macro1->variadic != macro2->variadic)
2559
    return true;
Neil Booth committed
2560 2561 2562 2563

  /* Check parameter spellings.  */
  for (i = 0; i < macro1->paramc; i++)
    if (macro1->params[i] != macro2->params[i])
2564
      return true;
Neil Booth committed
2565

2566 2567
  /* Check the replacement text or tokens.  */
  if (CPP_OPTION (pfile, traditional))
2568
    return _cpp_expansions_different_trad (macro1, macro2);
2569

2570 2571 2572 2573 2574 2575
  if (macro1->count != macro2->count)
    return true;

  for (i = 0; i < macro1->count; i++)
    if (!_cpp_equiv_tokens (&macro1->exp.tokens[i], &macro2->exp.tokens[i]))
      return true;
2576 2577

  return false;
Neil Booth committed
2578 2579 2580
}

/* Free the definition of hashnode H.  */
Zack Weinberg committed
2581
void
2582
_cpp_free_definition (cpp_hashnode *h)
Zack Weinberg committed
2583
{
Neil Booth committed
2584 2585 2586
  /* Macros and assertions no longer have anything to free.  */
  h->type = NT_VOID;
  /* Clear builtin flag in case of redefinition.  */
2587
  h->flags &= ~(NODE_BUILTIN | NODE_DISABLED | NODE_USED);
Neil Booth committed
2588 2589
}

2590
/* Save parameter NODE to the parameter list of macro MACRO.  Returns
2591
   zero on success, nonzero if the parameter is a duplicate.  */
2592
bool
2593
_cpp_save_parameter (cpp_reader *pfile, cpp_macro *macro, cpp_hashnode *node)
Neil Booth committed
2594
{
2595
  unsigned int len;
Neil Booth committed
2596
  /* Constraint 6.10.3.6 - duplicate parameter names.  */
2597
  if (node->flags & NODE_MACRO_ARG)
2598
    {
2599
      cpp_error (pfile, CPP_DL_ERROR, "duplicate macro parameter \"%s\"",
2600
		 NODE_NAME (node));
2601
      return true;
Neil Booth committed
2602
    }
2603

2604 2605 2606
  if (BUFF_ROOM (pfile->a_buff)
      < (macro->paramc + 1) * sizeof (cpp_hashnode *))
    _cpp_extend_buff (pfile, &pfile->a_buff, sizeof (cpp_hashnode *));
2607

2608
  ((cpp_hashnode **) BUFF_FRONT (pfile->a_buff))[macro->paramc++] = node;
2609 2610 2611 2612
  node->flags |= NODE_MACRO_ARG;
  len = macro->paramc * sizeof (union _cpp_hashnode_value);
  if (len > pfile->macro_buffer_len)
    {
2613 2614
      pfile->macro_buffer = XRESIZEVEC (unsigned char, pfile->macro_buffer,
                                        len);
2615 2616 2617 2618 2619 2620
      pfile->macro_buffer_len = len;
    }
  ((union _cpp_hashnode_value *) pfile->macro_buffer)[macro->paramc - 1]
    = node->value;
  
  node->value.arg_index  = macro->paramc;
2621
  return false;
Zack Weinberg committed
2622 2623
}

2624 2625 2626
/* Check the syntax of the parameters in a MACRO definition.  Returns
   false if an error occurs.  */
static bool
2627
parse_params (cpp_reader *pfile, cpp_macro *macro)
Zack Weinberg committed
2628
{
Neil Booth committed
2629
  unsigned int prev_ident = 0;
Zack Weinberg committed
2630

Neil Booth committed
2631
  for (;;)
Zack Weinberg committed
2632
    {
2633
      const cpp_token *token = _cpp_lex_token (pfile);
Zack Weinberg committed
2634

2635
      switch (token->type)
Zack Weinberg committed
2636
	{
Neil Booth committed
2637
	default:
2638 2639 2640 2641 2642 2643
	  /* Allow/ignore comments in parameter lists if we are
	     preserving comments in macro expansions.  */
	  if (token->type == CPP_COMMENT
	      && ! CPP_OPTION (pfile, discard_comments_in_macro_exp))
	    continue;

2644
	  cpp_error (pfile, CPP_DL_ERROR,
2645
		     "\"%s\" may not appear in macro parameter list",
2646
		     cpp_token_as_text (pfile, token));
2647
	  return false;
Neil Booth committed
2648

Zack Weinberg committed
2649
	case CPP_NAME:
Neil Booth committed
2650 2651
	  if (prev_ident)
	    {
2652
	      cpp_error (pfile, CPP_DL_ERROR,
2653
			 "macro parameters must be comma-separated");
2654
	      return false;
Neil Booth committed
2655 2656 2657
	    }
	  prev_ident = 1;

2658
	  if (_cpp_save_parameter (pfile, macro, token->val.node.node))
2659
	    return false;
Neil Booth committed
2660
	  continue;
Zack Weinberg committed
2661

Neil Booth committed
2662 2663
	case CPP_CLOSE_PAREN:
	  if (prev_ident || macro->paramc == 0)
2664
	    return true;
Zack Weinberg committed
2665

Neil Booth committed
2666 2667 2668 2669
	  /* Fall through to pick up the error.  */
	case CPP_COMMA:
	  if (!prev_ident)
	    {
2670
	      cpp_error (pfile, CPP_DL_ERROR, "parameter name missing");
2671
	      return false;
Neil Booth committed
2672 2673
	    }
	  prev_ident = 0;
Zack Weinberg committed
2674 2675
	  continue;

Neil Booth committed
2676
	case CPP_ELLIPSIS:
2677
	  macro->variadic = 1;
Neil Booth committed
2678 2679
	  if (!prev_ident)
	    {
2680 2681
	      _cpp_save_parameter (pfile, macro,
				   pfile->spec_nodes.n__VA_ARGS__);
Neil Booth committed
2682
	      pfile->state.va_args_ok = 1;
2683
	      if (! CPP_OPTION (pfile, c99)
2684
		  && CPP_OPTION (pfile, cpp_pedantic)
2685
		  && CPP_OPTION (pfile, warn_variadic_macros))
2686 2687 2688
		cpp_pedwarning
                  (pfile, CPP_W_VARIADIC_MACROS,
		   "anonymous variadic macros were introduced in C99");
Neil Booth committed
2689
	    }
2690
	  else if (CPP_OPTION (pfile, cpp_pedantic)
2691
		   && CPP_OPTION (pfile, warn_variadic_macros))
2692 2693
	    cpp_pedwarning (pfile, CPP_W_VARIADIC_MACROS,
		            "ISO C does not permit named variadic macros");
Zack Weinberg committed
2694

Neil Booth committed
2695
	  /* We're at the end, and just expect a closing parenthesis.  */
2696 2697
	  token = _cpp_lex_token (pfile);
	  if (token->type == CPP_CLOSE_PAREN)
2698
	    return true;
Neil Booth committed
2699
	  /* Fall through.  */
Zack Weinberg committed
2700

Neil Booth committed
2701
	case CPP_EOF:
2702
	  cpp_error (pfile, CPP_DL_ERROR, "missing ')' in macro parameter list");
2703
	  return false;
Zack Weinberg committed
2704 2705
	}
    }
Neil Booth committed
2706 2707
}

2708
/* Allocate room for a token from a macro's replacement list.  */
Neil Booth committed
2709
static cpp_token *
2710
alloc_expansion_token (cpp_reader *pfile, cpp_macro *macro)
Neil Booth committed
2711
{
2712 2713
  if (BUFF_ROOM (pfile->a_buff) < (macro->count + 1) * sizeof (cpp_token))
    _cpp_extend_buff (pfile, &pfile->a_buff, sizeof (cpp_token));
Zack Weinberg committed
2714

2715
  return &((cpp_token *) BUFF_FRONT (pfile->a_buff))[macro->count++];
2716 2717
}

2718 2719
/* Lex a token from the expansion of MACRO, but mark parameters as we
   find them and warn of traditional stringification.  */
2720
static cpp_token *
2721
lex_expansion_token (cpp_reader *pfile, cpp_macro *macro)
2722
{
2723
  cpp_token *token, *saved_cur_token;
2724

2725
  saved_cur_token = pfile->cur_token;
2726 2727
  pfile->cur_token = alloc_expansion_token (pfile, macro);
  token = _cpp_lex_direct (pfile);
2728
  pfile->cur_token = saved_cur_token;
Neil Booth committed
2729

2730
  /* Is this a parameter?  */
2731
  if (token->type == CPP_NAME
2732
      && (token->val.node.node->flags & NODE_MACRO_ARG) != 0)
Neil Booth committed
2733 2734
    {
      token->type = CPP_MACRO_ARG;
2735
      token->val.macro_arg.arg_no = token->val.node.node->value.arg_index;
Neil Booth committed
2736 2737 2738 2739 2740 2741
    }
  else if (CPP_WTRADITIONAL (pfile) && macro->paramc > 0
	   && (token->type == CPP_STRING || token->type == CPP_CHAR))
    check_trad_stringification (pfile, macro, &token->val.str);

  return token;
Zack Weinberg committed
2742 2743
}

2744
static bool
2745
create_iso_definition (cpp_reader *pfile, cpp_macro *macro)
Zack Weinberg committed
2746
{
2747
  cpp_token *token;
2748
  const cpp_token *ctoken;
2749 2750 2751
  bool following_paste_op = false;
  const char *paste_op_error_msg =
    N_("'##' cannot appear at either end of a macro expansion");
2752
  unsigned int num_extra_tokens = 0;
Neil Booth committed
2753 2754 2755

  /* Get the first token of the expansion (or the '(' of a
     function-like macro).  */
2756 2757 2758
  ctoken = _cpp_lex_token (pfile);

  if (ctoken->type == CPP_OPEN_PAREN && !(ctoken->flags & PREV_WHITE))
Neil Booth committed
2759
    {
2760
      bool ok = parse_params (pfile, macro);
2761 2762
      macro->params = (cpp_hashnode **) BUFF_FRONT (pfile->a_buff);
      if (!ok)
2763
	return false;
2764

Geoffrey Keating committed
2765 2766 2767
      /* Success.  Commit or allocate the parameter array.  */
      if (pfile->hash_table->alloc_subobject)
	{
2768 2769 2770
	  cpp_hashnode **params =
            (cpp_hashnode **) pfile->hash_table->alloc_subobject
            (sizeof (cpp_hashnode *) * macro->paramc);
2771 2772 2773
	  memcpy (params, macro->params,
		  sizeof (cpp_hashnode *) * macro->paramc);
	  macro->params = params;
Geoffrey Keating committed
2774 2775 2776
	}
      else
	BUFF_FRONT (pfile->a_buff) = (uchar *) &macro->params[macro->paramc];
Neil Booth committed
2777 2778
      macro->fun_like = 1;
    }
2779
  else if (ctoken->type != CPP_EOF && !(ctoken->flags & PREV_WHITE))
2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812
    {
      /* While ISO C99 requires whitespace before replacement text
	 in a macro definition, ISO C90 with TC1 allows there characters
	 from the basic source character set.  */
      if (CPP_OPTION (pfile, c99))
	cpp_error (pfile, CPP_DL_PEDWARN,
		   "ISO C99 requires whitespace after the macro name");
      else
	{
	  int warntype = CPP_DL_WARNING;
	  switch (ctoken->type)
	    {
	    case CPP_ATSIGN:
	    case CPP_AT_NAME:
	    case CPP_OBJC_STRING:
	      /* '@' is not in basic character set.  */
	      warntype = CPP_DL_PEDWARN;
	      break;
	    case CPP_OTHER:
	      /* Basic character set sans letters, digits and _.  */
	      if (strchr ("!\"#%&'()*+,-./:;<=>?[\\]^{|}~",
			  ctoken->val.str.text[0]) == NULL)
		warntype = CPP_DL_PEDWARN;
	      break;
	    default:
	      /* All other tokens start with a character from basic
		 character set.  */
	      break;
	    }
	  cpp_error (pfile, warntype,
		     "missing whitespace after the macro name");
	}
    }
Zack Weinberg committed
2813

2814 2815 2816 2817 2818 2819 2820
  if (macro->fun_like)
    token = lex_expansion_token (pfile, macro);
  else
    {
      token = alloc_expansion_token (pfile, macro);
      *token = *ctoken;
    }
Zack Weinberg committed
2821

Neil Booth committed
2822 2823 2824 2825 2826 2827 2828 2829
  for (;;)
    {
      /* Check the stringifying # constraint 6.10.3.2.1 of
	 function-like macros when lexing the subsequent token.  */
      if (macro->count > 1 && token[-1].type == CPP_HASH && macro->fun_like)
	{
	  if (token->type == CPP_MACRO_ARG)
	    {
2830 2831 2832 2833
	      if (token->flags & PREV_WHITE)
		token->flags |= SP_PREV_WHITE;
	      if (token[-1].flags & DIGRAPH)
		token->flags |= SP_DIGRAPH;
Neil Booth committed
2834 2835 2836 2837 2838 2839 2840
	      token->flags &= ~PREV_WHITE;
	      token->flags |= STRINGIFY_ARG;
	      token->flags |= token[-1].flags & PREV_WHITE;
	      token[-1] = token[0];
	      macro->count--;
	    }
	  /* Let assembler get away with murder.  */
2841
	  else if (CPP_OPTION (pfile, lang) != CLK_ASM)
Neil Booth committed
2842
	    {
2843
	      cpp_error (pfile, CPP_DL_ERROR,
2844
			 "'#' is not followed by a macro parameter");
2845
	      return false;
Neil Booth committed
2846 2847 2848 2849
	    }
	}

      if (token->type == CPP_EOF)
2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860
	{
	  /* Paste operator constraint 6.10.3.3.1:
	     Token-paste ##, can appear in both object-like and
	     function-like macros, but not at the end.  */
	  if (following_paste_op)
	    {
	      cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg);
	      return false;
	    }
	  break;
	}
Neil Booth committed
2861 2862 2863 2864 2865

      /* Paste operator constraint 6.10.3.3.1.  */
      if (token->type == CPP_PASTE)
	{
	  /* Token-paste ##, can appear in both object-like and
2866 2867
	     function-like macros, but not at the beginning.  */
	  if (macro->count == 1)
Neil Booth committed
2868
	    {
2869
	      cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg);
2870
	      return false;
Neil Booth committed
2871
	    }
Zack Weinberg committed
2872

2873 2874 2875 2876
	  if (token[-1].flags & PASTE_LEFT)
	    {
	      macro->extra_tokens = 1;
	      num_extra_tokens++;
2877
	      token->val.token_no = macro->count - 1;
2878 2879 2880 2881 2882 2883 2884 2885 2886 2887
	    }
	  else
	    {
	      --macro->count;
	      token[-1].flags |= PASTE_LEFT;
	      if (token->flags & DIGRAPH)
		token[-1].flags |= SP_DIGRAPH;
	      if (token->flags & PREV_WHITE)
		token[-1].flags |= SP_PREV_WHITE;
	    }
Neil Booth committed
2888 2889
	}

2890
      following_paste_op = (token->type == CPP_PASTE);
Neil Booth committed
2891 2892 2893
      token = lex_expansion_token (pfile, macro);
    }

2894
  macro->exp.tokens = (cpp_token *) BUFF_FRONT (pfile->a_buff);
Geoffrey Keating committed
2895
  macro->traditional = 0;
2896

Neil Booth committed
2897 2898
  /* Don't count the CPP_EOF.  */
  macro->count--;
Neil Booth committed
2899

2900
  /* Clear whitespace on first token for warn_of_redefinition().  */
2901
  if (macro->count)
2902
    macro->exp.tokens[0].flags &= ~PREV_WHITE;
2903

Geoffrey Keating committed
2904 2905 2906
  /* Commit or allocate the memory.  */
  if (pfile->hash_table->alloc_subobject)
    {
2907 2908 2909
      cpp_token *tokns =
        (cpp_token *) pfile->hash_table->alloc_subobject (sizeof (cpp_token)
                                                          * macro->count);
2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930
      if (num_extra_tokens)
	{
	  /* Place second and subsequent ## or %:%: tokens in
	     sequences of consecutive such tokens at the end of the
	     list to preserve information about where they appear, how
	     they are spelt and whether they are preceded by
	     whitespace without otherwise interfering with macro
	     expansion.  */
	  cpp_token *normal_dest = tokns;
	  cpp_token *extra_dest = tokns + macro->count - num_extra_tokens;
	  unsigned int i;
	  for (i = 0; i < macro->count; i++)
	    {
	      if (macro->exp.tokens[i].type == CPP_PASTE)
		*extra_dest++ = macro->exp.tokens[i];
	      else
		*normal_dest++ = macro->exp.tokens[i];
	    }
	}
      else
	memcpy (tokns, macro->exp.tokens, sizeof (cpp_token) * macro->count);
Geoffrey Keating committed
2931 2932 2933 2934
      macro->exp.tokens = tokns;
    }
  else
    BUFF_FRONT (pfile->a_buff) = (uchar *) &macro->exp.tokens[macro->count];
2935

2936 2937 2938
  return true;
}

2939
/* Parse a macro and save its expansion.  Returns nonzero on success.  */
2940
bool
2941
_cpp_create_definition (cpp_reader *pfile, cpp_hashnode *node)
2942 2943 2944 2945
{
  cpp_macro *macro;
  unsigned int i;
  bool ok;
2946

Geoffrey Keating committed
2947
  if (pfile->hash_table->alloc_subobject)
2948 2949
    macro = (cpp_macro *) pfile->hash_table->alloc_subobject
      (sizeof (cpp_macro));
Geoffrey Keating committed
2950 2951
  else
    macro = (cpp_macro *) _cpp_aligned_alloc (pfile, sizeof (cpp_macro));
2952 2953 2954 2955
  macro->line = pfile->directive_line;
  macro->params = 0;
  macro->paramc = 0;
  macro->variadic = 0;
2956
  macro->used = !CPP_OPTION (pfile, warn_unused_macros);
2957 2958
  macro->count = 0;
  macro->fun_like = 0;
2959
  macro->extra_tokens = 0;
2960
  /* To suppress some diagnostics.  */
2961
  macro->syshdr = pfile->buffer && pfile->buffer->sysp != 0;
2962

2963 2964 2965 2966 2967 2968
  if (CPP_OPTION (pfile, traditional))
    ok = _cpp_create_trad_definition (pfile, macro);
  else
    {
      ok = create_iso_definition (pfile, macro);

2969
      /* We set the type for SEEN_EOL() in directives.c.
2970 2971 2972 2973 2974 2975 2976 2977 2978 2979

	 Longer term we should lex the whole line before coming here,
	 and just copy the expansion.  */

      /* Stop the lexer accepting __VA_ARGS__.  */
      pfile->state.va_args_ok = 0;
    }

  /* Clear the fast argument lookup indices.  */
  for (i = macro->paramc; i-- > 0; )
2980 2981 2982 2983 2984
    {
      struct cpp_hashnode *node = macro->params[i];
      node->flags &= ~ NODE_MACRO_ARG;
      node->value = ((union _cpp_hashnode_value *) pfile->macro_buffer)[i];
    }
2985 2986 2987 2988

  if (!ok)
    return ok;

2989
  if (node->type == NT_MACRO)
Zack Weinberg committed
2990
    {
2991 2992 2993
      if (CPP_OPTION (pfile, warn_unused_macros))
	_cpp_warn_if_unused_macro (pfile, node, NULL);

2994
      if (warn_of_redefinition (pfile, node, macro))
Zack Weinberg committed
2995
	{
2996 2997
          const int reason = (node->flags & NODE_BUILTIN)
                             ? CPP_W_BUILTIN_MACRO_REDEFINED : CPP_W_NONE;
2998
	  bool warned;
2999 3000 3001 3002 3003

	  warned = cpp_pedwarning_with_line (pfile, reason,
					     pfile->directive_line, 0,
					     "\"%s\" redefined",
                                             NODE_NAME (node));
Neil Booth committed
3004

3005 3006
	  if (warned && node->type == NT_MACRO && !(node->flags & NODE_BUILTIN))
	    cpp_error_with_line (pfile, CPP_DL_NOTE,
3007 3008
				 node->value.macro->line, 0,
			 "this is the location of the previous definition");
Zack Weinberg committed
3009 3010 3011
	}
    }

3012 3013 3014
  if (node->type != NT_VOID)
    _cpp_free_definition (node);

Zack Weinberg committed
3015
  /* Enter definition in hash table.  */
Neil Booth committed
3016 3017
  node->type = NT_MACRO;
  node->value.macro = macro;
3018
  if (! ustrncmp (NODE_NAME (node), DSC ("__STDC_"))
3019 3020 3021 3022 3023 3024 3025
      && ustrcmp (NODE_NAME (node), (const uchar *) "__STDC_FORMAT_MACROS")
      /* __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS are mentioned
	 in the C standard, as something that one must use in C++.
	 However DR#593 indicates that these aren't actually mentioned
	 in the C++ standard.  We special-case them anyway.  */
      && ustrcmp (NODE_NAME (node), (const uchar *) "__STDC_LIMIT_MACROS")
      && ustrcmp (NODE_NAME (node), (const uchar *) "__STDC_CONSTANT_MACROS"))
3026
    node->flags |= NODE_WARN;
Zack Weinberg committed
3027

3028 3029 3030 3031
  /* If user defines one of the conditional macros, remove the
     conditional flag */
  node->flags &= ~NODE_CONDITIONAL;

Neil Booth committed
3032
  return ok;
Zack Weinberg committed
3033 3034
}

3035 3036
/* Warn if a token in STRING matches one of a function-like MACRO's
   parameters.  */
3037
static void
3038 3039
check_trad_stringification (cpp_reader *pfile, const cpp_macro *macro,
			    const cpp_string *string)
3040
{
Neil Booth committed
3041
  unsigned int i, len;
3042
  const uchar *p, *q, *limit;
3043

3044
  /* Loop over the string.  */
3045 3046
  limit = string->text + string->len - 1;
  for (p = string->text + 1; p < limit; p = q)
3047 3048
    {
      /* Find the start of an identifier.  */
3049 3050
      while (p < limit && !is_idstart (*p))
	p++;
3051 3052 3053

      /* Find the end of the identifier.  */
      q = p;
3054 3055
      while (q < limit && is_idchar (*q))
	q++;
Neil Booth committed
3056 3057 3058

      len = q - p;

3059 3060
      /* Loop over the function macro arguments to see if the
	 identifier inside the string matches one of them.  */
Neil Booth committed
3061 3062 3063
      for (i = 0; i < macro->paramc; i++)
	{
	  const cpp_hashnode *node = macro->params[i];
3064

3065 3066
	  if (NODE_LEN (node) == len
	      && !memcmp (p, NODE_NAME (node), len))
3067
	    {
3068
	      cpp_error (pfile, CPP_DL_WARNING,
3069
	   "macro argument \"%s\" would be stringified in traditional C",
3070
			 NODE_NAME (node));
3071 3072 3073 3074 3075
	      break;
	    }
	}
    }
}
Neil Booth committed
3076

3077 3078 3079 3080
/* Returns the name, arguments and expansion of a macro, in a format
   suitable to be read back in again, and therefore also for DWARF 2
   debugging info.  e.g. "PASTE(X, Y) X ## Y", or "MACNAME EXPANSION".
   Caller is expected to generate the "#define" bit if needed.  The
Neil Booth committed
3081 3082
   returned text is temporary, and automatically freed later.  */
const unsigned char *
3083
cpp_macro_definition (cpp_reader *pfile, cpp_hashnode *node)
Neil Booth committed
3084 3085
{
  unsigned int i, len;
3086
  const cpp_macro *macro;
Neil Booth committed
3087 3088 3089 3090
  unsigned char *buffer;

  if (node->type != NT_MACRO || (node->flags & NODE_BUILTIN))
    {
3091 3092 3093 3094 3095 3096 3097 3098 3099
      if (node->type != NT_MACRO
	  || !pfile->cb.user_builtin_macro
          || !pfile->cb.user_builtin_macro (pfile, node))
	{
	  cpp_error (pfile, CPP_DL_ICE,
		     "invalid hash type %d in cpp_macro_definition",
		     node->type);
	  return 0;
	}
Neil Booth committed
3100 3101
    }

3102
  macro = node->value.macro;
Neil Booth committed
3103
  /* Calculate length.  */
3104
  len = NODE_LEN (node) + 2;			/* ' ' and NUL.  */
Neil Booth committed
3105 3106
  if (macro->fun_like)
    {
3107 3108
      len += 4;		/* "()" plus possible final ".." of named
			   varargs (we have + 1 below).  */
Neil Booth committed
3109
      for (i = 0; i < macro->paramc; i++)
3110
	len += NODE_LEN (macro->params[i]) + 1; /* "," */
Neil Booth committed
3111 3112
    }

3113
  /* This should match below where we fill in the buffer.  */
3114 3115 3116
  if (CPP_OPTION (pfile, traditional))
    len += _cpp_replacement_text_len (macro);
  else
Neil Booth committed
3117
    {
3118 3119
      unsigned int count = macro_real_token_count (macro);
      for (i = 0; i < count; i++)
3120 3121
	{
	  cpp_token *token = &macro->exp.tokens[i];
Neil Booth committed
3122

3123
	  if (token->type == CPP_MACRO_ARG)
3124
	    len += NODE_LEN (macro->params[token->val.macro_arg.arg_no - 1]);
3125
	  else
3126 3127
	    len += cpp_token_len (token);

3128 3129 3130 3131
	  if (token->flags & STRINGIFY_ARG)
	    len++;			/* "#" */
	  if (token->flags & PASTE_LEFT)
	    len += 3;		/* " ##" */
3132 3133
	  if (token->flags & PREV_WHITE)
	    len++;              /* " " */
3134
	}
Neil Booth committed
3135 3136 3137
    }

  if (len > pfile->macro_buffer_len)
3138
    {
3139 3140
      pfile->macro_buffer = XRESIZEVEC (unsigned char,
                                        pfile->macro_buffer, len);
3141 3142
      pfile->macro_buffer_len = len;
    }
3143 3144

  /* Fill in the buffer.  Start with the macro name.  */
Neil Booth committed
3145
  buffer = pfile->macro_buffer;
3146 3147
  memcpy (buffer, NODE_NAME (node), NODE_LEN (node));
  buffer += NODE_LEN (node);
Neil Booth committed
3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158

  /* Parameter names.  */
  if (macro->fun_like)
    {
      *buffer++ = '(';
      for (i = 0; i < macro->paramc; i++)
	{
	  cpp_hashnode *param = macro->params[i];

	  if (param != pfile->spec_nodes.n__VA_ARGS__)
	    {
3159 3160
	      memcpy (buffer, NODE_NAME (param), NODE_LEN (param));
	      buffer += NODE_LEN (param);
Neil Booth committed
3161 3162 3163
	    }

	  if (i + 1 < macro->paramc)
3164 3165 3166
	    /* Don't emit a space after the comma here; we're trying
	       to emit a Dwarf-friendly definition, and the Dwarf spec
	       forbids spaces in the argument list.  */
3167
	    *buffer++ = ',';
3168
	  else if (macro->variadic)
Neil Booth committed
3169 3170 3171 3172 3173
	    *buffer++ = '.', *buffer++ = '.', *buffer++ = '.';
	}
      *buffer++ = ')';
    }

3174 3175 3176 3177
  /* The Dwarf spec requires a space after the macro name, even if the
     definition is the empty string.  */
  *buffer++ = ' ';

3178 3179 3180
  if (CPP_OPTION (pfile, traditional))
    buffer = _cpp_copy_replacement_text (macro, buffer);
  else if (macro->count)
Neil Booth committed
3181 3182
  /* Expansion tokens.  */
    {
3183 3184
      unsigned int count = macro_real_token_count (macro);
      for (i = 0; i < count; i++)
Neil Booth committed
3185
	{
3186
	  cpp_token *token = &macro->exp.tokens[i];
Neil Booth committed
3187 3188 3189 3190 3191 3192 3193 3194

	  if (token->flags & PREV_WHITE)
	    *buffer++ = ' ';
	  if (token->flags & STRINGIFY_ARG)
	    *buffer++ = '#';

	  if (token->type == CPP_MACRO_ARG)
	    {
3195
	      memcpy (buffer,
3196 3197 3198
		      NODE_NAME (macro->params[token->val.macro_arg.arg_no - 1]),
		      NODE_LEN (macro->params[token->val.macro_arg.arg_no - 1]));
	      buffer += NODE_LEN (macro->params[token->val.macro_arg.arg_no - 1]);
Neil Booth committed
3199 3200
	    }
	  else
3201
	    buffer = cpp_spell_token (pfile, token, buffer, false);
Neil Booth committed
3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215

	  if (token->flags & PASTE_LEFT)
	    {
	      *buffer++ = ' ';
	      *buffer++ = '#';
	      *buffer++ = '#';
	      /* Next has PREV_WHITE; see _cpp_create_definition.  */
	    }
	}
    }

  *buffer = '\0';
  return pfile->macro_buffer;
}