| From cd9a15f42ef35449a8ad480352f9f5495eb37c30 Mon Sep 17 00:00:00 2001 |
| From: Boris Kolpackov <boris@codesynthesis.com> |
| Date: Fri, 15 Mar 2019 17:37:28 +0200 |
| Subject: [PATCH] Add initial support for GCC 9 |
| |
| Upstream: https://git.codesynthesis.com/cgit/odb/odb/commit/?id=841140bbf13ae2bfaa5978a181718cda0a8edae7 |
| Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> |
| --- |
| odb/cxx-lexer.cxx | 33 +++++++++++++++++++++++++++------ |
| odb/gcc.hxx | 32 ++++++++++++++++++++++++++++++++ |
| odb/include.cxx | 3 +++ |
| odb/plugin.cxx | 45 ++++++++++++++++++++++++++++++--------------- |
| 4 files changed, 92 insertions(+), 21 deletions(-) |
| |
| diff --git a/odb/cxx-lexer.cxx b/odb/cxx-lexer.cxx |
| index cfebbb5..acd13be 100644 |
| --- a/odb/cxx-lexer.cxx |
| +++ b/odb/cxx-lexer.cxx |
| @@ -143,12 +143,20 @@ translate () |
| // Diagnostics callback. |
| // |
| extern "C" bool |
| -cpp_error_callback ( |
| +cpp_diagnostic_callback ( |
| cpp_reader* reader, |
| +#if BUILDING_GCC_MAJOR >= 9 |
| + cpp_diagnostic_level level, |
| +#else |
| int level, |
| +#endif |
| #if BUILDING_GCC_MAJOR > 4 || BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR > 5 |
| +#if BUILDING_GCC_MAJOR >= 9 |
| + cpp_warning_reason, |
| +#else |
| int /*reason*/, // Added in GCC 4.6.0. |
| #endif |
| +#endif |
| #if BUILDING_GCC_MAJOR <= 5 |
| location_t, |
| unsigned int, |
| @@ -185,10 +193,14 @@ cpp_error_callback ( |
| vfprintf (stderr, msg, *ap); |
| fprintf (stderr, "\n"); |
| |
| - // By resetting the error callback we indicate to cxx_string_lexer |
| - // that there was an error. |
| + // By resetting the callback we indicate to cxx_string_lexer that there |
| + // was an error. |
| // |
| +#if BUILDING_GCC_MAJOR >= 9 |
| + cpp_get_callbacks (reader)->diagnostic = 0; |
| +#else |
| cpp_get_callbacks (reader)->error = 0; |
| +#endif |
| return true; |
| } |
| |
| @@ -247,7 +259,12 @@ start (string const& data) |
| // The previous lexing session should have popped the buffer. |
| // |
| assert (cpp_get_buffer (reader_) == 0); |
| - callbacks_->error = &cpp_error_callback; |
| + |
| +#if BUILDING_GCC_MAJOR >= 9 |
| + callbacks_->diagnostic = &cpp_diagnostic_callback; |
| +#else |
| + callbacks_->error = &cpp_diagnostic_callback; |
| +#endif |
| |
| data_ = data; |
| buf_ = data; |
| @@ -267,10 +284,14 @@ next (string& token, tree* node) |
| token.clear (); |
| cpp_token const* t (cpp_get_token (reader_)); |
| |
| - // If there was an error, the error callback will be reset to 0. |
| - // Diagnostics has already been issued. |
| + // If there was an error, the callback will be reset to 0. Diagnostics has |
| + // already been issued. |
| // |
| +#if BUILDING_GCC_MAJOR >= 9 |
| + if (callbacks_->diagnostic == 0) |
| +#else |
| if (callbacks_->error == 0) |
| +#endif |
| throw invalid_input (); |
| |
| cpp_ttype tt (t->type); |
| diff --git a/odb/gcc.hxx b/odb/gcc.hxx |
| index a22357d..0304192 100644 |
| --- a/odb/gcc.hxx |
| +++ b/odb/gcc.hxx |
| @@ -158,4 +158,36 @@ gcc_tree_code_name (gcc_tree_code_type tc) {return tree_code_name[tc];} |
| # define anon_aggrname_p(X) ANON_AGGRNAME_P(X) |
| #endif |
| |
| +// In GCC 9: |
| +// |
| +// INCLUDED_FROM Became linemap_included_from_linemap(). |
| +// LAST_SOURCE_LINE Was removed apparently as no longer used. Studying |
| +// the line-map.h diff from 8.3 suggests that the old |
| +// implementation should still work. |
| +// |
| +#if BUILDING_GCC_MAJOR >= 9 |
| + |
| +inline const line_map_ordinary* |
| +INCLUDED_FROM (line_maps* set, const line_map_ordinary* map) |
| +{ |
| + return linemap_included_from_linemap (set, map); |
| +} |
| + |
| +inline source_location |
| +LAST_SOURCE_LINE_LOCATION (const line_map_ordinary* map) |
| +{ |
| + return (((map[1].start_location - 1 |
| + - map->start_location) |
| + & ~((1 << map->m_column_and_range_bits) - 1)) |
| + + map->start_location); |
| +} |
| + |
| +inline linenum_type |
| +LAST_SOURCE_LINE (const line_map_ordinary* map) |
| +{ |
| + return SOURCE_LINE (map, LAST_SOURCE_LINE_LOCATION (map)); |
| +} |
| + |
| +#endif |
| + |
| #endif // ODB_GCC_HXX |
| diff --git a/odb/include.cxx b/odb/include.cxx |
| index 08c93ce..0082f5e 100644 |
| --- a/odb/include.cxx |
| +++ b/odb/include.cxx |
| @@ -584,6 +584,9 @@ namespace |
| |
| for (include_map::iterator i (imap.begin ()), e (imap.end ()); i != e; ++i) |
| { |
| + // Note that the LAST_SOURCE_LINE value of a map that includes another |
| + // map is the line of that include. |
| + |
| /* |
| cerr << endl |
| << i->first << " included from" << endl; |
| diff --git a/odb/plugin.cxx b/odb/plugin.cxx |
| index 0fac632..892f27c 100644 |
| --- a/odb/plugin.cxx |
| +++ b/odb/plugin.cxx |
| @@ -44,10 +44,15 @@ paths profile_paths_; |
| path file_; // File being compiled. |
| paths inputs_; // List of input files in at-once mode or just file_. |
| |
| -bool (*cpp_error_prev) ( |
| +bool (*cpp_diagnostic_prev) ( |
| cpp_reader*, |
| +#if BUILDING_GCC_MAJOR >= 9 |
| + cpp_diagnostic_level, |
| + cpp_warning_reason, |
| +#else |
| int, |
| int, |
| +#endif |
| #if BUILDING_GCC_MAJOR >= 6 |
| rich_location*, |
| #else |
| @@ -58,17 +63,22 @@ bool (*cpp_error_prev) ( |
| va_list*); |
| |
| static bool |
| -cpp_error_filter (cpp_reader* r, |
| - int level, |
| - int reason, |
| +cpp_diagnostic_filter (cpp_reader* r, |
| +#if BUILDING_GCC_MAJOR >= 9 |
| + cpp_diagnostic_level level, |
| + cpp_warning_reason reason, |
| +#else |
| + int level, |
| + int reason, |
| +#endif |
| #if BUILDING_GCC_MAJOR >= 6 |
| - rich_location* l, |
| + rich_location* l, |
| #else |
| - location_t l, |
| - unsigned int column_override, |
| + location_t l, |
| + unsigned int column_override, |
| #endif |
| - const char* msg, |
| - va_list* ap) |
| + const char* msg, |
| + va_list* ap) |
| { |
| // #pragma once in the main file. Note that the message that we get is |
| // potentially translated so we search for the substring (there is |
| @@ -80,7 +90,7 @@ cpp_error_filter (cpp_reader* r, |
| if (strstr (msg, "#pragma once") != 0) |
| return true; |
| |
| - return cpp_error_prev ( |
| + return cpp_diagnostic_prev ( |
| r, |
| level, |
| reason, |
| @@ -119,15 +129,20 @@ start_unit_callback (void*, void*) |
| // |
| cpp_callbacks* cb (cpp_get_callbacks (parse_in)); |
| |
| - if (cb->error == 0) |
| +#if BUILDING_GCC_MAJOR >= 9 |
| + cpp_diagnostic_prev = cb->diagnostic; |
| + cb->diagnostic = &cpp_diagnostic_filter; |
| +#else |
| + cpp_diagnostic_prev = cb->error; |
| + cb->error = &cpp_diagnostic_filter; |
| +#endif |
| + |
| + if (cpp_diagnostic_prev == 0) |
| { |
| - cerr << "ice: expected cpp error callback to be set" << endl; |
| + cerr << "ice: expected cpp diagnostic callback to be set" << endl; |
| exit (1); |
| } |
| |
| - cpp_error_prev = cb->error; |
| - cb->error = &cpp_error_filter; |
| - |
| // Set the directory of the main file (stdin) to that of the orginal |
| // file so that relative inclusion works. Also adjust the path and |
| // re-stat the file so that #pragma once works. |
| -- |
| 2.25.0 |
| |