diff options
author | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-11-22 16:13:00 +0000 |
---|---|---|
committer | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-11-22 16:13:00 +0000 |
commit | b082215e334107b0e2d800b1e607d19374ee15ef (patch) | |
tree | d6a2a2cc3ba40550db6147ea6c6ac40a98129901 /libcpp/line-map.c | |
parent | 3785914c8741c1933af419e839e6d26b8908ea69 (diff) | |
download | gcc-b082215e334107b0e2d800b1e607d19374ee15ef.tar.gz |
* include/line-map.h (linemap_dump): Declare.
(line_table_dump): Declare.
* line-map.c (linemap_dump): New.
(line_table_dump): New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181625 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp/line-map.c')
-rw-r--r-- | libcpp/line-map.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/libcpp/line-map.c b/libcpp/line-map.c index 23a0347cb5f..d7752bb4e61 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -1153,6 +1153,57 @@ linemap_expand_location (struct line_maps *set, return xloc; } + +/* Dump line map at index IX in line table SET to STREAM. If STREAM + is NULL, use stderr. IS_MACRO is true if the caller wants to + dump a macro map, false otherwise. */ + +void +linemap_dump (FILE *stream, struct line_maps *set, unsigned ix, bool is_macro) +{ + const char *lc_reasons_v[LC_ENTER_MACRO + 1] + = { "LC_ENTER", "LC_LEAVE", "LC_RENAME", "LC_RENAME_VERBATIM", + "LC_ENTER_MACRO" }; + const char *reason; + struct line_map *map; + + if (stream == NULL) + stream = stderr; + + if (!is_macro) + map = LINEMAPS_ORDINARY_MAP_AT (set, ix); + else + map = LINEMAPS_MACRO_MAP_AT (set, ix); + + reason = (map->reason <= LC_ENTER_MACRO) ? lc_reasons_v[map->reason] : "???"; + + fprintf (stream, "Map #%u [%p] - LOC: %u - REASON: %s - SYSP: %s\n", + ix, (void *) map, map->start_location, reason, + (!is_macro && ORDINARY_MAP_IN_SYSTEM_HEADER_P (map)) ? "yes" : "no"); + if (!is_macro) + { + unsigned includer_ix; + struct line_map *includer_map; + + includer_ix = ORDINARY_MAP_INCLUDER_FILE_INDEX (map); + includer_map = includer_ix < LINEMAPS_ORDINARY_USED (set) + ? LINEMAPS_ORDINARY_MAP_AT (set, includer_ix) + : NULL; + + fprintf (stream, "File: %s:%d\n", ORDINARY_MAP_FILE_NAME (map), + ORDINARY_MAP_STARTING_LINE_NUMBER (map)); + fprintf (stream, "Included from: [%d] %s\n", includer_ix, + includer_map ? ORDINARY_MAP_FILE_NAME (includer_map) : "None"); + } + else + fprintf (stream, "Macro: %s (%u tokens)\n", + linemap_map_get_macro_name (map), + MACRO_MAP_NUM_MACRO_TOKENS (map)); + + fprintf (stream, "\n"); +} + + /* Dump debugging information about source location LOC into the file stream STREAM. SET is the line map set LOC comes from. */ @@ -1254,3 +1305,42 @@ linemap_get_statistics (struct line_maps *set, s->duplicated_macro_maps_locations_size = duplicated_macro_maps_locations_size; } + + +/* Dump line table SET to STREAM. If STREAM is NULL, stderr is used. + NUM_ORDINARY specifies how many ordinary maps to dump. NUM_MACRO + specifies how many macro maps to dump. */ + +void +line_table_dump (FILE *stream, struct line_maps *set, unsigned int num_ordinary, + unsigned int num_macro) +{ + unsigned int i; + + if (set == NULL) + return; + + if (stream == NULL) + stream = stderr; + + fprintf (stream, "# of ordinary maps: %d\n", LINEMAPS_ORDINARY_USED (set)); + fprintf (stream, "# of macro maps: %d\n", LINEMAPS_MACRO_USED (set)); + fprintf (stream, "Include stack depth: %d\n", set->depth); + fprintf (stream, "Highest location: %u\n", set->highest_location); + + if (num_ordinary) + { + fprintf (stream, "\nOrdinary line maps\n"); + for (i = 0; i < num_ordinary && i < LINEMAPS_ORDINARY_USED (set); i++) + linemap_dump (stream, set, i, false); + fprintf (stream, "\n"); + } + + if (num_macro) + { + fprintf (stream, "\nMacro line maps\n"); + for (i = 0; i < num_macro && i < LINEMAPS_MACRO_USED (set); i++) + linemap_dump (stream, set, i, true); + fprintf (stream, "\n"); + } +} |