Commit 60cdff2f authored by Tom Tromey's avatar Tom Tromey Committed by Tom de Vries
Browse files

Add Rust support to source highlighting

[ Backport of master commit d806ea2d. ]

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-08-19  Tom Tromey  <tom@tromey.com>

	PR gdb/25009
	* 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.
parent ef93dd73
2019-08-19 Tom Tromey <tom@tromey.com>
PR gdb/25009
* 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.
2019-06-28 Sergio Durigan Junior <sergiodj@redhat.com>
PR breakpoints/24541
......
......@@ -11503,6 +11503,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`
......
......@@ -1251,6 +1251,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`
......
......@@ -156,8 +156,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";
......@@ -213,21 +212,33 @@ source_cache::get_source_lines (struct symtab *s, int first_line,
use-after-free. */
fullname = symtab_to_fullname (s);
}
srchilite::SourceHighlight highlighter ("esc.outlang");
highlighter.setStyleFile("esc.style");
try
{
srchilite::SourceHighlight highlighter ("esc.outlang");
highlighter.setStyleFile("esc.style");
std::ostringstream output;
highlighter.highlight (input, output, lang_name, fullname);
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. */
}
}
}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment