diff options
author | Per Bothner <per@bothner.com> | 2004-02-11 07:29:30 -0800 |
---|---|---|
committer | Per Bothner <bothner@gcc.gnu.org> | 2004-02-11 07:29:30 -0800 |
commit | 12f9df4ec55a2004a9c9201886440d9503b6a858 (patch) | |
tree | a9c4a3f1215b61026ad26cff4b8f9fc9396740cf /gcc/cpperror.c | |
parent | 8914b65e213507d28c235ddeeff22e4867c2e2c0 (diff) | |
download | gcc-12f9df4ec55a2004a9c9201886440d9503b6a858.zip gcc-12f9df4ec55a2004a9c9201886440d9503b6a858.tar.gz gcc-12f9df4ec55a2004a9c9201886440d9503b6a858.tar.bz2 |
Represent column numbers using line-map's source_location.
The "next available source_location" is now managed internally by
line-maps.c rather than by clients.
* line-map.h (struct line_map): New field column_bits.
<from_line>: Rename field to start_location.
(struct line_maps): New fields highest_location and max_column_hint.
(linemap_check_files_exited): New declaration.
(linemap_line_start): New declaration.
(linemap_add): Remove from_line parameter; use highest_location field.
(SOURCE_LINE, LAST_SOURCE_LINE): Modify to use column_bits.
(SOURCE_COLUMN, LAST_SOURCE_LINE_LOCATION): New macros.
(CURRENT_LINE_MAP): Remove macro.
(linemap_position_for_column): New inline function.
* line-map.c (linemap_init): Clear new fields.
(linemap_check_files_exited): New function, extracted from ...
(linemap_free): Use linemap_check_files_exited.
(linemap_add): Remove from_line parameter. Various updates.
(linemap_line_start): New function.
(linemap_lookeup): Update for new field names.
* cpphash.h (struct cpp_reader) <map>: Field removed. Because
linemap_position_for_column may unpredictably change the current map,
it is cleaner and simpler for us to not cache it in cpp_reader.
(struct cpp_buffer): New sysp field.
Changed warned_cplusplus_comments and from_stage3 to bitfields.
* cppinit.c (cpp_read_min_file): pfile->map no longer exists.
* cpplib.c (do_line, do_linemarker, _cpp_do_file_change): Get
current map using linemap_lookup.
(do_linemarker): Also set buffer's sysp field.
(destringize_and_run): No longer need to decrement current line.
* cppfiles.c (_cpp_stack_file): Set sysp from and in buffer.
(search_path_head, open_file_failed): Use buffer's sysp.
(cpp_make_system_header): Get current map using linemap_lookup.
Also set buffer's sysp flag.
* cppmacro.c (_cpp_builtin_macro_text): Likewise use linemap_lookup.
* cpphash.h (CPP_INCREMENT_LINE): New macro.
(struct cpp_buffer): Moved fields saved_cur, saved_rlimit to ...
(struct cpp_reader): ... and adding saved_line_base field.
* cpptrad.c (_cpp_overlay_buffer, _cpp_remove_overlay):
Update accordingly. Don't adjust line.
(_cpp_scan_out_logical_line): Use CPP_INCREMENT_LINE.
* cpphash.c (CPP_IN_SYSTEM_HEADER): Replaced macro by ...
(cpp_in_system_header): ... new inline function, using buffer's sysp.
* cpperror.c (_cpp_begin_message): Update to use cpp_in_system_header.
* cpplex.c (_cpp_lex_direct): Likewise.
* cppmacro.c (_cpp_builtin_macro_text): Likewise.
* cppmacro.c (_cpp_create_definition): Use buffer's sysp field.
* cpplib.h (struct cpp_token): Rename line field to src_loc.
Remove col field as it is now subsumed by src_loc.
* cpperror.c: Update various field, parameter, and macro names.
(print_location): If col==0, try SOURCE_COLUMN of line.
(cpp_error): Use cur_token's src_loc field, rather than line+col.
* cpplib.c (do_diagnostic): Token's src_loc fields replaces line+col.
* cpplex.c (_cpp_process_line_notes, _cpp_lex_direct,
_cpp_skip_block_comment): Use CPP_INCREMENT_LINE.
(_cpp_temp_token): Replace cpp_token's line+col fields by src_loc.
(_cpp_get_fresh_line): Don't need to adjust line for missing newline.
(_cpp_lex_direct): Use linemap_position_for_column.
* c-ppoutput.c (maybe_print_line, print_line): Don't take map
parameter. Instead get it from the line_table global. Adjust callers.
(print): Remove map field. Replace line field to src_line.
(init_pp_output, account_for_newlines, maybe_print_line): Adjust.
(cb_line_change): Use SOURCE_COLUMN. Minor optimizations.
(pp_file_change): Use MAIN_FILE_P since we cannot checked print.map.
Use LAST_SOURCE_LINE_LOCATION to "catch up" after #include.
* cpptrad.c (copy_comment): Rename variable.
* c-lex.c (map): Remove static variable, for same reason we removed
cpp_reader's map field.
(cb_line_change, cb_def_pragma, cb_define, cb_undef): Hence we need
to call linemap_lookup.
(cb_line_change): Token's line field replaced by src_loc.
(fe_file_change): Use MAINFILE_P and LAST_SOURCE_LINE macros.
Don't save new_map.
* cpphash.h, cpperror.c, cpplib.h: Some renames of fileline to
source_location.
From-SVN: r77663
Diffstat (limited to 'gcc/cpperror.c')
-rw-r--r-- | gcc/cpperror.c | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/gcc/cpperror.c b/gcc/cpperror.c index 776f6e8..d572380 100644 --- a/gcc/cpperror.c +++ b/gcc/cpperror.c @@ -29,14 +29,14 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "cpphash.h" #include "intl.h" -static void print_location (cpp_reader *, fileline, unsigned int); +static void print_location (cpp_reader *, source_location, unsigned int); /* Print the logical file location (LINE, COL) in preparation for a diagnostic. Outputs the #include chain if it has changed. A line of zero suppresses the include stack, and outputs the program name instead. */ static void -print_location (cpp_reader *pfile, fileline line, unsigned int col) +print_location (cpp_reader *pfile, source_location line, unsigned int col) { if (line == 0) fprintf (stderr, "%s: ", progname); @@ -50,7 +50,11 @@ print_location (cpp_reader *pfile, fileline line, unsigned int col) lin = SOURCE_LINE (map, line); if (col == 0) - col = 1; + { + col = SOURCE_COLUMN (map, line); + if (col == 0) + col = 1; + } if (lin == 0) fprintf (stderr, "%s:", map->to_file); @@ -64,13 +68,18 @@ print_location (cpp_reader *pfile, fileline line, unsigned int col) } /* Set up for a diagnostic: print the file and line, bump the error - counter, etc. LINE is the logical line number; zero means to print + counter, etc. SRC_LOC is the logical line number; zero means to print at the location of the previously lexed token, which tends to be - the correct place by default. Returns 0 if the error has been - suppressed. */ + the correct place by default. The column number can be specified either + using COLUMN or (if COLUMN==0) extracting SOURCE_COLUMN from SRC_LOC. + (This may seem redundant, but is useful when pre-scanning (cleaning) a line, + when we haven't yet verified whether the current line_map has a + big enough max_column_hint.) + + Returns 0 if the error has been suppressed. */ int -_cpp_begin_message (cpp_reader *pfile, int code, fileline line, - unsigned int column) +_cpp_begin_message (cpp_reader *pfile, int code, + source_location src_loc, unsigned int column) { int level = CPP_DL_EXTRACT (code); @@ -78,7 +87,7 @@ _cpp_begin_message (cpp_reader *pfile, int code, fileline line, { case CPP_DL_WARNING: case CPP_DL_PEDWARN: - if (CPP_IN_SYSTEM_HEADER (pfile) + if (cpp_in_system_header (pfile) && ! CPP_OPTION (pfile, warn_system_headers)) return 0; /* Fall through. */ @@ -105,7 +114,7 @@ _cpp_begin_message (cpp_reader *pfile, int code, fileline line, break; } - print_location (pfile, line, column); + print_location (pfile, src_loc, column); if (CPP_DL_WARNING_P (level)) fputs (_("warning: "), stderr); else if (level == CPP_DL_ICE) @@ -125,8 +134,7 @@ _cpp_begin_message (cpp_reader *pfile, int code, fileline line, void cpp_error (cpp_reader * pfile, int level, const char *msgid, ...) { - fileline line; - unsigned int column; + source_location src_loc; va_list ap; va_start (ap, msgid); @@ -134,18 +142,16 @@ cpp_error (cpp_reader * pfile, int level, const char *msgid, ...) if (CPP_OPTION (pfile, traditional)) { if (pfile->state.in_directive) - line = pfile->directive_line; + src_loc = pfile->directive_line; else - line = pfile->line; - column = 0; + src_loc = pfile->line; } else { - line = pfile->cur_token[-1].line; - column = pfile->cur_token[-1].col; + src_loc = pfile->cur_token[-1].src_loc; } - if (_cpp_begin_message (pfile, level, line, column)) + if (_cpp_begin_message (pfile, level, src_loc, 0)) v_message (msgid, ap); va_end (ap); @@ -154,14 +160,14 @@ cpp_error (cpp_reader * pfile, int level, const char *msgid, ...) /* Print an error at a specific location. */ void cpp_error_with_line (cpp_reader *pfile, int level, - fileline line, unsigned int column, + source_location src_loc, unsigned int column, const char *msgid, ...) { va_list ap; va_start (ap, msgid); - if (_cpp_begin_message (pfile, level, line, column)) + if (_cpp_begin_message (pfile, level, src_loc, column)) v_message (msgid, ap); va_end (ap); |