diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-lex.c | 75 | ||||
-rw-r--r-- | gcc/cpperror.c | 2 | ||||
-rw-r--r-- | gcc/cppfiles.c | 13 | ||||
-rw-r--r-- | gcc/cpphash.h | 18 | ||||
-rw-r--r-- | gcc/cpplib.c | 48 | ||||
-rw-r--r-- | gcc/cpplib.h | 14 | ||||
-rw-r--r-- | gcc/cppmacro.c | 2 | ||||
-rw-r--r-- | gcc/cppmain.c | 67 | ||||
-rw-r--r-- | gcc/line-map.c | 54 | ||||
-rw-r--r-- | gcc/line-map.h | 33 |
10 files changed, 163 insertions, 163 deletions
diff --git a/gcc/c-lex.c b/gcc/c-lex.c index 971d9cd14a7..c47fb22af58 100644 --- a/gcc/c-lex.c +++ b/gcc/c-lex.c @@ -58,7 +58,7 @@ Boston, MA 02111-1307, USA. */ static const char *cpp_filename; /* The current line map. */ -static struct line_map *map; +static const struct line_map *map; /* We may keep statistics about how long which files took to compile. */ static int header_time, body_time; @@ -91,7 +91,7 @@ static void update_header_times PARAMS ((const char *)); static int dump_one_header PARAMS ((splay_tree_node, void *)); static void cb_ident PARAMS ((cpp_reader *, unsigned int, const cpp_string *)); -static void cb_file_change PARAMS ((cpp_reader *, const cpp_file_change *)); +static void cb_file_change PARAMS ((cpp_reader *, const struct line_map *)); static void cb_def_pragma PARAMS ((cpp_reader *, unsigned int)); static void cb_define PARAMS ((cpp_reader *, unsigned int, cpp_hashnode *)); @@ -244,28 +244,28 @@ cb_ident (pfile, line, str) } static void -cb_file_change (pfile, fc) +cb_file_change (pfile, new_map) cpp_reader *pfile ATTRIBUTE_UNUSED; - const cpp_file_change *fc; + const struct line_map *new_map; { - unsigned int from_line = SOURCE_LINE (fc->map - 1, fc->line - 1); + unsigned int to_line = SOURCE_LINE (new_map, new_map->to_line); - if (fc->reason == LC_ENTER) + if (new_map->reason == LC_ENTER) { /* Don't stack the main buffer on the input stack; we already did in compile_file. */ - if (MAIN_FILE_P (fc->map)) - main_input_filename = fc->map->to_file; + if (map == NULL) + main_input_filename = new_map->to_file; else { - lineno = from_line; - push_srcloc (fc->map->to_file, 1); + lineno = SOURCE_LINE (new_map - 1, new_map->from_line - 1); + push_srcloc (new_map->to_file, 1); input_file_stack->indent_level = indent_level; - (*debug_hooks->start_source_file) (lineno, fc->map->to_file); + (*debug_hooks->start_source_file) (lineno, new_map->to_file); #ifndef NO_IMPLICIT_EXTERN_C if (c_header_level) ++c_header_level; - else if (fc->externc) + else if (new_map->sysp == 2) { c_header_level = 1; ++pending_lang_change; @@ -273,41 +273,36 @@ cb_file_change (pfile, fc) #endif } } - else if (fc->reason == LC_LEAVE) + else if (new_map->reason == LC_LEAVE) { - /* Popping out of a file. */ - if (input_file_stack->next) - { #ifndef NO_IMPLICIT_EXTERN_C - if (c_header_level && --c_header_level == 0) - { - if (fc->externc) - warning ("badly nested C headers from preprocessor"); - --pending_lang_change; - } + if (c_header_level && --c_header_level == 0) + { + if (new_map->sysp == 2) + warning ("badly nested C headers from preprocessor"); + --pending_lang_change; + } #endif #if 0 - if (indent_level != input_file_stack->indent_level) - { - warning_with_file_and_line - (input_filename, lineno, - "This file contains more '%c's than '%c's.", - indent_level > input_file_stack->indent_level ? '{' : '}', - indent_level > input_file_stack->indent_level ? '}' : '{'); - } -#endif - pop_srcloc (); - (*debug_hooks->end_source_file) (from_line); + if (indent_level != input_file_stack->indent_level) + { + warning_with_file_and_line + (input_filename, lineno, + "This file contains more '%c's than '%c's.", + indent_level > input_file_stack->indent_level ? '{' : '}', + indent_level > input_file_stack->indent_level ? '}' : '{'); } - else - error ("leaving more files than we entered"); +#endif + pop_srcloc (); + + (*debug_hooks->end_source_file) (to_line); } - update_header_times (fc->map->to_file); - map = fc->map; - in_system_header = fc->sysp != 0; - input_filename = map->to_file; - lineno = SOURCE_LINE (map, fc->line); + update_header_times (new_map->to_file); + in_system_header = new_map->sysp != 0; + input_filename = new_map->to_file; + lineno = to_line; + map = new_map; /* Hook for C++. */ extract_interface_info (); diff --git a/gcc/cpperror.c b/gcc/cpperror.c index 167ea9d46a5..73cb418b473 100644 --- a/gcc/cpperror.c +++ b/gcc/cpperror.c @@ -61,7 +61,7 @@ print_location (pfile, filename, pos) line = 0; else { - struct line_map *map; + const struct line_map *map; if (type == BUF_PRAGMA) buffer = buffer->prev; diff --git a/gcc/cppfiles.c b/gcc/cppfiles.c index 8af65c8925f..657130400f1 100644 --- a/gcc/cppfiles.c +++ b/gcc/cppfiles.c @@ -290,7 +290,7 @@ stack_include_file (pfile, inc) /* We'll try removing deps_sysp after the release of 3.0. */ deps_sysp = pfile->system_include_depth != 0; - sysp = MAX ((pfile->buffer ? pfile->buffer->sysp : 0), + sysp = MAX ((pfile->map ? pfile->map->sysp : 0), (inc->foundhere ? inc->foundhere->sysp : 0)); /* For -M, add the file to the dependencies on its first inclusion. */ @@ -329,7 +329,6 @@ stack_include_file (pfile, inc) fp = cpp_push_buffer (pfile, inc->buffer, len, BUF_FILE, inc->name, 0); fp->inc = inc; fp->inc->refcnt++; - fp->sysp = sysp; /* Initialise controlling macro state. */ pfile->mi_valid = true; @@ -337,7 +336,7 @@ stack_include_file (pfile, inc) pfile->include_depth++; /* Generate the call back. */ - _cpp_do_file_change (pfile, LC_ENTER, 1); + _cpp_do_file_change (pfile, LC_ENTER, fp->nominal_fname, 1, sysp); } /* Read the file referenced by INC into the file cache. @@ -576,9 +575,8 @@ cpp_make_system_header (pfile, syshdr, externc) /* 1 = system header, 2 = system header to be treated as C. */ if (syshdr) flags = 1 + (externc != 0); - pfile->buffer->sysp = flags; - _cpp_do_file_change (pfile, LC_RENAME, - SOURCE_LINE (pfile->map, pfile->line)); + _cpp_do_file_change (pfile, LC_RENAME, pfile->map->to_file, + SOURCE_LINE (pfile->map, pfile->line), flags); } /* Report on all files that might benefit from a multiple include guard. @@ -678,7 +676,6 @@ _cpp_execute_include (pfile, header, type) if (header->type == CPP_HEADER_NAME) pfile->system_include_depth++; - pfile->buffer->return_to_line = SOURCE_LINE (pfile->map, pfile->line); stack_include_file (pfile, inc); if (type == IT_IMPORT) @@ -808,7 +805,7 @@ search_from (pfile, type) buffer->dir.len = dlen; buffer->dir.next = CPP_OPTION (pfile, quote_include); - buffer->dir.sysp = buffer->sysp; + buffer->dir.sysp = pfile->map->sysp; } return &buffer->dir; diff --git a/gcc/cpphash.h b/gcc/cpphash.h index 5409e070569..366655b71e9 100644 --- a/gcc/cpphash.h +++ b/gcc/cpphash.h @@ -66,7 +66,7 @@ struct cpp_chunk typedef struct cpp_pool cpp_pool; struct cpp_pool { - struct cpp_chunk *cur, *locked; + struct cpp_chunk *cur, *locked, *first; unsigned char *pos; /* Current position. */ unsigned int align; unsigned int locks; @@ -190,11 +190,6 @@ struct cpp_buffer /* Token column position adjustment owing to tabs in whitespace. */ unsigned int col_adjust; - /* The line of the buffer that we return to after a #include. - Strictly this is redundant, since it can be calculated from the - line maps, but it is clearest to save it here. */ - unsigned int return_to_line; - /* Contains PREV_WHITE and/or AVOID_LPASTE. */ unsigned char saved_flags; @@ -213,9 +208,6 @@ struct cpp_buffer buffers. */ unsigned char from_stage3; - /* 1 = system header file, 2 = C system header file used for C++. */ - unsigned char sysp; - /* Nonzero means that the directory to start searching for "" include files has been calculated and stored in "dir" below. */ unsigned char search_cached; @@ -247,7 +239,7 @@ struct cpp_reader /* Source line tracking. */ struct line_maps line_maps; - struct line_map *map; + const struct line_map *map; unsigned int line; /* The position of the last lexed token and last lexed directive. */ @@ -376,8 +368,7 @@ extern unsigned char _cpp_trigraph_map[UCHAR_MAX + 1]; /* Macros. */ #define CPP_PRINT_DEPS(PFILE) CPP_OPTION (PFILE, print_deps) -#define CPP_IN_SYSTEM_HEADER(PFILE) \ - (CPP_BUFFER (PFILE) && CPP_BUFFER (PFILE)->sysp) +#define CPP_IN_SYSTEM_HEADER(PFILE) (pfile->map && pfile->map->sysp) #define CPP_PEDANTIC(PF) CPP_OPTION (PF, pedantic) #define CPP_WTRADITIONAL(PF) CPP_OPTION (PF, warn_traditional) @@ -439,7 +430,8 @@ extern void _cpp_do__Pragma PARAMS ((cpp_reader *)); extern void _cpp_init_directives PARAMS ((cpp_reader *)); extern void _cpp_init_internal_pragmas PARAMS ((cpp_reader *)); extern void _cpp_do_file_change PARAMS ((cpp_reader *, enum lc_reason, - unsigned int)); + const char *, + unsigned int, unsigned int)); extern void _cpp_pop_buffer PARAMS ((cpp_reader *)); /* Utility routines and macros. */ diff --git a/gcc/cpplib.c b/gcc/cpplib.c index 4710beb6ced..9404a00ea8e 100644 --- a/gcc/cpplib.c +++ b/gcc/cpplib.c @@ -713,7 +713,7 @@ do_line (pfile) cpp_buffer *buffer = pfile->buffer; enum lc_reason reason = LC_RENAME; unsigned long new_lineno; - unsigned int cap; + unsigned int cap, sysp = pfile->map->sysp; cpp_token token; /* C99 raised the minimum limit on #line numbers. */ @@ -741,9 +741,10 @@ do_line (pfile) /* Only accept flags for the # 55 form. */ if (pfile->state.line_extension) { - int flag = 0, sysp = 0; + int flag; - flag = read_flag (pfile, flag); + sysp = 0; + flag = read_flag (pfile, 0); if (flag == 1) { reason = LC_ENTER; @@ -763,7 +764,6 @@ do_line (pfile) if (flag == 4) sysp = 2; } - buffer->sysp = sysp; } check_eol (pfile); } @@ -775,34 +775,27 @@ do_line (pfile) } end_directive (pfile, 1); - _cpp_do_file_change (pfile, reason, new_lineno); + _cpp_do_file_change (pfile, reason, (const char *) buffer->nominal_fname, + new_lineno, sysp); } /* Arrange the file_change callback. pfile->line has changed to - FILE_LINE of the current buffer, for reason REASON. */ + FILE_LINE of TO_FILE, for reason REASON. SYSP is 1 for a system + header, 2 for a sytem header that needs to be extern "C" protected, + and zero otherwise. */ void -_cpp_do_file_change (pfile, reason, file_line) +_cpp_do_file_change (pfile, reason, to_file, file_line, sysp) cpp_reader *pfile; enum lc_reason reason; + const char *to_file; unsigned int file_line; + unsigned int sysp; { - cpp_buffer *buffer = pfile->buffer; - - pfile->map = add_line_map (&pfile->line_maps, reason, - pfile->line, buffer->nominal_fname, file_line); + pfile->map = add_line_map (&pfile->line_maps, reason, sysp, + pfile->line, to_file, file_line); if (pfile->cb.file_change) - { - cpp_file_change fc; - - fc.map = pfile->map; - fc.line = pfile->line; - fc.reason = reason; - fc.sysp = buffer->sysp; - fc.externc = CPP_OPTION (pfile, cplusplus) && buffer->sysp == 2; - - (*pfile->cb.file_change) (pfile, &fc); - } + (*pfile->cb.file_change) (pfile, pfile->map); } /* @@ -908,7 +901,8 @@ cpp_register_pragma (pfile, space, name, handler) } found: - new = xnew (struct pragma_entry); + new = (struct pragma_entry *) + _cpp_pool_alloc (&pfile->macro_pool, sizeof (struct pragma_entry)); new->name = name; new->len = strlen (name); new->isnspace = 0; @@ -936,7 +930,8 @@ cpp_register_pragma_space (pfile, space) p = p->next; } - new = xnew (struct pragma_entry); + new = (struct pragma_entry *) + _cpp_pool_alloc (&pfile->macro_pool, sizeof (struct pragma_entry)); new->name = space; new->len = len; new->isnspace = 1; @@ -1722,7 +1717,7 @@ cpp_get_callbacks (pfile) } /* The line map set. */ -struct line_maps * +const struct line_maps * cpp_get_line_maps (pfile) cpp_reader *pfile; { @@ -1764,7 +1759,6 @@ cpp_push_buffer (pfile, buffer, len, type, filename, return_at_eof) new->line_base = new->buf = new->cur = buffer; new->rlimit = buffer + len; - new->sysp = 0; /* No read ahead or extra char initially. */ new->read_ahead = EOF; @@ -1813,7 +1807,7 @@ _cpp_pop_buffer (pfile) { /* Callbacks are not generated for popping the main file. */ if (buffer->prev) - _cpp_do_file_change (pfile, LC_LEAVE, buffer->prev->return_to_line); + _cpp_do_file_change (pfile, LC_LEAVE, 0, 0, 0); _cpp_pop_file_buffer (pfile, buffer); } diff --git a/gcc/cpplib.h b/gcc/cpplib.h index 32b3d8905e3..acce60620fd 100644 --- a/gcc/cpplib.h +++ b/gcc/cpplib.h @@ -387,20 +387,10 @@ struct cpp_options unsigned char help_only; }; -typedef struct cpp_file_change cpp_file_change; -struct cpp_file_change -{ - struct line_map *map; /* Line map, valid until next callback. */ - unsigned int line; /* Logical line number of next line. */ - enum lc_reason reason; /* Reason for change. */ - unsigned char sysp; /* Nonzero if system header. */ - unsigned char externc; /* Nonzero if wrapper needed. */ -}; - /* Call backs. */ struct cpp_callbacks { - void (*file_change) PARAMS ((cpp_reader *, const cpp_file_change *)); + void (*file_change) PARAMS ((cpp_reader *, const struct line_map *)); void (*include) PARAMS ((cpp_reader *, unsigned int, const unsigned char *, const cpp_token *)); void (*define) PARAMS ((cpp_reader *, unsigned int, cpp_hashnode *)); @@ -501,7 +491,7 @@ extern int cpp_destroy PARAMS ((cpp_reader *)); through the pointer returned from cpp_get_callbacks, or set them with cpp_set_callbacks. */ extern cpp_options *cpp_get_options PARAMS ((cpp_reader *)); -extern struct line_maps *cpp_get_line_maps PARAMS ((cpp_reader *)); +extern const struct line_maps *cpp_get_line_maps PARAMS ((cpp_reader *)); extern cpp_callbacks *cpp_get_callbacks PARAMS ((cpp_reader *)); extern void cpp_set_callbacks PARAMS ((cpp_reader *, cpp_callbacks *)); diff --git a/gcc/cppmacro.c b/gcc/cppmacro.c index 1618e7e102f..8eb67e1d3a3 100644 --- a/gcc/cppmacro.c +++ b/gcc/cppmacro.c @@ -1466,7 +1466,7 @@ _cpp_create_definition (pfile, node) && macro->expansion[0].val.node == node); /* To suppress some diagnostics. */ - macro->syshdr = pfile->buffer->sysp != 0; + macro->syshdr = pfile->map->sysp != 0; /* Commit the memory. */ POOL_COMMIT (&pfile->macro_pool, macro->count * sizeof (cpp_token)); diff --git a/gcc/cppmain.c b/gcc/cppmain.c index b8cd7af18fb..5cb0746bece 100644 --- a/gcc/cppmain.c +++ b/gcc/cppmain.c @@ -31,8 +31,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. struct printer { FILE *outf; /* Stream to write to. */ - const char *syshdr_flags; /* System header flags, if any. */ - struct line_map *map; /* Logical to physical line mappings. */ + const struct line_map *map; /* Logical to physical line mappings. */ unsigned int line; /* Line currently being written. */ unsigned char printed; /* Nonzero if something output at line. */ }; @@ -47,9 +46,9 @@ static void scan_translation_unit PARAMS ((cpp_reader *)); static void check_multiline_token PARAMS ((cpp_string *)); static int dump_macro PARAMS ((cpp_reader *, cpp_hashnode *, void *)); -static void print_line PARAMS ((struct line_map *, unsigned int, +static void print_line PARAMS ((const struct line_map *, unsigned int, const char *)); -static void maybe_print_line PARAMS ((struct line_map *, unsigned int)); +static void maybe_print_line PARAMS ((const struct line_map *, unsigned int)); /* Callback routines for the parser. Most of these are active only in specific modes. */ @@ -59,7 +58,7 @@ static void cb_include PARAMS ((cpp_reader *, unsigned int, const unsigned char *, const cpp_token *)); static void cb_ident PARAMS ((cpp_reader *, unsigned int, const cpp_string *)); -static void cb_file_change PARAMS ((cpp_reader *, const cpp_file_change *)); +static void cb_file_change PARAMS ((cpp_reader *, const struct line_map *)); static void cb_def_pragma PARAMS ((cpp_reader *, unsigned int)); const char *progname; /* Needs to be global. */ @@ -285,7 +284,7 @@ check_multiline_token (str) static void maybe_print_line (map, line) - struct line_map *map; + const struct line_map *map; unsigned int line; { /* End the previous line of text. */ @@ -308,9 +307,11 @@ maybe_print_line (map, line) print_line (map, line, ""); } +/* Output a line marker for logical line LINE. Special flags are "1" + or "2" indicating entering or leaving a file. */ static void print_line (map, line, special_flags) - struct line_map *map; + const struct line_map *map; unsigned int line; const char *special_flags; { @@ -321,9 +322,17 @@ print_line (map, line, special_flags) print.line = line; if (! options->no_line_commands) - fprintf (print.outf, "# %u \"%s\"%s%s\n", - SOURCE_LINE (map, print.line), map->to_file, - special_flags, print.syshdr_flags); + { + fprintf (print.outf, "# %u \"%s\"%s", + SOURCE_LINE (map, print.line), map->to_file, special_flags); + + if (map->sysp == 2) + fputs (" 3 4", print.outf); + else if (map->sysp == 1) + fputs (" 3", print.outf); + + putc ('\n', print.outf); + } } /* Callbacks. */ @@ -382,40 +391,32 @@ cb_include (pfile, line, dir, header) } /* The file name, line number or system header flags have changed, as - described in FC. NB: the old print.map must be considered invalid. */ + described in MAP. From this point on, the old print.map might be + pointing to freed memory, and so must not be dereferenced. */ static void -cb_file_change (pfile, fc) +cb_file_change (pfile, map) cpp_reader *pfile ATTRIBUTE_UNUSED; - const cpp_file_change *fc; + const struct line_map *map; { - bool first_time = print.map == NULL; - - /* Bring current file to correct line. We handle the first file - change callback specially, so that a first line of "# 1 "foo.c" - in file foo.i outputs just the foo.c line, and not a foo.i line. */ - if (fc->reason == LC_ENTER && !first_time) - maybe_print_line (fc->map - 1, fc->line - 1); - - print.map = fc->map; - if (fc->externc) - print.syshdr_flags = " 3 4"; - else if (fc->sysp) - print.syshdr_flags = " 3"; - else - print.syshdr_flags = ""; - - if (!first_time) + /* Not first time? */ + if (print.map) { const char *flags = ""; - if (fc->reason == LC_ENTER) + /* Bring current file to correct line when entering a new file. */ + if (map->reason == LC_ENTER) + maybe_print_line (map - 1, map->from_line - 1); + + if (map->reason == LC_ENTER) flags = " 1"; - else if (fc->reason == LC_LEAVE) + else if (map->reason == LC_LEAVE) flags = " 2"; - print_line (print.map, fc->line, flags); + print_line (map, map->from_line, flags); } + + print.map = map; } /* Copy a #pragma directive to the preprocessed output. LINE is the diff --git a/gcc/line-map.c b/gcc/line-map.c index 1cd1bfdfc0f..d1df5572b83 100644 --- a/gcc/line-map.c +++ b/gcc/line-map.c @@ -45,14 +45,15 @@ free_line_maps (set) { if (set->maps) { -#ifdef ENABLE_CHECKING struct line_map *map; + /* Depending upon whether we are handling preprocessed input or + not, this can be a user error or an ICE. */ for (map = CURRENT_LINE_MAP (set); ! MAIN_FILE_P (map); map = INCLUDED_FROM (set, map)) fprintf (stderr, "line-map.c: file \"%s\" entered but not left\n", map->to_file); -#endif + free (set->maps); } } @@ -64,10 +65,11 @@ free_line_maps (set) FROM_LINE should be monotonic increasing across calls to this function. */ -struct line_map * -add_line_map (set, reason, from_line, to_file, to_line) +const struct line_map * +add_line_map (set, reason, sysp, from_line, to_file, to_line) struct line_maps *set; enum lc_reason reason; + unsigned int sysp; unsigned int from_line; const char *to_file; unsigned int to_line; @@ -85,9 +87,6 @@ add_line_map (set, reason, from_line, to_file, to_line) } map = &set->maps[set->used]; - map->from_line = from_line; - map->to_file = to_file; - map->to_line = to_line; /* If we don't keep our line maps consistent, we can easily segfault. Don't rely on the client to do it for us. */ @@ -95,17 +94,42 @@ add_line_map (set, reason, from_line, to_file, to_line) reason = LC_ENTER; else if (reason == LC_LEAVE) { - if (MAIN_FILE_P (map - 1) - || strcmp (INCLUDED_FROM (set, map - 1)->to_file, to_file)) + struct line_map *from; + bool error; + + if (MAIN_FILE_P (map - 1)) { -#ifdef ENABLE_CHECKING - fprintf (stderr, "line-map.c: file \"%s\" left but not entered\n", - to_file); -#endif + error = true; reason = LC_RENAME; + from = map - 1; + } + else + { + from = INCLUDED_FROM (set, map - 1); + error = to_file && strcmp (from->to_file, to_file); + } + + /* Depending upon whether we are handling preprocessed input or + not, this can be a user error or an ICE. */ + if (error) + fprintf (stderr, "line-map.c: file \"%s\" left but not entered\n", + to_file); + + /* A TO_FILE of NULL is special - we use the natural values. */ + if (error || to_file == NULL) + { + to_file = from->to_file; + to_line = LAST_SOURCE_LINE (from) + 1; + sysp = from->sysp; } } + map->reason = reason; + map->sysp = sysp; + map->from_line = from_line; + map->to_file = to_file; + map->to_line = to_line; + if (reason == LC_ENTER) map->included_from = set->used - 1; else if (reason == LC_RENAME) @@ -122,7 +146,7 @@ add_line_map (set, reason, from_line, to_file, to_line) chronologically, the logical lines are monotonic increasing, and so the list is sorted and we can use a binary search. */ -struct line_map * +const struct line_map * lookup_line (set, line) struct line_maps *set; unsigned int line; @@ -151,7 +175,7 @@ lookup_line (set, line) void print_containing_files (set, map) struct line_maps *set; - struct line_map *map; + const struct line_map *map; { if (MAIN_FILE_P (map) || set->last_listed == map->included_from) return; diff --git a/gcc/line-map.h b/gcc/line-map.h index 865fbced5b6..ed02420e112 100644 --- a/gcc/line-map.h +++ b/gcc/line-map.h @@ -23,17 +23,29 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef GCC_LINE_MAP_H #define GCC_LINE_MAP_H +/* Reason for adding a line change with add_line_map (). LC_ENTER is + when including a new file, e.g. a #include directive in C. + LC_LEAVE is when reaching a file's end. LC_RENAME is when a file + name or line number changes for neither of the above reasons + (e.g. a #line directive in C). */ +enum lc_reason {LC_ENTER = 0, LC_LEAVE, LC_RENAME}; + /* The logical line FROM_LINE maps to physical source file TO_FILE at line TO_LINE, and subsequently one-to-one until the next line_map structure in the set. INCLUDED_FROM is an index into the set that gives the line mapping at whose end the current one was included. - File(s) at the bottom of the include stack have this set to -1. */ + File(s) at the bottom of the include stack have this set to -1. + REASON is the reason for creation of this line map, SYSP is one for + a system header, two for a C system header file that therefore + needs to be extern "C" protected in C++, and zero otherwise. */ struct line_map { const char *to_file; unsigned int to_line; unsigned int from_line; int included_from; + ENUM_BITFIELD (lc_reason) reason : CHAR_BIT; + unsigned char sysp; }; /* A set of chronological line_map structures. */ @@ -49,13 +61,6 @@ struct line_maps int last_listed; }; -/* Reason for adding a line change with add_line_map (). LC_ENTER is - when including a new file, e.g. a #include directive in C. - LC_LEAVE is when reaching a file's end. LC_RENAME is when a file - name or line number changes for neither of the above reasons - (e.g. a #line directive in C). */ -enum lc_reason {LC_ENTER = 0, LC_LEAVE, LC_RENAME}; - /* Initialize a line map set. */ extern void init_line_maps PARAMS ((struct line_maps *)); @@ -66,25 +71,27 @@ extern void free_line_maps /* Add a mapping of logical source line to physical source file and line number. The text pointed to by TO_FILE must have a lifetime - at least as long as the final call to lookup_line (). + at least as long as the line maps. If reason is LC_LEAVE, and + TO_FILE is NULL, then TO_FILE, TO_LINE and SYSP are given their + natural values considering the file we are returning to. FROM_LINE should be monotonic increasing across calls to this function. A call to this function can relocate the previous set of maps, so any stored line_map pointers should not be used. */ -extern struct line_map *add_line_map - PARAMS ((struct line_maps *, enum lc_reason, +extern const struct line_map *add_line_map + PARAMS ((struct line_maps *, enum lc_reason, unsigned int sysp, unsigned int from_line, const char *to_file, unsigned int to_line)); /* Given a logical line, returns the map from which the corresponding (source file, line) pair can be deduced. */ -extern struct line_map *lookup_line +extern const struct line_map *lookup_line PARAMS ((struct line_maps *, unsigned int)); /* Print the file names and line numbers of the #include commands which led to the map MAP, if any, to stderr. Nothing is output if the most recently listed stack is the same as the current one. */ extern void print_containing_files - PARAMS ((struct line_maps *, struct line_map *)); + PARAMS ((struct line_maps *, const struct line_map *)); /* Converts a map and logical line to source line. */ #define SOURCE_LINE(MAP, LINE) ((LINE) + (MAP)->to_line - (MAP)->from_line) |