aboutsummaryrefslogtreecommitdiffstats
path: root/toolchain/gcc/patches/llvm/910-mbsd_multi.patch
blob: ef3b532360a7f1022ee41179348199e952a5ce5f (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
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278

	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@mirbsd.de>
	with copyright assignment to the FSF in effect.

--- a/gcc/c-opts.c
+++ b/gcc/c-opts.c
@@ -109,6 +109,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 set_Wimplicit (int);
 static void handle_OPT_d (const char *);
 static void set_std_cxx98 (int);
@@ -502,6 +505,14 @@ c_common_handle_option (size_t scode, co
       mesg_implicit_function_declaration = 2;
       break;
 
+    case OPT_Werror_maybe_reset:
+      {
+	char *ev = getenv ("GCC_NO_WERROR");
+	if ((ev != NULL) && (*ev != '0'))
+	  cpp_opts->warnings_are_errors = 0;
+      }
+      break;
+
     case OPT_Wformat:
       set_Wformat (value);
       break;
@@ -778,6 +789,12 @@ c_common_handle_option (size_t scode, co
       flag_exceptions = value;
       break;
 
+    case OPT_fhonour_copts:
+      if (c_language == clk_c) {
+	honour_copts++;
+      }
+      break;
+
     case OPT_fimplement_inlines:
       flag_implement_inlines = value;
       break;
@@ -1295,6 +1312,47 @@ c_common_init (void)
   /* Has to wait until now so that cpplib has its hash table.  */
   init_pragma ();
 
+  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 ("someone does not honour COPTS correctly, passed %d times",
+	 honour_copts);
+    }
+  }
+
   return true;
 }
 
--- a/gcc/c.opt
+++ b/gcc/c.opt
@@ -220,6 +220,10 @@ C ObjC C++ ObjC++
 Warn about extra tokens at the end of prepreprocessor directives
 ; APPLE LOCAL end -Wextra-tokens
 
+Werror-maybe-reset
+C ObjC C++ ObjC++
+; Documented in common.opt
+
 Wfloat-equal
 C ObjC C++ ObjC++ Var(warn_float_equal)
 Warn if testing floating point numbers for equality
@@ -675,6 +679,9 @@ C++ ObjC++
 fhonor-std
 C++ ObjC++
 
+fhonour-copts
+C ObjC C++ ObjC++ RejectNegative
+
 fhosted
 C ObjC
 Assume normal C execution environment
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -81,6 +81,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
 Print extra (possibly unwanted) warnings
@@ -607,6 +611,9 @@ Common Report Var(flag_guess_branch_prob
 Enable guessing of branch probabilities
 ; APPLE LOCAL end optimization pragmas 3124235/3420242
 
+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
@@ -507,9 +507,6 @@ void set_flags_from_O (unsigned int cmdl
 #endif
       flag_regmove = 1;
       /* APPLE LOCAL optimization pragmas 3124235/3420242 */
-      if (cmdline) flag_strict_aliasing = 1;
-      flag_strict_overflow = 1;
-      flag_delete_null_pointer_checks = 1;
       flag_reorder_blocks = 1;
       /* APPLE LOCAL optimization pragmas 3124235/3420242 */
       if (cmdline) flag_reorder_functions = 1;
@@ -536,6 +533,9 @@ void set_flags_from_O (unsigned int cmdl
 
   if (optimize >= 3)
     {
+      if (cmdline) flag_strict_aliasing = 1;
+      flag_strict_overflow = 1;
+      flag_delete_null_pointer_checks = 1;
       if (cmdline)
         flag_inline_functions = 1;
       flag_unswitch_loops = 1;
@@ -873,6 +873,17 @@ common_handle_option (size_t scode, cons
       }
       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_Wextra:
       set_Wextra (value);
       break;
--- a/gcc/doc/cppopts.texi
+++ b/gcc/doc/cppopts.texi
@@ -166,6 +166,11 @@ in older programs.  This warning is on b
 Make all warnings into hard errors.  Source code which triggers warnings
 will be rejected.
 
+@item -Werror-maybe-reset
+@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
@@ -282,7 +282,7 @@ Objective-C and Objective-C++ Dialects}.
 -Wc++-compat -Wcast-align  -Wcast-qual  -Wchar-subscripts  -Wcomment @gol
 -Wconversion  -Wno-deprecated-declarations @gol
 -Wdisabled-optimization  -Wno-div-by-zero  -Wno-endif-labels @gol
--Werror  -Werror=* -Werror-implicit-function-declaration @gol
+-Werror -Werror-maybe-reset -Werror=* -Werror-implicit-function-declaration @gol
 @c APPLE LOCAL default to Wformat-security 5764921
 -Wfatal-errors  -Wfloat-equal  -Wno-format  -Wformat=2 @gol
 -Wno-format-extra-args -Wformat-nonliteral @gol
@@ -4031,6 +4031,22 @@ Note that specifying @option{-Werror=}@v
 @option{-W}@var{foo}.  However, @option{-Wno-error=}@var{foo} does not
 imply anything.
 
+@item -Werror-maybe-reset
+@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 -fhonour-copts
+@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
 This option is only active when @option{-fstack-protector} is active.  It
@@ -5533,7 +5549,7 @@ second branch or a point immediately fol
 the condition is known to be true or false.
 
 @c APPLE LOCAL 4231761 -Oz
-Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}, @option{-Oz} (APPLE ONLY).
+Enabled at levels @option{-O3}, @option{-Oz} (APPLE ONLY).
 
 @item -fcse-follow-jumps
 @opindex fcse-follow-jumps
@@ -5659,7 +5675,7 @@ safely dereference null pointers.  Use
 for programs which depend on that behavior.
 
 @c APPLE LOCAL 4231761 -Oz
-Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}, @option{-Oz} (APPLE ONLY).
+Enabled at levels @option{-O3}, @option{-Oz} (APPLE ONLY).
 
 @item -fexpensive-optimizations
 @opindex fexpensive-optimizations
@@ -6103,7 +6119,7 @@ allowed to alias.  For an example, see t
 @code{c_get_alias_set}.
 
 @c APPLE LOCAL 4231761 -Oz
-Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}, @option{-Oz} (APPLE ONLY).
+Enabled at levels @option{-O3}, @option{-Oz} (APPLE ONLY).
 
 @item -fstrict-overflow
 @opindex fstrict-overflow
--- a/gcc/java/jvspec.c
+++ b/gcc/java/jvspec.c
@@ -632,6 +632,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)
     {