summaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>2014-07-16 10:33:27 +0000
committerdodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>2014-07-16 10:33:27 +0000
commita4cfdfed6839584bcde0c2c884e3dd55476adaa3 (patch)
tree2b9dadc35640ecec96428e5e73e233c98df2477d /libcpp
parentc4884451cad7af65335e5a3dfbd99a75a50110e7 (diff)
downloadgcc-a4cfdfed6839584bcde0c2c884e3dd55476adaa3.tar.gz
Support location tracking for built-in macro tokens
When a built-in macro is expanded, the location of the token in the epansion list is the location of the expansion point of the built-in macro. This patch creates a virtual location for that token instead, effectively tracking locations of tokens resulting from built-in macro tokens. libcpp/ * include/line-map.h (line_maps::builtin_location): New data member. (line_map_init): Add a new parameter to initialize the new line_maps::builtin_location data member. * line-map.c (linemap_init): Initialize the line_maps::builtin_location data member. * macro.c (builtin_macro): Create a macro map and track the token resulting from the expansion of a built-in macro. gcc/ * input.h (is_location_from_builtin_token): New function declaration. * input.c (is_location_from_builtin_token): New function definition. * toplev.c (general_init): Tell libcpp what the pre-defined spelling location for built-in tokens is. Signed-off-by: Dodji Seketeli <dodji@redhat.com> git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@212637 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp')
-rw-r--r--libcpp/ChangeLog12
-rw-r--r--libcpp/include/line-map.h12
-rw-r--r--libcpp/line-map.c4
-rw-r--r--libcpp/macro.c23
4 files changed, 47 insertions, 4 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index 490bf4e50d1..7a6b8e3a5cc 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,15 @@
+2014-07-16 Dodji Seketeli <dodji@redhat.com>
+
+ Support location tracking for built-in macro tokens
+ * include/line-map.h (line_maps::builtin_location): New data
+ member.
+ (line_map_init): Add a new parameter to initialize the new
+ line_maps::builtin_location data member.
+ * line-map.c (linemap_init): Initialize the
+ line_maps::builtin_location data member.
+ * macro.c (builtin_macro): Create a macro map and track the token
+ resulting from the expansion of a built-in macro.
+
2014-07-10 Edward Smith-Rowland <3dw4rd@verizon.net>
Jonathan Wakely <jwakely@redhat.com>
diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h
index 9886314b25a..0c8f588abc5 100644
--- a/libcpp/include/line-map.h
+++ b/libcpp/include/line-map.h
@@ -315,6 +315,10 @@ struct GTY(()) line_maps {
line_map_round_alloc_size_func round_alloc_size;
struct location_adhoc_data_map location_adhoc_data_map;
+
+ /* The special location value that is used as spelling location for
+ built-in tokens. */
+ source_location builtin_location;
};
/* Returns the pointer to the memory region where information about
@@ -447,8 +451,12 @@ extern source_location get_location_from_adhoc_loc (struct line_maps *,
extern void rebuild_location_adhoc_htab (struct line_maps *);
-/* Initialize a line map set. */
-extern void linemap_init (struct line_maps *);
+/* Initialize a line map set. SET is the line map set to initialize
+ and BUILTIN_LOCATION is the special location value to be used as
+ spelling location for built-in tokens. This BUILTIN_LOCATION has
+ to be strictly less than RESERVED_LOCATION_COUNT. */
+extern void linemap_init (struct line_maps *set,
+ source_location builtin_location);
/* Check for and warn about line_maps entered but not exited. */
diff --git a/libcpp/line-map.c b/libcpp/line-map.c
index f9a7658cbdb..a4055c29c74 100644
--- a/libcpp/line-map.c
+++ b/libcpp/line-map.c
@@ -175,13 +175,15 @@ location_adhoc_data_fini (struct line_maps *set)
/* Initialize a line map set. */
void
-linemap_init (struct line_maps *set)
+linemap_init (struct line_maps *set,
+ source_location builtin_location)
{
memset (set, 0, sizeof (struct line_maps));
set->highest_location = RESERVED_LOCATION_COUNT - 1;
set->highest_line = RESERVED_LOCATION_COUNT - 1;
set->location_adhoc_data_map.htab =
htab_create (100, location_adhoc_data_hash, location_adhoc_data_eq, NULL);
+ set->builtin_location = builtin_location;
}
/* Check for and warn about line_maps entered but not exited. */
diff --git a/libcpp/macro.c b/libcpp/macro.c
index ab4817e8af6..3b8fa406935 100644
--- a/libcpp/macro.c
+++ b/libcpp/macro.c
@@ -428,7 +428,28 @@ builtin_macro (cpp_reader *pfile, cpp_hashnode *node)
/* Set pfile->cur_token as required by _cpp_lex_direct. */
pfile->cur_token = _cpp_temp_token (pfile);
- _cpp_push_token_context (pfile, NULL, _cpp_lex_direct (pfile), 1);
+ cpp_token *token = _cpp_lex_direct (pfile);
+ 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);
+ const line_map * map =
+ linemap_enter_macro (pfile->line_table, node,
+ token->src_loc, 1);
+ 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);
if (pfile->buffer->cur != pfile->buffer->rlimit)
cpp_error (pfile, CPP_DL_ICE, "invalid built-in macro \"%s\"",
NODE_NAME (node));