macro.c 116 KB
Newer Older
Neil Booth committed
1
/* Part of CPP library.  (Macro and #define handling.)
2
   Copyright (C) 1986-2018 Free Software Foundation, Inc.
Zack Weinberg committed
3 4 5 6 7 8
   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
9
Free Software Foundation; either version 3, or (at your option) any
Zack Weinberg committed
10 11 12 13 14 15 16 17
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
18 19
along with this program; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.
Zack Weinberg committed
20 21 22 23 24 25 26 27

 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"
28
#include "internal.h"
Zack Weinberg committed
29

Neil Booth committed
30
typedef struct macro_arg macro_arg;
31 32 33 34
/* 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
35 36
struct macro_arg
{
37
  const cpp_token **first;	/* First token in unexpanded argument.  */
Kazu Hirata committed
38
  const cpp_token **expanded;	/* Macro-expanded argument.  */
39
  const cpp_token *stringified;	/* Stringified argument.  */
Neil Booth committed
40 41
  unsigned int count;		/* # of tokens in argument.  */
  unsigned int expanded_count;	/* # of tokens in expanded argument.  */
42 43 44 45 46 47 48 49 50 51 52 53
  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
54
     literal, e.g. #foo.  */
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
  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
Joseph Myers committed
73
     -ftrack-macro-expansion is used this location tracks loci across
74 75
     macro expansion.  */
  const source_location *location_ptr;
76
#if CHECKING_P
77 78 79 80
  /* The number of times the iterator went forward. This useful only
     when checking is enabled.  */
  size_t num_forwards;
#endif
Zack Weinberg committed
81 82
};

83 84 85 86 87
/* Saved data about an identifier being used as a macro argument
   name.  */
struct macro_arg_saved_data {
  /* The canonical (UTF-8) spelling of this identifier.  */
  cpp_hashnode *canonical_node;
Nathan Sidwell committed
88
  /* The previous value & type of this identifier.  */
89
  union _cpp_hashnode_value value;
Nathan Sidwell committed
90
  node_type type;
91 92
};

Tom Tromey committed
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
static const char *vaopt_paste_error =
  N_("'##' cannot appear at either end of __VA_OPT__");

/* A class for tracking __VA_OPT__ state while iterating over a
   sequence of tokens.  This is used during both macro definition and
   expansion.  */
class vaopt_state {

 public:

  /* Initialize the state tracker.  ANY_ARGS is true if variable
     arguments were provided to the macro invocation.  */
  vaopt_state (cpp_reader *pfile, bool is_variadic, bool any_args)
    : m_pfile (pfile),
    m_allowed (any_args),
    m_variadic (is_variadic),
    m_last_was_paste (false),
110
    m_state (0),
Tom Tromey committed
111 112 113 114 115 116 117 118 119
    m_paste_location (0),
    m_location (0)
  {
  }

  enum update_type
  {
    ERROR,
    DROP,
120 121 122
    INCLUDE,
    BEGIN,
    END
Tom Tromey committed
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
  };

  /* Given a token, update the state of this tracker and return a
     boolean indicating whether the token should be be included in the
     expansion.  */
  update_type update (const cpp_token *token)
  {
    /* If the macro isn't variadic, just don't bother.  */
    if (!m_variadic)
      return INCLUDE;

    if (token->type == CPP_NAME
	&& token->val.node.node == m_pfile->spec_nodes.n__VA_OPT__)
      {
	if (m_state > 0)
	  {
	    cpp_error_at (m_pfile, CPP_DL_ERROR, token->src_loc,
			  "__VA_OPT__ may not appear in a __VA_OPT__");
	    return ERROR;
	  }
	++m_state;
	m_location = token->src_loc;
145
	return BEGIN;
Tom Tromey committed
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
      }
    else if (m_state == 1)
      {
	if (token->type != CPP_OPEN_PAREN)
	  {
	    cpp_error_at (m_pfile, CPP_DL_ERROR, m_location,
			  "__VA_OPT__ must be followed by an "
			  "open parenthesis");
	    return ERROR;
	  }
	++m_state;
	return DROP;
      }
    else if (m_state >= 2)
      {
	if (m_state == 2 && token->type == CPP_PASTE)
	  {
	    cpp_error_at (m_pfile, CPP_DL_ERROR, token->src_loc,
			  vaopt_paste_error);
	    return ERROR;
	  }
	/* Advance states before further considering this token, in
	   case we see a close paren immediately after the open
	   paren.  */
	if (m_state == 2)
	  ++m_state;

	bool was_paste = m_last_was_paste;
	m_last_was_paste = false;
	if (token->type == CPP_PASTE)
	  {
	    m_last_was_paste = true;
	    m_paste_location = token->src_loc;
	  }
	else if (token->type == CPP_OPEN_PAREN)
	  ++m_state;
	else if (token->type == CPP_CLOSE_PAREN)
	  {
	    --m_state;
	    if (m_state == 2)
	      {
		/* Saw the final paren.  */
		m_state = 0;

		if (was_paste)
		  {
		    cpp_error_at (m_pfile, CPP_DL_ERROR, token->src_loc,
				  vaopt_paste_error);
		    return ERROR;
		  }

197
		return END;
Tom Tromey committed
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
	      }
	  }
	return m_allowed ? INCLUDE : DROP;
      }

    /* Nothing to do with __VA_OPT__.  */
    return INCLUDE;
  }

  /* Ensure that any __VA_OPT__ was completed.  If ok, return true.
     Otherwise, issue an error and return false.  */
  bool completed ()
  {
    if (m_variadic && m_state != 0)
      cpp_error_at (m_pfile, CPP_DL_ERROR, m_location,
		    "unterminated __VA_OPT__");
    return m_state == 0;
  }

 private:

  /* The cpp_reader.  */
  cpp_reader *m_pfile;

  /* True if there were varargs.  */
  bool m_allowed;
  /* True if the macro is variadic.  */
  bool m_variadic;
226 227 228
  /* If true, the previous token was ##.  This is used to detect when
     a paste occurs at the end of the sequence.  */
  bool m_last_was_paste;
Tom Tromey committed
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243

  /* The state variable:
     0 means not parsing
     1 means __VA_OPT__ seen, looking for "("
     2 means "(" seen (so the next token can't be "##")
     >= 3 means looking for ")", the number encodes the paren depth.  */
  int m_state;

  /* The location of the paste token.  */
  source_location m_paste_location;

  /* Location of the __VA_OPT__ token.  */
  source_location m_location;
};

Neil Booth committed
244 245
/* Macro expansion.  */

246
static int enter_macro_context (cpp_reader *, cpp_hashnode *,
247
				const cpp_token *, source_location);
248 249
static int builtin_macro (cpp_reader *, cpp_hashnode *,
			  source_location, source_location);
250 251
static void push_ptoken_context (cpp_reader *, cpp_hashnode *, _cpp_buff *,
				 const cpp_token **, unsigned int);
252 253 254
static void push_extended_tokens_context (cpp_reader *, cpp_hashnode *,
					  _cpp_buff *, source_location *,
					  const cpp_token **, unsigned int);
255
static _cpp_buff *collect_args (cpp_reader *, const cpp_hashnode *,
256
				_cpp_buff **, unsigned *);
257 258 259 260 261 262
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 *);
263 264
static bool paste_tokens (cpp_reader *, source_location,
			  const cpp_token **, const cpp_token *);
265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
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 *);
292 293 294 295 296
static inline const cpp_token **tokens_buff_put_token_to (const cpp_token **,
                                                          source_location *,
                                                          const cpp_token *,
                                                          source_location,
                                                          source_location,
297
                                                          const line_map_macro *,
298
                                                          unsigned int);
299 300 301 302 303 304

static const cpp_token **tokens_buff_add_token (_cpp_buff *,
						source_location *,
						const cpp_token *,
						source_location,
						source_location,
305
						const line_map_macro *,
306
						unsigned int);
307
static inline void tokens_buff_remove_last_token (_cpp_buff *);
308
static void replace_args (cpp_reader *, cpp_hashnode *, cpp_macro *,
309
			  macro_arg *, source_location);
310
static _cpp_buff *funlike_invocation_p (cpp_reader *, cpp_hashnode *,
311
					_cpp_buff **, unsigned *);
312
static cpp_macro *create_iso_definition (cpp_reader *);
Neil Booth committed
313 314 315

/* #define directive parsing and handling.  */

316
static cpp_macro *lex_expansion_token (cpp_reader *, cpp_macro *);
317
static bool warn_of_redefinition (cpp_reader *, cpp_hashnode *,
318
				  const cpp_macro *);
319
static bool parse_params (cpp_reader *, unsigned *, bool *);
320 321
static void check_trad_stringification (cpp_reader *, const cpp_macro *,
					const cpp_string *);
322 323 324 325 326
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
327

328 329
static cpp_hashnode* macro_of_context (cpp_context *context);

330 331
static bool in_macro_expansion_p (cpp_reader *pfile);

332 333 334 335 336 337 338
/* 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;

339 340 341
/* Emits a warning if NODE is a macro defined in the main file that
   has not been used.  */
int
342 343
_cpp_warn_if_unused_macro (cpp_reader *pfile, cpp_hashnode *node,
			   void *v ATTRIBUTE_UNUSED)
344
{
345
  if (cpp_user_macro_p (node))
346 347 348 349
    {
      cpp_macro *macro = node->value.macro;

      if (!macro->used
350 351 352
	  && MAIN_FILE_P (linemap_check_ordinary
			    (linemap_lookup (pfile->line_table,
					     macro->line))))
353 354
	cpp_warning_with_line (pfile, CPP_W_UNUSED_MACROS, macro->line, 0,
			       "macro \"%s\" is not used", NODE_NAME (node));
355 356 357 358 359
    }

  return 1;
}

360 361 362
/* 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 *
363
new_string_token (cpp_reader *pfile, unsigned char *text, unsigned int len)
Neil Booth committed
364
{
365
  cpp_token *token = _cpp_temp_token (pfile);
Neil Booth committed
366

367
  text[len] = '\0';
Neil Booth committed
368
  token->type = CPP_STRING;
369 370
  token->val.str.len = len;
  token->val.str.text = text;
Neil Booth committed
371
  token->flags = 0;
372
  return token;
Neil Booth committed
373 374 375 376 377 378 379 380
}

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

381 382
/* Helper function for builtin_macro.  Returns the text generated by
   a builtin macro. */
383
const uchar *
384 385
_cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node,
			 source_location loc)
Neil Booth committed
386
{
387
  const uchar *result = NULL;
388
  linenum_type number = 1;
Neil Booth committed
389

Neil Booth committed
390 391
  switch (node->value.builtin)
    {
392
    default:
393
      cpp_error (pfile, CPP_DL_ICE, "invalid built-in macro \"%s\"",
394
		 NODE_NAME (node));
395
      break;
396

397 398
    case BT_TIMESTAMP:
      {
399
	if (CPP_OPTION (pfile, warn_date_time))
400 401
	  cpp_warning (pfile, CPP_W_DATE_TIME, "macro \"%s\" might prevent "
		       "reproducible builds", NODE_NAME (node));
402

403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431
	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");
432
		    pbuffer->timestamp = UC"\"??? ??? ?? ??:??:?? ????\"";
433 434 435 436 437 438
		  }
	      }
	  }
	result = pbuffer->timestamp;
      }
      break;
Neil Booth committed
439 440
    case BT_FILE:
    case BT_BASE_FILE:
Zack Weinberg committed
441
      {
442
	unsigned int len;
443
	const char *name;
444
	uchar *buf;
445 446 447 448 449 450
	
	if (node->value.builtin == BT_FILE)
	  name = linemap_get_expansion_filename (pfile->line_table,
						 pfile->line_table->highest_line);
	else
	  {
451 452 453
	    name = _cpp_get_file_name (pfile->main_file);
	    if (!name)
	      abort ();
454
	  }
455 456
	if (pfile->cb.remap_filename)
	  name = pfile->cb.remap_filename (name);
457
	len = strlen (name);
458
	buf = _cpp_unaligned_alloc (pfile, len * 2 + 3);
459 460 461 462 463
	result = buf;
	*buf = '"';
	buf = cpp_quote_string (buf + 1, (const unsigned char *) name, len);
	*buf++ = '"';
	*buf = '\0';
Zack Weinberg committed
464
      }
Neil Booth committed
465 466
      break;

Neil Booth committed
467
    case BT_INCLUDE_LEVEL:
468 469 470
      /* The line map depth counts the primary source as level 1, but
	 historically __INCLUDE_DEPTH__ has called the primary source
	 level 0.  */
471
      number = pfile->line_table->depth - 1;
Neil Booth committed
472
      break;
Neil Booth committed
473 474 475 476

    case BT_SPECLINE:
      /* If __LINE__ is embedded in a macro, it must expand to the
	 line of the macro's invocation, not its definition.
477 478 479 480 481 482 483 484
	 Otherwise things like assert() will not work properly.
	 See WG14 N1911, WG21 N4220 sec 6.5, and PR 61861.  */
      if (CPP_OPTION (pfile, traditional))
	loc = pfile->line_table->highest_line;
      else
	loc = linemap_resolve_location (pfile->line_table, loc,
					LRK_MACRO_EXPANSION_POINT, NULL);
      number = linemap_get_expansion_line (pfile->line_table, loc);
Neil Booth committed
485
      break;
Neil Booth committed
486

487 488
      /* __STDC__ has the value 1 under normal circumstances.
	 However, if (a) we are in a system header, (b) the option
489 490
	 stdc_0_in_system_headers is true (set by target config), and
	 (c) we are not in strictly conforming mode, then it has the
491
	 value 0.  (b) and (c) are already checked in cpp_init_builtins.  */
Neil Booth committed
492
    case BT_STDC:
493 494 495 496
      if (cpp_in_system_header (pfile))
	number = 0;
      else
	number = 1;
Neil Booth committed
497
      break;
Zack Weinberg committed
498

Neil Booth committed
499 500
    case BT_DATE:
    case BT_TIME:
501
      if (CPP_OPTION (pfile, warn_date_time))
502 503
	cpp_warning (pfile, CPP_W_DATE_TIME, "macro \"%s\" might prevent "
		     "reproducible builds", NODE_NAME (node));
504
      if (pfile->date == NULL)
Neil Booth committed
505
	{
506 507 508 509
	  /* 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.  */
510 511 512
	  time_t tt;
	  struct tm *tb = NULL;

513
	  /* Set a reproducible timestamp for __DATE__ and __TIME__ macro
514 515 516 517 518 519 520
	     if SOURCE_DATE_EPOCH is defined.  */
	  if (pfile->source_date_epoch == (time_t) -2
	      && pfile->cb.get_source_date_epoch != NULL)
	    pfile->source_date_epoch = pfile->cb.get_source_date_epoch (pfile);

	  if (pfile->source_date_epoch >= (time_t) 0)
	    tb = gmtime (&pfile->source_date_epoch);
521 522 523 524 525 526 527 528 529 530
	  else
	    {
	      /* (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);
	    }
531 532 533 534 535 536

	  if (tb)
	    {
	      pfile->date = _cpp_unaligned_alloc (pfile,
						  sizeof ("\"Oct 11 1347\""));
	      sprintf ((char *) pfile->date, "\"%s %2d %4d\"",
537 538
		       monthnames[tb->tm_mon], tb->tm_mday,
		       tb->tm_year + 1900);
539 540 541 542 543 544 545 546

	      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
	    {
547
	      cpp_errno (pfile, CPP_DL_WARNING,
548 549
			 "could not determine date and time");
		
550 551
	      pfile->date = UC"\"??? ?? ????\"";
	      pfile->time = UC"\"??:??:??\"";
552
	    }
Neil Booth committed
553 554
	}

Neil Booth committed
555
      if (node->value.builtin == BT_DATE)
556
	result = pfile->date;
Neil Booth committed
557
      else
558
	result = pfile->time;
Neil Booth committed
559
      break;
560 561

    case BT_COUNTER:
562 563 564
      if (CPP_OPTION (pfile, directives_only) && pfile->state.in_directive)
	cpp_error (pfile, CPP_DL_ERROR,
	    "__COUNTER__ expanded inside directive with -fdirectives-only");
565 566
      number = pfile->counter++;
      break;
567 568 569 570

    case BT_HAS_ATTRIBUTE:
      number = pfile->cb.has_attribute (pfile);
      break;
571 572 573 574 575 576 577 578 579 580 581 582 583
    }

  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
584 585
   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
586 587
   return the token to the caller.  LOC is the location of the expansion
   point of the macro.  */
588
static int
589 590
builtin_macro (cpp_reader *pfile, cpp_hashnode *node,
	       source_location loc, source_location expand_loc)
591 592
{
  const uchar *buf;
593 594
  size_t len;
  char *nbuf;
Neil Booth committed
595

596 597
  if (node->value.builtin == BT_PRAGMA)
    {
Neil Booth committed
598 599 600 601 602
      /* 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;

603
      return _cpp_do__Pragma (pfile, loc);
Neil Booth committed
604
    }
Neil Booth committed
605

606
  buf = _cpp_builtin_macro_text (pfile, node, expand_loc);
607
  len = ustrlen (buf);
608
  nbuf = (char *) alloca (len + 1);
609 610
  memcpy (nbuf, buf, len);
  nbuf[len]='\n';
611

612
  cpp_push_buffer (pfile, (uchar *) nbuf, len, /* from_stage3 */ true);
613
  _cpp_clean_line (pfile);
614 615 616

  /* Set pfile->cur_token as required by _cpp_lex_direct.  */
  pfile->cur_token = _cpp_temp_token (pfile);
617
  cpp_token *token = _cpp_lex_direct (pfile);
618 619
  /* We should point to the expansion point of the builtin macro.  */
  token->src_loc = loc;
620 621 622 623 624 625 626 627
  if (pfile->context->tokens_kind == TOKENS_KIND_EXTENDED)
    {
      /* We are tracking tokens resulting from macro expansion.
	 Create a macro line map and generate a virtual location for
	 the token resulting from the expansion of the built-in
	 macro.  */
      source_location *virt_locs = NULL;
      _cpp_buff *token_buf = tokens_buff_new (pfile, 1, &virt_locs);
628
      const line_map_macro * map =
629
	linemap_enter_macro (pfile->line_table, node, loc, 1);
630 631 632 633 634 635 636 637 638 639
      tokens_buff_add_token (token_buf, virt_locs, token,
			     pfile->line_table->builtin_location,
			     pfile->line_table->builtin_location,
			    map, /*macro_token_index=*/0);
      push_extended_tokens_context (pfile, node, token_buf, virt_locs,
				    (const cpp_token **)token_buf->base,
				    1);
    }
  else
    _cpp_push_token_context (pfile, NULL, token, 1);
640
  if (pfile->buffer->cur != pfile->buffer->rlimit)
641
    cpp_error (pfile, CPP_DL_ICE, "invalid built-in macro \"%s\"",
642 643 644
	       NODE_NAME (node));
  _cpp_pop_buffer (pfile);

Neil Booth committed
645
  return 1;
Zack Weinberg committed
646 647
}

648
/* Copies SRC, of length LEN, to DEST, adding backslashes before all
649 650
   backslashes and double quotes. DEST must be of sufficient size.
   Returns a pointer to the end of the string.  */
651
uchar *
652
cpp_quote_string (uchar *dest, const uchar *src, unsigned int len)
Neil Booth committed
653 654 655
{
  while (len--)
    {
656
      uchar c = *src++;
Zack Weinberg committed
657

658
      switch (c)
Neil Booth committed
659
	{
660 661 662 663 664 665 666
	case '\n':
	  /* Naked LF can appear in raw string literals  */
	  c = 'n';
	  /* FALLTHROUGH */

	case '\\':
	case '"':
Neil Booth committed
667
	  *dest++ = '\\';
668 669 670
	  /* FALLTHROUGH */

	default:
Neil Booth committed
671 672 673
	  *dest++ = c;
	}
    }
Zack Weinberg committed
674

Neil Booth committed
675 676
  return dest;
}
Zack Weinberg committed
677

678 679
/* Convert a token sequence ARG to a single string token according to
   the rules of the ISO C #-operator.  */
680
static const cpp_token *
681
stringify_arg (cpp_reader *pfile, macro_arg *arg)
Neil Booth committed
682
{
683
  unsigned char *dest;
684
  unsigned int i, escape_it, backslash_count = 0;
685
  const cpp_token *source = NULL;
686
  size_t len;
Zack Weinberg committed
687

688 689 690 691 692
  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
693 694 695
  /* Loop, reading in the argument's tokens.  */
  for (i = 0; i < arg->count; i++)
    {
696 697 698 699
      const cpp_token *token = arg->first[i];

      if (token->type == CPP_PADDING)
	{
700 701 702
	  if (source == NULL
	      || (!(source->flags & PREV_WHITE)
		  && token->val.source == NULL))
703 704 705
	    source = token->val.source;
	  continue;
	}
Zack Weinberg committed
706

707
      escape_it = (token->type == CPP_STRING || token->type == CPP_CHAR
708
		   || token->type == CPP_WSTRING || token->type == CPP_WCHAR
709
		   || token->type == CPP_STRING32 || token->type == CPP_CHAR32
710
		   || token->type == CPP_STRING16 || token->type == CPP_CHAR16
711
		   || token->type == CPP_UTF8STRING || token->type == CPP_UTF8CHAR
712 713
		   || cpp_userdef_string_p (token->type)
		   || cpp_userdef_char_p (token->type));
714

715
      /* Room for each char being written in octal, initial space and
716
	 final quote and NUL.  */
717
      len = cpp_token_len (token);
Neil Booth committed
718 719
      if (escape_it)
	len *= 4;
720
      len += 3;
Zack Weinberg committed
721

722
      if ((size_t) (BUFF_LIMIT (pfile->u_buff) - dest) < len)
Neil Booth committed
723
	{
724
	  size_t len_so_far = dest - BUFF_FRONT (pfile->u_buff);
725
	  _cpp_extend_buff (pfile, &pfile->u_buff, len);
726
	  dest = BUFF_FRONT (pfile->u_buff) + len_so_far;
Neil Booth committed
727
	}
Zack Weinberg committed
728

729
      /* Leading white space?  */
730
      if (dest - 1 != BUFF_FRONT (pfile->u_buff))
731 732 733 734 735 736 737
	{
	  if (source == NULL)
	    source = token;
	  if (source->flags & PREV_WHITE)
	    *dest++ = ' ';
	}
      source = NULL;
Zack Weinberg committed
738

Neil Booth committed
739 740
      if (escape_it)
	{
741 742
	  _cpp_buff *buff = _cpp_get_buff (pfile, len);
	  unsigned char *buf = BUFF_FRONT (buff);
743
	  len = cpp_spell_token (pfile, token, buf, true) - buf;
744
	  dest = cpp_quote_string (dest, buf, len);
745
	  _cpp_release_buff (pfile, buff);
Neil Booth committed
746 747
	}
      else
748
	dest = cpp_spell_token (pfile, token, dest, true);
Neil Booth committed
749

750
      if (token->type == CPP_OTHER && token->val.str.text[0] == '\\')
Neil Booth committed
751 752 753 754 755 756 757 758
	backslash_count++;
      else
	backslash_count = 0;
    }

  /* Ignore the final \ of invalid string literals.  */
  if (backslash_count & 1)
    {
759
      cpp_error (pfile, CPP_DL_WARNING,
760
		 "invalid string literal, ignoring final '\\'");
761
      dest--;
Neil Booth committed
762 763
    }

764
  /* Commit the memory, including NUL, and return the token.  */
765
  *dest++ = '"';
766 767 768
  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
769 770
}

771
/* Try to paste two tokens.  On success, return nonzero.  In any
Neil Booth committed
772
   case, PLHS is updated to point to the pasted token, which is
773 774
   guaranteed to not have the PASTE_LEFT flag set.  LOCATION is
   the virtual location used for error reporting.  */
Neil Booth committed
775
static bool
776 777
paste_tokens (cpp_reader *pfile, source_location location,
	      const cpp_token **plhs, const cpp_token *rhs)
778
{
779
  unsigned char *buf, *end, *lhsend;
780
  cpp_token *lhs;
Neil Booth committed
781 782
  unsigned int len;

783
  len = cpp_token_len (*plhs) + cpp_token_len (rhs) + 1;
784
  buf = (unsigned char *) alloca (len);
785
  end = lhsend = cpp_spell_token (pfile, *plhs, buf, true);
Neil Booth committed
786 787 788 789 790

  /* 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.  */
791
  if ((*plhs)->type == CPP_DIV && rhs->type != CPP_EQ)
Neil Booth committed
792
    *end++ = ' ';
793 794
  /* In one obscure case we might see padding here.  */
  if (rhs->type != CPP_PADDING)
795
    end = cpp_spell_token (pfile, rhs, end, true);
796
  *end = '\n';
Neil Booth committed
797

798
  cpp_push_buffer (pfile, buf, end - buf, /* from_stage3 */ true);
799
  _cpp_clean_line (pfile);
Neil Booth committed
800 801 802

  /* Set pfile->cur_token as required by _cpp_lex_direct.  */
  pfile->cur_token = _cpp_temp_token (pfile);
803
  lhs = _cpp_lex_direct (pfile);
804 805
  if (pfile->buffer->cur != pfile->buffer->rlimit)
    {
806 807
      source_location saved_loc = lhs->src_loc;

808 809 810 811
      _cpp_pop_buffer (pfile);
      _cpp_backup_tokens (pfile, 1);
      *lhsend = '\0';

812 813 814 815 816 817 818
      /* 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;

819 820
      /* Mandatory error for all apart from assembler.  */
      if (CPP_OPTION (pfile, lang) != CLK_ASM)
821
	cpp_error_with_line (pfile, CPP_DL_ERROR, location, 0,
822 823 824 825
	 "pasting \"%s\" and \"%s\" does not give a valid preprocessing token",
		   buf, cpp_token_as_text (pfile, rhs));
      return false;
    }
Neil Booth committed
826

827
  *plhs = lhs;
828 829
  _cpp_pop_buffer (pfile);
  return true;
830 831
}

832 833 834 835 836 837 838
/* 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
839
static void
840
paste_all_tokens (cpp_reader *pfile, const cpp_token *lhs)
Neil Booth committed
841
{
842
  const cpp_token *rhs = NULL;
843
  cpp_context *context = pfile->context;
844 845
  source_location virt_loc = 0;

846 847 848 849
  /* We are expanding a macro and we must have been called on a token
     that appears at the left hand side of a ## operator.  */
  if (macro_of_context (pfile->context) == NULL
      || (!(lhs->flags & PASTE_LEFT)))
850 851 852 853 854 855 856 857 858 859
    abort ();

  if (context->tokens_kind == TOKENS_KIND_EXTENDED)
    /* The caller must have called consume_next_token_from_context
       right before calling us.  That has incremented the pointer to
       the current virtual location.  So it now points to the location
       of the token that comes right after *LHS.  We want the
       resulting pasted token to have the location of the current
       *LHS, though.  */
    virt_loc = context->c.mc->cur_virt_loc[-1];
860 861 862 863 864
  else
    /* We are not tracking macro expansion.  So the best virtual
       location we can get here is the expansion point of the macro we
       are currently expanding.  */
    virt_loc = pfile->invocation_location;
865

Neil Booth committed
866 867 868 869 870 871
  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
872
	 guarantee we have at least one more token.  */
873
      if (context->tokens_kind == TOKENS_KIND_DIRECT)
874
	rhs = FIRST (context).token++;
875
      else if (context->tokens_kind == TOKENS_KIND_INDIRECT)
876
	rhs = *FIRST (context).ptoken++;
877 878 879 880 881 882 883 884 885 886 887 888 889 890 891
      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++;
	}
892 893

      if (rhs->type == CPP_PADDING)
894 895 896 897
	{
	  if (rhs->flags & PASTE_LEFT)
	    abort ();
	}
898
      if (!paste_tokens (pfile, virt_loc, &lhs, rhs))
899
	break;
Neil Booth committed
900 901 902
    }
  while (rhs->flags & PASTE_LEFT);

Neil Booth committed
903
  /* Put the resulting token in its own context.  */
904 905 906 907 908 909 910 911 912 913 914 915
  if (context->tokens_kind == TOKENS_KIND_EXTENDED)
    {
      source_location *virt_locs = NULL;
      _cpp_buff *token_buf = tokens_buff_new (pfile, 1, &virt_locs);
      tokens_buff_add_token (token_buf, virt_locs, lhs,
			     virt_loc, 0, NULL, 0);
      push_extended_tokens_context (pfile, context->c.mc->macro_node,
				    token_buf, virt_locs,
				    (const cpp_token **)token_buf->base, 1);
    }
  else
    _cpp_push_token_context (pfile, NULL, lhs, 1);
Neil Booth committed
916 917
}

918 919 920 921 922 923 924
/* 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
925
_cpp_arguments_ok (cpp_reader *pfile, cpp_macro *macro, const cpp_hashnode *node, unsigned int argc)
926 927 928 929 930 931
{
  if (argc == macro->paramc)
    return true;

  if (argc < macro->paramc)
    {
Tom Tromey committed
932 933
      /* In C++2a (here the va_opt flag is used), and also as a GNU
	 extension, variadic arguments are allowed to not appear in
934 935 936 937
	 the invocation at all.
	 e.g. #define debug(format, args...) something
	 debug("string");

938 939
	 This is exactly the same as if an empty variadic list had been
	 supplied - debug("string", ).  */
940 941 942

      if (argc + 1 == macro->paramc && macro->variadic)
	{
Tom Tromey committed
943 944
	  if (CPP_PEDANTIC (pfile) && ! macro->syshdr
	      && ! CPP_OPTION (pfile, va_opt))
945 946 947 948 949 950 951 952 953 954
	    {
	      if (CPP_OPTION (pfile, cplusplus))
		cpp_error (pfile, CPP_DL_PEDWARN,
			   "ISO C++11 requires at least one argument "
			   "for the \"...\" in a variadic macro");
	      else
		cpp_error (pfile, CPP_DL_PEDWARN,
			   "ISO C99 requires at least one argument "
			   "for the \"...\" in a variadic macro");
	    }
955 956 957
	  return true;
	}

958
      cpp_error (pfile, CPP_DL_ERROR,
959 960 961 962
		 "macro \"%s\" requires %u arguments, but only %u given",
		 NODE_NAME (node), macro->paramc, argc);
    }
  else
963
    cpp_error (pfile, CPP_DL_ERROR,
964 965 966
	       "macro \"%s\" passed %u arguments, but takes just %u",
	       NODE_NAME (node), argc, macro->paramc);

967 968 969 970
  if (macro->line > RESERVED_LOCATION_COUNT)
    cpp_error_at (pfile, CPP_DL_NOTE, macro->line, "macro \"%s\" defined here",
		  NODE_NAME (node));

971 972 973
  return false;
}

974 975 976 977
/* 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
978 979
   future benefit of expand_arg().  If there are any deferred
   #pragma directives among macro arguments, store pointers to the
980 981 982 983 984 985 986
   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.  */
987
static _cpp_buff *
988
collect_args (cpp_reader *pfile, const cpp_hashnode *node,
989
	      _cpp_buff **pragma_buff, unsigned *num_args)
Neil Booth committed
990
{
991 992 993 994 995
  _cpp_buff *buff, *base_buff;
  cpp_macro *macro;
  macro_arg *args, *arg;
  const cpp_token *token;
  unsigned int argc;
996 997 998
  source_location virt_loc;
  bool track_macro_expansion_p = CPP_OPTION (pfile, track_macro_expansion);
  unsigned num_args_alloced = 0;
999 1000 1001 1002 1003 1004

  macro = node->value.macro;
  if (macro->paramc)
    argc = macro->paramc;
  else
    argc = 1;
1005 1006 1007 1008 1009 1010

#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 *)
1011 1012 1013 1014
				       + sizeof (macro_arg)));
  base_buff = buff;
  args = (macro_arg *) buff->base;
  memset (args, 0, argc * sizeof (macro_arg));
1015
  buff->cur = (unsigned char *) &args[argc];
1016 1017 1018 1019 1020 1021
  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
1022
    {
1023 1024
      unsigned int paren_depth = 0;
      unsigned int ntokens = 0;
1025 1026
      unsigned virt_locs_capacity = DEFAULT_NUM_TOKENS_PER_MACRO_ARG;
      num_args_alloced++;
Neil Booth committed
1027

1028 1029
      argc++;
      arg->first = (const cpp_token **) buff->cur;
1030 1031 1032 1033 1034 1035
      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
1036

1037 1038 1039
      for (;;)
	{
	  /* Require space for 2 new tokens (including a CPP_EOF).  */
1040
	  if ((unsigned char *) &arg->first[ntokens + 2] > buff->limit)
1041
	    {
1042
	      buff = _cpp_append_extend_buff (pfile, buff,
1043 1044
					      ARG_TOKENS_EXTENT
					      * sizeof (cpp_token *));
1045 1046
	      arg->first = (const cpp_token **) buff->cur;
	    }
1047 1048 1049 1050 1051 1052 1053 1054
	  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);
	    }
1055

1056
	  token = cpp_get_token_1 (pfile, &virt_loc);
Zack Weinberg committed
1057

1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081
	  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;
1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112
	  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;
1113
		  token = cpp_get_token_1 (pfile, &virt_loc);
1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126
		}
	      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;
	    }
1127 1128 1129 1130
	  set_arg_token (arg, token, virt_loc,
			 ntokens, MACRO_ARG_TOKEN_NORMAL,
			 CPP_OPTION (pfile, track_macro_expansion));
	  ntokens++;
1131
	}
Neil Booth committed
1132

1133 1134 1135
      /* Drop trailing padding.  */
      while (ntokens > 0 && arg->first[ntokens - 1]->type == CPP_PADDING)
	ntokens--;
Neil Booth committed
1136

1137
      arg->count = ntokens;
1138 1139 1140
      set_arg_token (arg, &pfile->eof, pfile->eof.src_loc,
		     ntokens, MACRO_ARG_TOKEN_NORMAL,
		     CPP_OPTION (pfile, track_macro_expansion));
Neil Booth committed
1141

1142 1143 1144 1145
      /* Terminate the argument.  Excess arguments loop back and
	 overwrite the final legitimate argument, before failing.  */
      if (argc <= macro->paramc)
	{
1146
	  buff->cur = (unsigned char *) &arg->first[ntokens + 1];
1147 1148 1149
	  if (argc != macro->paramc)
	    arg++;
	}
Neil Booth committed
1150
    }
1151
  while (token->type != CPP_CLOSE_PAREN && token->type != CPP_EOF);
Neil Booth committed
1152

1153
  if (token->type == CPP_EOF)
Neil Booth committed
1154
    {
1155 1156 1157 1158
      /* 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.  */
1159
      if (pfile->context->prev || pfile->state.in_directive)
1160
	_cpp_backup_tokens (pfile, 1);
1161
      cpp_error (pfile, CPP_DL_ERROR,
1162
		 "unterminated argument list invoking macro \"%s\"",
1163
		 NODE_NAME (node));
Neil Booth committed
1164
    }
1165
  else
Neil Booth committed
1166
    {
1167 1168 1169 1170
      /* 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))
1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182
	{
	  /* 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;
1183 1184
	  if (num_args)
	    *num_args = num_args_alloced;
1185 1186
	  return base_buff;
	}
Neil Booth committed
1187 1188
    }

1189
  /* An error occurred.  */
1190 1191
  _cpp_release_buff (pfile, base_buff);
  return NULL;
Neil Booth committed
1192 1193
}

1194 1195 1196
/* 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
1197
   the arguments and return the buffer containing them.  PRAGMA_BUFF
1198 1199 1200
   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.  */
1201
static _cpp_buff *
1202
funlike_invocation_p (cpp_reader *pfile, cpp_hashnode *node,
1203
		      _cpp_buff **pragma_buff, unsigned *num_args)
Neil Booth committed
1204
{
1205
  const cpp_token *token, *padding = NULL;
1206

1207
  for (;;)
1208
    {
1209 1210 1211 1212 1213 1214
      token = cpp_get_token (pfile);
      if (token->type != CPP_PADDING)
	break;
      if (padding == NULL
	  || (!(padding->flags & PREV_WHITE) && token->val.source == NULL))
	padding = token;
1215
    }
Neil Booth committed
1216

1217
  if (token->type == CPP_OPEN_PAREN)
Neil Booth committed
1218
    {
1219
      pfile->state.parsing_args = 2;
1220
      return collect_args (pfile, node, pragma_buff, num_args);
Neil Booth committed
1221 1222
    }

1223 1224 1225 1226 1227 1228 1229 1230 1231
  /* 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)
1232
	_cpp_push_token_context (pfile, NULL, padding, 1);
1233
    }
1234 1235

  return NULL;
Neil Booth committed
1236 1237
}

1238 1239 1240 1241 1242 1243
/* Return the real number of tokens in the expansion of MACRO.  */
static inline unsigned int
macro_real_token_count (const cpp_macro *macro)
{
  if (__builtin_expect (!macro->extra_tokens, true))
    return macro->count;
1244 1245 1246 1247 1248 1249

  for (unsigned i = macro->count; i--;)
    if (macro->exp.tokens[i].type != CPP_PASTE)
      return i + 1;

  return 0;
1250 1251
}

1252 1253 1254
/* 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.
1255 1256 1257 1258 1259 1260
   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
1261
static int
1262
enter_macro_context (cpp_reader *pfile, cpp_hashnode *node,
1263
		     const cpp_token *result, source_location location)
Zack Weinberg committed
1264
{
1265
  /* The presence of a macro invalidates a file's controlling macro.  */
Neil Booth committed
1266 1267
  pfile->mi_valid = false;

1268 1269
  pfile->state.angled_headers = false;

1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280
  /* From here to when we push the context for the macro later down
     this function, we need to flag the fact that we are about to
     expand a macro.  This is useful when -ftrack-macro-expansion is
     turned off.  In that case, we need to record the location of the
     expansion point of the top-most macro we are about to to expand,
     into pfile->invocation_location.  But we must not record any such
     location once the process of expanding the macro starts; that is,
     we must not do that recording between now and later down this
     function where set this flag to FALSE.  */
  pfile->about_to_expand_macro_p = true;

1281
  if (cpp_user_macro_p (node))
Zack Weinberg committed
1282
    {
1283
      cpp_macro *macro = node->value.macro;
1284
      _cpp_buff *pragma_buff = NULL;
Neil Booth committed
1285

1286 1287 1288
      if (macro->fun_like)
	{
	  _cpp_buff *buff;
1289
	  unsigned num_args = 0;
1290 1291 1292 1293

	  pfile->state.prevent_expansion++;
	  pfile->keep_tokens++;
	  pfile->state.parsing_args = 1;
1294 1295
	  buff = funlike_invocation_p (pfile, node, &pragma_buff,
				       &num_args);
1296 1297 1298 1299 1300 1301 1302
	  pfile->state.parsing_args = 0;
	  pfile->keep_tokens--;
	  pfile->state.prevent_expansion--;

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

1307 1308 1309
	      if (pragma_buff)
		_cpp_release_buff (pfile, pragma_buff);

1310
	      pfile->about_to_expand_macro_p = false;
1311 1312 1313
	      return 0;
	    }

1314
	  if (macro->paramc > 0)
1315 1316 1317 1318 1319 1320 1321
	    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);
1322
	}
Neil Booth committed
1323

1324
      /* Disable the macro within its expansion.  */
Neil Booth committed
1325
      node->flags |= NODE_DISABLED;
Neil Booth committed
1326

1327 1328 1329
      /* Laziness can only affect the expansion tokens of the macro,
	 not its fun-likeness or parameters.  */
      _cpp_maybe_notify_macro_use (pfile, node);
1330
      if (pfile->cb.used)
1331
	pfile->cb.used (pfile, location, node);
1332

1333 1334
      macro->used = 1;

1335
      if (macro->paramc == 0)
1336
	{
1337
	  unsigned tokens_count = macro_real_token_count (macro);
1338 1339
	  if (CPP_OPTION (pfile, track_macro_expansion))
	    {
1340
	      unsigned int i;
1341
	      const cpp_token *src = macro->exp.tokens;
1342
	      const line_map_macro *map;
1343
	      source_location *virt_locs = NULL;
1344 1345
	      _cpp_buff *macro_tokens
		= tokens_buff_new (pfile, tokens_count, &virt_locs);
1346 1347 1348 1349

	      /* 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.  */
1350 1351 1352
	      map = linemap_enter_macro (pfile->line_table,
					 node, location, tokens_count);
	      for (i = 0; i < tokens_count; ++i)
1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363
		{
		  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,
1364
					    tokens_count);
1365 1366
	    }
	  else
1367 1368 1369
	    _cpp_push_token_context (pfile, node, macro->exp.tokens,
				     tokens_count);
	  num_macro_tokens_counter += tokens_count;
1370
	}
Neil Booth committed
1371

1372 1373 1374 1375 1376 1377 1378
      if (pragma_buff)
	{
	  if (!pfile->state.in_directive)
	    _cpp_push_token_context (pfile, NULL,
				     padding_token (pfile, result), 1);
	  do
	    {
1379
	      unsigned tokens_count;
1380 1381
	      _cpp_buff *tail = pragma_buff->next;
	      pragma_buff->next = NULL;
1382 1383
	      tokens_count = ((const cpp_token **) BUFF_FRONT (pragma_buff)
			      - (const cpp_token **) pragma_buff->base);
1384 1385
	      push_ptoken_context (pfile, NULL, pragma_buff,
				   (const cpp_token **) pragma_buff->base,
1386
				   tokens_count);
1387
	      pragma_buff = tail;
1388 1389 1390
	      if (!CPP_OPTION (pfile, track_macro_expansion))
		num_macro_tokens_counter += tokens_count;

1391 1392
	    }
	  while (pragma_buff != NULL);
1393
	  pfile->about_to_expand_macro_p = false;
1394 1395 1396
	  return 2;
	}

1397
      pfile->about_to_expand_macro_p = false;
Neil Booth committed
1398
      return 1;
Zack Weinberg committed
1399
    }
Neil Booth committed
1400

1401
  pfile->about_to_expand_macro_p = false;
1402
  /* Handle built-in macros and the _Pragma operator.  */
1403
  {
1404
    source_location expand_loc;
1405

1406
    if (/* The top-level macro invocation that triggered the expansion
1407 1408
	   we are looking at is with a function-like user macro ...  */
	cpp_fun_like_macro_p (pfile->top_most_macro_node)
1409 1410 1411 1412 1413
	/* ... and we are tracking the macro expansion.  */
	&& CPP_OPTION (pfile, track_macro_expansion))
      /* Then the location of the end of the macro invocation is the
	 location of the expansion point of this macro.  */
      expand_loc = location;
1414
    else
1415 1416 1417 1418
      /* Otherwise, the location of the end of the macro invocation is
	 the location of the expansion point of that top-level macro
	 invocation.  */
      expand_loc = pfile->invocation_location;
1419

1420
    return builtin_macro (pfile, node, location, expand_loc);
1421
  }
Neil Booth committed
1422 1423
}

1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462
/* 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
Joseph Myers committed
1463
   the location that encodes loci across macro expansion. Otherwise
1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483
   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)
    {
1484 1485 1486 1487 1488
      /* 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.   */
      gcc_checking_assert (kind != MACRO_ARG_TOKEN_STRINGIFIED
			   && track_macro_exp_p);
1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 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 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567
      *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;
1568 1569 1570 1571
  /* 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;
1572 1573
  if (track_macro_exp_p)
    iter->location_ptr = get_arg_token_location (arg, kind);
1574
#if CHECKING_P
1575 1576 1577 1578 1579 1580 1581 1582 1583 1584
  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
Joseph Myers committed
1585
   forward doesn't make sense as a stringified token is essentially one
1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598
   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:
1599
#if CHECKING_P
1600 1601 1602 1603 1604 1605
      if (it->num_forwards > 0)
	abort ();
#endif
      break;
    }

1606
#if CHECKING_P
1607 1608 1609 1610 1611 1612 1613 1614
  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)
{
1615
#if CHECKING_P
1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628
  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)
{
1629
#if CHECKING_P
1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 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 1685 1686 1687 1688 1689 1690
  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;
}

1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714
/* Copy whether PASTE_LEFT is set from SRC to *PASTE_FLAG.  */

static void
copy_paste_flag (cpp_reader *pfile, const cpp_token **paste_flag,
		 const cpp_token *src)
{
  cpp_token *token = _cpp_temp_token (pfile);
  token->type = (*paste_flag)->type;
  token->val = (*paste_flag)->val;
  if (src->flags & PASTE_LEFT)
    token->flags = (*paste_flag)->flags | PASTE_LEFT;
  else
    token->flags = (*paste_flag)->flags & ~PASTE_LEFT;
  *paste_flag = token;
}

/* True IFF the last token emitted into BUFF (if any) is PTR.  */

static bool
last_token_is (_cpp_buff *buff, const cpp_token **ptr)
{
  return (ptr && tokens_buff_last_token_ptr (buff) == ptr);
}

1715 1716 1717
/* 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
1718 1719 1720
   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
1721
static void
1722 1723
replace_args (cpp_reader *pfile, cpp_hashnode *node, cpp_macro *macro,
	      macro_arg *args, source_location expansion_point_loc)
Neil Booth committed
1724 1725 1726
{
  unsigned int i, total;
  const cpp_token *src, *limit;
1727
  const cpp_token **first = NULL;
Neil Booth committed
1728
  macro_arg *arg;
1729 1730 1731
  _cpp_buff *buff = NULL;
  source_location *virt_locs = NULL;
  unsigned int exp_count;
1732
  const line_map_macro *map = NULL;
1733
  int track_macro_exp;
Neil Booth committed
1734 1735

  /* First, fully macro-expand arguments, calculating the number of
1736 1737 1738
     tokens in the final expansion as we go.  The ordering of the if
     statements below is subtle; we must handle stringification before
     pasting.  */
1739 1740 1741 1742 1743 1744 1745

  /* 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;
1746

1747
  for (src = macro->exp.tokens; src < limit; src++)
Neil Booth committed
1748 1749
    if (src->type == CPP_MACRO_ARG)
      {
1750 1751
	/* Leading and trailing padding tokens.  */
	total += 2;
1752 1753 1754 1755 1756
	/* 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;
1757

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

Neil Booth committed
1762 1763 1764
	if (src->flags & STRINGIFY_ARG)
	  {
	    if (!arg->stringified)
1765
	      arg->stringified = stringify_arg (pfile, arg);
Neil Booth committed
1766 1767
	  }
	else if ((src->flags & PASTE_LEFT)
1768
		 || (src != macro->exp.tokens && (src[-1].flags & PASTE_LEFT)))
Neil Booth committed
1769 1770 1771 1772
	  total += arg->count - 1;
	else
	  {
	    if (!arg->expanded)
1773
	      expand_arg (pfile, arg);
Neil Booth committed
1774 1775 1776 1777
	    total += arg->expanded_count - 1;
	  }
      }

1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812
  /* 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);

1813
  first = (const cpp_token **) buff->base;
Neil Booth committed
1814

1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832
  /* 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.

1833
	   Suppose we have #define SQUARE(A) A * A
1834

1835
	   And then we do SQUARE(2+3)
1836 1837 1838 1839 1840 1841 1842 1843 1844

	   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;
Tom Tromey committed
1845 1846
  vaopt_state vaopt_tracker (pfile, macro->variadic,
			     args[macro->paramc - 1].count > 0);
1847
  const cpp_token **vaopt_start = NULL;
1848
  for (src = macro->exp.tokens; src < limit; src++)
1849
    {
1850 1851 1852 1853
      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
1854

Tom Tromey committed
1855
      /* __VA_OPT__ handling.  */
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
      vaopt_state::update_type vostate = vaopt_tracker.update (src);
      if (vostate != vaopt_state::INCLUDE)
	{
	  if (vostate == vaopt_state::BEGIN)
	    {
	      /* Padding on the left of __VA_OPT__ (unless RHS of ##).  */
	      if (src != macro->exp.tokens && !(src[-1].flags & PASTE_LEFT))
		{
		  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);
		}
	      vaopt_start = tokens_buff_last_token_ptr (buff);
	    }
	  else if (vostate == vaopt_state::END)
	    {
	      const cpp_token **start = vaopt_start;
	      vaopt_start = NULL;

	      /* Remove any tail padding from inside the __VA_OPT__.  */
	      paste_flag = tokens_buff_last_token_ptr (buff);
	      while (paste_flag && paste_flag != start
		     && (*paste_flag)->type == CPP_PADDING)
		{
		  tokens_buff_remove_last_token (buff);
		  paste_flag = tokens_buff_last_token_ptr (buff);
		}

	      if (src->flags & PASTE_LEFT)
		{
		  /* With a non-empty __VA_OPT__ on the LHS of ##, the last
		     token should be flagged PASTE_LEFT.  */
		  if (paste_flag && (*paste_flag)->type != CPP_PADDING)
		    copy_paste_flag (pfile, paste_flag, src);
		}
	      else
		{
		  /* Otherwise, avoid paste on RHS, __VA_OPT__(c)d or
		     __VA_OPT__(c)__VA_OPT__(d).  */
		  const cpp_token *t = &pfile->avoid_paste;
		  tokens_buff_add_token (buff, virt_locs,
					 t, t->src_loc, t->src_loc,
					 NULL, 0);
		}
	    }
	  continue;
	}
Tom Tromey committed
1908

1909 1910
      if (src->type != CPP_MACRO_ARG)
	{
1911 1912 1913 1914 1915 1916 1917 1918
	  /* 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;
1919 1920
	  continue;
	}
Neil Booth committed
1921

1922
      paste_flag = 0;
1923
      arg = &args[src->val.macro_arg.arg_no - 1];
1924 1925 1926 1927 1928 1929 1930 1931 1932
      /* 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.  */
1933
      if (src->flags & STRINGIFY_ARG)
1934 1935 1936 1937 1938 1939 1940 1941
	{
	  arg_tokens_count = 1;
	  macro_arg_token_iter_init (&from,
				     CPP_OPTION (pfile,
						 track_macro_expansion),
				     MACRO_ARG_TOKEN_STRINGIFIED,
				     arg, &arg->stringified);
	}
1942
      else if (src->flags & PASTE_LEFT)
1943 1944 1945 1946 1947 1948 1949 1950
	{
	  arg_tokens_count = arg->count;
	  macro_arg_token_iter_init (&from,
				     CPP_OPTION (pfile,
						 track_macro_expansion),
				     MACRO_ARG_TOKEN_NORMAL,
				     arg, arg->first);
	}
1951
      else if (src != macro->exp.tokens && (src[-1].flags & PASTE_LEFT))
1952
	{
1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963
	  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)
1964
	    {
1965 1966 1967 1968 1969 1970 1971 1972
	      /* 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
1973
		  && macro->variadic
1974
		  && src->val.macro_arg.arg_no == macro->paramc)
1975
		{
1976 1977 1978 1979 1980 1981 1982
		  /* ... 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);
1983
		  else
1984
		    paste_flag = tmp_token_ptr;
1985
		}
1986 1987 1988 1989 1990
	      /* Remove the paste flag if the RHS is a placemarker, unless the
		 previous emitted token is at the beginning of __VA_OPT__;
		 placemarkers within __VA_OPT__ are ignored in that case.  */
	      else if (arg_tokens_count == 0
		       && tmp_token_ptr != vaopt_start)
1991
		paste_flag = tmp_token_ptr;
1992 1993 1994
	    }
	}
      else
1995 1996 1997 1998 1999 2000 2001
	{
	  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);
2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015

	  if (last_token_is (buff, vaopt_start))
	    {
	      /* We're expanding an arg at the beginning of __VA_OPT__.
		 Skip padding. */
	      while (arg_tokens_count)
		{
		  const cpp_token *t = macro_arg_token_iter_get_token (&from);
		  if (t->type != CPP_PADDING)
		    break;
		  macro_arg_token_iter_forward (&from);
		  --arg_tokens_count;
		}
	    }
2016
	}
Neil Booth committed
2017

2018
      /* Padding on the left of an argument (unless RHS of ##).  */
2019
      if ((!pfile->state.in_directive || pfile->state.directive_wants_padding)
2020 2021
	  && src != macro->exp.tokens && !(src[-1].flags & PASTE_LEFT)
	  && !last_token_is (buff, vaopt_start))
2022 2023 2024 2025 2026 2027 2028 2029 2030 2031
	{
	  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
2032

2033
      if (arg_tokens_count)
2034
	{
2035 2036 2037 2038 2039 2040 2041 2042 2043 2044
	  /* 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:

2045
		 Suppose we have #define SQUARE(A) A * A
2046

2047
		 And then we do SQUARE(2+3)
2048 2049 2050 2051 2052 2053 2054

		 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
2055
	      argument. In other words all the ARG_TOKENS_COUNT tokens
2056
	      resulting from the expansion of the macro argument will
2057
	      have the index I.  Normally, each of those tokens should
2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070
	      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
2071

2072 2073 2074
	  /* With a non-empty argument on the LHS of ##, the last
	     token should be flagged PASTE_LEFT.  */
	  if (src->flags & PASTE_LEFT)
2075 2076
	    paste_flag
	      = (const cpp_token **) tokens_buff_last_token_ptr (buff);
2077
	}
2078 2079
      else if (CPP_PEDANTIC (pfile) && ! CPP_OPTION (pfile, c99)
	       && ! macro->syshdr && ! cpp_in_system_header (pfile))
2080
	{
2081
	  if (CPP_OPTION (pfile, cplusplus))
2082 2083 2084 2085 2086
	    cpp_pedwarning (pfile, CPP_W_PEDANTIC,
			    "invoking macro %s argument %d: "
			    "empty macro arguments are undefined"
			    " in ISO C++98",
			    NODE_NAME (node), src->val.macro_arg.arg_no);
2087
	  else if (CPP_OPTION (pfile, cpp_warn_c90_c99_compat))
2088 2089 2090 2091 2092 2093 2094
	    cpp_pedwarning (pfile, 
			    CPP_OPTION (pfile, cpp_warn_c90_c99_compat) > 0
			    ? CPP_W_C90_C99_COMPAT : CPP_W_PEDANTIC,
			    "invoking macro %s argument %d: "
			    "empty macro arguments are undefined"
			    " in ISO C90",
			    NODE_NAME (node), src->val.macro_arg.arg_no);
2095
	}
2096
      else if (CPP_OPTION (pfile, cpp_warn_c90_c99_compat) > 0
2097 2098 2099 2100 2101 2102 2103
	       && ! CPP_OPTION (pfile, cplusplus)
	       && ! macro->syshdr && ! cpp_in_system_header (pfile))
	cpp_warning (pfile, CPP_W_C90_C99_COMPAT,
		     "invoking macro %s argument %d: "
		     "empty macro arguments are undefined"
		     " in ISO C90",
		     NODE_NAME (node), src->val.macro_arg.arg_no);
2104

2105
      /* Avoid paste on RHS (even case count == 0).  */
2106 2107
      if (!pfile->state.in_directive && !(src->flags & PASTE_LEFT)
	  && !last_token_is (buff, vaopt_start))
2108 2109 2110 2111 2112 2113
	{
	  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
2114

2115 2116
      /* Add a new paste flag, or remove an unwanted one.  */
      if (paste_flag)
2117
	copy_paste_flag (pfile, paste_flag, src);
Neil Booth committed
2118

2119 2120
      i += arg_tokens_count;
    }
2121

2122 2123 2124 2125 2126 2127
  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));
2128 2129

  num_macro_tokens_counter += tokens_buff_count (buff);
2130 2131 2132 2133
}

/* Return a special padding token, with padding inherited from SOURCE.  */
static const cpp_token *
2134
padding_token (cpp_reader *pfile, const cpp_token *source)
2135 2136 2137 2138
{
  cpp_token *result = _cpp_temp_token (pfile);

  result->type = CPP_PADDING;
2139 2140 2141 2142

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

2147 2148
/* Get a new uninitialized context.  Create a new one if we cannot
   re-use an old one.  */
2149
static cpp_context *
2150
next_context (cpp_reader *pfile)
2151 2152 2153 2154
{
  cpp_context *result = pfile->context->next;

  if (result == 0)
Zack Weinberg committed
2155
    {
2156
      result = XNEW (cpp_context);
2157
      memset (result, 0, sizeof (cpp_context));
2158 2159 2160
      result->prev = pfile->context;
      result->next = 0;
      pfile->context->next = result;
Neil Booth committed
2161
    }
2162 2163 2164

  pfile->context = result;
  return result;
Neil Booth committed
2165 2166
}

2167 2168
/* Push a list of pointers to tokens.  */
static void
2169 2170
push_ptoken_context (cpp_reader *pfile, cpp_hashnode *macro, _cpp_buff *buff,
		     const cpp_token **first, unsigned int count)
Neil Booth committed
2171 2172 2173
{
  cpp_context *context = next_context (pfile);

2174 2175
  context->tokens_kind = TOKENS_KIND_INDIRECT;
  context->c.macro = macro;
2176
  context->buff = buff;
2177 2178
  FIRST (context).ptoken = first;
  LAST (context).ptoken = first + count;
2179 2180
}

2181 2182 2183 2184 2185 2186
/* Push a list of tokens.

   A NULL macro means that we should continue the current macro
   expansion, in essence.  That means that if we are currently in a
   macro expansion context, we'll make the new pfile->context refer to
   the current macro.  */
2187 2188 2189
void
_cpp_push_token_context (cpp_reader *pfile, cpp_hashnode *macro,
			 const cpp_token *first, unsigned int count)
2190
{
2191 2192 2193 2194 2195 2196
  cpp_context *context;

   if (macro == NULL)
     macro = macro_of_context (pfile->context);

   context = next_context (pfile);
2197 2198 2199
   context->tokens_kind = TOKENS_KIND_DIRECT;
   context->c.macro = macro;
   context->buff = NULL;
2200 2201
   FIRST (context).token = first;
   LAST (context).token = first + count;
Neil Booth committed
2202 2203
}

2204 2205 2206 2207 2208
/* 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
2209 2210 2211 2212 2213 2214
   contains the virtual locations.

   A NULL macro means that we should continue the current macro
   expansion, in essence.  That means that if we are currently in a
   macro expansion context, we'll make the new pfile->context refer to
   the current macro.  */
2215 2216 2217 2218 2219 2220 2221 2222
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)
{
2223
  cpp_context *context;
2224 2225
  macro_context *m;

2226 2227 2228 2229
  if (macro == NULL)
    macro = macro_of_context (pfile->context);

  context = next_context (pfile);
2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241
  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;
}

2242 2243
/* Push a traditional macro's replacement text.  */
void
2244 2245
_cpp_push_text_context (cpp_reader *pfile, cpp_hashnode *macro,
			const uchar *start, size_t len)
2246 2247 2248
{
  cpp_context *context = next_context (pfile);

2249 2250
  context->tokens_kind = TOKENS_KIND_DIRECT;
  context->c.macro = macro;
2251 2252
  context->buff = NULL;
  CUR (context) = start;
2253
  RLIMIT (context) = start + len;
2254
  macro->flags |= NODE_DISABLED;
2255 2256
}

2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287
/* 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)
{
2288 2289
  if (BUFF_FRONT (buff) == buff->base)
    return NULL;
2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311
  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
Joseph Myers committed
2312
   location possibly encoding its locus across macro expansion.  If
2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331
   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,			  
2332
			  const line_map_macro *map,
2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356
			  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
Joseph Myers committed
2357
   the token, i.e, the location possibly encoding its locus across
2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376
   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,
2377
		       const line_map_macro *map,
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
		       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)
{
2408 2409 2410
  gcc_checking_assert (arg->expanded == NULL
		       && arg->expanded_virt_locs == NULL);

2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442
  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);
    }
}

2443 2444 2445 2446 2447 2448
/* 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
2449
static void
2450
expand_arg (cpp_reader *pfile, macro_arg *arg)
Neil Booth committed
2451
{
2452
  size_t capacity;
2453
  bool saved_warn_trad;
2454
  bool track_macro_exp_p = CPP_OPTION (pfile, track_macro_expansion);
2455

2456 2457
  if (arg->count == 0
      || arg->expanded != NULL)
2458
    return;
Neil Booth committed
2459

2460 2461 2462 2463
  /* Don't warn about funlike macros when pre-expanding.  */
  saved_warn_trad = CPP_WTRADITIONAL (pfile);
  CPP_WTRADITIONAL (pfile) = 0;

2464
  /* Loop, reading in the tokens of the argument.  */
2465
  capacity = 256;
2466 2467 2468 2469 2470 2471 2472 2473 2474 2475
  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
2476

2477
  for (;;)
Neil Booth committed
2478
    {
2479
      const cpp_token *token;
2480
      source_location location;
2481

2482 2483
      ensure_expanded_arg_room (pfile, arg, arg->expanded_count + 1,
				&capacity);
Neil Booth committed
2484

2485
      token = cpp_get_token_1 (pfile, &location);
Neil Booth committed
2486

2487 2488 2489
      if (token->type == CPP_EOF)
	break;

2490 2491 2492 2493
      set_arg_token (arg, token, location,
		     arg->expanded_count, MACRO_ARG_TOKEN_EXPANDED,
		     CPP_OPTION (pfile, track_macro_expansion));
      arg->expanded_count++;
2494 2495
    }

2496
  _cpp_pop_context (pfile);
2497 2498

  CPP_WTRADITIONAL (pfile) = saved_warn_trad;
Neil Booth committed
2499 2500
}

2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513
/* Returns the macro associated to the current context if we are in
   the context a macro expansion, NULL otherwise.  */
static cpp_hashnode*
macro_of_context (cpp_context *context)
{
  if (context == NULL)
    return NULL;

  return (context->tokens_kind == TOKENS_KIND_EXTENDED)
    ? context->c.mc->macro_node
    : context->c.macro;
}

2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527
/* Return TRUE iff we are expanding a macro or are about to start
   expanding one.  If we are effectively expanding a macro, the
   function macro_of_context returns a pointer to the macro being
   expanded.  */
static bool
in_macro_expansion_p (cpp_reader *pfile)
{
  if (pfile == NULL)
    return false;

  return (pfile->about_to_expand_macro_p 
	  || macro_of_context (pfile->context));
}

2528
/* Pop the current context off the stack, re-enabling the macro if the
2529 2530 2531
   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
2532
void
2533
_cpp_pop_context (cpp_reader *pfile)
Neil Booth committed
2534
{
2535 2536
  cpp_context *context = pfile->context;

2537 2538 2539 2540
  /* We should not be popping the base context.  */
  if (context == &pfile->base_context)
    abort ();

2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567
  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.  */
2568 2569 2570
      if (macro != NULL
	  /* Several contiguous macro expansion contexts can be
	     associated to the same macro; that means it's the same
Joseph Myers committed
2571
	     macro expansion that spans across all these (sub)
2572 2573 2574 2575
	     contexts.  So we should re-enable an expansion-disabled
	     macro only when we are sure we are really out of that
	     macro expansion.  */
	  && macro_of_context (context->prev) != macro)
2576
	macro->flags &= ~NODE_DISABLED;
2577 2578 2579 2580

      if (macro == pfile->top_most_macro_node && context->prev == NULL)
	/* We are popping the context of the top-most macro node.  */
	pfile->top_most_macro_node = NULL;
2581
    }
2582 2583

  if (context->buff)
2584 2585 2586 2587 2588
    {
      /* Decrease memory peak consumption by freeing the memory used
	 by the context.  */
      _cpp_free_buff (context->buff);
    }
Neil Booth committed
2589

2590
  pfile->context = context->prev;
2591 2592 2593
  /* decrease peak memory consumption by feeing the context.  */
  pfile->context->next = NULL;
  free (context);
Neil Booth committed
2594 2595
}

2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612
/* 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"
Joseph Myers committed
2613
   means the location encoding the locus of the token across macro
2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669
   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.
2670 2671 2672 2673 2674 2675 2676

   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
2677 2678 2679 2680 2681 2682 2683 2684
   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
2685
{
2686
  const cpp_token *result;
2687 2688 2689
  /* This token is a virtual token that either encodes a location
     related to macro expansion or a spelling location.  */
  source_location virt_loc = 0;
2690 2691 2692 2693
  /* pfile->about_to_expand_macro_p can be overriden by indirect calls
     to functions that push macro contexts.  So let's save it so that
     we can restore it when we are about to leave this routine.  */
  bool saved_about_to_expand_macro = pfile->about_to_expand_macro_p;
2694

2695
  for (;;)
Neil Booth committed
2696
    {
2697
      cpp_hashnode *node;
Neil Booth committed
2698 2699 2700
      cpp_context *context = pfile->context;

      /* Context->prev == 0 <=> base context.  */
2701
      if (!context->prev)
2702
	{
2703 2704 2705 2706 2707 2708 2709
	  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);
2710
	  if (result->flags & PASTE_LEFT)
2711
	    {
2712 2713 2714
	      paste_all_tokens (pfile, result);
	      if (pfile->state.in_directive)
		continue;
2715 2716
	      result = padding_token (pfile, result);
	      goto out;
2717
	    }
2718
	}
Neil Booth committed
2719 2720
      else
	{
2721 2722
	  if (pfile->context->c.macro)
	    ++num_expanded_macros_counter;
2723
	  _cpp_pop_context (pfile);
2724 2725
	  if (pfile->state.in_directive)
	    continue;
2726 2727
	  result = &pfile->avoid_paste;
	  goto out;
Neil Booth committed
2728 2729
	}

2730 2731 2732
      if (pfile->state.in_directive && result->type == CPP_COMMENT)
	continue;

2733
      if (result->type != CPP_NAME)
Neil Booth committed
2734 2735
	break;

2736
      node = result->val.node.node;
2737

Nathan Sidwell committed
2738
      if (node->type == NT_VOID || (result->flags & NO_EXPAND))
Neil Booth committed
2739
	break;
2740

Neil Booth committed
2741
      if (!(node->flags & NODE_DISABLED))
Neil Booth committed
2742
	{
2743
	  int ret = 0;
2744
	  /* If not in a macro context, and we're going to start an
2745 2746
	     expansion, record the location and the top level macro
	     about to be expanded.  */
2747
	  if (!in_macro_expansion_p (pfile))
2748 2749 2750 2751
	    {
	      pfile->invocation_location = result->src_loc;
	      pfile->top_most_macro_node = node;
	    }
2752 2753
	  if (pfile->state.prevent_expansion)
	    break;
2754 2755 2756

	  /* Conditional macros require that a predicate be evaluated
	     first.  */
2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767
	  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)
2768 2769
		    ret = enter_macro_context (pfile, node, result,
					       virt_loc);
2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785
		  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
2786 2787
	    ret = enter_macro_context (pfile, node, result, 
				       virt_loc);
2788
	  if (ret)
2789
 	    {
2790
	      if (pfile->state.in_directive || ret == 2)
2791
		continue;
2792 2793
	      result = padding_token (pfile, result);
	      goto out;
2794
	    }
Neil Booth committed
2795
	}
Neil Booth committed
2796 2797
      else
	{
2798 2799
	  /* Flag this token as always unexpandable.  FIXME: move this
	     to collect_args()?.  */
Neil Booth committed
2800 2801 2802
	  cpp_token *t = _cpp_temp_token (pfile);
	  t->type = result->type;
	  t->flags = result->flags | NO_EXPAND;
2803
	  t->val = result->val;
Neil Booth committed
2804 2805
	  result = t;
	}
2806

Neil Booth committed
2807
      break;
Neil Booth committed
2808
    }
2809

2810 2811 2812 2813 2814 2815 2816 2817
 out:
  if (location != NULL)
    {
      if (virt_loc == 0)
	virt_loc = result->src_loc;
      *location = virt_loc;

      if (!CPP_OPTION (pfile, track_macro_expansion)
2818
	  && macro_of_context (pfile->context) != NULL)
2819 2820 2821 2822 2823 2824 2825
	/* 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);
    }
2826 2827

  pfile->about_to_expand_macro_p = saved_about_to_expand_macro;
2828
  return result;
Neil Booth committed
2829 2830
}

2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885
/* 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.  */

2886 2887 2888
const cpp_token *
cpp_get_token_with_location (cpp_reader *pfile, source_location *loc)
{
2889
  return cpp_get_token_1 (pfile, loc);
2890 2891
}

2892 2893 2894 2895
/* 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
2896
cpp_sys_macro_p (cpp_reader *pfile)
2897
{
2898 2899 2900 2901 2902 2903
  cpp_hashnode *node = NULL;

  if (pfile->context->tokens_kind == TOKENS_KIND_EXTENDED)
    node = pfile->context->c.mc->macro_node;
  else
    node = pfile->context->c.macro;
2904

Neil Booth committed
2905
  return node && node->value.macro && node->value.macro->syshdr;
2906 2907
}

2908 2909
/* Read each token in, until end of the current file.  Directives are
   transparently processed.  */
Neil Booth committed
2910
void
2911
cpp_scan_nooutput (cpp_reader *pfile)
Neil Booth committed
2912
{
2913 2914 2915 2916
  /* 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;

2917 2918 2919
  pfile->state.discarding_output++;
  pfile->state.prevent_expansion++;

2920 2921 2922 2923 2924 2925
  if (CPP_OPTION (pfile, traditional))
    while (_cpp_read_logical_line_trad (pfile))
      ;
  else
    while (cpp_get_token (pfile)->type != CPP_EOF)
      ;
2926 2927 2928

  pfile->state.discarding_output--;
  pfile->state.prevent_expansion--;
Neil Booth committed
2929 2930
}

2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948
/* 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;
        }
    }
}

2949
/* Step back one (or more) tokens.  Can only step back more than 1 if
2950
   they are from the lexer, and not from macro expansion.  */
2951
void
2952
_cpp_backup_tokens (cpp_reader *pfile, unsigned int count)
Neil Booth committed
2953
{
2954
  if (pfile->context->prev == NULL)
2955
    _cpp_backup_tokens_direct (pfile, count);
2956
  else
Neil Booth committed
2957
    {
2958 2959
      if (count != 1)
	abort ();
2960
      if (pfile->context->tokens_kind == TOKENS_KIND_DIRECT)
2961
	FIRST (pfile->context).token--;
2962
      else if (pfile->context->tokens_kind == TOKENS_KIND_INDIRECT)
2963
	FIRST (pfile->context).ptoken--;
2964 2965 2966 2967 2968 2969 2970
      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--;
2971
	      gcc_checking_assert (m->cur_virt_loc >= m->virt_locs);
2972 2973 2974 2975 2976 2977
	    }
	  else
	    abort ();
	}
      else
	abort ();
Neil Booth committed
2978 2979
    }
}
Zack Weinberg committed
2980

Neil Booth committed
2981 2982
/* #define directive parsing and handling.  */

2983
/* Returns true if a macro redefinition warning is required.  */
2984
static bool
2985
warn_of_redefinition (cpp_reader *pfile, cpp_hashnode *node,
2986
		      const cpp_macro *macro2)
Neil Booth committed
2987
{
2988 2989
  /* Some redefinitions need to be warned about regardless.  */
  if (node->flags & NODE_WARN)
2990
    return true;
Neil Booth committed
2991

2992 2993
  /* Suppress warnings for builtins that lack the NODE_WARN flag,
     unless Wbuiltin-macro-redefined.  */
2994
  if (cpp_builtin_macro_p (node))
2995
    return CPP_OPTION (pfile, warn_builtin_macro_redefined);
2996

2997 2998 2999 3000 3001
  /* Redefinitions of conditional (context-sensitive) macros, on
     the other hand, must be allowed silently.  */
  if (node->flags & NODE_CONDITIONAL)
    return false;

3002 3003 3004 3005 3006 3007 3008 3009 3010
  cpp_macro *macro1 = node->value.macro;
  if (macro1->lazy)
    {
      /* We don't want to mark MACRO as used, but do need to finalize
	 its laziness.  */
      pfile->cb.user_lazy_macro (pfile, macro1, macro1->lazy - 1);
      macro1->lazy = 0;
    }

3011
  /* Redefinition of a macro is allowed if and only if the old and new
3012
     definitions are the same.  (6.10.3 paragraph 2).  */
Neil Booth committed
3013

3014 3015 3016
  /* 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
3017
      || macro1->fun_like != macro2->fun_like
3018
      || macro1->variadic != macro2->variadic)
3019
    return true;
Neil Booth committed
3020 3021

  /* Check parameter spellings.  */
3022
  for (unsigned i = macro1->paramc; i--; )
3023
    if (macro1->parm.params[i] != macro2->parm.params[i])
3024
      return true;
Neil Booth committed
3025

3026
  /* Check the replacement text or tokens.  */
3027
  if (macro1->kind == cmk_traditional)
3028
    return _cpp_expansions_different_trad (macro1, macro2);
3029

3030 3031 3032
  if (macro1->count != macro2->count)
    return true;

3033
  for (unsigned i= macro1->count; i--; )
3034 3035
    if (!_cpp_equiv_tokens (&macro1->exp.tokens[i], &macro2->exp.tokens[i]))
      return true;
3036 3037

  return false;
Neil Booth committed
3038 3039 3040
}

/* Free the definition of hashnode H.  */
Zack Weinberg committed
3041
void
3042
_cpp_free_definition (cpp_hashnode *h)
Zack Weinberg committed
3043
{
Neil Booth committed
3044 3045
  /* Macros and assertions no longer have anything to free.  */
  h->type = NT_VOID;
Nathan Sidwell committed
3046 3047
  h->value.answers = NULL;
  h->flags &= ~(NODE_DISABLED | NODE_USED);
Neil Booth committed
3048 3049
}

3050
/* Save parameter NODE (spelling SPELLING) to the parameter list of
3051
   macro MACRO.  Returns true on success, false on failure.   */
3052
bool
3053
_cpp_save_parameter (cpp_reader *pfile, unsigned n, cpp_hashnode *node,
3054
		     cpp_hashnode *spelling)
Neil Booth committed
3055 3056
{
  /* Constraint 6.10.3.6 - duplicate parameter names.  */
Nathan Sidwell committed
3057
  if (node->type == NT_MACRO_ARG)
3058
    {
3059
      cpp_error (pfile, CPP_DL_ERROR, "duplicate macro parameter \"%s\"",
3060
		 NODE_NAME (node));
3061
      return false;
Neil Booth committed
3062
    }
3063

3064
  unsigned len = (n + 1) * sizeof (struct macro_arg_saved_data);
3065 3066
  if (len > pfile->macro_buffer_len)
    {
3067 3068
      pfile->macro_buffer
	= XRESIZEVEC (unsigned char, pfile->macro_buffer, len);
3069 3070 3071
      pfile->macro_buffer_len = len;
    }
  
3072 3073 3074
  macro_arg_saved_data *saved = (macro_arg_saved_data *)pfile->macro_buffer;
  saved[n].canonical_node = node;
  saved[n].value = node->value;
Nathan Sidwell committed
3075
  saved[n].type = node->type;
3076

3077 3078 3079
  void *base = _cpp_reserve_room (pfile, n * sizeof (cpp_hashnode *),
				  sizeof (cpp_hashnode *));
  ((cpp_hashnode **)base)[n] = spelling;
3080 3081

  /* Morph into a macro arg.  */
Nathan Sidwell committed
3082
  node->type = NT_MACRO_ARG;
3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099
  /* Index is 1 based.  */
  node->value.arg_index = n + 1;

  return true;
}

/* Restore the parameters to their previous state.  */
void
_cpp_unsave_parameters (cpp_reader *pfile, unsigned n)
{
  /* Clear the fast argument lookup indices.  */
  while (n--)
    {
      struct macro_arg_saved_data *save =
	&((struct macro_arg_saved_data *) pfile->macro_buffer)[n];

      struct cpp_hashnode *node = save->canonical_node;
Nathan Sidwell committed
3100
      node->type = save->type;
3101 3102
      node->value = save->value;
    }
Zack Weinberg committed
3103 3104
}

3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115
/* Check the syntax of the parameters in a MACRO definition.  Return
   false on failure.  Set *N_PTR and *VARADIC_PTR as appropriate.
   '(' ')'
   '(' parm-list ',' last-parm ')'
   '(' last-parm ')'
   parm-list: name
            | parm-list, name
   last-parm: name
   	    | name '...'
            | '...'
*/
Nathan Sidwell committed
3116

3117
static bool
3118
parse_params (cpp_reader *pfile, unsigned *n_ptr, bool *varadic_ptr)
Zack Weinberg committed
3119
{
3120 3121
  unsigned nparms = 0;
  bool ok = false;
Zack Weinberg committed
3122

3123
  for (bool prev_ident = false;;)
Zack Weinberg committed
3124
    {
3125
      const cpp_token *token = _cpp_lex_token (pfile);
Zack Weinberg committed
3126

3127
      switch (token->type)
Zack Weinberg committed
3128
	{
3129
	case CPP_COMMENT:
3130 3131
	  /* Allow/ignore comments in parameter lists if we are
	     preserving comments in macro expansions.  */
3132 3133
	  if (!CPP_OPTION (pfile, discard_comments_in_macro_exp))
	    break;
3134

3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157
	  /* FALLTHRU  */
	default:
	bad:
	  {
	    const char *const msgs[5] =
	      {
	       N_("expected parameter name, found \"%s\""),
	       N_("expected ',' or ')', found \"%s\""),
	       N_("expected parameter name before end of line"),
	       N_("expected ')' before end of line"),
	       N_("expected ')' after \"...\"")
	      };
	    unsigned ix = prev_ident;
	    const unsigned char *as_text = NULL;
	    if (*varadic_ptr)
	      ix = 4;
	    else if (token->type == CPP_EOF)
	      ix += 2;
	    else
	      as_text = cpp_token_as_text (pfile, token);
	    cpp_error (pfile, CPP_DL_ERROR, msgs[ix], as_text);
	  }
	  goto out;
Neil Booth committed
3158

Zack Weinberg committed
3159
	case CPP_NAME:
3160 3161 3162 3163 3164 3165 3166 3167 3168
	  if (prev_ident || *varadic_ptr)
	    goto bad;
	  prev_ident = true;

	  if (!_cpp_save_parameter (pfile, nparms, token->val.node.node,
				    token->val.node.spelling))
	    goto out;
	  nparms++;
	  break;
Zack Weinberg committed
3169

Neil Booth committed
3170
	case CPP_CLOSE_PAREN:
3171 3172 3173 3174 3175
	  if (prev_ident || !nparms || *varadic_ptr)
	    {
	      ok = true;
	      goto out;
	    }
Zack Weinberg committed
3176

3177
	  /* FALLTHRU */
Neil Booth committed
3178
	case CPP_COMMA:
3179 3180 3181 3182
	  if (!prev_ident || *varadic_ptr)
	    goto bad;
	  prev_ident = false;
	  break;
Zack Weinberg committed
3183

Neil Booth committed
3184
	case CPP_ELLIPSIS:
3185 3186 3187
	  if (*varadic_ptr)
	    goto bad;
	  *varadic_ptr = true;
Neil Booth committed
3188 3189
	  if (!prev_ident)
	    {
3190 3191
	      /* An ISO bare ellipsis.  */
	      _cpp_save_parameter (pfile, nparms,
3192
				   pfile->spec_nodes.n__VA_ARGS__,
3193
				   pfile->spec_nodes.n__VA_ARGS__);
3194
	      nparms++;
Neil Booth committed
3195
	      pfile->state.va_args_ok = 1;
3196
	      if (! CPP_OPTION (pfile, c99)
3197
		  && CPP_OPTION (pfile, cpp_pedantic)
3198
		  && CPP_OPTION (pfile, warn_variadic_macros))
3199 3200 3201 3202 3203
		cpp_pedwarning
		  (pfile, CPP_W_VARIADIC_MACROS,
		   CPP_OPTION (pfile, cplusplus)
		   ? N_("anonymous variadic macros were introduced in C++11")
		   : N_("anonymous variadic macros were introduced in C99"));
3204
	      else if (CPP_OPTION (pfile, cpp_warn_c90_c99_compat) > 0
3205 3206 3207
		       && ! CPP_OPTION (pfile, cplusplus))
		cpp_error (pfile, CPP_DL_WARNING,
			   "anonymous variadic macros were introduced in C99");
Neil Booth committed
3208
	    }
3209
	  else if (CPP_OPTION (pfile, cpp_pedantic)
3210
		   && CPP_OPTION (pfile, warn_variadic_macros))
3211 3212 3213 3214 3215
	    cpp_pedwarning (pfile, CPP_W_VARIADIC_MACROS,
			    CPP_OPTION (pfile, cplusplus)
			    ? N_("ISO C++ does not permit named variadic macros")
			    : N_("ISO C does not permit named variadic macros"));
	  break;
Zack Weinberg committed
3216 3217
	}
    }
3218 3219 3220 3221 3222

 out:
  *n_ptr = nparms;

  return ok;
Neil Booth committed
3223 3224
}

3225 3226
/* Lex a token from the expansion of MACRO, but mark parameters as we
   find them and warn of traditional stringification.  */
3227
static cpp_macro *
3228
lex_expansion_token (cpp_reader *pfile, cpp_macro *macro)
3229
{
3230 3231 3232 3233 3234 3235 3236
  macro = (cpp_macro *)_cpp_reserve_room (pfile,
					  sizeof (cpp_macro) - sizeof (cpp_token)
					  + macro->count * sizeof (cpp_token),
					  sizeof (cpp_token));
  cpp_token *saved_cur_token = pfile->cur_token;
  pfile->cur_token = &macro->exp.tokens[macro->count];
  cpp_token *token = _cpp_lex_direct (pfile);
3237
  pfile->cur_token = saved_cur_token;
Neil Booth committed
3238

3239
  /* Is this a parameter?  */
Nathan Sidwell committed
3240
  if (token->type == CPP_NAME && token->val.node.node->type == NT_MACRO_ARG)
Neil Booth committed
3241
    {
Nathan Sidwell committed
3242
      /* Morph into a parameter reference.  */
3243
      cpp_hashnode *spelling = token->val.node.spelling;
Neil Booth committed
3244
      token->type = CPP_MACRO_ARG;
3245
      token->val.macro_arg.arg_no = token->val.node.node->value.arg_index;
3246
      token->val.macro_arg.spelling = spelling;
Neil Booth committed
3247 3248 3249 3250 3251
    }
  else if (CPP_WTRADITIONAL (pfile) && macro->paramc > 0
	   && (token->type == CPP_STRING || token->type == CPP_CHAR))
    check_trad_stringification (pfile, macro, &token->val.str);

3252
  return macro;
Zack Weinberg committed
3253 3254
}

3255 3256
static cpp_macro *
create_iso_definition (cpp_reader *pfile)
Zack Weinberg committed
3257
{
3258 3259 3260
  bool following_paste_op = false;
  const char *paste_op_error_msg =
    N_("'##' cannot appear at either end of a macro expansion");
3261
  unsigned int num_extra_tokens = 0;
3262
  unsigned nparms = 0;
3263
  cpp_hashnode **params = NULL;
3264 3265
  bool varadic = false;
  bool ok = false;
3266
  cpp_macro *macro = NULL;
Neil Booth committed
3267

3268 3269 3270 3271 3272 3273 3274
  /* Look at the first token, to see if this is a function-like
     macro.   */
  cpp_token first;
  cpp_token *saved_cur_token = pfile->cur_token;
  pfile->cur_token = &first;
  cpp_token *token = _cpp_lex_direct (pfile);
  pfile->cur_token = saved_cur_token;
3275

3276
  if (token->flags & PREV_WHITE)
3277
    /* Preceeded by space, must be part of expansion.  */;
3278
  else if (token->type == CPP_OPEN_PAREN)
Neil Booth committed
3279
    {
3280 3281 3282
      /* An open-paren, get a parameter list.  */
      if (!parse_params (pfile, &nparms, &varadic))
	goto out;
3283

3284 3285 3286
      params = (cpp_hashnode **)_cpp_commit_buff
	(pfile, sizeof (cpp_hashnode *) * nparms);
      token = NULL;
Neil Booth committed
3287
    }
3288 3289 3290
  else if (token->type != CPP_EOF
	   && !(token->type == CPP_COMMENT
		&& ! CPP_OPTION (pfile, discard_comments_in_macro_exp)))
3291 3292
    {
      /* While ISO C99 requires whitespace before replacement text
3293 3294
	 in a macro definition, ISO C90 with TC1 allows characters
	 from the basic source character set there.  */
3295
      if (CPP_OPTION (pfile, c99))
3296 3297 3298 3299
	cpp_error (pfile, CPP_DL_PEDWARN,
		   CPP_OPTION (pfile, cplusplus)
		   ? N_("ISO C++11 requires whitespace after the macro name")
		   : N_("ISO C99 requires whitespace after the macro name"));
3300 3301
      else
	{
3302
	  enum cpp_diagnostic_level warntype = CPP_DL_WARNING;
3303
	  switch (token->type)
3304 3305 3306 3307 3308 3309 3310 3311 3312 3313
	    {
	    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 ("!\"#%&'()*+,-./:;<=>?[\\]^{|}~",
3314
			  token->val.str.text[0]) == NULL)
3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325
		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
3326

3327 3328 3329 3330 3331 3332 3333
  macro = _cpp_new_macro (pfile, cmk_macro,
			  _cpp_reserve_room (pfile, 0, sizeof (cpp_macro)));

  if (!token)
    {
      macro->variadic = varadic;
      macro->paramc = nparms;
3334
      macro->parm.params = params;
3335 3336
      macro->fun_like = true;
    }
3337 3338
  else
    {
3339 3340 3341 3342
      /* Preserve the token we peeked, there is already a single slot for it.  */
      macro->exp.tokens[0] = *token;
      token = &macro->exp.tokens[0];
      macro->count = 1;
3343
    }
Zack Weinberg committed
3344

3345
  for (vaopt_state vaopt_tracker (pfile, macro->variadic, true);; token = NULL)
Neil Booth committed
3346
    {
3347 3348 3349 3350 3351 3352
      if (!token)
	{
	  macro = lex_expansion_token (pfile, macro);
	  token = &macro->exp.tokens[macro->count++];
	}

Neil Booth committed
3353 3354 3355 3356 3357 3358
      /* 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)
	    {
3359 3360 3361 3362
	      if (token->flags & PREV_WHITE)
		token->flags |= SP_PREV_WHITE;
	      if (token[-1].flags & DIGRAPH)
		token->flags |= SP_DIGRAPH;
Neil Booth committed
3363 3364 3365 3366 3367 3368 3369
	      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.  */
3370
	  else if (CPP_OPTION (pfile, lang) != CLK_ASM)
Neil Booth committed
3371
	    {
3372
	      cpp_error (pfile, CPP_DL_ERROR,
3373
			 "'#' is not followed by a macro parameter");
3374
	      goto out;
Neil Booth committed
3375 3376 3377 3378
	    }
	}

      if (token->type == CPP_EOF)
3379 3380 3381 3382 3383 3384 3385
	{
	  /* 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);
3386
	      goto out;
3387
	    }
3388 3389
	  if (!vaopt_tracker.completed ())
	    goto out;
3390 3391
	  break;
	}
Neil Booth committed
3392 3393 3394 3395 3396

      /* Paste operator constraint 6.10.3.3.1.  */
      if (token->type == CPP_PASTE)
	{
	  /* Token-paste ##, can appear in both object-like and
3397 3398
	     function-like macros, but not at the beginning.  */
	  if (macro->count == 1)
Neil Booth committed
3399
	    {
3400
	      cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg);
3401
	      goto out;
Neil Booth committed
3402
	    }
Zack Weinberg committed
3403

3404
	  if (following_paste_op)
3405
	    {
3406 3407
	      /* Consecutive paste operators.  This one will be moved
		 to the end.  */
3408
	      num_extra_tokens++;
3409
	      token->val.token_no = macro->count - 1;
3410 3411 3412
	    }
	  else
	    {
3413
	      /* Drop the paste operator.  */
3414 3415 3416 3417 3418 3419 3420
	      --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;
	    }
3421
	  following_paste_op = true;
Neil Booth committed
3422
	}
3423 3424
      else
	following_paste_op = false;
Neil Booth committed
3425

Tom Tromey committed
3426
      if (vaopt_tracker.update (token) == vaopt_state::ERROR)
3427
	goto out;
Neil Booth committed
3428 3429
    }

3430 3431
  /* We're committed to winning now.  */
  ok = true;
Tom Tromey committed
3432

Neil Booth committed
3433 3434
  /* Don't count the CPP_EOF.  */
  macro->count--;
Neil Booth committed
3435

3436 3437 3438 3439
  macro = (cpp_macro *)_cpp_commit_buff
    (pfile, sizeof (cpp_macro) - sizeof (cpp_token)
     + sizeof (cpp_token) * macro->count);

3440
  /* Clear whitespace on first token.  */
3441
  if (macro->count)
3442
    macro->exp.tokens[0].flags &= ~PREV_WHITE;
3443

3444
  if (num_extra_tokens)
Geoffrey Keating committed
3445
    {
3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464
      /* 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.   Remember, this is
	 extremely rare, so efficiency is not a priority.  */
      cpp_token *temp = (cpp_token *)_cpp_reserve_room
	(pfile, 0, num_extra_tokens * sizeof (cpp_token));
      unsigned extra_ix = 0, norm_ix = 0;
      cpp_token *exp = macro->exp.tokens;
      for (unsigned ix = 0; ix != macro->count; ix++)
	if (exp[ix].type == CPP_PASTE)
	  temp[extra_ix++] = exp[ix];
	else
	  exp[norm_ix++] = exp[ix];
      memcpy (&exp[norm_ix], temp, num_extra_tokens * sizeof (cpp_token));

      /* Record there are extra tokens.  */
      macro->extra_tokens = 1;
Geoffrey Keating committed
3465
    }
3466

3467 3468 3469 3470
 out:
  pfile->state.va_args_ok = 0;
  _cpp_unsave_parameters (pfile, nparms);

3471
  return ok ? macro : NULL;
3472 3473
}

3474 3475
cpp_macro *
_cpp_new_macro (cpp_reader *pfile, cpp_macro_kind kind, void *placement)
3476
{
3477
  cpp_macro *macro = (cpp_macro *) placement;
3478

3479
  macro->line = pfile->directive_line;
3480
  macro->parm.params = 0;
3481
  macro->lazy = 0;
3482 3483
  macro->paramc = 0;
  macro->variadic = 0;
3484
  macro->used = !CPP_OPTION (pfile, warn_unused_macros);
3485 3486
  macro->count = 0;
  macro->fun_like = 0;
3487
  macro->extra_tokens = 0;
3488
  /* To suppress some diagnostics.  */
3489
  macro->syshdr = pfile->buffer && pfile->buffer->sysp != 0;
3490

3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501
  macro->kind = kind;

  return macro;
}

/* Parse a macro and save its expansion.  Returns nonzero on success.  */
bool
_cpp_create_definition (cpp_reader *pfile, cpp_hashnode *node)
{
  cpp_macro *macro;

3502
  if (CPP_OPTION (pfile, traditional))
3503
    macro = _cpp_create_trad_definition (pfile);
3504
  else
3505
    macro = create_iso_definition (pfile);
3506

3507 3508
  if (!macro)
    return false;
3509

3510
  if (cpp_macro_p (node))
Zack Weinberg committed
3511
    {
3512 3513 3514
      if (CPP_OPTION (pfile, warn_unused_macros))
	_cpp_warn_if_unused_macro (pfile, node, NULL);

3515
      if (warn_of_redefinition (pfile, node, macro))
Zack Weinberg committed
3516
	{
3517
          const enum cpp_warning_reason reason
3518 3519
	    = (cpp_builtin_macro_p (node) && !(node->flags & NODE_WARN))
	    ? CPP_W_BUILTIN_MACRO_REDEFINED : CPP_W_NONE;
3520

3521 3522 3523 3524
	  bool warned = 
	    cpp_pedwarning_with_line (pfile, reason,
				      pfile->directive_line, 0,
				      "\"%s\" redefined", NODE_NAME (node));
Neil Booth committed
3525

3526
	  if (warned && cpp_user_macro_p (node))
3527
	    cpp_error_with_line (pfile, CPP_DL_NOTE,
3528 3529
				 node->value.macro->line, 0,
			 "this is the location of the previous definition");
Zack Weinberg committed
3530
	}
3531
      _cpp_free_definition (node);
Zack Weinberg committed
3532 3533 3534
    }

  /* Enter definition in hash table.  */
Nathan Sidwell committed
3535
  node->type = NT_USER_MACRO;
Neil Booth committed
3536
  node->value.macro = macro;
3537
  if (! ustrncmp (NODE_NAME (node), DSC ("__STDC_"))
3538 3539 3540
      && 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++.
3541 3542
	 However DR#593 and C++11 indicate that they play no role in C++.
	 We special-case them anyway.  */
3543 3544
      && ustrcmp (NODE_NAME (node), (const uchar *) "__STDC_LIMIT_MACROS")
      && ustrcmp (NODE_NAME (node), (const uchar *) "__STDC_CONSTANT_MACROS"))
3545
    node->flags |= NODE_WARN;
Zack Weinberg committed
3546

3547 3548 3549 3550
  /* If user defines one of the conditional macros, remove the
     conditional flag */
  node->flags &= ~NODE_CONDITIONAL;

3551
  return true;
Zack Weinberg committed
3552 3553
}

3554 3555 3556 3557 3558
extern void
cpp_define_lazily (cpp_reader *pfile, cpp_hashnode *node, unsigned num)
{
  cpp_macro *macro = node->value.macro;

3559
  gcc_checking_assert (pfile->cb.user_lazy_macro && macro && num < UCHAR_MAX);
3560 3561 3562 3563

  macro->lazy = num + 1;
}

3564 3565 3566 3567 3568 3569 3570 3571 3572
/* Notify the use of NODE in a macro-aware context (i.e. expanding it,
   or testing its existance).  Also applies any lazy definition.  */

extern void
_cpp_notify_macro_use (cpp_reader *pfile, cpp_hashnode *node)
{
  node->flags |= NODE_USED;
  switch (node->type)
    {
Nathan Sidwell committed
3573 3574 3575 3576 3577 3578 3579 3580 3581 3582
    case NT_USER_MACRO:
      {
	cpp_macro *macro = node->value.macro;
	if (macro->lazy)
	  {
	    pfile->cb.user_lazy_macro (pfile, macro, macro->lazy - 1);
	    macro->lazy = 0;
	  }
      }
      /* FALLTHROUGH.  */
3583

Nathan Sidwell committed
3584
    case NT_BUILTIN_MACRO:
3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598
      if (pfile->cb.used_define)
	pfile->cb.used_define (pfile, pfile->directive_line, node);
      break;

    case NT_VOID:
      if (pfile->cb.used_undef)
	pfile->cb.used_undef (pfile, pfile->directive_line, node);
      break;

    default:
      abort ();
    }
}

3599 3600
/* Warn if a token in STRING matches one of a function-like MACRO's
   parameters.  */
3601
static void
3602 3603
check_trad_stringification (cpp_reader *pfile, const cpp_macro *macro,
			    const cpp_string *string)
3604
{
Neil Booth committed
3605
  unsigned int i, len;
3606
  const uchar *p, *q, *limit;
3607

3608
  /* Loop over the string.  */
3609 3610
  limit = string->text + string->len - 1;
  for (p = string->text + 1; p < limit; p = q)
3611 3612
    {
      /* Find the start of an identifier.  */
3613 3614
      while (p < limit && !is_idstart (*p))
	p++;
3615 3616 3617

      /* Find the end of the identifier.  */
      q = p;
3618 3619
      while (q < limit && is_idchar (*q))
	q++;
Neil Booth committed
3620 3621 3622

      len = q - p;

3623 3624
      /* Loop over the function macro arguments to see if the
	 identifier inside the string matches one of them.  */
Neil Booth committed
3625 3626
      for (i = 0; i < macro->paramc; i++)
	{
3627
	  const cpp_hashnode *node = macro->parm.params[i];
3628

3629 3630
	  if (NODE_LEN (node) == len
	      && !memcmp (p, NODE_NAME (node), len))
3631
	    {
3632
	      cpp_warning (pfile, CPP_W_TRADITIONAL,
3633
	   "macro argument \"%s\" would be stringified in traditional C",
3634
			 NODE_NAME (node));
3635 3636 3637 3638 3639
	      break;
	    }
	}
    }
}
Neil Booth committed
3640

3641 3642 3643 3644
/* 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
3645 3646
   returned text is temporary, and automatically freed later.  */
const unsigned char *
3647
cpp_macro_definition (cpp_reader *pfile, cpp_hashnode *node)
Neil Booth committed
3648 3649 3650 3651
{
  unsigned int i, len;
  unsigned char *buffer;

3652 3653 3654
  gcc_checking_assert (cpp_user_macro_p (node));

  const cpp_macro *macro = node->value.macro;
Neil Booth committed
3655 3656

  /* Calculate length.  */
3657
  len = NODE_LEN (node) * 10 + 2;		/* ' ' and NUL.  */
Neil Booth committed
3658 3659
  if (macro->fun_like)
    {
3660 3661
      len += 4;		/* "()" plus possible final ".." of named
			   varargs (we have + 1 below).  */
Neil Booth committed
3662
      for (i = 0; i < macro->paramc; i++)
3663
	len += NODE_LEN (macro->parm.params[i]) + 1; /* "," */
Neil Booth committed
3664 3665
    }

3666
  /* This should match below where we fill in the buffer.  */
3667 3668 3669
  if (CPP_OPTION (pfile, traditional))
    len += _cpp_replacement_text_len (macro);
  else
Neil Booth committed
3670
    {
3671 3672
      unsigned int count = macro_real_token_count (macro);
      for (i = 0; i < count; i++)
3673
	{
3674
	  const cpp_token *token = &macro->exp.tokens[i];
Neil Booth committed
3675

3676
	  if (token->type == CPP_MACRO_ARG)
3677
	    len += NODE_LEN (token->val.macro_arg.spelling);
3678
	  else
3679 3680
	    len += cpp_token_len (token);

3681 3682 3683 3684
	  if (token->flags & STRINGIFY_ARG)
	    len++;			/* "#" */
	  if (token->flags & PASTE_LEFT)
	    len += 3;		/* " ##" */
3685 3686
	  if (token->flags & PREV_WHITE)
	    len++;              /* " " */
3687
	}
Neil Booth committed
3688 3689 3690
    }

  if (len > pfile->macro_buffer_len)
3691
    {
3692 3693
      pfile->macro_buffer = XRESIZEVEC (unsigned char,
                                        pfile->macro_buffer, len);
3694 3695
      pfile->macro_buffer_len = len;
    }
3696 3697

  /* Fill in the buffer.  Start with the macro name.  */
Neil Booth committed
3698
  buffer = pfile->macro_buffer;
3699
  buffer = _cpp_spell_ident_ucns (buffer, node);
Neil Booth committed
3700 3701 3702 3703 3704 3705 3706

  /* Parameter names.  */
  if (macro->fun_like)
    {
      *buffer++ = '(';
      for (i = 0; i < macro->paramc; i++)
	{
3707
	  cpp_hashnode *param = macro->parm.params[i];
Neil Booth committed
3708 3709 3710

	  if (param != pfile->spec_nodes.n__VA_ARGS__)
	    {
3711 3712
	      memcpy (buffer, NODE_NAME (param), NODE_LEN (param));
	      buffer += NODE_LEN (param);
Neil Booth committed
3713 3714 3715
	    }

	  if (i + 1 < macro->paramc)
3716 3717 3718
	    /* 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.  */
3719
	    *buffer++ = ',';
3720
	  else if (macro->variadic)
Neil Booth committed
3721 3722 3723 3724 3725
	    *buffer++ = '.', *buffer++ = '.', *buffer++ = '.';
	}
      *buffer++ = ')';
    }

3726 3727 3728 3729
  /* The Dwarf spec requires a space after the macro name, even if the
     definition is the empty string.  */
  *buffer++ = ' ';

3730 3731 3732
  if (CPP_OPTION (pfile, traditional))
    buffer = _cpp_copy_replacement_text (macro, buffer);
  else if (macro->count)
Neil Booth committed
3733 3734
  /* Expansion tokens.  */
    {
3735 3736
      unsigned int count = macro_real_token_count (macro);
      for (i = 0; i < count; i++)
Neil Booth committed
3737
	{
3738
	  const cpp_token *token = &macro->exp.tokens[i];
Neil Booth committed
3739 3740 3741 3742 3743 3744 3745 3746

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

	  if (token->type == CPP_MACRO_ARG)
	    {
3747
	      memcpy (buffer,
3748 3749 3750
		      NODE_NAME (token->val.macro_arg.spelling),
		      NODE_LEN (token->val.macro_arg.spelling));
	      buffer += NODE_LEN (token->val.macro_arg.spelling);
Neil Booth committed
3751 3752
	    }
	  else
3753
	    buffer = cpp_spell_token (pfile, token, buffer, true);
Neil Booth committed
3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767

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

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