[v2,2/2] Add Rust support to source highlighting

Message ID 20190727155155.32417-3-tom@tromey.com
State New, archived
Headers

Commit Message

Tom Tromey July 27, 2019, 3:51 p.m. UTC
  Currently, no release of GNU Source Highlight supports Rust.  However,
I've checked in a patch to do so there, and I plan to make a new
release sometime this summer.

This patch prepares gdb for that by adding support for Rust to the
source highlighting code.

Because Source Highlight will throw an exception if the language is
unrecognized, this also changes gdb to ignore exceptions here.  This
will cause gdb to fall back to un-highlighted source text.

This updates gdb's configure script to reject the combination of
Source Highlight and -static-libstdc++.  This is done because it's not
possible to use -static-libstdc++ and then catch exceptions from a
shared library.

Tested with the current and development versions of Source Highlight.

gdb/ChangeLog
2019-07-27  Tom Tromey  <tom@tromey.com>

	* configure: Rebuild.
	* configure.ac: Disallow the combination of -static-libstdc++ and
	source highlight.
	* source-cache.c (get_language_name): Handle rust.
	(source_cache::get_source_lines): Ignore highlighting exceptions.
---
 gdb/ChangeLog      |  8 ++++++++
 gdb/configure      |  6 ++++++
 gdb/configure.ac   |  8 ++++++++
 gdb/source-cache.c | 33 ++++++++++++++++++++++-----------
 4 files changed, 44 insertions(+), 11 deletions(-)
  

Comments

Tom de Vries Sept. 4, 2019, 5:22 p.m. UTC | #1
On 27-07-19 17:51, Tom Tromey wrote:
> Currently, no release of GNU Source Highlight supports Rust.  However,
> I've checked in a patch to do so there, and I plan to make a new
> release sometime this summer.
> 
> This patch prepares gdb for that by adding support for Rust to the
> source highlighting code.
> 
> Because Source Highlight will throw an exception if the language is
> unrecognized, this also changes gdb to ignore exceptions here.  This
> will cause gdb to fall back to un-highlighted source text.
> 
> This updates gdb's configure script to reject the combination of
> Source Highlight and -static-libstdc++.  This is done because it's not
> possible to use -static-libstdc++ and then catch exceptions from a
> shared library.
> 
> Tested with the current and development versions of Source Highlight.

Hi,

I recently updated my regular build setup to include an installed
libsource-highlight.so by installing package libsource-highlight-devel
in openSUSE Leap 15.1.

Subsequently I ran into this error in the gdb 8.3 branch:
...
$ ./install/bin/gdb -q a.out -ex start
Reading symbols from a.out...
Temporary breakpoint 1 at 0x40053b: file hello.c, line 9.
Starting program: /data/gdb_versions/devel/a.out

Temporary breakpoint 1, main () at hello.c:9
terminate called after throwing an instance of 'srchilite::ParserException'
  what():  error during the parsing of a definition file
Aborted (core dumped)
...

This expection happens when the library attempts to access
/usr/share/source-highlight/esc.outlang, which is not there, because
it's contained in another package (source-highlight). Installing that
package fixes the error.

Nevertheless, the error did not occur on master, and I've bisect that
behaviour to this patch.

So my question is: does it make sense to backport (part of) this patch
to 8.3?

Thanks,
- Tom
  
Tom Tromey Sept. 10, 2019, 3:56 p.m. UTC | #2
>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:

Tom> I recently updated my regular build setup to include an installed
Tom> libsource-highlight.so by installing package libsource-highlight-devel
Tom> in openSUSE Leap 15.1.
...

Tom> So my question is: does it make sense to backport (part of) this patch
Tom> to 8.3?

It would be fine by me.  The configury bits would also be needed.

Tom
  

Patch

diff --git a/gdb/configure b/gdb/configure
index 12954d1f74a..cd92b70958c 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -11296,6 +11296,12 @@  $as_echo "no - pkg-config not found" >&6; }
       as_fn_error $? "pkg-config was not found in your system" "$LINENO" 5
     fi
   else
+    case "$LDFLAGS" in
+      *static-libstdc*)
+        as_fn_error $? "source highlight is incompatible with -static-libstdc++; either use --disable-source-highlight or --without-static-standard-libraries" "$LINENO" 5
+        ;;
+    esac
+
     if ${pkg_config_prog_path} --exists source-highlight; then
       SRCHIGH_CFLAGS=`${pkg_config_prog_path} --cflags source-highlight`
       SRCHIGH_LIBS=`${pkg_config_prog_path} --libs source-highlight`
diff --git a/gdb/configure.ac b/gdb/configure.ac
index 2a43d12df76..3dc4b7549b1 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -1217,6 +1217,14 @@  if test "${enable_source_highlight}" != "no"; then
       AC_MSG_ERROR([pkg-config was not found in your system])
     fi
   else
+    case "$LDFLAGS" in
+      *static-libstdc*)
+        AC_MSG_ERROR([source highlight is incompatible with -static-libstdc++; dnl
+either use --disable-source-highlight or dnl
+--without-static-standard-libraries])
+        ;;
+    esac
+
     if ${pkg_config_prog_path} --exists source-highlight; then
       SRCHIGH_CFLAGS=`${pkg_config_prog_path} --cflags source-highlight`
       SRCHIGH_LIBS=`${pkg_config_prog_path} --libs source-highlight`
diff --git a/gdb/source-cache.c b/gdb/source-cache.c
index f5bb641a22b..06a244ebbf0 100644
--- a/gdb/source-cache.c
+++ b/gdb/source-cache.c
@@ -154,8 +154,7 @@  get_language_name (enum language lang)
       break;
 
     case language_rust:
-      /* Not handled by Source Highlight.  */
-      break;
+      return "rust.lang";
 
     case language_ada:
       return "ada.lang";
@@ -224,18 +223,30 @@  source_cache::get_source_lines (struct symtab *s, int first_line,
 		  highlighter->setStyleFile ("esc.style");
 		}
 
-	      std::ostringstream output;
-	      highlighter->highlight (input, output, lang_name, fullname);
+	      try
+		{
+		  std::ostringstream output;
+		  highlighter->highlight (input, output, lang_name, fullname);
 
-	      source_text result = { fullname, output.str () };
-	      m_source_map.push_back (std::move (result));
+		  source_text result = { fullname, output.str () };
+		  m_source_map.push_back (std::move (result));
 
-	      if (m_source_map.size () > MAX_ENTRIES)
-		m_source_map.erase (m_source_map.begin ());
+		  if (m_source_map.size () > MAX_ENTRIES)
+		    m_source_map.erase (m_source_map.begin ());
 
-	      *lines = extract_lines (m_source_map.back (), first_line,
-				      last_line);
-	      return true;
+		  *lines = extract_lines (m_source_map.back (), first_line,
+					  last_line);
+		  return true;
+		}
+	      catch (...)
+		{
+		  /* Source Highlight will throw an exception if
+		     highlighting fails.  One possible reason it can
+		     fail is if the language is unknown -- which
+		     matters to gdb because Rust support wasn't added
+		     until after 3.1.8.  Ignore exceptions here and
+		     fall back to un-highlighted text. */
+		}
 	    }
 	}
     }