Integrated preprocessor patch - revised

Zack Weinberg zack@wolery.cumb.org
Wed Sep 6 16:02:00 GMT 2000


This is a revised version of the patch I posted about a week and a
half ago.  Some bugs have been fixed, and it doesn't break the C++
front end's -fxref and -fstats options.  Without --enable-c-cpplib,
the only thing that breaks should be target specific pragmas.  With
that switch, you additionally lose -traditional and -save-temps (well,
-save-temps will get you an assembly dump, but that's it).

Despite the above problems, I would like to apply this patch now, and
then work on the remaining issues.  The patch is too big to work on
easily, and several people are waiting for these changes.

I have bootstrapped the compiler with no regressions - apart from the
above problems - on i386-linux, with and without --enable-c-cpplib,
with this patch.

zw

	* Makefile.in: Remove all references to c-parse.gperf,
	c-gperf.h, and c-parse.h.  Remove -d from yacc command line
	generating c-parse.c.  Update dependencies.
	* c-parse.gperf, c-gperf.h: Delete.

	* c-common.c: Don't define parse_options, cpp_token, yy_cur,
	yy_lim, or yy_get_token.  Don't define get_directive_line if
	USE_CPPLIB.
	* c-common.h: Add multiple include guard.  Define RID values
	for every keyword in C, C++, and Objective C.  Put all the
	modifiers first.
	(struct c_fileinfo, get_fileinfo, dump_time_statistics): New.
	* c-decl.c (c_decode_option): Handle -lang-objc here.
	(print_lang_identifier): Handle C_IS_RESERVED_WORD case.
	(grokdeclarator): Adjust for new RID scheme.
	(extract_interface_info): New stub.
	* c-lang.c: Don't declare yy_cur or parse_options.
	(lang_init_options): Call cpp_init.  Don't call
	cpp_options_init.
	(lang_init): Don't call check_newline if USE_CPPLIB.

        * c-lex.c: Don't include c-parse.h.  Do include timevar.h.
        Elide lots of unnecessary code if USE_CPPLIB.  Delete code
        rendered unnecessary by new architecture.  Move routines not
        shared with C++ to c-parse.in.  Maintain a local idea of the
        line number.  	Handle C++ as well as C.
        [USE_CPPLIB]: Declare and register callbacks for #ident and
        for entering/leaving files.
        (init_c_lex, c_lex): Are now the entry points to this file.
        (check_newline): Break out directive handling to
        process_directive.
        (read_ucs, is_extended_char, utf8_extend_token): Moved here 
        from C++ front end.
        (readescape, parse_float): Overhaul.
        (lex_number, lex_string, lex_charconst): Break out of c_lex
        (n'ee yylex).
	(get_fileinfo, update_header_times, dump_one_header,
        dump_time_statistics): New and/or moved here from C++.
        Support per-file data needed by C++ and per-header timing
        statistics (C++ only, at the moment).
        * c-lex.h: Update prototypes.  Add multiple include guard.
        * c-tree.h (struct lang_identifier): Add rid_code field.
        (C_IS_RESERVED_WORD, C_RID_CODE): New.

        * c-parse.in: Include c-pragma.h. Remove unnecesary calls to
        reinit_parse_for_function and/or position_after_white_space.
        (save_filename, save_lineno): Look ahead before saving.
	(label -> identifier ':'): Save file and line before shifting ':'.
        (reservedwords): No need to call get_identifier.
        (init_parse, finish_parse, yyerror, yylex, yyprint,
        make_pointer_declarator): Are now here for C/ObjC.
	(rid_to_yy): Conversion table from RID constants to Yacc codes.

        * c-pragma.c: Rewrite parsing logic to fit with cpplib's
        #pragma registry.  Provide dummy implementation of that
        interface if !USE_CPPLIB.
        * c-pragma.h: Update to match.

	* flags.h: Add multiple include guard.
	(flag_detailed_statistics): Moved here from C++.
	* toplev.c: Define flag_detailed_statistics.

        * gcc.c (C specs): Use %(trad_capable_cpp) for -E|-M|-MM case
        #if USE_CPPLIB.
        * timevar.def (TV_CPP, TV_LEX): New.
	* timevar.h: Add multiple include guard.

cp:
        * Make-lang.in, Makefile.in: Remove all references to input.c,
        gxx.gperf, and hash.h.  Add ../c-lex.o to C_OBJS.
        * gxx.gperf, hash.h, input.c: Delete.
        * lang-specs.h: Pass -lang-c++ to cc1plus so cpplib is
        initialized properly.

        * class.c (fixup_pending_inline): Take a tree, not a
        struct pending_inline *.  All callers changed.
        (init_class_processing): Set RID_PUBLIC, RID_PRIVATE,
        RID_PROTECTED entries in ridpointers[] array here.
        * decl.c (duplicate_decls): Do not refer to struct
        pending_inline.
        (record_builtin_type, init_decl_processing): Use RID_MAX not
        CP_RID_MAX.
        (grokdeclarator): Use C_IS_RESERVED_WORD.
        * decl2.c (lang_decode_option): Ignore -lang-c++ for sake of
        cpplib.
        (grok_x_components): Do not inspect pending_inlines chain.

        * cp-tree.h (struct lang_identifier): Add rid_code entry.
        (C_IS_RESERVED_WORD, C_RID_CODE, C_RID_YYCODE): New.
        (flag_no_gnu_keywords, flag_operator_names, rid_to_yy): Declare.
        (DEFARG_LENGTH, struct pending_inline, TIME_IDENTIFIER_TIME,
        TIME_IDENTIFIER_FILEINFO): Kill.
        Update prototypes.
        * lex.h: Expunge cp_rid.  Rewrite RIDBIT macros to use just a
        single 32-bit word.
        * parse.y: Call do_pending_inlines unconditionally.
        reinit_parse_for_method is now snarf_method.  fn.defpen is no
        longer necessary.  Remove unnecessary <itype> annotation on
        SCOPE.  Do not refer to end_of_file or struct pending_inline.
        * semantics.c (begin_inline_definitions): Call
        do_pending_inlines unconditionally.

        * lex.c: Remove all code now shared with C front end.
        Initialize cpplib properly if USE_CPPLIB.  Put reserved words
        into the get_identifier table.  Rewrite pragma handling to
        work with the registry.  Move code to save tokens for later
        processing to spew.c.

        * spew.c: Rewrite everything in terms of token streams instead
        of text.  Move routines here from lex.c / input.c as
        appropriate.  GC-mark trees hanging off the pending inlines
        chain.

objc:
        * lang-specs.h: Use %(trad_capable_cpp) for -E|-M|-MM case
        #if USE_CPPLIB.
        * objc-act.c: Don't mention yy_cur or parse_options.
        Initialize cpplib properly.  Force lineno to 0 after first
        call to check_newline.  Don't handle -lang-objc here.
        Move forget_protocol_qualifiers and
        remember_protocol_qualifiers here.

testsuite:
        * g++.old-deja/g++.benjamin/13478.C: Put meaningful tags on
        ERROR markers.
        * g++.old-deja/g++.brendan/crash8.C: Move ERROR marker up one line.
	* gcc.dg/c99-array-nonobj-1.c: Don't expect func[] cases to fail.
	* gcc.dg/wtr-label-1.c: Don't use unconstrained .* in error regexps.
	* gcc.dg/wtr-suffix-1.c: Correct error regexps.
        * gcc.dg/cpp/unc1.c, gcc.dg/cpp/unc2.c, gcc.dg/cpp/unc3.c:
	Preprocess only.
        * gcc.dg/cpp/unc4.c: Adjust line number in dg-error line.
        * gcc.dg/noncompile/const-ll-1.c: Generalize error regexp.
intpp-patch.bz2

-------------- next part --------------
A non-text attachment was scrubbed...
Name: intpp-patch.bz2
Type: application/x-bzip2
Size: 77107 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20000906/2057bdfc/attachment.bz2>


More information about the Gcc-patches mailing list