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