xref: /OK3568_Linux_fs/buildroot/package/odb/0010-Add-initial-support-for-GCC-9.patch (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593SmuzhiyunFrom cd9a15f42ef35449a8ad480352f9f5495eb37c30 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Boris Kolpackov <boris@codesynthesis.com>
3*4882a593SmuzhiyunDate: Fri, 15 Mar 2019 17:37:28 +0200
4*4882a593SmuzhiyunSubject: [PATCH] Add initial support for GCC 9
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun[Upstream: 841140bbf13ae2bfaa5978a181718cda0a8edae7]
7*4882a593SmuzhiyunSigned-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com>
8*4882a593Smuzhiyun---
9*4882a593Smuzhiyun odb/cxx-lexer.cxx | 33 +++++++++++++++++++++++++++------
10*4882a593Smuzhiyun odb/gcc.hxx       | 32 ++++++++++++++++++++++++++++++++
11*4882a593Smuzhiyun odb/include.cxx   |  3 +++
12*4882a593Smuzhiyun odb/plugin.cxx    | 45 ++++++++++++++++++++++++++++++---------------
13*4882a593Smuzhiyun 4 files changed, 92 insertions(+), 21 deletions(-)
14*4882a593Smuzhiyun
15*4882a593Smuzhiyundiff --git a/odb/cxx-lexer.cxx b/odb/cxx-lexer.cxx
16*4882a593Smuzhiyunindex cfebbb5..acd13be 100644
17*4882a593Smuzhiyun--- a/odb/cxx-lexer.cxx
18*4882a593Smuzhiyun+++ b/odb/cxx-lexer.cxx
19*4882a593Smuzhiyun@@ -143,12 +143,20 @@ translate ()
20*4882a593Smuzhiyun // Diagnostics callback.
21*4882a593Smuzhiyun //
22*4882a593Smuzhiyun extern "C" bool
23*4882a593Smuzhiyun-cpp_error_callback (
24*4882a593Smuzhiyun+cpp_diagnostic_callback (
25*4882a593Smuzhiyun   cpp_reader* reader,
26*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 9
27*4882a593Smuzhiyun+  cpp_diagnostic_level level,
28*4882a593Smuzhiyun+#else
29*4882a593Smuzhiyun   int level,
30*4882a593Smuzhiyun+#endif
31*4882a593Smuzhiyun #if BUILDING_GCC_MAJOR > 4 || BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR > 5
32*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 9
33*4882a593Smuzhiyun+  cpp_warning_reason,
34*4882a593Smuzhiyun+#else
35*4882a593Smuzhiyun   int /*reason*/, // Added in GCC 4.6.0.
36*4882a593Smuzhiyun #endif
37*4882a593Smuzhiyun+#endif
38*4882a593Smuzhiyun #if BUILDING_GCC_MAJOR <= 5
39*4882a593Smuzhiyun   location_t,
40*4882a593Smuzhiyun   unsigned int,
41*4882a593Smuzhiyun@@ -185,10 +193,14 @@ cpp_error_callback (
42*4882a593Smuzhiyun     vfprintf (stderr, msg, *ap);
43*4882a593Smuzhiyun     fprintf (stderr, "\n");
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun-    // By resetting the error callback we indicate to cxx_string_lexer
46*4882a593Smuzhiyun-    // that there was an error.
47*4882a593Smuzhiyun+    // By resetting the callback we indicate to cxx_string_lexer that there
48*4882a593Smuzhiyun+    // was an error.
49*4882a593Smuzhiyun     //
50*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 9
51*4882a593Smuzhiyun+    cpp_get_callbacks (reader)->diagnostic = 0;
52*4882a593Smuzhiyun+#else
53*4882a593Smuzhiyun     cpp_get_callbacks (reader)->error = 0;
54*4882a593Smuzhiyun+#endif
55*4882a593Smuzhiyun     return true;
56*4882a593Smuzhiyun   }
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun@@ -247,7 +259,12 @@ start (string const& data)
59*4882a593Smuzhiyun   // The previous lexing session should have popped the buffer.
60*4882a593Smuzhiyun   //
61*4882a593Smuzhiyun   assert (cpp_get_buffer (reader_) == 0);
62*4882a593Smuzhiyun-  callbacks_->error = &cpp_error_callback;
63*4882a593Smuzhiyun+
64*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 9
65*4882a593Smuzhiyun+  callbacks_->diagnostic = &cpp_diagnostic_callback;
66*4882a593Smuzhiyun+#else
67*4882a593Smuzhiyun+  callbacks_->error = &cpp_diagnostic_callback;
68*4882a593Smuzhiyun+#endif
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun   data_ = data;
71*4882a593Smuzhiyun   buf_ = data;
72*4882a593Smuzhiyun@@ -267,10 +284,14 @@ next (string& token, tree* node)
73*4882a593Smuzhiyun   token.clear ();
74*4882a593Smuzhiyun   cpp_token const* t (cpp_get_token (reader_));
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun-  // If there was an error, the error callback will be reset to 0.
77*4882a593Smuzhiyun-  // Diagnostics has already been issued.
78*4882a593Smuzhiyun+  // If there was an error, the callback will be reset to 0. Diagnostics has
79*4882a593Smuzhiyun+  // already been issued.
80*4882a593Smuzhiyun   //
81*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 9
82*4882a593Smuzhiyun+  if (callbacks_->diagnostic == 0)
83*4882a593Smuzhiyun+#else
84*4882a593Smuzhiyun   if (callbacks_->error == 0)
85*4882a593Smuzhiyun+#endif
86*4882a593Smuzhiyun     throw invalid_input ();
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun   cpp_ttype tt (t->type);
89*4882a593Smuzhiyundiff --git a/odb/gcc.hxx b/odb/gcc.hxx
90*4882a593Smuzhiyunindex a22357d..0304192 100644
91*4882a593Smuzhiyun--- a/odb/gcc.hxx
92*4882a593Smuzhiyun+++ b/odb/gcc.hxx
93*4882a593Smuzhiyun@@ -158,4 +158,36 @@ gcc_tree_code_name (gcc_tree_code_type tc) {return tree_code_name[tc];}
94*4882a593Smuzhiyun #  define anon_aggrname_p(X) ANON_AGGRNAME_P(X)
95*4882a593Smuzhiyun #endif
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun+// In GCC 9:
98*4882a593Smuzhiyun+//
99*4882a593Smuzhiyun+// INCLUDED_FROM     Became linemap_included_from_linemap().
100*4882a593Smuzhiyun+// LAST_SOURCE_LINE  Was removed apparently as no longer used. Studying
101*4882a593Smuzhiyun+//                   the line-map.h diff from 8.3 suggests that the old
102*4882a593Smuzhiyun+//                   implementation should still work.
103*4882a593Smuzhiyun+//
104*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 9
105*4882a593Smuzhiyun+
106*4882a593Smuzhiyun+inline const line_map_ordinary*
107*4882a593Smuzhiyun+INCLUDED_FROM (line_maps* set, const line_map_ordinary* map)
108*4882a593Smuzhiyun+{
109*4882a593Smuzhiyun+  return linemap_included_from_linemap (set, map);
110*4882a593Smuzhiyun+}
111*4882a593Smuzhiyun+
112*4882a593Smuzhiyun+inline source_location
113*4882a593Smuzhiyun+LAST_SOURCE_LINE_LOCATION (const line_map_ordinary* map)
114*4882a593Smuzhiyun+{
115*4882a593Smuzhiyun+  return (((map[1].start_location - 1
116*4882a593Smuzhiyun+	    - map->start_location)
117*4882a593Smuzhiyun+	   & ~((1 << map->m_column_and_range_bits) - 1))
118*4882a593Smuzhiyun+	  + map->start_location);
119*4882a593Smuzhiyun+}
120*4882a593Smuzhiyun+
121*4882a593Smuzhiyun+inline linenum_type
122*4882a593Smuzhiyun+LAST_SOURCE_LINE (const line_map_ordinary* map)
123*4882a593Smuzhiyun+{
124*4882a593Smuzhiyun+  return SOURCE_LINE (map, LAST_SOURCE_LINE_LOCATION (map));
125*4882a593Smuzhiyun+}
126*4882a593Smuzhiyun+
127*4882a593Smuzhiyun+#endif
128*4882a593Smuzhiyun+
129*4882a593Smuzhiyun #endif // ODB_GCC_HXX
130*4882a593Smuzhiyundiff --git a/odb/include.cxx b/odb/include.cxx
131*4882a593Smuzhiyunindex 08c93ce..0082f5e 100644
132*4882a593Smuzhiyun--- a/odb/include.cxx
133*4882a593Smuzhiyun+++ b/odb/include.cxx
134*4882a593Smuzhiyun@@ -584,6 +584,9 @@ namespace
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun     for (include_map::iterator i (imap.begin ()), e (imap.end ()); i != e; ++i)
137*4882a593Smuzhiyun     {
138*4882a593Smuzhiyun+      // Note that the LAST_SOURCE_LINE value of a map that includes another
139*4882a593Smuzhiyun+      // map is the line of that include.
140*4882a593Smuzhiyun+
141*4882a593Smuzhiyun       /*
142*4882a593Smuzhiyun       cerr << endl
143*4882a593Smuzhiyun            << i->first << " included from" << endl;
144*4882a593Smuzhiyundiff --git a/odb/plugin.cxx b/odb/plugin.cxx
145*4882a593Smuzhiyunindex 0fac632..892f27c 100644
146*4882a593Smuzhiyun--- a/odb/plugin.cxx
147*4882a593Smuzhiyun+++ b/odb/plugin.cxx
148*4882a593Smuzhiyun@@ -44,10 +44,15 @@ paths profile_paths_;
149*4882a593Smuzhiyun path file_;    // File being compiled.
150*4882a593Smuzhiyun paths inputs_; // List of input files in at-once mode or just file_.
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun-bool (*cpp_error_prev) (
153*4882a593Smuzhiyun+bool (*cpp_diagnostic_prev) (
154*4882a593Smuzhiyun   cpp_reader*,
155*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 9
156*4882a593Smuzhiyun+  cpp_diagnostic_level,
157*4882a593Smuzhiyun+  cpp_warning_reason,
158*4882a593Smuzhiyun+#else
159*4882a593Smuzhiyun   int,
160*4882a593Smuzhiyun   int,
161*4882a593Smuzhiyun+#endif
162*4882a593Smuzhiyun #if BUILDING_GCC_MAJOR >= 6
163*4882a593Smuzhiyun   rich_location*,
164*4882a593Smuzhiyun #else
165*4882a593Smuzhiyun@@ -58,17 +63,22 @@ bool (*cpp_error_prev) (
166*4882a593Smuzhiyun   va_list*);
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun static bool
169*4882a593Smuzhiyun-cpp_error_filter (cpp_reader* r,
170*4882a593Smuzhiyun-                  int level,
171*4882a593Smuzhiyun-                  int reason,
172*4882a593Smuzhiyun+cpp_diagnostic_filter (cpp_reader* r,
173*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 9
174*4882a593Smuzhiyun+                       cpp_diagnostic_level level,
175*4882a593Smuzhiyun+                       cpp_warning_reason reason,
176*4882a593Smuzhiyun+#else
177*4882a593Smuzhiyun+                       int level,
178*4882a593Smuzhiyun+                       int reason,
179*4882a593Smuzhiyun+#endif
180*4882a593Smuzhiyun #if BUILDING_GCC_MAJOR >= 6
181*4882a593Smuzhiyun-                  rich_location* l,
182*4882a593Smuzhiyun+                       rich_location* l,
183*4882a593Smuzhiyun #else
184*4882a593Smuzhiyun-                  location_t l,
185*4882a593Smuzhiyun-                  unsigned int column_override,
186*4882a593Smuzhiyun+                       location_t l,
187*4882a593Smuzhiyun+                       unsigned int column_override,
188*4882a593Smuzhiyun #endif
189*4882a593Smuzhiyun-                  const char* msg,
190*4882a593Smuzhiyun-                  va_list* ap)
191*4882a593Smuzhiyun+                       const char* msg,
192*4882a593Smuzhiyun+                       va_list* ap)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun   // #pragma once in the main file. Note that the message that we get is
195*4882a593Smuzhiyun   // potentially translated so we search for the substring (there is
196*4882a593Smuzhiyun@@ -80,7 +90,7 @@ cpp_error_filter (cpp_reader* r,
197*4882a593Smuzhiyun   if (strstr (msg, "#pragma once") != 0)
198*4882a593Smuzhiyun     return true;
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun-  return cpp_error_prev (
201*4882a593Smuzhiyun+  return cpp_diagnostic_prev (
202*4882a593Smuzhiyun     r,
203*4882a593Smuzhiyun     level,
204*4882a593Smuzhiyun     reason,
205*4882a593Smuzhiyun@@ -119,15 +129,20 @@ start_unit_callback (void*, void*)
206*4882a593Smuzhiyun   //
207*4882a593Smuzhiyun   cpp_callbacks* cb (cpp_get_callbacks (parse_in));
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun-  if (cb->error == 0)
210*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 9
211*4882a593Smuzhiyun+  cpp_diagnostic_prev = cb->diagnostic;
212*4882a593Smuzhiyun+  cb->diagnostic = &cpp_diagnostic_filter;
213*4882a593Smuzhiyun+#else
214*4882a593Smuzhiyun+  cpp_diagnostic_prev = cb->error;
215*4882a593Smuzhiyun+  cb->error = &cpp_diagnostic_filter;
216*4882a593Smuzhiyun+#endif
217*4882a593Smuzhiyun+
218*4882a593Smuzhiyun+  if (cpp_diagnostic_prev == 0)
219*4882a593Smuzhiyun   {
220*4882a593Smuzhiyun-    cerr << "ice: expected cpp error callback to be set" << endl;
221*4882a593Smuzhiyun+    cerr << "ice: expected cpp diagnostic callback to be set" << endl;
222*4882a593Smuzhiyun     exit (1);
223*4882a593Smuzhiyun   }
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun-  cpp_error_prev = cb->error;
226*4882a593Smuzhiyun-  cb->error = &cpp_error_filter;
227*4882a593Smuzhiyun-
228*4882a593Smuzhiyun   // Set the directory of the main file (stdin) to that of the orginal
229*4882a593Smuzhiyun   // file so that relative inclusion works. Also adjust the path and
230*4882a593Smuzhiyun   // re-stat the file so that #pragma once works.
231*4882a593Smuzhiyun--
232*4882a593Smuzhiyun2.25.0
233*4882a593Smuzhiyun
234