aboutsummaryrefslogtreecommitdiffstats
path: root/toolchain/gcc/patches/4.7-linaro/910-mbsd_multi.patch
blob: 82b17455e17a837408e79c3cd05028877d2a854a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
	This patch brings over a few features from MirBSD:
	* -fhonour-copts
	  If this option is not given, it's warned (depending
	  on environment variables). This is to catch errors
	  of misbuilt packages which override CFLAGS themselves.
	* -Werror-maybe-reset
	  Has the effect of -Wno-error if GCC_NO_WERROR is
	  set and not '0', a no-operation otherwise. This is
	  to be able to use -Werror in "make" but prevent
	  GNU autoconf generated configure scripts from
	  freaking out.
	* Make -fno-strict-aliasing and -fno-delete-null-pointer-checks
	  the default for -O2/-Os, because they trigger gcc bugs
	  and can delete code with security implications.

	This patch was authored by Thorsten Glaser <tg at mirbsd.de>
	with copyright assignment to the FSF in effect.

--- a/gcc/c-family/c-opts.c
+++ b/gcc/c-family/c-opts.c
@@ -108,6 +108,9 @@ static size_t deferred_count;
 /* Number of deferred options scanned for -include.  */
 static size_t include_cursor;
 
+/* Check if a port honours COPTS.  */
+static int honour_copts = 0;
+
 static void handle_OPT_d (const char *);
 static void set_std_cxx98 (int);
 static void set_std_cxx11 (int);
@@ -449,6 +452,9 @@ c_common_handle_option (size_t scode, co
       cpp_opts->warn_endif_labels = value;
       break;
 
+    case OPT_Werror_maybe_reset:
+      break;
+
     case OPT_Wformat:
       set_Wformat (value);
       break;
@@ -592,6 +598,12 @@ c_common_handle_option (size_t scode, co
       flag_no_builtin = !value;
       break;
 
+    case OPT_fhonour_copts:
+      if (c_language == clk_c) {
+        honour_copts++;
+      }
+      break;
+
     case OPT_fconstant_string_class_:
       constant_string_class_name = arg;
       break;
@@ -1098,6 +1110,47 @@ c_common_init (void)
       return false;
     }
 
+  if (c_language == clk_c) {
+    char *ev = getenv ("GCC_HONOUR_COPTS");
+    int evv;
+    if (ev == NULL)
+      evv = -1;
+    else if ((*ev == '0') || (*ev == '\0'))
+      evv = 0;
+    else if (*ev == '1')
+      evv = 1;
+    else if (*ev == '2')
+      evv = 2;
+    else if (*ev == 's')
+      evv = -1;
+    else {
+      warning (0, "unknown GCC_HONOUR_COPTS value, assuming 1");
+      evv = 1; /* maybe depend this on something like MIRBSD_NATIVE?  */
+    }
+    if (evv == 1) {
+      if (honour_copts == 0) {
+        error ("someone does not honour COPTS at all in lenient mode");
+        return false;
+      } else if (honour_copts != 1) {
+        warning (0, "someone does not honour COPTS correctly, passed %d times",
+         honour_copts);
+      }
+    } else if (evv == 2) {
+      if (honour_copts == 0) {
+        error ("someone does not honour COPTS at all in strict mode");
+        return false;
+      } else if (honour_copts != 1) {
+        error ("someone does not honour COPTS correctly, passed %d times",
+         honour_copts);
+        return false;
+      }
+    } else if (evv == 0) {
+      if (honour_copts != 1)
+        inform (0, "someone does not honour COPTS correctly, passed %d times",
+         honour_copts);
+    }
+  }
+
   return true;
 }
 
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -371,6 +371,10 @@ Werror-implicit-function-declaration
 C ObjC RejectNegative Warning Alias(Werror=, implicit-function-declaration)
 This switch is deprecated; use -Werror=implicit-function-declaration instead
 
+Werror-maybe-reset
+C ObjC C++ ObjC++
+; Documented in common.opt
+
 Wfloat-equal
 C ObjC C++ ObjC++ Var(warn_float_equal) Warning
 Warn if testing floating point numbers for equality
@@ -830,6 +834,9 @@ C++ ObjC++ Optimization Alias(fexception
 fhonor-std
 C++ ObjC++ Ignore Warn(switch %qs is no longer supported)
 
+fhonour-copts
+C ObjC C++ ObjC++ RejectNegative
+
 fhosted
 C ObjC
 Assume normal C execution environment
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -531,6 +531,10 @@ Werror=
 Common Joined
 Treat specified warning as error
 
+Werror-maybe-reset
+Common
+If environment variable GCC_NO_WERROR is set, act as -Wno-error
+
 Wextra
 Common Var(extra_warnings) Warning
 Print extra (possibly unwanted) warnings
@@ -1209,6 +1213,9 @@ fguess-branch-probability
 Common Report Var(flag_guess_branch_prob) Optimization
 Enable guessing of branch probabilities
 
+fhonour-copts
+Common RejectNegative
+
 ; Nonzero means ignore `#ident' directives.  0 means handle them.
 ; Generate position-independent code for executables if possible
 ; On SVR4 targets, it also controls whether or not to emit a
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -470,8 +470,6 @@ static const struct default_options defa
     { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
 #endif
     { OPT_LEVELS_2_PLUS, OPT_fregmove, NULL, 1 },
-    { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
-    { OPT_LEVELS_2_PLUS, OPT_fstrict_overflow, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_freorder_blocks, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
@@ -489,6 +487,8 @@ static const struct default_options defa
     { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
 
     /* -O3 optimizations.  */
+    { OPT_LEVELS_3_PLUS, OPT_fstrict_aliasing, NULL, 1 },
+    { OPT_LEVELS_3_PLUS, OPT_fstrict_overflow, NULL, 1 },
     { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
     { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
     /* Inlining of functions reducing size is a good idea with -Os
@@ -1433,6 +1433,17 @@ common_handle_option (struct gcc_options
 			       opts, opts_set, loc, dc);
       break;
 
+    case OPT_Werror_maybe_reset:
+      {
+        char *ev = getenv ("GCC_NO_WERROR");
+        if ((ev != NULL) && (*ev != '0'))
+          warnings_are_errors = 0;
+      }
+      break;
+
+    case OPT_fhonour_copts:
+      break;
+
     case OPT_Wlarger_than_:
       opts->x_larger_than_size = value;
       opts->x_warn_larger_than = value != -1;
--- a/gcc/doc/cppopts.texi
+++ b/gcc/doc/cppopts.texi
@@ -164,6 +164,11 @@ in older programs.  This warning is on b
 Make all warnings into hard errors.  Source code which triggers warnings
 will be rejected.
 
+ at item -Werror-maybe-reset
+ at opindex Werror-maybe-reset
+Act like @samp{-Wno-error} if the @env{GCC_NO_WERROR} environment
+variable is set to anything other than 0 or empty.
+
 @item -Wsystem-headers
 @opindex Wsystem-headers
 Issue warnings for code in system headers.  These are normally unhelpful
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -242,7 +242,7 @@ Objective-C and Objective-C++ Dialects}.
 -Wconversion  -Wcoverage-mismatch  -Wno-cpp  -Wno-deprecated  @gol
 -Wno-deprecated-declarations -Wdisabled-optimization  @gol
 -Wno-div-by-zero -Wdouble-promotion -Wempty-body  -Wenum-compare @gol
--Wno-endif-labels -Werror  -Werror=* @gol
+-Wno-endif-labels -Werror  -Werror=* -Werror-maybe-reset @gol
 -Wfatal-errors  -Wfloat-equal  -Wformat  -Wformat=2 @gol
 -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral @gol
 -Wformat-security  -Wformat-y2k @gol
@@ -4661,6 +4661,22 @@ This option is only supported for C and
 @option{-Wall} and by @option{-pedantic}, which can be disabled with
 @option{-Wno-pointer-sign}.
 
+ at item -Werror-maybe-reset
+ at opindex Werror-maybe-reset
+Act like @samp{-Wno-error} if the @env{GCC_NO_WERROR} environment
+variable is set to anything other than 0 or empty.
+
+ at item -fhonour-copts
+ at opindex fhonour-copts
+If @env{GCC_HONOUR_COPTS} is set to 1, abort if this option is not
+given at least once, and warn if it is given more than once.
+If @env{GCC_HONOUR_COPTS} is set to 2, abort if this option is not
+given exactly once.
+If @env{GCC_HONOUR_COPTS} is set to 0 or unset, warn if this option
+is not given exactly once.
+The warning is quelled if @env{GCC_HONOUR_COPTS} is set to @samp{s}.
+This flag and environment variable only affect the C language.
+
 @item -Wstack-protector
 @opindex Wstack-protector
 @opindex Wno-stack-protector
@@ -6580,7 +6596,7 @@ so, the first branch is redirected to ei
 second branch or a point immediately following it, depending on whether
 the condition is known to be true or false.
 
-Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
+Enabled at levels @option{-O3}.
 
 @item -fsplit-wide-types
 @opindex fsplit-wide-types
--- a/gcc/java/jvspec.c
+++ b/gcc/java/jvspec.c
@@ -627,6 +627,7 @@ lang_specific_pre_link (void)
      class name.  Append dummy `.c' that can be stripped by set_input so %b
      is correct.  */ 
   set_input (concat (main_class_name, "main.c", NULL));
+  putenv ("GCC_HONOUR_COPTS=s"); /* XXX hack!  */
   err = do_spec (jvgenmain_spec);
   if (err == 0)
     {