summaryrefslogtreecommitdiff
path: root/toolchain/gcc/patches/cflags.patch
blob: af4430fdc72de7df42f83d78e342ac92ca9cee70 (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
diff -Nur gcc-4.6.0.orig/gcc/c-family/c-opts.c gcc-4.6.0/gcc/c-family/c-opts.c
--- gcc-4.6.0.orig/gcc/c-family/c-opts.c	2011-01-26 07:48:04.000000000 +0100
+++ gcc-4.6.0/gcc/c-family/c-opts.c	2011-03-31 15:46:52.000000000 +0200
@@ -103,6 +103,9 @@
 /* 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_cxx0x (int);
@@ -441,6 +444,9 @@
       global_dc->warning_as_error_requested = value;
       break;
 
+    case OPT_Werror_maybe_reset:
+      break;
+
     case OPT_Wformat:
       set_Wformat (value);
       break;
@@ -653,6 +659,11 @@
       visibility_options.inlines_hidden = value;
       break;
 
+    case OPT_fhonour_copts:
+      if (c_language == clk_c)
+		honour_copts++;
+      break;
+
     case OPT_femit_struct_debug_baseonly:
       set_struct_debug_option (&global_options, loc, "base");
       break;
@@ -1058,6 +1069,47 @@
       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;
 }
 
diff -Nur gcc-4.6.0.orig/gcc/c-family/c.opt gcc-4.6.0/gcc/c-family/c.opt
--- gcc-4.6.0.orig/gcc/c-family/c.opt	2011-02-17 22:34:10.000000000 +0100
+++ gcc-4.6.0/gcc/c-family/c.opt	2011-03-31 15:40:46.000000000 +0200
@@ -363,6 +363,10 @@
 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
@@ -790,6 +794,9 @@
 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
diff -Nur gcc-4.6.0.orig/gcc/common.opt gcc-4.6.0/gcc/common.opt
--- gcc-4.6.0.orig/gcc/common.opt	2011-03-06 01:38:13.000000000 +0100
+++ gcc-4.6.0/gcc/common.opt	2011-03-31 15:40:46.000000000 +0200
@@ -511,6 +511,10 @@
 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
@@ -1147,6 +1151,9 @@
 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
diff -Nur gcc-4.6.0.orig/gcc/doc/cppopts.texi gcc-4.6.0/gcc/doc/cppopts.texi
--- gcc-4.6.0.orig/gcc/doc/cppopts.texi	2010-12-20 08:26:12.000000000 +0100
+++ gcc-4.6.0/gcc/doc/cppopts.texi	2011-03-31 15:40:46.000000000 +0200
@@ -164,6 +164,11 @@
 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
diff -Nur gcc-4.6.0.orig/gcc/doc/invoke.texi gcc-4.6.0/gcc/doc/invoke.texi
--- gcc-4.6.0.orig/gcc/doc/invoke.texi	2011-03-18 15:34:52.000000000 +0100
+++ gcc-4.6.0/gcc/doc/invoke.texi	2011-03-31 15:41:41.000000000 +0200
@@ -240,7 +240,7 @@
 -Wconversion  -Wcoverage-mismatch  -Wcpp  -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
@@ -4488,6 +4488,22 @@
 @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
@@ -6310,7 +6326,7 @@
 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
diff -Nur gcc-4.6.0.orig/gcc/java/jvspec.c gcc-4.6.0/gcc/java/jvspec.c
--- gcc-4.6.0.orig/gcc/java/jvspec.c	2011-02-13 20:20:01.000000000 +0100
+++ gcc-4.6.0/gcc/java/jvspec.c	2011-03-31 15:40:46.000000000 +0200
@@ -627,6 +627,7 @@
      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)
     {
diff -Nur gcc-4.6.0.orig/gcc/opts.c gcc-4.6.0/gcc/opts.c
--- gcc-4.6.0.orig/gcc/opts.c	2011-02-17 23:51:57.000000000 +0100
+++ gcc-4.6.0/gcc/opts.c	2011-03-31 15:43:52.000000000 +0200
@@ -477,8 +477,6 @@
     { 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 },
@@ -501,6 +499,8 @@
     { OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 },
     { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
     { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
+    { OPT_LEVELS_3_PLUS, OPT_fstrict_aliasing, NULL, 1 },
+    { OPT_LEVELS_3_PLUS, OPT_fstrict_overflow, NULL, 1 },
     { OPT_LEVELS_3_PLUS, OPT_ftree_vectorize, NULL, 1 },
     { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
 
@@ -1399,6 +1399,17 @@
 			       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;