diff options
author | Andreas Jaeger <aj@gcc.gnu.org> | 2001-01-02 08:00:49 +0100 |
---|---|---|
committer | Andreas Jaeger <aj@gcc.gnu.org> | 2001-01-02 08:00:49 +0100 |
commit | 21c7361e4047bdf15f384ae2bd9c9868063f8025 (patch) | |
tree | 12f18ebddad6ed8db942da5167b01fafd5c86da5 | |
parent | 42ded877b0b8ed0213bce5e01a70ecc443c8a5d2 (diff) | |
download | gcc-21c7361e4047bdf15f384ae2bd9c9868063f8025.zip gcc-21c7361e4047bdf15f384ae2bd9c9868063f8025.tar.gz gcc-21c7361e4047bdf15f384ae2bd9c9868063f8025.tar.bz2 |
c-decl.c (c_decode_option): Remove support of -Wmissing-noreturn.
* c-decl.c (c_decode_option): Remove support of
-Wmissing-noreturn.
* toplev.c (documented_lang_options): Remove -Wmissing-noreturn.
(W_options): Add -Wmissing-noreturn here.
* flow.c: Define lang_missing_noreturn_ok_p.
(check_function_return_warnings): Use it.
* c-common.h: Declare lang_missing_noreturn_ok_p.
* c-lang.c (c_missing_noreturn_ok_p): New function.
(lang_init): Set lang_missing_noreturn_ok_p.
* invoke.texi (Warning Options): Document this.
From-SVN: r38612
-rw-r--r-- | gcc/ChangeLog | 88 | ||||
-rw-r--r-- | gcc/c-common.h | 33 | ||||
-rw-r--r-- | gcc/c-decl.c | 24 | ||||
-rw-r--r-- | gcc/c-lang.c | 25 | ||||
-rw-r--r-- | gcc/flow.c | 66 | ||||
-rw-r--r-- | gcc/invoke.texi | 5 | ||||
-rw-r--r-- | gcc/toplev.c | 22 |
7 files changed, 150 insertions, 113 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fa32630..317a469 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,21 @@ +2001-01-02 Andreas Jaeger <aj@suse.de> + + * c-decl.c (c_decode_option): Remove support of + -Wmissing-noreturn. + + * toplev.c (documented_lang_options): Remove -Wmissing-noreturn. + (W_options): Add -Wmissing-noreturn here. + + * flow.c: Define lang_missing_noreturn_ok_p. + (check_function_return_warnings): Use it. + + * c-common.h: Declare lang_missing_noreturn_ok_p. + + * c-lang.c (c_missing_noreturn_ok_p): New function. + (lang_init): Set lang_missing_noreturn_ok_p. + + * invoke.texi (Warning Options): Document this. + 2000-12-27 Phil Edwards <pme@sources.redhat.com> * extend.texi (C++ Extensions): New node for C++ attributes; @@ -113,13 +131,13 @@ Mon Jan 1 07:38:33 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> * unroll.c (copy_loop_body, loop_iterations): Likewise. (remap_split_bivs): Likewise. -2001-01-01 Michael Hayes <mhayes@redhat.com> +2001-01-01 Michael Hayes <mhayes@redhat.com> * loop.c (loop_ivs_free): New function. (strength_reduce): Break out from... 2001-01-01 Michael Hayes <mhayes@redhat.com> - + * loop.h (struct iv): New. (REG_IV_TYPE, REG_IV_CLASS, REG_INFO): Modify to use 'struct iv'. (struct loop_ivs): Replace 'reg_iv_type', 'reg_iv_info', @@ -139,7 +157,7 @@ Mon Jan 1 07:38:33 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> * loop.h (REG_IV_CLASS): New accessor macro. * loop.c (REG_IV_CLASS): Use it instead of reg_iv_class array. * unroll.c (REG_IV_CLASS): Likewise. - + Sun Dec 31 19:20:51 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> * dwarf2out.c (loc_descriptor_from_tree, case WITH_RECORD_EXPR): New. @@ -152,14 +170,14 @@ Sun Dec 31 19:20:51 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> (prescan_loop): Set pre_header_has_call in loop_info. * loop.h (struct_iv_class): Add `final_value' and `all_reduced'. (struct loop_info): Add `pre_header_has_call'. - + * loop.c (loop_bivs_find): Break out from strength_reduce. (loop_bivs_init_find, loop_bivs_check, loop_givs_find): Likewise. (loop_givs_check, loop_biv_eliminable_p): Likewise. - + * loop.c (LOOP_REG_LIFETIME, LOOP_REG_GLOBAL_P): Define. (scan_loop, record_giv): Use LOOP_REG_LIFETIME and LOOP_REG_GLOBAL_P. - + * loop.h (REGNO_FIRST_LUID, REGNO_LAST_LUID): Define. * loop.c (REGNO_FIRST_LUID, REGNO_LAST_LUID): Use in place of direct access to uid_luid array. @@ -198,7 +216,7 @@ Sun Dec 31 19:20:51 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> 2000-12-30 Philip Blundell <philb@gnu.org> - * config/arm/arm.c (arm_expand_prologue): Fix typos in error + * config/arm/arm.c (arm_expand_prologue): Fix typos in error message and comment. Note location of testcase for an unhandled situation. @@ -236,7 +254,7 @@ Sun Dec 31 19:20:51 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> * stmt.c (expand_decl): Don't use assign_stack_temp in error case. (add_case_node): No need to copy nodes anymore. - + 2000-12-30 Alexandre Oliva <aoliva@redhat.com> * config/sh/sh.c (split_branches): Don't dereference re-computed @@ -391,7 +409,7 @@ Sun Dec 31 19:20:51 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> * calls.c (store_one_arg): If parm is passed both in stack and in register and offset is greater than reg_parm_stack_space, split - the offset and call emit_push_insn(). + the offset and call emit_push_insn(). 2000-12-27 Nick Clifton <nickc@redhat.com> @@ -417,7 +435,7 @@ Sun Dec 31 19:20:51 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> between conditionally executed insns. (sched_analyze_1, sched_analyze_2, sched_analyze_insn): Don't free dependency lists if current insn is a COND_EXEC. - + 2000-12-27 Geoffrey Keating <geoffk@redhat.com> * config/rs6000/rs6000.md (define_attr "length"): Correct @@ -478,7 +496,7 @@ Sun Dec 31 19:20:51 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> (arm_expand_prologue): If the link register has not been saved set lr_save_eliminated and emit a USE to prevent later passes from scavenging it. - + * dwarf2out_frame_debug_expr: Allow the (scratch) frame pointer to be initialised from the stack pointer plus a constant. @@ -513,7 +531,7 @@ Sun Dec 31 19:20:51 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> * dwarf2out.c (file_info_cmp): Prototype. (dwarf2out_line): Hide variable `old_in_use'. - + * objc-act.c (objc_fatal): Delete. * sched-vis.c (visualize_stall_cycles): Remove unused variable. @@ -615,7 +633,7 @@ Sun Dec 31 19:20:51 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> (nop_m, nop_i, nop_f, nop_b, nop_x, cycle_display, cycle_display_1, bundle_selector): New patterns. (insn_group_barrier): Now has an operand. - + 2000-12-21 DJ Delorie <dj@redhat.com> * dwarf2out.c (simple_decl_align_in_bits): new @@ -958,9 +976,9 @@ Sun Dec 17 12:41:48 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> * config/c4x/c4x-protos.h (c4x_init_builtins): Add tree argument. - * config/c4x/c4x.c (c4x_init_builtins): Add tree argument. + * config/c4x/c4x.c (c4x_init_builtins): Add tree argument. (c4x_output_ascii): Fix. - + 2000-12-17 Michael Hayes <m.hayes@elec.canterbury.ac.nz> Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl> @@ -979,7 +997,7 @@ Sun Dec 17 12:41:48 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> (*toieee_movqf_clobber, *frieee_movqf_clobber): Likewise. 2000-12-17 Michael Hayes <m.hayes@elec.canterbury.ac.nz> - + * libgcc2.h: Use Wtype for SItype and DWtype for DItype in prototypes. * libgcc2.c (__absvsi2): Use Wtype and DWtype. (__absvdi2, __addvsi3, __addvdi3, __subvsi3): Likewise. @@ -1021,8 +1039,8 @@ Sat Dec 16 10:41:11 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> (do_warning): New function. (finclude): Skip past the newline and increase the line number before calling output_line_command. - (do_line): Skip the new line after output_line_command. Don't - pre-decrement the line number. + (do_line): Skip the new line after output_line_command. Don't + pre-decrement the line number. 2000-12-15 Diego Novillo <dnovillo@redhat.com> @@ -1087,7 +1105,7 @@ Fri Dec 15 03:37:51 2000 J"orn Rennecke <amylaar@redhat.com> * alias.c (get_alias_set): Call record_component_aliases for COMPLEX_TYPE. (record_component_aliases): Handle COMPLEX_TYPE. - + 2000-12-14 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * fixinc/gnu-regex.c: Disable NLS. @@ -1109,7 +1127,7 @@ Fri Dec 15 03:37:51 2000 J"orn Rennecke <amylaar@redhat.com> * gcc.c (cpp_options): Update to use '&'. (struct switchstr): Change type of validated to save space. New member 'ordering'. - (handle_braces, validate_switches): Update to handle '&'. + (handle_braces, validate_switches): Update to handle '&'. 2000-12-13 Laurynas Biveinis <lauras@softhome.net> @@ -1153,7 +1171,7 @@ Fri Dec 15 03:37:51 2000 J"orn Rennecke <amylaar@redhat.com> * tradcpp.c (special_symbol): Improve test for definedness, though it is still not perfect. (do_define): Don't define illegal macro names. - + 2000-12-07 Aldy Hernandez <aldyh@redhat.com> * config/mips/elf.h (ASM_OUTPUT_SECTION_NAME): emit @nobits @@ -1262,7 +1280,7 @@ Mon Dec 11 13:51:09 2000 Jeffrey A Law (law@cygnus.com) * cppfiles.c (stack_include_file): Update. (_cpp_pop_file_buffer): Update. * cpphash.h (struct cpp_buffer): New members - include_stack_listed and type. + include_stack_listed and type. * cpplib.c (_cpp_handle_directive): Buffer->inc is not null. (run_directive): Take buffer type. cpp_push_buffer cannot fail. (_cpp_do__Pragma, cpp_define, _cpp_define_builtin, cpp_undef, @@ -1296,7 +1314,7 @@ Mon Dec 11 13:51:09 2000 Jeffrey A Law (law@cygnus.com) 2000-12-09 Richard Henderson <rth@redhat.com> - * genrecog.c (validate_pattern): Verify that ZERO_EXTRACT and + * genrecog.c (validate_pattern): Verify that ZERO_EXTRACT and STRICT_LOW_PART as SET_DEST have in-out constraints. 2000-12-09 Joseph S. Myers <jsm28@cam.ac.uk> @@ -2065,8 +2083,8 @@ Tue Dec 5 20:09:14 2000 Jeffrey A Law (law@cygnus.com) 2000-12-02 Geoffrey Keating <geoffk@redhat.com> * c-common.c (combine_strings): When the ISO C standard specifies - the maximum length of a string, it doesn't include the trailing - zero byte. + the maximum length of a string, it doesn't include the trailing + zero byte. * cpplib.c (do_ifdef): Add check_eol() call. (do_ifndef): Likewise. @@ -2188,13 +2206,13 @@ Tue Dec 5 20:09:14 2000 Jeffrey A Law (law@cygnus.com) 2000-12-01 Jim Blandy <jimb@redhat.com> * dbxout.c (dbxout_parms): Correctly describe parameters passed by - invisible reference in registers, but then spilled to the stack. - Remove code to emit a second stab for such parameters; it attempts - to describe the value's location by introducing a synthetic C++ - `reference' type, and then saying the stack slot has that - reference type. This loses type information (breaking GDB's - `ptype' command, among other things) just to describe a location - which stabs can represent correctly in other ways. + invisible reference in registers, but then spilled to the stack. + Remove code to emit a second stab for such parameters; it attempts + to describe the value's location by introducing a synthetic C++ + `reference' type, and then saying the stack slot has that + reference type. This loses type information (breaking GDB's + `ptype' command, among other things) just to describe a location + which stabs can represent correctly in other ways. 2000-12-01 Alexandre Oliva <aoliva@redhat.com> @@ -2749,7 +2767,7 @@ Mon Nov 27 17:29:44 2000 kaz Kojima <kkojima@rr.iij4u.or.jp> canonicalizes conditional compares. (arm_select_cc_mode): Likewise. * arm.md: Garbage collect some dead code. - (cmp_and, cmp_ior): New patterns. + (cmp_and, cmp_ior): New patterns. (splitter for conditional move with inverted false): Use cond_exec and handle unordered comparisons. @@ -2766,7 +2784,7 @@ Mon Nov 27 17:22:56 MET 2000 Jan Hubicka <jh@suse.cz> arm_subsi3_insn, anddi_zesidi_di, arm_andsi3_insn, anddi_notdi_di, anddi_notzesidi_di, anddi_notsesidi_di, arm_iorsi3, one_cmpldi2): Merge with splitters to create define_insn_and_split - patterns. Remove redundant splits. + patterns. Remove redundant splits. (peephole2 for add:SI of invalid immediate): New. (peephole2 for minus:SI of invalid immediate): New. (peephole2 for ior:SI of invalid immediate): New. @@ -7486,7 +7504,7 @@ Mon 25-Sep-2000 23:31:45 BST Neil Booth <neilb@earthling.net> * dwarf2out.c (UNALIGNED_SHORT_ASM_OP, UNALIGNED_INT_ASM_OP, UNALIGNED_DOUBLE_INT_ASM_OP, SECTION_ASM_OP, ASM_BYTE_OP): Here. * dwarfout.c (FILE_ASM_OP, VERSION_ASM_OP, - UNALIGNED_SHORT_ASM_OP, UNALIGNED_INT_ASM_OP, ASM_BYTE_OP, + UNALIGNED_SHORT_ASM_OP, UNALIGNED_INT_ASM_OP, ASM_BYTE_OP, PUSHSECTION_ASM_OP, POPSECTION_ASM_OP): Here. * defaults.h (ASM_STABD_OP, EH_FRAME_SECTION_ASM_OP): Here. * varasm.c (ASM_STABS_OP): Here. diff --git a/gcc/c-common.h b/gcc/c-common.h index a23b871..77c54f3 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -1,6 +1,6 @@ /* Definitions for c-common.c. Copyright (C) 1987, 1993, 1994, 1995, 1997, 1998, - 1999, 2000 Free Software Foundation, Inc. + 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. @@ -222,7 +222,7 @@ typedef enum c_language_kind etc. */ clk_cplusplus, /* ANSI/ISO C++ */ clk_objective_c /* Objective C */ -} +} c_language_kind; /* Information about a statement tree. */ @@ -244,10 +244,10 @@ struct stmt_tree_s { However, in order to represent aggregate initialization code as tree structure, we use statement-expressions. The statements within the statement expression should not result in cleanups - being run until the entire enclosing statement is complete. + being run until the entire enclosing statement is complete. This flag has no effect in C. */ - int stmts_are_full_exprs_p; + int stmts_are_full_exprs_p; }; typedef struct stmt_tree_s *stmt_tree; @@ -294,10 +294,15 @@ extern void (*lang_expand_stmt) PARAMS ((tree)); extern void (*lang_expand_decl_stmt) PARAMS ((tree)); extern void (*lang_expand_function_end) PARAMS ((void)); +/* Callback that determines if it's ok for a function to have no + noreturn attribute. */ +extern int (*lang_missing_noreturn_ok_p) PARAMS ((tree)); + + /* The type of a function that walks over tree structure. */ -typedef tree (*walk_tree_fn) PARAMS ((tree *, - int *, +typedef tree (*walk_tree_fn) PARAMS ((tree *, + int *, void *)); extern stmt_tree current_stmt_tree PARAMS ((void)); @@ -436,7 +441,7 @@ extern int warn_long_long; descending through array types. Note that this macro evaluates its arguments mor than once. */ #define C_TYPE_QUALS(TYPE) \ - (TYPE_QUALS ((TREE_CODE (TYPE) == ARRAY_TYPE \ + (TYPE_QUALS ((TREE_CODE (TYPE) == ARRAY_TYPE \ && c_language == clk_cplusplus) \ ? strip_array_types (TYPE) : TYPE)) @@ -595,7 +600,7 @@ extern tree strip_array_types PARAMS ((tree)); #define ASM_CLOBBERS(NODE) TREE_OPERAND (ASM_STMT_CHECK (NODE), 4) /* DECL_STMT accessor. This gives access to the DECL associated with - the given declaration statement. */ + the given declaration statement. */ #define DECL_STMT_DECL(NODE) TREE_OPERAND (DECL_STMT_CHECK (NODE), 0) /* STMT_EXPR accessor. */ @@ -607,7 +612,7 @@ extern tree strip_array_types PARAMS ((tree)); /* Nonzero if this SCOPE_STMT is for the beginning of a scope. */ #define SCOPE_BEGIN_P(NODE) \ - (TREE_LANG_FLAG_0 (SCOPE_STMT_CHECK (NODE))) + (TREE_LANG_FLAG_0 (SCOPE_STMT_CHECK (NODE))) /* Nonzero if this SCOPE_STMT is for the end of a scope. */ #define SCOPE_END_P(NODE) \ @@ -629,7 +634,7 @@ extern tree strip_array_types PARAMS ((tree)); /* Nonzero for a SCOPE_STMT if this statement is for a partial scope. For example, in: - + S s; l: S s2; @@ -654,12 +659,12 @@ extern tree strip_array_types PARAMS ((tree)); /* If non-zero, the STMT_LINENO for NODE is the line at which the function ended. */ -#define STMT_LINENO_FOR_FN_P(NODE) \ +#define STMT_LINENO_FOR_FN_P(NODE) \ (TREE_LANG_FLAG_2 ((NODE))) /* Nonzero if we want the new ISO rules for pushing a new scope for `for' initialization variables. */ -#define NEW_FOR_SCOPE_P(NODE) (TREE_LANG_FLAG_0 (NODE)) +#define NEW_FOR_SCOPE_P(NODE) (TREE_LANG_FLAG_0 (NODE)) #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) SYM, @@ -754,7 +759,7 @@ extern void extract_interface_info PARAMS ((void)); extern void mark_c_language_function PARAMS ((struct language_function *)); -extern int case_compare PARAMS ((splay_tree_key, +extern int case_compare PARAMS ((splay_tree_key, splay_tree_key)); extern tree c_add_case_label PARAMS ((splay_tree, @@ -807,5 +812,3 @@ struct c_fileinfo *get_fileinfo PARAMS ((const char *)); extern void dump_time_statistics PARAMS ((void)); #endif - - diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 92d8403..d4b3a2a 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -1,6 +1,6 @@ /* Process declarations and variables for C compiler. - Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 - Free Software Foundation, Inc. + Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, + 2001 Free Software Foundation, Inc. This file is part of GNU CC. @@ -665,8 +665,6 @@ c_decode_option (argc, argv) warn_bad_function_cast = 1; else if (!strcmp (p, "-Wno-bad-function-cast")) warn_bad_function_cast = 0; - else if (!strcmp (p, "-Wmissing-noreturn")) - warn_missing_noreturn = 1; else if (!strcmp (p, "-Wno-missing-noreturn")) warn_missing_noreturn = 0; else if (!strcmp (p, "-Wmissing-format-attribute")) @@ -4487,7 +4485,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized) else if (decl_context == FIELD) { /* ??? Need to check somewhere that this is a structure - and not a union, that this field is last, and that + and not a union, that this field is last, and that this structure has at least one other named member. */ if (pedantic && !flag_isoc99 && !in_system_header) @@ -6515,7 +6513,7 @@ store_parm_decls () init_function_start (fndecl, input_filename, lineno); /* Begin the statement tree for this function. */ - DECL_LANG_SPECIFIC (current_function_decl) + DECL_LANG_SPECIFIC (current_function_decl) =((struct lang_decl *) ggc_alloc (sizeof (struct lang_decl))); begin_stmt_tree (&DECL_SAVED_TREE (current_function_decl)); @@ -6903,7 +6901,7 @@ c_expand_body (fndecl, nested_p) pop_function_context (); } } - + } /* Check the declarations given in a for-loop for satisfying the C99 @@ -6979,7 +6977,7 @@ push_c_function_context (f) struct function *f; { struct c_language_function *p; - p = ((struct c_language_function *) + p = ((struct c_language_function *) xmalloc (sizeof (struct c_language_function))); f->language = (struct language_function *) p; @@ -7001,7 +6999,7 @@ void pop_c_function_context (f) struct function *f; { - struct c_language_function *p + struct c_language_function *p = (struct c_language_function *) f->language; tree link; @@ -7042,7 +7040,7 @@ void mark_c_function_context (f) struct function *f; { - struct c_language_function *p + struct c_language_function *p = (struct c_language_function *) f->language; if (p == 0) @@ -7158,12 +7156,12 @@ c_begin_compound_stmt () stmt = add_stmt (build_stmt (COMPOUND_STMT, NULL_TREE)); /* If we haven't already declared __FUNCTION__ and its ilk then this is the opening curly brace of the function. Declare them now. */ - if (!c_function_name_declared_p) + if (!c_function_name_declared_p) { c_function_name_declared_p = 1; declare_function_name (); } - + return stmt; } @@ -7175,7 +7173,7 @@ c_expand_decl_stmt (t) tree t; { tree decl = DECL_STMT_DECL (t); - + /* Expand nested functions. */ if (TREE_CODE (decl) == FUNCTION_DECL && DECL_CONTEXT (decl) == current_function_decl diff --git a/gcc/c-lang.c b/gcc/c-lang.c index fb4dbee..5217391 100644 --- a/gcc/c-lang.c +++ b/gcc/c-lang.c @@ -1,6 +1,6 @@ /* Language-specific hook definitions for C front end. Copyright (C) 1991, 1995, 1997, 1998, - 1999, 2000 Free Software Foundation, Inc. + 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. @@ -37,10 +37,11 @@ Boston, MA 02111-1307, USA. */ #include "cpplib.h" static int c_tree_printer PARAMS ((output_buffer *)); +static int c_missing_noreturn_ok_p PARAMS ((tree)); /* Each of the functions defined here is an alternative to a function in objc-actions.c. */ - + int lang_decode_option (argc, argv) int argc; @@ -81,6 +82,7 @@ lang_init () lang_safe_from_p = &c_safe_from_p; lang_printer = &c_tree_printer; lang_expand_decl_stmt = &c_expand_decl_stmt; + lang_missing_noreturn_ok_p = &c_missing_noreturn_ok_p; c_parse_init (); } @@ -186,8 +188,8 @@ start_cdtor (method_type) tree body; start_function (void_list_node_1, - build_parse_node (CALL_EXPR, fnname, - tree_cons (NULL_TREE, NULL_TREE, + build_parse_node (CALL_EXPR, fnname, + tree_cons (NULL_TREE, NULL_TREE, void_list_node_1), NULL_TREE), NULL_TREE, NULL_TREE); @@ -213,11 +215,11 @@ finish_cdtor (body) tree block; scope = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0); - block = poplevel (0, 0, 0); + block = poplevel (0, 0, 0); SCOPE_STMT_BLOCK (TREE_PURPOSE (scope)) = block; SCOPE_STMT_BLOCK (TREE_VALUE (scope)) = block; - RECHAIN_STMTS (body, COMPOUND_BODY (body)); + RECHAIN_STMTS (body, COMPOUND_BODY (body)); finish_function (0); } @@ -252,7 +254,7 @@ finish_file () finish_cdtor (body); } #endif - + if (back_end_hook) (*back_end_hook) (getdecls ()); @@ -294,3 +296,12 @@ c_tree_printer (buffer) return 0; } } + +static int +c_missing_noreturn_ok_p (decl) + tree decl; +{ + /* A missing noreturn is not ok for freestanding implementations and + ok for the `main' function in hosted implementations. */ + return flag_hosted && MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl)); +} @@ -1,6 +1,6 @@ /* Data flow analysis for GNU compiler. Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000 Free Software Foundation, Inc. + 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. @@ -251,6 +251,10 @@ regset regs_live_at_setjmp; are another pair, etc. */ rtx regs_may_share; +/* Callback that determines if it's ok for a function to have no + noreturn attribute. */ +int (*lang_missing_noreturn_ok_p) PARAMS ((tree)); + /* Set of registers that may be eliminable. These are handled specially in updating regs_ever_live. */ @@ -424,15 +428,15 @@ static void invalidate_mems_from_autoinc PARAMS ((struct propagate_block_info *, static void invalidate_mems_from_set PARAMS ((struct propagate_block_info *, rtx)); static void remove_fake_successors PARAMS ((basic_block)); -static void flow_nodes_print PARAMS ((const char *, const sbitmap, +static void flow_nodes_print PARAMS ((const char *, const sbitmap, FILE *)); static void flow_edge_list_print PARAMS ((const char *, const edge *, int, FILE *)); static void flow_loops_cfg_dump PARAMS ((const struct loops *, FILE *)); -static int flow_loop_nested_p PARAMS ((struct loop *, +static int flow_loop_nested_p PARAMS ((struct loop *, struct loop *)); -static int flow_loop_entry_edges_find PARAMS ((basic_block, const sbitmap, +static int flow_loop_entry_edges_find PARAMS ((basic_block, const sbitmap, edge **)); static int flow_loop_exit_edges_find PARAMS ((const sbitmap, edge **)); static int flow_loop_nodes_find PARAMS ((basic_block, basic_block, sbitmap)); @@ -530,7 +534,9 @@ check_function_return_warnings () { if (warn_missing_noreturn && !TREE_THIS_VOLATILE (cfun->decl) - && EXIT_BLOCK_PTR->pred == NULL) + && EXIT_BLOCK_PTR->pred == NULL + && (lang_missing_noreturn_ok_p + && !lang_missing_noreturn_ok_p (cfun->decl))) warning ("function might be possible candidate for attribute `noreturn'"); /* If we have a path to EXIT, then we do return. */ @@ -1537,7 +1543,7 @@ split_block (bb, insn) /* Redirect the src of the successor edges of bb to point to new_bb. */ for (e = new_bb->succ; e; e = e->succ_next) e->src = new_bb; - + /* Place the new block just after the block being split. */ VARRAY_GROW (basic_block_info, ++n_basic_blocks); @@ -1576,7 +1582,7 @@ split_block (bb, insn) propagate_block to determine which registers are live. */ COPY_REG_SET (new_bb->global_live_at_start, bb->global_live_at_end); propagate_block (new_bb, new_bb->global_live_at_start, NULL, NULL, 0); - COPY_REG_SET (bb->global_live_at_end, + COPY_REG_SET (bb->global_live_at_end, new_bb->global_live_at_start); } @@ -3382,7 +3388,7 @@ calculate_global_regs_live (blocks_in, blocks_out, flags) SET_REGNO_REG_SET (new_live_at_end, STACK_POINTER_REGNUM); /* Before reload, there are a few registers that must be forced - live everywhere -- which might not already be the case for + live everywhere -- which might not already be the case for blocks within infinite loops. */ if (! reload_completed) { @@ -4200,7 +4206,7 @@ insn_dead_p (pbi, x, call_ok, notes) #ifdef AUTO_INC_DEC /* Check if memory reference matches an auto increment. Only post increment/decrement or modify are valid. */ - if (GET_MODE (mem) == GET_MODE (r) + if (GET_MODE (mem) == GET_MODE (r) && (GET_CODE (XEXP (mem, 0)) == POST_DEC || GET_CODE (XEXP (mem, 0)) == POST_INC || GET_CODE (XEXP (mem, 0)) == POST_MODIFY) @@ -4978,7 +4984,7 @@ flush_reg_cond_reg_1 (node, data) the in-order traversal. */ if (xdata[1] >= (int) node->key) return 0; - + /* Splice out portions of the expression that refer to regno. */ rcli = (struct reg_cond_life_info *) node->value; rcli->condition = elim_reg_cond (rcli->condition, regno); @@ -6599,7 +6605,7 @@ count_or_remove_death_notes (blocks, kill) /* Update insns block within BB. */ -void +void update_bb_for_insn (bb) basic_block bb; { @@ -7089,7 +7095,7 @@ verify_edge_list (f, elist) if (EDGE_INDEX (elist, BASIC_BLOCK (pred), BASIC_BLOCK (succ)) != EDGE_INDEX_NO_EDGE && found_edge == 0) fprintf (f, "*** Edge (%d, %d) has index %d, but there is no edge\n", - pred, succ, EDGE_INDEX (elist, BASIC_BLOCK (pred), + pred, succ, EDGE_INDEX (elist, BASIC_BLOCK (pred), BASIC_BLOCK (succ))); } for (succ = 0; succ < n_basic_blocks; succ++) @@ -7334,7 +7340,7 @@ redirect_edge_pred (e, new_pred) /* Dump the list of basic blocks in the bitmap NODES. */ -static void +static void flow_nodes_print (str, nodes, file) const char *str; const sbitmap nodes; @@ -7353,7 +7359,7 @@ flow_nodes_print (str, nodes, file) /* Dump the list of edges in the array EDGE_LIST. */ -static void +static void flow_edge_list_print (str, edge_list, num_edges, file) const char *str; const edge *edge_list; @@ -7467,7 +7473,7 @@ flow_loop_dump (loop, file, loop_dump_aux, verbose) /* Dump the loop information specified by LOOPS to the stream FILE, using auxiliary dump callback function LOOP_DUMP_AUX if non null. */ -void +void flow_loops_dump (loops, file, loop_dump_aux, verbose) const struct loops *loops; FILE *file; @@ -7481,7 +7487,7 @@ flow_loops_dump (loops, file, loop_dump_aux, verbose) if (! num_loops || ! file) return; - fprintf (file, ";; %d loops found, %d levels\n", + fprintf (file, ";; %d loops found, %d levels\n", num_loops, loops->levels); for (i = 0; i < num_loops; i++) @@ -7510,7 +7516,7 @@ flow_loops_dump (loops, file, loop_dump_aux, verbose) must be disjoint. */ disjoint = ! flow_loop_nested_p (smaller ? loop : oloop, smaller ? oloop : loop); - fprintf (file, + fprintf (file, ";; loop header %d shared by loops %d, %d %s\n", loop->header->index, i, j, disjoint ? "disjoint" : "nested"); @@ -7586,7 +7592,7 @@ flow_loop_entry_edges_find (header, nodes, entry_edges) for (e = header->pred; e; e = e->pred_next) { basic_block src = e->src; - + if (src == ENTRY_BLOCK_PTR || ! TEST_BIT (nodes, src->index)) num_entries++; } @@ -7600,7 +7606,7 @@ flow_loop_entry_edges_find (header, nodes, entry_edges) for (e = header->pred; e; e = e->pred_next) { basic_block src = e->src; - + if (src == ENTRY_BLOCK_PTR || ! TEST_BIT (nodes, src->index)) (*entry_edges)[num_entries++] = e; } @@ -7632,7 +7638,7 @@ flow_loop_exit_edges_find (nodes, exit_edges) EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, { for (e = BASIC_BLOCK (node)->succ; e; e = e->succ_next) { - basic_block dest = e->dest; + basic_block dest = e->dest; if (dest == EXIT_BLOCK_PTR || ! TEST_BIT (nodes, dest->index)) num_exits++; @@ -7649,7 +7655,7 @@ flow_loop_exit_edges_find (nodes, exit_edges) EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, { for (e = BASIC_BLOCK (node)->succ; e; e = e->succ_next) { - basic_block dest = e->dest; + basic_block dest = e->dest; if (dest == EXIT_BLOCK_PTR || ! TEST_BIT (nodes, dest->index)) (*exit_edges)[num_exits++] = e; @@ -8143,7 +8149,7 @@ flow_loops_find (loops, flags) must always be built if this function is called. */ if (! (flags & LOOP_TREE)) abort (); - + memset (loops, 0, sizeof (*loops)); /* Taking care of this degenerate case makes the rest of @@ -8258,7 +8264,7 @@ flow_loops_find (loops, flags) loop->nodes = sbitmap_alloc (n_basic_blocks); loop->num_nodes = flow_loop_nodes_find (loop->header, loop->latch, loop->nodes); - + /* Compute first and last blocks within the loop. These are often the same as the loop header and loop latch respectively, but this is not always @@ -8267,7 +8273,7 @@ flow_loops_find (loops, flags) = BASIC_BLOCK (sbitmap_first_set_bit (loop->nodes)); loop->last = BASIC_BLOCK (sbitmap_last_set_bit (loop->nodes)); - + if (flags & LOOP_EDGES) { /* Find edges which enter the loop header. @@ -8277,12 +8283,12 @@ flow_loops_find (loops, flags) = flow_loop_entry_edges_find (loop->header, loop->nodes, &loop->entry_edges); - + /* Find edges which exit the loop. */ loop->num_exits = flow_loop_exit_edges_find (loop->nodes, &loop->exit_edges); - + /* Determine which loop nodes dominate all the exits of the loop. */ loop->exits_doms = sbitmap_alloc (n_basic_blocks); @@ -8290,17 +8296,17 @@ flow_loops_find (loops, flags) for (j = 0; j < loop->num_exits; j++) sbitmap_a_and_b (loop->exits_doms, loop->exits_doms, dom[loop->exit_edges[j]->src->index]); - + /* The header of a natural loop must dominate all exits. */ if (! TEST_BIT (loop->exits_doms, loop->header->index)) abort (); } - + if (flags & LOOP_PRE_HEADER) { /* Look to see if the loop has a pre-header node. */ - loop->pre_header + loop->pre_header = flow_loop_pre_header_find (loop->header, dom); flow_loop_pre_header_scan (loop); @@ -8347,7 +8353,7 @@ flow_loops_update (loops, flags) throw away the old stuff and rebuild what we need. */ if (loops->array) flow_loops_free (loops); - + return flow_loops_find (loops, flags); } diff --git a/gcc/invoke.texi b/gcc/invoke.texi index d4e79d2..4d37992 100644 --- a/gcc/invoke.texi +++ b/gcc/invoke.texi @@ -5,7 +5,7 @@ @ignore @c man begin COPYRIGHT Copyright @copyright{} 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, -1998, 1999, 2000 Free Software Foundation, Inc. +1998, 1999, 2000, 2001 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are @@ -2170,7 +2170,8 @@ Warn about functions which might be candidates for attribute @code{noreturn}. Note these are only possible candidates, not absolute ones. Care should be taken to manually verify functions actually do not ever return before adding the @code{noreturn} attribute, otherwise subtle code generation -bugs could be introduced. +bugs could be introduced. You will not get a warning for @code{main} in +hosted C environments. @item -Wmissing-format-attribute If @samp{-Wformat} is enabled, also warn about functions which might be diff --git a/gcc/toplev.c b/gcc/toplev.c index 7d4a347..4f38dc1 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1,6 +1,6 @@ /* Top level of GNU C compiler Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000 Free Software Foundation, Inc. + 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. @@ -969,7 +969,7 @@ const char *user_label_prefix; lang_independent_options f_options[] = { - {"eliminate-dwarf2-dups", &flag_eliminate_dwarf2_dups, 1, + {"eliminate-dwarf2-dups", &flag_eliminate_dwarf2_dups, 1, "Perform DWARF2 duplicate elimination"}, {"float-store", &flag_float_store, 1, "Do not store floats in registers" }, @@ -1210,8 +1210,6 @@ documented_lang_options[] = { "-Wbad-function-cast", "Warn about casting functions to incompatible types" }, { "-Wno-bad-function-cast", "" }, - { "-Wmissing-noreturn", - "Warn about functions which might be candidates for attribute noreturn" }, { "-Wno-missing-noreturn", "" }, { "-Wmissing-format-attribute", "Warn about functions which might be candidates for format attributes" }, @@ -1461,7 +1459,9 @@ lang_independent_options W_options[] = {"padded", &warn_padded, 1, "Warn when padding is required to align struct members"}, {"disabled-optimization", &warn_disabled_optimization, 1, - "Warn when an optimization pass is disabled"} + "Warn when an optimization pass is disabled"}, + {"missing-noreturn", &warn_missing_noreturn, 1, + "Warn about functions which might be candidates for attribute noreturn"} }; /* Output files for assembler code (real compiler output) @@ -1576,7 +1576,7 @@ approx_sqrt (x) double s, d; if (x < 0) - abort (); + abort (); if (x == 0) return 0; @@ -1584,8 +1584,8 @@ approx_sqrt (x) do { d = (s * s - x) / (2 * s); - s -= d; - } + s -= d; + } while (d > .0001); return s; } @@ -1962,7 +1962,7 @@ wrapup_global_declarations (vec, len) if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl) && (! TREE_READONLY (decl) || TREE_PUBLIC (decl) - || (!optimize + || (!optimize && flag_keep_static_consts && !DECL_ARTIFICIAL (decl)) || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))) @@ -2878,7 +2878,7 @@ rest_of_compilation (decl) integrate.*/ rtx_equal_function_value_matters = 0; purge_hard_subreg_sets (get_insns ()); - + /* Don't return yet if -Wreturn-type; we need to do jump_optimize. */ if ((rtl_dump_and_exit || flag_syntax_only) && !warn_return_type) goto exit_rest_of_compilation; @@ -3075,7 +3075,7 @@ rest_of_compilation (decl) insns = get_insns (); eliminate_dead_code(); - + close_dump_file (DFI_dce, print_rtl_with_bb, insns); timevar_pop (TV_DEAD_CODE_ELIM); } |