diff options
author | neil <neil@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-11-27 08:00:04 +0000 |
---|---|---|
committer | neil <neil@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-11-27 08:00:04 +0000 |
commit | d7503801e5662ff8d132df1e21bdfcbeaa3a5174 (patch) | |
tree | 6ecb94c4e9edb0c2004142e389531669ea20c416 /gcc | |
parent | 15155f829e7ddc1a5dd4a45cecdcf9d173c74380 (diff) | |
download | gcc-d7503801e5662ff8d132df1e21bdfcbeaa3a5174.tar.gz |
* c-lex.c (cb_enter_file, cb_leave_file, cb_rename_file):
Combine into the new function cb_change_file.
(init_c_lex): Update.
* cppfiles.c (stack_include_file): Use _cpp_do_file_change.
(cpp_syshdr_flags): Delete.
* cpphash.h (_cpp_do_file_change): New prototype.
Move struct cpp_buffer here from...
* cpplib.h (struct cpp_buffer): ... here.
(enum cpp_fc_reason, struct cpp_file_loc,
struct_cpp_file_change, change_file): New.
(enter_file, leave_file, rename_file, cpp_syshdr_flags): Delete.
* cpplib.c (do_line): Update for new cb_change_file callback.
(_cpp_do_file_change): New function.
(_cpp_pop_buffer): Update to use it.
* cppmain.c (move_printer): Delete.
(main): Set up single callback cb_change_file.
(cb_enter_file, cb_leave_file, cb_rename_file): Delete.
(cb_change_file): New.
* fix-header.c (cur_file, cb_change_file): New.
(recognized_function, read_scan_file): Update.
* scan-decls.c (scan_decls): Update.
* scan.h (recognized_function): Update prototype.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37784 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 25 | ||||
-rw-r--r-- | gcc/c-lex.c | 351 | ||||
-rw-r--r-- | gcc/cppfiles.c | 28 | ||||
-rw-r--r-- | gcc/cpphash.h | 54 | ||||
-rw-r--r-- | gcc/cpplib.c | 96 | ||||
-rw-r--r-- | gcc/cpplib.h | 76 | ||||
-rw-r--r-- | gcc/cppmain.c | 67 | ||||
-rw-r--r-- | gcc/fix-header.c | 26 | ||||
-rw-r--r-- | gcc/scan-decls.c | 3 | ||||
-rw-r--r-- | gcc/scan.h | 3 |
10 files changed, 262 insertions, 467 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 099d51c890f..df1f036d042 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,28 @@ +2000-11-27 Neil Booth <neilb@earthling.net> + + * c-lex.c (cb_enter_file, cb_leave_file, cb_rename_file): + Combine into the new function cb_change_file. + (init_c_lex): Update. + * cppfiles.c (stack_include_file): Use _cpp_do_file_change. + (cpp_syshdr_flags): Delete. + * cpphash.h (_cpp_do_file_change): New prototype. + Move struct cpp_buffer here from... + * cpplib.h (struct cpp_buffer): ... here. + (enum cpp_fc_reason, struct cpp_file_loc, + struct_cpp_file_change, change_file): New. + (enter_file, leave_file, rename_file, cpp_syshdr_flags): Delete. + * cpplib.c (do_line): Update for new cb_change_file callback. + (_cpp_do_file_change): New function. + (_cpp_pop_buffer): Update to use it. + * cppmain.c (move_printer): Delete. + (main): Set up single callback cb_change_file. + (cb_enter_file, cb_leave_file, cb_rename_file): Delete. + (cb_change_file): New. + * fix-header.c (cur_file, cb_change_file): New. + (recognized_function, read_scan_file): Update. + * scan-decls.c (scan_decls): Update. + * scan.h (recognized_function): Update prototype. + 2000-11-26 Mark Mitchell <mark@codesourcery.com> * tree.h (mark_tree_hashtable): New function. diff --git a/gcc/c-lex.c b/gcc/c-lex.c index 552495e25ea..959b10331b5 100644 --- a/gcc/c-lex.c +++ b/gcc/c-lex.c @@ -93,9 +93,7 @@ static tree lex_charconst PARAMS ((const char *, unsigned int, int)); 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 *, const cpp_string *)); -static void cb_enter_file PARAMS ((cpp_reader *)); -static void cb_leave_file PARAMS ((cpp_reader *)); -static void cb_rename_file PARAMS ((cpp_reader *)); +static void cb_change_file PARAMS ((cpp_reader *, const cpp_file_change *)); static void cb_def_pragma PARAMS ((cpp_reader *)); const char * @@ -125,9 +123,7 @@ init_c_lex (filename) #endif parse_in.cb.ident = cb_ident; - parse_in.cb.enter_file = cb_enter_file; - parse_in.cb.leave_file = cb_leave_file; - parse_in.cb.rename_file = cb_rename_file; + parse_in.cb.change_file = cb_change_file; parse_in.cb.def_pragma = cb_def_pragma; /* Make sure parse_in.digraphs matches flag_digraphs. */ @@ -218,195 +214,55 @@ dump_time_statistics () splay_tree_foreach (file_info_tree, dump_one_header, 0); } -#if 0 /* Keep this code for a while for reference. */ +/* Not yet handled: #pragma, #define, #undef. + No need to deal with linemarkers under normal conditions. */ + static void -process_directive () +cb_ident (pfile, str) + cpp_reader *pfile ATTRIBUTE_UNUSED; + const cpp_string *str; { - enum cpp_ttype token; - tree value; - int saw_line; - enum { act_none, act_push, act_pop } action; - int action_number, l; - const char *new_file; -#ifndef NO_IMPLICIT_EXTERN_C - int entering_c_header = 0; -#endif - - /* Don't read beyond this line. */ - saw_line = 0; - linemode = 1; - - token = c_lex (&value); - - if (token == CPP_NAME) - { - /* If a letter follows, then if the word here is `line', skip - it and ignore it; otherwise, ignore the line, with an error - if the word isn't `pragma'. */ - - const char *name = IDENTIFIER_POINTER (value); - - if (!strcmp (name, "pragma")) - { - dispatch_pragma (); - goto skipline; - } - else if (!strcmp (name, "define")) - { - debug_define (lex_lineno, GET_DIRECTIVE_LINE ()); - goto skipline; - } - else if (!strcmp (name, "undef")) - { - debug_undef (lex_lineno, GET_DIRECTIVE_LINE ()); - goto skipline; - } - else if (!strcmp (name, "line")) - { - saw_line = 1; - token = c_lex (&value); - goto linenum; - } - else if (!strcmp (name, "ident")) - { - /* #ident. We expect a string constant here. - The pedantic warning and syntax error are now in cpp. */ - - token = c_lex (&value); - if (token != CPP_STRING || TREE_CODE (value) != STRING_CST) - goto skipline; - #ifdef ASM_OUTPUT_IDENT - if (! flag_no_ident) - { - ASM_OUTPUT_IDENT (asm_out_file, TREE_STRING_POINTER (value)); - } -#endif - - /* Skip the rest of this line. */ - goto skipline; - } - - error ("undefined or invalid # directive `%s'", name); - goto skipline; - } - - /* If the # is the only nonwhite char on the line, - just ignore it. Check the new newline. */ - if (token == CPP_EOF) - goto skipline; - -linenum: - /* Here we have either `#line' or `# <nonletter>'. - In either case, it should be a line number; a digit should follow. */ - - if (token != CPP_NUMBER || TREE_CODE (value) != INTEGER_CST) - { - error ("invalid #-line"); - goto skipline; - } - - /* subtract one, because it is the following line that - gets the specified number */ - - l = TREE_INT_CST_LOW (value) - 1; - - /* More follows: it must be a string constant (filename). - It would be neat to use cpplib to quickly process the string, but - (1) we don't have a handy tokenization of the string, and - (2) I don't know how well that would work in the presense - of filenames that contain wide characters. */ - - if (saw_line) - { - /* Don't treat \ as special if we are processing #line 1 "...". - If you want it to be treated specially, use # 1 "...". */ - ignore_escape_flag = 1; - } - - /* Read the string constant. */ - token = c_lex (&value); - - ignore_escape_flag = 0; - - if (token == CPP_EOF) - { - /* No more: store the line number and check following line. */ - lex_lineno = l; - goto skipline; - } - - if (token != CPP_STRING || TREE_CODE (value) != STRING_CST) - { - error ("invalid #line"); - goto skipline; - } - - new_file = TREE_STRING_POINTER (value); - - if (main_input_filename == 0) - main_input_filename = new_file; - - action = act_none; - action_number = 0; - - /* Each change of file name - reinitializes whether we are now in a system header. */ - in_system_header = 0; - - if (!read_line_number (&action_number)) - { - /* Update the name in the top element of input_file_stack. */ - if (input_file_stack) - input_file_stack->name = input_filename; - } - - /* `1' after file name means entering new file. - `2' after file name means just left a file. */ - - if (action_number == 1) - { - action = act_push; - read_line_number (&action_number); - } - else if (action_number == 2) - { - action = act_pop; - read_line_number (&action_number); - } - if (action_number == 3) - { - /* `3' after file name means this is a system header file. */ - in_system_header = 1; - read_line_number (&action_number); - } -#ifndef NO_IMPLICIT_EXTERN_C - if (action_number == 4) + if (! flag_no_ident) { - /* `4' after file name means this is a C header file. */ - entering_c_header = 1; - read_line_number (&action_number); + /* Convert escapes in the string. */ + tree value = lex_string ((const char *)str->text, str->len, 0); + ASM_OUTPUT_IDENT (asm_out_file, TREE_STRING_POINTER (value)); } #endif +} + +static void +cb_change_file (pfile, fc) + cpp_reader *pfile ATTRIBUTE_UNUSED; + const cpp_file_change *fc; +{ + if (fc->from.filename == 0) + main_input_filename = fc->to.filename; + in_system_header = fc->sysp; /* Do the actions implied by the preceding numbers. */ - if (action == act_push) + if (fc->reason == FC_ENTER) { - lineno = lex_lineno; - push_srcloc (input_filename, 1); - input_file_stack->indent_level = indent_level; - debug_start_source_file (input_filename); -#ifndef NO_IMPLICIT_EXTERN_C - if (c_header_level) - ++c_header_level; - else if (entering_c_header) + /* FIXME. Don't stack the main buffer on the input stack. */ + if (fc->from.filename) { - c_header_level = 1; - ++pending_lang_change; - } + lineno = lex_lineno; + push_srcloc (fc->to.filename, 1); + input_file_stack->indent_level = indent_level; + debug_start_source_file (fc->to.filename); +#ifndef NO_IMPLICIT_EXTERN_C + if (c_header_level) + ++c_header_level; + else if (fc->externc) + { + c_header_level = 1; + ++pending_lang_change; + } #endif + } } - else if (action == act_pop) + else if (fc->reason == FC_LEAVE) { /* Popping out of a file. */ if (input_file_stack->next) @@ -414,7 +270,7 @@ linenum: #ifndef NO_IMPLICIT_EXTERN_C if (c_header_level && --c_header_level == 0) { - if (entering_c_header) + if (fc->externc) warning ("badly nested C headers from preprocessor"); --pending_lang_change; } @@ -433,131 +289,16 @@ linenum: debug_end_source_file (input_file_stack->line); } else - error ("#-lines for entering and leaving files don't match"); - } - - update_header_times (new_file); - - input_filename = new_file; - lex_lineno = l; - - /* Hook for C++. */ - extract_interface_info (); - - /* skip the rest of this line. */ - skipline: - linemode = 0; - - while (getch () != '\n'); -} -#endif - -/* Not yet handled: #pragma, #define, #undef. - No need to deal with linemarkers under normal conditions. */ - -static void -cb_ident (pfile, str) - cpp_reader *pfile ATTRIBUTE_UNUSED; - const cpp_string *str; -{ -#ifdef ASM_OUTPUT_IDENT - if (! flag_no_ident) - { - /* Convert escapes in the string. */ - tree value = lex_string ((const char *)str->text, str->len, 0); - ASM_OUTPUT_IDENT (asm_out_file, TREE_STRING_POINTER (value)); - } -#endif -} - -static void -cb_enter_file (pfile) - cpp_reader *pfile; -{ - cpp_buffer *ip = CPP_BUFFER (pfile); - /* Bleah, need a better interface to this. */ - const char *flags = cpp_syshdr_flags (pfile, ip); - - /* Mustn't stack the main buffer on the input stack. (Ick.) */ - if (ip->prev) - { - lex_lineno = lineno = ip->prev->lineno - 1; - push_srcloc (ip->nominal_fname, 1); - input_file_stack->indent_level = indent_level; - debug_start_source_file (ip->nominal_fname); + error ("leaving more files than we entered"); } - else - lex_lineno = 1; + else if (fc->reason == FC_RENAME) + input_filename = fc->to.filename; - update_header_times (ip->nominal_fname); + update_header_times (fc->to.filename); - /* Hook for C++. */ - extract_interface_info (); + input_filename = fc->to.filename; + lex_lineno = fc->to.lineno; - in_system_header = (flags[0] != 0); -#ifndef NO_IMPLICIT_EXTERN_C - if (c_header_level) - ++c_header_level; - else if (in_system_header && flags[1] != 0 && flags[2] != 0) - { - c_header_level = 1; - ++pending_lang_change; - } -#endif -} - -static void -cb_leave_file (pfile) - cpp_reader *pfile; -{ - /* Bleah, need a better interface to this. */ - const char *flags = cpp_syshdr_flags (pfile, CPP_BUFFER (pfile)); - - if (input_file_stack->next) - { -#ifndef NO_IMPLICIT_EXTERN_C - if (c_header_level && --c_header_level == 0) - { - if (flags[2] != 0) - 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, lex_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 - /* We get called for the main buffer, but we mustn't pop it. */ - pop_srcloc (); - debug_end_source_file (input_file_stack->line); - } - - in_system_header = (flags[0] != 0); - lex_lineno = CPP_BUFFER (pfile)->lineno; - - update_header_times (input_file_stack->name); - /* Hook for C++. */ - extract_interface_info (); -} - -static void -cb_rename_file (pfile) - cpp_reader *pfile; -{ - cpp_buffer *ip = CPP_BUFFER (pfile); - /* Bleah, need a better interface to this. */ - const char *flags = cpp_syshdr_flags (pfile, ip); - input_filename = ip->nominal_fname; - lex_lineno = ip->lineno; - in_system_header = (flags[0] != 0); - - update_header_times (ip->nominal_fname); /* Hook for C++. */ extract_interface_info (); } diff --git a/gcc/cppfiles.c b/gcc/cppfiles.c index 47bf43f211f..9af0c396cd7 100644 --- a/gcc/cppfiles.c +++ b/gcc/cppfiles.c @@ -212,8 +212,16 @@ stack_include_file (pfile, inc) cpp_reader *pfile; struct include_file *inc; { + const char *filename = 0; + unsigned int lineno = 0; cpp_buffer *fp; + if (pfile->buffer) + { + filename = pfile->buffer->nominal_fname; + lineno = pfile->buffer->lineno; + } + if (pfile->context->prev) cpp_ice (pfile, "attempt to push file buffer with contexts stacked"); @@ -237,7 +245,7 @@ stack_include_file (pfile, inc) fp->buf = inc->buffer; fp->rlimit = fp->buf + inc->st.st_size; fp->cur = fp->buf; - fp->lineno = 1; + fp->lineno = 0; fp->line_base = fp->buf; /* The ->actual_dir field is only used when ignore_srcdir is not in effect; @@ -249,9 +257,9 @@ stack_include_file (pfile, inc) pfile->include_depth++; pfile->input_stack_listing_current = 0; - if (pfile->cb.enter_file) - (*pfile->cb.enter_file) (pfile); + _cpp_do_file_change (pfile, FC_ENTER, filename, lineno); + fp->lineno = 1; return 1; } @@ -531,20 +539,6 @@ cpp_make_system_header (pfile, pbuf, flag) pbuf->inc->sysp = flag; } -const char * -cpp_syshdr_flags (pfile, pbuf) - cpp_reader *pfile ATTRIBUTE_UNUSED; - cpp_buffer *pbuf; -{ -#ifndef NO_IMPLICIT_EXTERN_C - if (CPP_OPTION (pfile, cplusplus) && pbuf->inc->sysp == 2) - return " 3 4"; -#endif - if (pbuf->inc->sysp) - return " 3"; - return ""; -} - /* Report on all files that might benefit from a multiple include guard. Triggered by -H. */ void diff --git a/gcc/cpphash.h b/gcc/cpphash.h index 500c0c25747..698f545cae2 100644 --- a/gcc/cpphash.h +++ b/gcc/cpphash.h @@ -98,6 +98,58 @@ struct include_file ((inc)->cmacro && ((inc)->cmacro == NEVER_REREAD \ || ((inc)->cmacro->type == NT_MACRO) == (inc)->defined)) +struct cpp_buffer +{ + const unsigned char *cur; /* current position */ + const unsigned char *rlimit; /* end of valid data */ + const unsigned char *line_base; /* start of current line */ + cppchar_t read_ahead; /* read ahead character */ + cppchar_t extra_char; /* extra read-ahead for long tokens. */ + + struct cpp_reader *pfile; /* Owns this buffer. */ + struct cpp_buffer *prev; + + const unsigned char *buf; /* entire buffer */ + + /* Filename specified with #line command. */ + const char *nominal_fname; + + /* Actual directory of this file, used only for "" includes */ + struct file_name_list *actual_dir; + + /* Pointer into the include table. Used for include_next and + to record control macros. */ + struct include_file *inc; + + /* Value of if_stack at start of this file. + Used to prohibit unmatched #endif (etc) in an include file. */ + struct if_stack *if_stack; + + /* Token column position adjustment owing to tabs in whitespace. */ + unsigned int col_adjust; + + /* Line number at line_base (above). */ + unsigned int lineno; + + /* Because of the way the lexer works, -Wtrigraphs can sometimes + warn twice for the same trigraph. This helps prevent that. */ + const unsigned char *last_Wtrigraphs; + + /* True if we have already warned about C++ comments in this file. + The warning happens only for C89 extended mode with -pedantic on, + or for -Wtraditional, and only once per file (otherwise it would + be far too noisy). */ + unsigned char warned_cplusplus_comments; + + /* True if we don't process trigraphs and escaped newlines. True + for preprocessed input, command line directives, and _Pragma + buffers. */ + unsigned char from_stage3; + + /* Temporary storage for pfile->skipping whilst in a directive. */ + unsigned char was_skipping; +}; + /* Character classes. If the definition of `numchar' looks odd to you, please look up the definition of a pp-number in the C standard [section 6.4.8 of C99]. @@ -208,6 +260,8 @@ extern void _cpp_do__Pragma PARAMS ((cpp_reader *)); extern void _cpp_init_stacks PARAMS ((cpp_reader *)); extern void _cpp_cleanup_stacks PARAMS ((cpp_reader *)); extern void _cpp_init_internal_pragmas PARAMS ((cpp_reader *)); +extern void _cpp_do_file_change PARAMS ((cpp_reader *, enum cpp_fc_reason, + const char *, unsigned int)); /* Utility routines and macros. */ #define DSC(str) (const U_CHAR *)str, sizeof str - 1 diff --git a/gcc/cpplib.c b/gcc/cpplib.c index 48a8bf6052b..de72e989d34 100644 --- a/gcc/cpplib.c +++ b/gcc/cpplib.c @@ -718,13 +718,17 @@ static void do_line (pfile) cpp_reader *pfile; { - cpp_buffer *ip = CPP_BUFFER (pfile); + cpp_buffer *buffer = pfile->buffer; + const char *filename = buffer->nominal_fname; + unsigned int lineno = buffer->lineno; + enum cpp_fc_reason reason = (enum cpp_fc_reason) -1; unsigned long new_lineno; - /* C99 raised the minimum limit on #line numbers. */ - unsigned int cap = CPP_OPTION (pfile, c99) ? 2147483647 : 32767; - int enter = 0, leave = 0, rename = 0; + unsigned int cap; cpp_token token; + /* C99 raised the minimum limit on #line numbers. */ + cap = CPP_OPTION (pfile, c99) ? 2147483647 : 32767; + /* #line commands expand macros. */ cpp_get_token (pfile, &token); if (token.type != CPP_NUMBER @@ -739,32 +743,24 @@ do_line (pfile) cpp_pedwarn (pfile, "line number out of range"); cpp_get_token (pfile, &token); - - if (token.type != CPP_EOF) + if (token.type == CPP_STRING) { char *fname; unsigned int len; int action_number = 0; - if (token.type != CPP_STRING) - { - cpp_error (pfile, "\"%s\" is not a valid filename", - cpp_token_as_text (pfile, &token)); - return; - } - len = token.val.str.len; fname = alloca (len + 1); memcpy (fname, token.val.str.text, len); fname[len] = '\0'; - if (strcmp (fname, ip->nominal_fname)) + if (strcmp (fname, buffer->nominal_fname)) { - rename = 1; - if (!strcmp (fname, ip->inc->name)) - ip->nominal_fname = ip->inc->name; + reason = FC_RENAME; + if (!strcmp (fname, buffer->inc->name)) + buffer->nominal_fname = buffer->inc->name; else - ip->nominal_fname = _cpp_fake_include (pfile, fname); + buffer->nominal_fname = _cpp_fake_include (pfile, fname); } if (read_line_number (pfile, &action_number) != 0) @@ -774,39 +770,66 @@ do_line (pfile) if (action_number == 1) { - enter = 1; - cpp_make_system_header (pfile, ip, 0); + reason = FC_ENTER; + cpp_make_system_header (pfile, buffer, 0); read_line_number (pfile, &action_number); } else if (action_number == 2) { - leave = 1; - cpp_make_system_header (pfile, ip, 0); + reason = FC_LEAVE; + cpp_make_system_header (pfile, buffer, 0); read_line_number (pfile, &action_number); } if (action_number == 3) { - cpp_make_system_header (pfile, ip, 1); + cpp_make_system_header (pfile, buffer, 1); read_line_number (pfile, &action_number); } if (action_number == 4) { - cpp_make_system_header (pfile, ip, 2); + cpp_make_system_header (pfile, buffer, 2); read_line_number (pfile, &action_number); } } + check_eol (pfile); } + else if (token.type != CPP_EOF) + { + cpp_error (pfile, "\"%s\" is not a valid filename", + cpp_token_as_text (pfile, &token)); + return; + } /* Our line number is incremented after the directive is processed. */ - ip->lineno = new_lineno - 1; - pfile->lexer_pos.output_line = ip->lineno; - if (enter && pfile->cb.enter_file) - (*pfile->cb.enter_file) (pfile); - if (leave && pfile->cb.leave_file) - (*pfile->cb.leave_file) (pfile); - if (rename && pfile->cb.rename_file) - (*pfile->cb.rename_file) (pfile); + buffer->lineno = new_lineno - 1; + if (reason != (enum cpp_fc_reason) -1) + _cpp_do_file_change (pfile, reason, filename, lineno); +} + +/* Arrange the file_change callback. The assumption is that the + current buffer's lineno is one less than the next line. */ +void +_cpp_do_file_change (pfile, reason, from_file, from_lineno) + cpp_reader *pfile; + enum cpp_fc_reason reason; + const char *from_file; + unsigned int from_lineno; +{ + if (pfile->cb.change_file) + { + cpp_file_change fc; + cpp_buffer *buffer = pfile->buffer; + + fc.reason = reason; + fc.from.filename = from_file; + fc.from.lineno = from_lineno; + fc.to.filename = buffer->nominal_fname; + fc.to.lineno = buffer->lineno + 1; + fc.sysp = buffer->inc->sysp; + fc.externc = CPP_OPTION (pfile, cplusplus) && buffer->inc->sysp == 2; + pfile->cb.change_file (pfile, &fc); + } } /* @@ -1745,8 +1768,10 @@ cpp_pop_buffer (pfile) cpp_reader *pfile; { cpp_buffer *buffer = pfile->buffer; + const char *filename = buffer->nominal_fname; + unsigned int lineno = buffer->lineno; struct if_stack *ifs = buffer->if_stack; - int wfb; + int wfb = (buffer->inc != 0); /* Walk back up the conditional stack till we reach its level at entry to this file, issuing error messages. */ @@ -1754,7 +1779,6 @@ cpp_pop_buffer (pfile) cpp_error_with_line (pfile, ifs->pos.line, ifs->pos.col, "unterminated #%s", dtable[ifs->type].name); - wfb = (buffer->inc != 0); if (wfb) _cpp_pop_file_buffer (pfile, buffer); @@ -1762,8 +1786,8 @@ cpp_pop_buffer (pfile) obstack_free (pfile->buffer_ob, buffer); pfile->buffer_stack_depth--; - if (pfile->buffer && wfb && pfile->cb.leave_file) - (*pfile->cb.leave_file) (pfile); + if (pfile->buffer && wfb) + _cpp_do_file_change (pfile, FC_LEAVE, filename, lineno); return pfile->buffer; } diff --git a/gcc/cpplib.h b/gcc/cpplib.h index 4ad00461be5..18ad1cd29b2 100644 --- a/gcc/cpplib.h +++ b/gcc/cpplib.h @@ -249,58 +249,6 @@ struct cpp_context same reason we use unsigned char - to avoid signedness issues. */ typedef int cppchar_t; -struct cpp_buffer -{ - const unsigned char *cur; /* current position */ - const unsigned char *rlimit; /* end of valid data */ - const unsigned char *line_base; /* start of current line */ - cppchar_t read_ahead; /* read ahead character */ - cppchar_t extra_char; /* extra read-ahead for long tokens. */ - - struct cpp_reader *pfile; /* Owns this buffer. */ - struct cpp_buffer *prev; - - const unsigned char *buf; /* entire buffer */ - - /* Filename specified with #line command. */ - const char *nominal_fname; - - /* Actual directory of this file, used only for "" includes */ - struct file_name_list *actual_dir; - - /* Pointer into the include table. Used for include_next and - to record control macros. */ - struct include_file *inc; - - /* Value of if_stack at start of this file. - Used to prohibit unmatched #endif (etc) in an include file. */ - struct if_stack *if_stack; - - /* Token column position adjustment owing to tabs in whitespace. */ - unsigned int col_adjust; - - /* Line number at line_base (above). */ - unsigned int lineno; - - /* Because of the way the lexer works, -Wtrigraphs can sometimes - warn twice for the same trigraph. This helps prevent that. */ - const unsigned char *last_Wtrigraphs; - - /* True if we have already warned about C++ comments in this file. - The warning happens only for C89 extended mode with -pedantic on, - or for -Wtraditional, and only once per file (otherwise it would - be far too noisy). */ - unsigned char warned_cplusplus_comments; - - /* True if we don't process trigraphs and escaped newlines. True - for preprocessed input, command line directives, and _Pragma - buffers. */ - unsigned char from_stage3; - - /* Temporary storage for pfile->skipping whilst in a directive. */ - unsigned char was_skipping; -}; - /* Maximum nesting of cpp_buffers. We use a static limit, partly for efficiency, and partly to limit runaway recursion. */ #define CPP_STACK_MAX 200 @@ -523,6 +471,25 @@ struct spec_nodes cpp_hashnode *n__VA_ARGS__; /* C99 vararg macros */ }; +/* This structure is passed to the call back when changing file. */ +enum cpp_fc_reason {FC_ENTER = 0, FC_LEAVE, FC_RENAME}; + +struct cpp_file_loc +{ + const char *filename; + unsigned int lineno; +}; + +typedef struct cpp_file_change cpp_file_change; +struct cpp_file_change +{ + struct cpp_file_loc from; /* Line of #include or #line. */ + struct cpp_file_loc to; /* Line after #include or #line, or start. */ + enum cpp_fc_reason reason; /* Reason for change. */ + unsigned char sysp; /* Nonzero if system header. */ + unsigned char externc; /* Nonzero if wrapper needed. */ +}; + /* A cpp_reader encapsulates the "state" of a pre-processor run. Applying cpp_get_token repeatedly yields a stream of pre-processor tokens. Usually, there is only one cpp_reader object active. */ @@ -624,9 +591,7 @@ struct cpp_reader /* Call backs. */ struct { - void (*enter_file) PARAMS ((cpp_reader *)); - void (*leave_file) PARAMS ((cpp_reader *)); - void (*rename_file) PARAMS ((cpp_reader *)); + void (*change_file) PARAMS ((cpp_reader *, const cpp_file_change *)); void (*include) PARAMS ((cpp_reader *, const unsigned char *, const cpp_token *)); void (*define) PARAMS ((cpp_reader *, cpp_hashnode *)); @@ -826,7 +791,6 @@ extern void cpp_stop_lookahead PARAMS ((cpp_reader *, int)); extern int cpp_included PARAMS ((cpp_reader *, const char *)); extern int cpp_read_file PARAMS ((cpp_reader *, const char *)); extern void cpp_make_system_header PARAMS ((cpp_reader *, cpp_buffer *, int)); -extern const char *cpp_syshdr_flags PARAMS ((cpp_reader *, cpp_buffer *)); /* These are inline functions instead of macros so we can get type checking. */ diff --git a/gcc/cppmain.c b/gcc/cppmain.c index 4e096c4abf9..7a597fbbaaf 100644 --- a/gcc/cppmain.c +++ b/gcc/cppmain.c @@ -46,7 +46,6 @@ static int dump_macro PARAMS ((cpp_reader *, cpp_hashnode *, void *)); static void print_line PARAMS ((const char *)); static void maybe_print_line PARAMS ((unsigned int)); -static void move_printer PARAMS ((cpp_reader *, unsigned int, const char *)); /* Callback routines for the parser. Most of these are active only in specific modes. */ @@ -55,9 +54,7 @@ static void cb_undef PARAMS ((cpp_reader *, cpp_hashnode *)); static void cb_include PARAMS ((cpp_reader *, const unsigned char *, const cpp_token *)); static void cb_ident PARAMS ((cpp_reader *, const cpp_string *)); -static void cb_enter_file PARAMS ((cpp_reader *)); -static void cb_leave_file PARAMS ((cpp_reader *)); -static void cb_rename_file PARAMS ((cpp_reader *)); +static void cb_change_file PARAMS ((cpp_reader *, const cpp_file_change *)); static void cb_def_pragma PARAMS ((cpp_reader *)); static void do_pragma_implementation PARAMS ((cpp_reader *)); @@ -108,11 +105,7 @@ main (argc, argv) pfile->cb.ident = cb_ident; pfile->cb.def_pragma = cb_def_pragma; if (! CPP_OPTION (pfile, no_line_commands)) - { - pfile->cb.enter_file = cb_enter_file; - pfile->cb.leave_file = cb_leave_file; - pfile->cb.rename_file = cb_rename_file; - } + pfile->cb.change_file = cb_change_file; } if (CPP_OPTION (pfile, dump_includes)) @@ -285,18 +278,6 @@ print_line (special_flags) print.lineno, print.last_fname, special_flags, print.syshdr_flags); } -static void -move_printer (pfile, line, special_flags) - cpp_reader *pfile; - unsigned int line; - const char *special_flags; -{ - print.lineno = line; - print.last_fname = pfile->buffer->nominal_fname; - print.syshdr_flags = cpp_syshdr_flags (pfile, pfile->buffer); - print_line (special_flags); -} - /* Callbacks */ static void @@ -354,29 +335,33 @@ cb_include (pfile, dir, header) } static void -cb_enter_file (pfile) - cpp_reader *pfile; +cb_change_file (pfile, fc) + cpp_reader *pfile ATTRIBUTE_UNUSED; + const cpp_file_change *fc; { - /* Bring current file to correct line (except main file). FIXME: we - may be using the same buffer via a # NUMBER "file" 1 directive. */ - if (pfile->done_initializing && pfile->buffer->prev) - maybe_print_line (pfile->buffer->prev->lineno); - - move_printer (pfile, 1, pfile->done_initializing ? " 1": ""); -} + const char *flags; + + /* Bring current file to correct line (except first file). */ + if (fc->reason == FC_ENTER && fc->from.filename) + maybe_print_line (fc->from.lineno); + + print.lineno = fc->to.lineno; + print.last_fname = fc->to.filename; + if (fc->externc) + print.syshdr_flags = " 3 4"; + else if (fc->sysp) + print.syshdr_flags = " 3"; + else + print.syshdr_flags = ""; -static void -cb_leave_file (pfile) - cpp_reader *pfile; -{ - move_printer (pfile, pfile->buffer->lineno + 1, " 2"); -} + switch (fc->reason) + { + case FC_ENTER : flags = fc->from.filename ? " 1": ""; break; + case FC_LEAVE : flags = " 2"; break; + case FC_RENAME: flags = ""; break; + } -static void -cb_rename_file (pfile) - cpp_reader *pfile; -{ - move_printer (pfile, pfile->buffer->lineno + 1, ""); + print_line (flags); } static void diff --git a/gcc/fix-header.c b/gcc/fix-header.c index b3138488086..5fb2c6a2916 100644 --- a/gcc/fix-header.c +++ b/gcc/fix-header.c @@ -114,6 +114,7 @@ static char *files_to_ignore[] = { char *inf_buffer; char *inf_limit; char *inf_ptr; +static const char *cur_file; /* Certain standard files get extra treatment */ @@ -198,6 +199,7 @@ static int inf_skip_spaces PARAMS ((int)); static int inf_read_upto PARAMS ((sstring *, int)); static int inf_scan_ident PARAMS ((sstring *, int)); static int check_protection PARAMS ((int *, int *)); +static void cb_change_file PARAMS ((cpp_reader *, const cpp_file_change *)); static void add_symbols (flags, names) @@ -511,18 +513,16 @@ recognized_extern (name) } /* Called by scan_decls if it saw a function definition for a function - named FNAME, in source file FILE_SEEN on line LINE_SEEN. KIND is - 'I' for an inline function; 'F' if a normal function declaration - preceded by 'extern "C"' (or nested inside 'extern "C"' braces); or - 'f' for other function declarations. */ + named FNAME. KIND is 'I' for an inline function; 'F' if a normal + function declaration preceded by 'extern "C"' (or nested inside + 'extern "C"' braces); or 'f' for other function declarations. */ void -recognized_function (fname, line, kind, have_arg_list, file_seen) +recognized_function (fname, line, kind, have_arg_list) const cpp_token *fname; unsigned int line; int kind; /* One of 'f' 'F' or 'I' */ int have_arg_list; - const char *file_seen; { struct partial_proto *partial; int i; @@ -552,9 +552,9 @@ recognized_function (fname, line, kind, have_arg_list, file_seen) /* If the partial prototype was included from some other file, we don't need to patch it up (in this run). */ - i = strlen (file_seen); + i = strlen (cur_file); if (i < inc_filename_length - || strcmp (inc_filename, file_seen + (i - inc_filename_length)) != 0) + || strcmp (inc_filename, cur_file + (i - inc_filename_length)) != 0) return; if (fn == NULL) @@ -598,6 +598,15 @@ check_macro_names (pfile, names) } static void +cb_change_file (pfile, fc) + cpp_reader *pfile ATTRIBUTE_UNUSED; + const cpp_file_change *fc; +{ + /* Just keep track of current file name. */ + cur_file = fc->to.filename; +} + +static void read_scan_file (in_fname, argc, argv) char *in_fname; int argc; @@ -612,6 +621,7 @@ read_scan_file (in_fname, argc, argv) cpp_init (); /* Initialize cpplib. */ cpp_reader_init (&scan_in, CLK_GNUC89); + scan_in.cb.change_file = cb_change_file; /* We are going to be scanning a header file out of its proper context, so ignore warnings and errors. */ diff --git a/gcc/scan-decls.c b/gcc/scan-decls.c index ba0a00c8fc4..cd92cdd8aa5 100644 --- a/gcc/scan-decls.c +++ b/gcc/scan-decls.c @@ -181,8 +181,7 @@ scan_decls (pfile, argc, argv) cpp_get_line (pfile)->line, (saw_inline ? 'I' : in_extern_C_brace || current_extern_C - ? 'F' : 'f'), have_arg_list, - CPP_BUFFER (pfile)->nominal_fname); + ? 'F' : 'f'), have_arg_list); cpp_get_token (pfile, &token); if (token.type == CPP_OPEN_BRACE) { diff --git a/gcc/scan.h b/gcc/scan.h index d0ae23c3a5f..8d19b1ef463 100644 --- a/gcc/scan.h +++ b/gcc/scan.h @@ -61,8 +61,7 @@ extern int scan_string _PARAMS((FILE *, sstring *, int)); extern int read_upto _PARAMS((FILE *, sstring *, int)); extern unsigned long hash _PARAMS((const char *)); extern void recognized_function _PARAMS((const struct cpp_token *, - unsigned int, int, int, - const char *)); + unsigned int, int, int)); extern void recognized_extern _PARAMS((const struct cpp_token *)); extern unsigned int hashstr _PARAMS((const char *, unsigned int)); |