summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2019-09-19 16:18:33 +0200
committerTom de Vries <tdevries@suse.de>2019-09-19 16:18:33 +0200
commit60cdff2f2222a49df78a682ad9f2c1c7faf1eb49 (patch)
tree2453f734022d1ca4d78366fa0f6c3d8013fb93fd
parentef93dd73bcaefd1736cbc9aaf9a0178be7976b6e (diff)
downloadbinutils-gdb-60cdff2f2222a49df78a682ad9f2c1c7faf1eb49.tar.gz
Add Rust support to source highlighting
[ Backport of master commit d806ea2d0e. ] 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.
-rw-r--r--gdb/ChangeLog9
-rwxr-xr-xgdb/configure6
-rw-r--r--gdb/configure.ac8
-rw-r--r--gdb/source-cache.c37
4 files changed, 47 insertions, 13 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 969515a65e9..765e2c95e14 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,12 @@
+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
diff --git a/gdb/configure b/gdb/configure
index 854837c50a3..866564fbe68 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -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`
diff --git a/gdb/configure.ac b/gdb/configure.ac
index 1527585839d..0805827adf6 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -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`
diff --git a/gdb/source-cache.c b/gdb/source-cache.c
index 5eae02082df..d443c5e7fbb 100644
--- a/gdb/source-cache.c
+++ b/gdb/source-cache.c
@@ -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. */
+ }
}
}
}