1*4882a593SmuzhiyunFrom bf389fd5185143847b1d91aed423e79c322dba51 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Boris Kolpackov <boris@codesynthesis.com>
3*4882a593SmuzhiyunDate: Fri, 5 Feb 2016 16:01:42 +0200
4*4882a593SmuzhiyunSubject: [PATCH] Initial work to make ODB compatible with GCC 6
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun[Upstream: 511dcf67322ad87fb32f97d1cf7725c129e83898]
7*4882a593SmuzhiyunSigned-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com>
8*4882a593Smuzhiyun---
9*4882a593Smuzhiyun odb/cxx-lexer.cxx          |  4 ++++
10*4882a593Smuzhiyun odb/gcc-fwd.hxx            | 23 ++++++++++++++++++++++-
11*4882a593Smuzhiyun odb/gcc.hxx                | 10 ++++++++++
12*4882a593Smuzhiyun odb/include.cxx            | 31 +++++++++++++++++++++----------
13*4882a593Smuzhiyun odb/parser.cxx             |  8 ++++----
14*4882a593Smuzhiyun odb/plugin.cxx             | 29 +++++++++++++++++++++++++++--
15*4882a593Smuzhiyun odb/semantics/elements.cxx |  4 ++--
16*4882a593Smuzhiyun 7 files changed, 90 insertions(+), 19 deletions(-)
17*4882a593Smuzhiyun
18*4882a593Smuzhiyundiff --git a/odb/cxx-lexer.cxx b/odb/cxx-lexer.cxx
19*4882a593Smuzhiyunindex 7029c7e..64df296 100644
20*4882a593Smuzhiyun--- a/odb/cxx-lexer.cxx
21*4882a593Smuzhiyun+++ b/odb/cxx-lexer.cxx
22*4882a593Smuzhiyun@@ -135,8 +135,12 @@ cpp_error_callback (
23*4882a593Smuzhiyun #if BUILDING_GCC_MAJOR > 4 || BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR > 5
24*4882a593Smuzhiyun   int /*reason*/, // Added in GCC 4.6.0.
25*4882a593Smuzhiyun #endif
26*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR <= 5
27*4882a593Smuzhiyun   location_t,
28*4882a593Smuzhiyun   unsigned int,
29*4882a593Smuzhiyun+#else
30*4882a593Smuzhiyun+  rich_location*,
31*4882a593Smuzhiyun+#endif
32*4882a593Smuzhiyun   char const* msg,
33*4882a593Smuzhiyun   va_list *ap)
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyundiff --git a/odb/gcc-fwd.hxx b/odb/gcc-fwd.hxx
36*4882a593Smuzhiyunindex a120f05..618b106 100644
37*4882a593Smuzhiyun--- a/odb/gcc-fwd.hxx
38*4882a593Smuzhiyun+++ b/odb/gcc-fwd.hxx
39*4882a593Smuzhiyun@@ -7,6 +7,24 @@
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun #include <bversion.h>
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 6
44*4882a593Smuzhiyun+
45*4882a593Smuzhiyun+// If we include <system.h> here, it pulls in all kinds of GCC trouble that
46*4882a593Smuzhiyun+// "poisons" standard C/C++ declarations; see safe-ctype.h. So instead we
47*4882a593Smuzhiyun+// are going to "exclude" safe-ctype.h. To compensate, however, we will
48*4882a593Smuzhiyun+// include it first thing in gcc.hxx.
49*4882a593Smuzhiyun+//
50*4882a593Smuzhiyun+#  include <config.h>
51*4882a593Smuzhiyun+#  define SAFE_CTYPE_H
52*4882a593Smuzhiyun+#  include <system.h>
53*4882a593Smuzhiyun+#  undef SAFE_CTYPE_H
54*4882a593Smuzhiyun+#  include <coretypes.h>
55*4882a593Smuzhiyun+
56*4882a593Smuzhiyun+typedef unsigned int source_location; // <line-map.h>
57*4882a593Smuzhiyun+typedef source_location location_t;   // <input.h>
58*4882a593Smuzhiyun+
59*4882a593Smuzhiyun+#else // GCC < 6
60*4882a593Smuzhiyun+
61*4882a593Smuzhiyun #if BUILDING_GCC_MAJOR > 4 || BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR > 8
62*4882a593Smuzhiyun #  include <limits.h> // CHAR_BIT
63*4882a593Smuzhiyun #  include <config.h>
64*4882a593Smuzhiyun@@ -33,6 +51,9 @@ extern "C"
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun typedef unsigned int source_location; // <line-map.h>
67*4882a593Smuzhiyun typedef source_location location_t;   // <input.h>
68*4882a593Smuzhiyun-}
69*4882a593Smuzhiyun+
70*4882a593Smuzhiyun+} // extern "C"
71*4882a593Smuzhiyun+
72*4882a593Smuzhiyun+#endif
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun #endif // ODB_GCC_FWD_HXX
75*4882a593Smuzhiyundiff --git a/odb/gcc.hxx b/odb/gcc.hxx
76*4882a593Smuzhiyunindex c953047..858d685 100644
77*4882a593Smuzhiyun--- a/odb/gcc.hxx
78*4882a593Smuzhiyun+++ b/odb/gcc.hxx
79*4882a593Smuzhiyun@@ -7,6 +7,10 @@
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun #include <odb/gcc-fwd.hxx>
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 6
84*4882a593Smuzhiyun+#  include <safe-ctype.h> // See gcc-fwd.hxx.
85*4882a593Smuzhiyun+#endif
86*4882a593Smuzhiyun+
87*4882a593Smuzhiyun // GCC header includes to get the plugin and parse tree declarations.
88*4882a593Smuzhiyun // The order is important and doesn't follow any kind of logic.
89*4882a593Smuzhiyun //
90*4882a593Smuzhiyun@@ -145,4 +149,10 @@ gcc_tree_code_name (gcc_tree_code_type tc) {return tree_code_name[tc];}
91*4882a593Smuzhiyun #define DECL_CHAIN(x) TREE_CHAIN(x)
92*4882a593Smuzhiyun #endif
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun+// In GCC 6, ANON_AGGRNAME_P became anon_aggrname_p().
95*4882a593Smuzhiyun+//
96*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR < 6
97*4882a593Smuzhiyun+#  define anon_aggrname_p(X) ANON_AGGRNAME_P(X)
98*4882a593Smuzhiyun+#endif
99*4882a593Smuzhiyun+
100*4882a593Smuzhiyun #endif // ODB_GCC_HXX
101*4882a593Smuzhiyundiff --git a/odb/include.cxx b/odb/include.cxx
102*4882a593Smuzhiyunindex c397993..08c93ce 100644
103*4882a593Smuzhiyun--- a/odb/include.cxx
104*4882a593Smuzhiyun+++ b/odb/include.cxx
105*4882a593Smuzhiyun@@ -30,9 +30,18 @@ namespace
106*4882a593Smuzhiyun     path path_;
107*4882a593Smuzhiyun   };
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 6
110*4882a593Smuzhiyun+  typedef line_map_ordinary line_map_type;
111*4882a593Smuzhiyun+#else
112*4882a593Smuzhiyun+  typedef line_map line_map_type;
113*4882a593Smuzhiyun+# ifndef linemap_check_ordinary
114*4882a593Smuzhiyun+#   define linemap_check_ordinary(X) (X)
115*4882a593Smuzhiyun+# endif
116*4882a593Smuzhiyun+#endif
117*4882a593Smuzhiyun+
118*4882a593Smuzhiyun   struct includes
119*4882a593Smuzhiyun   {
120*4882a593Smuzhiyun-    typedef std::map<line_map const*, include_directive> map_type;
121*4882a593Smuzhiyun+    typedef std::map<line_map_type const*, include_directive> map_type;
122*4882a593Smuzhiyun     bool trailing; // Included at the beginning or at the end of the main file.
123*4882a593Smuzhiyun     map_type map;
124*4882a593Smuzhiyun   };
125*4882a593Smuzhiyun@@ -144,7 +153,9 @@ namespace
126*4882a593Smuzhiyun       //
127*4882a593Smuzhiyun       if (l > BUILTINS_LOCATION)
128*4882a593Smuzhiyun       {
129*4882a593Smuzhiyun-        line_map const* lm (linemap_lookup (line_table, l));
130*4882a593Smuzhiyun+        line_map_type const* lm (
131*4882a593Smuzhiyun+          linemap_check_ordinary (
132*4882a593Smuzhiyun+            linemap_lookup (line_table, l)));
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun         if (lm != 0 && !MAIN_FILE_P (lm))
135*4882a593Smuzhiyun         {
136*4882a593Smuzhiyun@@ -537,20 +548,20 @@ namespace
137*4882a593Smuzhiyun     //
138*4882a593Smuzhiyun #if BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR <= 6
139*4882a593Smuzhiyun     size_t used (line_table->used);
140*4882a593Smuzhiyun-    line_map const* maps (line_table->maps);
141*4882a593Smuzhiyun+    line_map_type const* maps (line_table->maps);
142*4882a593Smuzhiyun #else
143*4882a593Smuzhiyun     size_t used (line_table->info_ordinary.used);
144*4882a593Smuzhiyun-    line_map const* maps (line_table->info_ordinary.maps);
145*4882a593Smuzhiyun+    line_map_type const* maps (line_table->info_ordinary.maps);
146*4882a593Smuzhiyun #endif
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun     for (size_t i (0); i < used; ++i)
149*4882a593Smuzhiyun     {
150*4882a593Smuzhiyun-      line_map const* m (maps + i);
151*4882a593Smuzhiyun+      line_map_type const* m (maps + i);
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun       if (MAIN_FILE_P (m) || m->reason != LC_ENTER)
154*4882a593Smuzhiyun         continue;
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun-      line_map const* ifm (INCLUDED_FROM (line_table, m));
157*4882a593Smuzhiyun+      line_map_type const* ifm (INCLUDED_FROM (line_table, m));
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun #if BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR <= 6
160*4882a593Smuzhiyun       path f (m->to_file);
161*4882a593Smuzhiyun@@ -580,7 +591,7 @@ namespace
162*4882a593Smuzhiyun       for (includes::iterator j (i->second.begin ());
163*4882a593Smuzhiyun            j != i->second.end (); ++j)
164*4882a593Smuzhiyun       {
165*4882a593Smuzhiyun-        line_map const* lm (j->first);
166*4882a593Smuzhiyun+        line_map_type const* lm (j->first);
167*4882a593Smuzhiyun         cerr << '\t' << lm->to_file << ":" << LAST_SOURCE_LINE (lm) << endl;
168*4882a593Smuzhiyun       }
169*4882a593Smuzhiyun       */
170*4882a593Smuzhiyun@@ -589,13 +600,13 @@ namespace
171*4882a593Smuzhiyun       // it is preferred over all others. Use the first one if there are
172*4882a593Smuzhiyun       // several.
173*4882a593Smuzhiyun       //
174*4882a593Smuzhiyun-      line_map const* main_lm (0);
175*4882a593Smuzhiyun+      line_map_type const* main_lm (0);
176*4882a593Smuzhiyun       include_directive* main_inc (0);
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun       for (includes::map_type::iterator j (i->second.map.begin ());
179*4882a593Smuzhiyun            j != i->second.map.end (); ++j)
180*4882a593Smuzhiyun       {
181*4882a593Smuzhiyun-        line_map const* lm (j->first);
182*4882a593Smuzhiyun+        line_map_type const* lm (j->first);
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun         if (MAIN_FILE_P (lm))
185*4882a593Smuzhiyun         {
186*4882a593Smuzhiyun@@ -636,7 +647,7 @@ namespace
187*4882a593Smuzhiyun       for (includes::map_type::iterator j (i->second.map.begin ());
188*4882a593Smuzhiyun            j != i->second.map.end (); ++j)
189*4882a593Smuzhiyun       {
190*4882a593Smuzhiyun-        line_map const* lm (j->first);
191*4882a593Smuzhiyun+        line_map_type const* lm (j->first);
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun #if BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR <= 6
194*4882a593Smuzhiyun         string f (lm->to_file);
195*4882a593Smuzhiyundiff --git a/odb/parser.cxx b/odb/parser.cxx
196*4882a593Smuzhiyunindex a8e6a6a..feda9d4 100644
197*4882a593Smuzhiyun--- a/odb/parser.cxx
198*4882a593Smuzhiyun+++ b/odb/parser.cxx
199*4882a593Smuzhiyun@@ -1044,14 +1044,14 @@ emit_type_decl (tree decl)
200*4882a593Smuzhiyun     // says that in typedef struct {} S; S becomes struct's
201*4882a593Smuzhiyun     // name.
202*4882a593Smuzhiyun     //
203*4882a593Smuzhiyun-    if (ANON_AGGRNAME_P (decl_name))
204*4882a593Smuzhiyun+    if (anon_aggrname_p (decl_name))
205*4882a593Smuzhiyun     {
206*4882a593Smuzhiyun       tree d (TYPE_NAME (t));
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun       if (d != NULL_TREE &&
209*4882a593Smuzhiyun           !DECL_ARTIFICIAL (d) &&
210*4882a593Smuzhiyun           DECL_NAME (d) != NULL_TREE &&
211*4882a593Smuzhiyun-          !ANON_AGGRNAME_P (DECL_NAME (d)))
212*4882a593Smuzhiyun+          !anon_aggrname_p (DECL_NAME (d)))
213*4882a593Smuzhiyun       {
214*4882a593Smuzhiyun         decl = d;
215*4882a593Smuzhiyun         decl_name = DECL_NAME (decl);
216*4882a593Smuzhiyun@@ -1668,7 +1668,7 @@ create_type (tree t,
217*4882a593Smuzhiyun             ts << "start anon/stub " << gcc_tree_code_name(tc) << " at "
218*4882a593Smuzhiyun                << file << ":" << line << endl;
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun-          if (d == NULL_TREE || ANON_AGGRNAME_P (DECL_NAME (d)))
221*4882a593Smuzhiyun+          if (d == NULL_TREE || anon_aggrname_p (DECL_NAME (d)))
222*4882a593Smuzhiyun           {
223*4882a593Smuzhiyun             if (tc == RECORD_TYPE)
224*4882a593Smuzhiyun               r = &emit_class<class_> (t, file, line, clmn);
225*4882a593Smuzhiyun@@ -1765,7 +1765,7 @@ create_type (tree t,
226*4882a593Smuzhiyun         ts << "start anon/stub " << gcc_tree_code_name(tc) << " at "
227*4882a593Smuzhiyun            << file << ":" << line << endl;
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun-      if (d == NULL_TREE || ANON_AGGRNAME_P (DECL_NAME (d)))
230*4882a593Smuzhiyun+      if (d == NULL_TREE || anon_aggrname_p (DECL_NAME (d)))
231*4882a593Smuzhiyun       {
232*4882a593Smuzhiyun         r = &emit_enum (t, access, file, line, clmn);
233*4882a593Smuzhiyun       }
234*4882a593Smuzhiyundiff --git a/odb/plugin.cxx b/odb/plugin.cxx
235*4882a593Smuzhiyunindex 51f0cb1..779faed 100644
236*4882a593Smuzhiyun--- a/odb/plugin.cxx
237*4882a593Smuzhiyun+++ b/odb/plugin.cxx
238*4882a593Smuzhiyun@@ -45,14 +45,28 @@ path file_;    // File being compiled.
239*4882a593Smuzhiyun paths inputs_; // List of input files in at-once mode or just file_.
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun bool (*cpp_error_prev) (
242*4882a593Smuzhiyun-  cpp_reader*, int, int, location_t, unsigned int, const char*, va_list*);
243*4882a593Smuzhiyun+  cpp_reader*,
244*4882a593Smuzhiyun+  int,
245*4882a593Smuzhiyun+  int,
246*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 6
247*4882a593Smuzhiyun+  rich_location*,
248*4882a593Smuzhiyun+#else
249*4882a593Smuzhiyun+  location_t,
250*4882a593Smuzhiyun+  unsigned int,
251*4882a593Smuzhiyun+#endif
252*4882a593Smuzhiyun+  const char*,
253*4882a593Smuzhiyun+  va_list*);
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun static bool
256*4882a593Smuzhiyun cpp_error_filter (cpp_reader* r,
257*4882a593Smuzhiyun                   int level,
258*4882a593Smuzhiyun                   int reason,
259*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 6
260*4882a593Smuzhiyun+                  rich_location* l,
261*4882a593Smuzhiyun+#else
262*4882a593Smuzhiyun                   location_t l,
263*4882a593Smuzhiyun                   unsigned int column_override,
264*4882a593Smuzhiyun+#endif
265*4882a593Smuzhiyun                   const char* msg,
266*4882a593Smuzhiyun                   va_list* ap)
267*4882a593Smuzhiyun {
268*4882a593Smuzhiyun@@ -66,7 +80,18 @@ cpp_error_filter (cpp_reader* r,
269*4882a593Smuzhiyun   if (strstr (msg, "#pragma once") != 0)
270*4882a593Smuzhiyun     return true;
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun-  return cpp_error_prev (r, level, reason, l, column_override, msg, ap);
273*4882a593Smuzhiyun+  return cpp_error_prev (
274*4882a593Smuzhiyun+    r,
275*4882a593Smuzhiyun+    level,
276*4882a593Smuzhiyun+    reason,
277*4882a593Smuzhiyun+#if BUILDING_GCC_MAJOR >= 6
278*4882a593Smuzhiyun+    l,
279*4882a593Smuzhiyun+#else
280*4882a593Smuzhiyun+    l,
281*4882a593Smuzhiyun+    column_override,
282*4882a593Smuzhiyun+#endif
283*4882a593Smuzhiyun+    msg,
284*4882a593Smuzhiyun+    ap);
285*4882a593Smuzhiyun }
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun // A prefix of the _cpp_file struct. This struct is not part of the
288*4882a593Smuzhiyundiff --git a/odb/semantics/elements.cxx b/odb/semantics/elements.cxx
289*4882a593Smuzhiyunindex 21e3260..399d5e9 100644
290*4882a593Smuzhiyun--- a/odb/semantics/elements.cxx
291*4882a593Smuzhiyun+++ b/odb/semantics/elements.cxx
292*4882a593Smuzhiyun@@ -59,7 +59,7 @@ namespace semantics
293*4882a593Smuzhiyun       if (tree decl = TYPE_NAME (n))
294*4882a593Smuzhiyun         name = DECL_NAME (decl);
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun-      return name != 0 && ANON_AGGRNAME_P (name);
297*4882a593Smuzhiyun+      return name != 0 && anon_aggrname_p (name);
298*4882a593Smuzhiyun     }
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun     return true;
301*4882a593Smuzhiyun@@ -108,7 +108,7 @@ namespace semantics
302*4882a593Smuzhiyun       if (tree decl = TYPE_NAME (type))
303*4882a593Smuzhiyun       {
304*4882a593Smuzhiyun         name = DECL_NAME (decl);
305*4882a593Smuzhiyun-        if (name != 0 && ANON_AGGRNAME_P (name))
306*4882a593Smuzhiyun+        if (name != 0 && anon_aggrname_p (name))
307*4882a593Smuzhiyun           return true;
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun         tree s (CP_DECL_CONTEXT (decl));
310*4882a593Smuzhiyun--
311*4882a593Smuzhiyun2.25.0
312*4882a593Smuzhiyun
313