aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2019-03-15 17:37:28 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2019-03-15 18:40:27 +0200
commit841140bbf13ae2bfaa5978a181718cda0a8edae7 (patch)
treee92871043d56857378a5d54f5c26d409578ce73e
parent98a6a1494d68e74ebc979dbf1989d32e961116ad (diff)
Add initial support for GCC 9
-rw-r--r--odb/cxx-lexer.cxx33
-rw-r--r--odb/gcc.hxx32
-rw-r--r--odb/include.cxx3
-rw-r--r--odb/plugin.cxx45
4 files changed, 92 insertions, 21 deletions
diff --git a/odb/cxx-lexer.cxx b/odb/cxx-lexer.cxx
index 7c52d39..e252332 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 a4be7f1..f4780ba 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 823a4f2..8ac6dda 100644
--- a/odb/include.cxx
+++ b/odb/include.cxx
@@ -586,6 +586,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 849940a..10b0b01 100644
--- a/odb/plugin.cxx
+++ b/odb/plugin.cxx
@@ -48,10 +48,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
@@ -62,17 +67,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
@@ -84,7 +94,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,
@@ -123,15 +133,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.