| 1 | |
| 2 | This patch brings over a few features from MirBSD: |
| 3 | * -fhonour-copts |
| 4 | If this option is not given, it's warned (depending |
| 5 | on environment variables). This is to catch errors |
| 6 | of misbuilt packages which override CFLAGS themselves. |
| 7 | * -Werror-maybe-reset |
| 8 | Has the effect of -Wno-error if GCC_NO_WERROR is |
| 9 | set and not '0', a no-operation otherwise. This is |
| 10 | to be able to use -Werror in "make" but prevent |
| 11 | GNU autoconf generated configure scripts from |
| 12 | freaking out. |
| 13 | * Make -fno-strict-aliasing and -fno-delete-null-pointer-checks |
| 14 | the default for -O2/-Os, because they trigger gcc bugs |
| 15 | and can delete code with security implications. |
| 16 | |
| 17 | This patch was authored by Thorsten Glaser <tg@mirbsd.de> |
| 18 | with copyright assignment to the FSF in effect. |
| 19 | |
| 20 | --- a/gcc/c-opts.c |
| 21 | +++ b/gcc/c-opts.c |
| 22 | @@ -103,6 +103,9 @@ static size_t deferred_count; |
| 23 | /* Number of deferred options scanned for -include. */ |
| 24 | static size_t include_cursor; |
| 25 | |
| 26 | +/* Check if a port honours COPTS. */ |
| 27 | +static int honour_copts = 0; |
| 28 | + |
| 29 | static void set_Wimplicit (int); |
| 30 | static void handle_OPT_d (const char *); |
| 31 | static void set_std_cxx98 (int); |
| 32 | @@ -448,6 +451,14 @@ c_common_handle_option (size_t scode, co |
| 33 | mesg_implicit_function_declaration = 2; |
| 34 | break; |
| 35 | |
| 36 | + case OPT_Werror_maybe_reset: |
| 37 | + { |
| 38 | + char *ev = getenv ("GCC_NO_WERROR"); |
| 39 | + if ((ev != NULL) && (*ev != '0')) |
| 40 | + cpp_opts->warnings_are_errors = 0; |
| 41 | + } |
| 42 | + break; |
| 43 | + |
| 44 | case OPT_Wformat: |
| 45 | set_Wformat (value); |
| 46 | break; |
| 47 | @@ -691,6 +702,12 @@ c_common_handle_option (size_t scode, co |
| 48 | flag_exceptions = value; |
| 49 | break; |
| 50 | |
| 51 | + case OPT_fhonour_copts: |
| 52 | + if (c_language == clk_c) { |
| 53 | + honour_copts++; |
| 54 | + } |
| 55 | + break; |
| 56 | + |
| 57 | case OPT_fimplement_inlines: |
| 58 | flag_implement_inlines = value; |
| 59 | break; |
| 60 | @@ -1121,6 +1138,47 @@ c_common_init (void) |
| 61 | /* Has to wait until now so that cpplib has its hash table. */ |
| 62 | init_pragma (); |
| 63 | |
| 64 | + if (c_language == clk_c) { |
| 65 | + char *ev = getenv ("GCC_HONOUR_COPTS"); |
| 66 | + int evv; |
| 67 | + if (ev == NULL) |
| 68 | + evv = -1; |
| 69 | + else if ((*ev == '0') || (*ev == '\0')) |
| 70 | + evv = 0; |
| 71 | + else if (*ev == '1') |
| 72 | + evv = 1; |
| 73 | + else if (*ev == '2') |
| 74 | + evv = 2; |
| 75 | + else if (*ev == 's') |
| 76 | + evv = -1; |
| 77 | + else { |
| 78 | + warning (0, "unknown GCC_HONOUR_COPTS value, assuming 1"); |
| 79 | + evv = 1; /* maybe depend this on something like MIRBSD_NATIVE? */ |
| 80 | + } |
| 81 | + if (evv == 1) { |
| 82 | + if (honour_copts == 0) { |
| 83 | + error ("someone does not honour COPTS at all in lenient mode"); |
| 84 | + return false; |
| 85 | + } else if (honour_copts != 1) { |
| 86 | + warning (0, "someone does not honour COPTS correctly, passed %d times", |
| 87 | + honour_copts); |
| 88 | + } |
| 89 | + } else if (evv == 2) { |
| 90 | + if (honour_copts == 0) { |
| 91 | + error ("someone does not honour COPTS at all in strict mode"); |
| 92 | + return false; |
| 93 | + } else if (honour_copts != 1) { |
| 94 | + error ("someone does not honour COPTS correctly, passed %d times", |
| 95 | + honour_copts); |
| 96 | + return false; |
| 97 | + } |
| 98 | + } else if (evv == 0) { |
| 99 | + if (honour_copts != 1) |
| 100 | + inform ("someone does not honour COPTS correctly, passed %d times", |
| 101 | + honour_copts); |
| 102 | + } |
| 103 | + } |
| 104 | + |
| 105 | return true; |
| 106 | } |
| 107 | |
| 108 | --- a/gcc/c.opt |
| 109 | +++ b/gcc/c.opt |
| 110 | @@ -185,6 +185,10 @@ Werror-implicit-function-declaration |
| 111 | C ObjC RejectNegative |
| 112 | Make implicit function declarations an error |
| 113 | |
| 114 | +Werror-maybe-reset |
| 115 | +C ObjC C++ ObjC++ |
| 116 | +; Documented in common.opt |
| 117 | + |
| 118 | Wfloat-equal |
| 119 | C ObjC C++ ObjC++ Var(warn_float_equal) |
| 120 | Warn if testing floating point numbers for equality |
| 121 | @@ -541,6 +545,9 @@ C++ ObjC++ |
| 122 | fhonor-std |
| 123 | C++ ObjC++ |
| 124 | |
| 125 | +fhonour-copts |
| 126 | +C ObjC C++ ObjC++ RejectNegative |
| 127 | + |
| 128 | fhosted |
| 129 | C ObjC |
| 130 | Assume normal C execution environment |
| 131 | --- a/gcc/common.opt |
| 132 | +++ b/gcc/common.opt |
| 133 | @@ -77,6 +77,10 @@ Werror |
| 134 | Common Var(warnings_are_errors) |
| 135 | Treat all warnings as errors |
| 136 | |
| 137 | +Werror-maybe-reset |
| 138 | +Common |
| 139 | +If environment variable GCC_NO_WERROR is set, act as -Wno-error |
| 140 | + |
| 141 | Wextra |
| 142 | Common |
| 143 | Print extra (possibly unwanted) warnings |
| 144 | @@ -451,6 +455,9 @@ fguess-branch-probability |
| 145 | Common Report Var(flag_guess_branch_prob) |
| 146 | Enable guessing of branch probabilities |
| 147 | |
| 148 | +fhonour-copts |
| 149 | +Common RejectNegative |
| 150 | + |
| 151 | ; Nonzero means ignore `#ident' directives. 0 means handle them. |
| 152 | ; Generate position-independent code for executables if possible |
| 153 | ; On SVR4 targets, it also controls whether or not to emit a |
| 154 | --- a/gcc/opts.c |
| 155 | +++ b/gcc/opts.c |
| 156 | @@ -569,8 +569,6 @@ decode_options (unsigned int argc, const |
| 157 | flag_schedule_insns_after_reload = 1; |
| 158 | #endif |
| 159 | flag_regmove = 1; |
| 160 | - flag_strict_aliasing = 1; |
| 161 | - flag_delete_null_pointer_checks = 1; |
| 162 | flag_reorder_blocks = 1; |
| 163 | flag_reorder_functions = 1; |
| 164 | flag_tree_store_ccp = 1; |
| 165 | @@ -586,6 +584,9 @@ decode_options (unsigned int argc, const |
| 166 | |
| 167 | if (optimize >= 3) |
| 168 | { |
| 169 | + flag_strict_aliasing = 1; |
| 170 | + flag_delete_null_pointer_checks = 1; |
| 171 | + |
| 172 | flag_inline_functions = 1; |
| 173 | flag_unswitch_loops = 1; |
| 174 | flag_gcse_after_reload = 1; |
| 175 | @@ -759,6 +760,17 @@ common_handle_option (size_t scode, cons |
| 176 | set_Wextra (value); |
| 177 | break; |
| 178 | |
| 179 | + case OPT_Werror_maybe_reset: |
| 180 | + { |
| 181 | + char *ev = getenv ("GCC_NO_WERROR"); |
| 182 | + if ((ev != NULL) && (*ev != '0')) |
| 183 | + warnings_are_errors = 0; |
| 184 | + } |
| 185 | + break; |
| 186 | + |
| 187 | + case OPT_fhonour_copts: |
| 188 | + break; |
| 189 | + |
| 190 | case OPT_Wextra: |
| 191 | set_Wextra (value); |
| 192 | break; |
| 193 | --- a/gcc/doc/cppopts.texi |
| 194 | +++ b/gcc/doc/cppopts.texi |
| 195 | @@ -166,6 +166,11 @@ in older programs. This warning is on b |
| 196 | Make all warnings into hard errors. Source code which triggers warnings |
| 197 | will be rejected. |
| 198 | |
| 199 | +@item -Werror-maybe-reset |
| 200 | +@opindex Werror-maybe-reset |
| 201 | +Act like @samp{-Wno-error} if the @env{GCC_NO_WERROR} environment |
| 202 | +variable is set to anything other than 0 or empty. |
| 203 | + |
| 204 | @item -Wsystem-headers |
| 205 | @opindex Wsystem-headers |
| 206 | Issue warnings for code in system headers. These are normally unhelpful |
| 207 | --- a/gcc/doc/invoke.texi |
| 208 | +++ b/gcc/doc/invoke.texi |
| 209 | @@ -222,7 +222,7 @@ Objective-C and Objective-C++ Dialects}. |
| 210 | -Wc++-compat -Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment @gol |
| 211 | -Wconversion -Wno-deprecated-declarations @gol |
| 212 | -Wdisabled-optimization -Wno-div-by-zero -Wno-endif-labels @gol |
| 213 | --Werror -Werror-implicit-function-declaration @gol |
| 214 | +-Werror -Werror-maybe-reset -Werror-implicit-function-declaration @gol |
| 215 | -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 @gol |
| 216 | -Wno-format-extra-args -Wformat-nonliteral @gol |
| 217 | -Wformat-security -Wformat-y2k @gol |
| 218 | @@ -3390,6 +3390,22 @@ This option is only supported for C and |
| 219 | @opindex Werror |
| 220 | Make all warnings into errors. |
| 221 | |
| 222 | +@item -Werror-maybe-reset |
| 223 | +@opindex Werror-maybe-reset |
| 224 | +Act like @samp{-Wno-error} if the @env{GCC_NO_WERROR} environment |
| 225 | +variable is set to anything other than 0 or empty. |
| 226 | + |
| 227 | +@item -fhonour-copts |
| 228 | +@opindex fhonour-copts |
| 229 | +If @env{GCC_HONOUR_COPTS} is set to 1, abort if this option is not |
| 230 | +given at least once, and warn if it is given more than once. |
| 231 | +If @env{GCC_HONOUR_COPTS} is set to 2, abort if this option is not |
| 232 | +given exactly once. |
| 233 | +If @env{GCC_HONOUR_COPTS} is set to 0 or unset, warn if this option |
| 234 | +is not given exactly once. |
| 235 | +The warning is quelled if @env{GCC_HONOUR_COPTS} is set to @samp{s}. |
| 236 | +This flag and environment variable only affect the C language. |
| 237 | + |
| 238 | @item -Wstack-protector |
| 239 | This option is only active when @option{-fstack-protector} is active. It |
| 240 | warns about functions that will not be protected against stack smashing. |
| 241 | @@ -4679,7 +4695,7 @@ erroneously read data to propagate withi |
| 242 | Perform the optimizations of loop strength reduction and |
| 243 | elimination of iteration variables. |
| 244 | |
| 245 | -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. |
| 246 | +Enabled at levels @option{-O3}. |
| 247 | |
| 248 | @item -fthread-jumps |
| 249 | @opindex fthread-jumps |
| 250 | @@ -4826,7 +4842,7 @@ safely dereference null pointers. Use |
| 251 | @option{-fno-delete-null-pointer-checks} to disable this optimization |
| 252 | for programs which depend on that behavior. |
| 253 | |
| 254 | -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. |
| 255 | +Enabled at levels @option{-O3}. |
| 256 | |
| 257 | @item -fexpensive-optimizations |
| 258 | @opindex fexpensive-optimizations |
| 259 | @@ -5234,7 +5250,7 @@ node, an alias set for the node. Nodes |
| 260 | allowed to alias. For an example, see the C front-end function |
| 261 | @code{c_get_alias_set}. |
| 262 | |
| 263 | -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. |
| 264 | +Enabled at levels @option{-O3}. |
| 265 | |
| 266 | @item -falign-functions |
| 267 | @itemx -falign-functions=@var{n} |
| 268 | --- a/gcc/java/jvspec.c |
| 269 | +++ b/gcc/java/jvspec.c |
| 270 | @@ -620,6 +620,7 @@ lang_specific_pre_link (void) |
| 271 | class name. Append dummy `.c' that can be stripped by set_input so %b |
| 272 | is correct. */ |
| 273 | set_input (concat (main_class_name, "main.c", NULL)); |
| 274 | + putenv ("GCC_HONOUR_COPTS=s"); /* XXX hack! */ |
| 275 | err = do_spec (jvgenmain_spec); |
| 276 | if (err == 0) |
| 277 | { |
| 278 | |