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