Fix Rust lex selftest when using libiconv

Message ID 20210930185549.579369-1-tromey@adacore.com
State New
Headers show
Series
  • Fix Rust lex selftest when using libiconv
Related show

Commit Message

Stafford Horne via Gdb-patches Sept. 30, 2021, 6:55 p.m.
The Rust lex selftest fails on our Windows build.  I tracked this down
to a use of UTF-32 as a parameter to convert_between_encodings.  Here,
iconv_open succeeds, but the actual conversion of a tab character
fails with EILSEQ.  I suspect that "UTF-32" is being interpreted as
big-endian, as changing the call to use "UTF-32LE" makes it work.
This patch implements this fix.
---
 gdb/rust-parse.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

-- 
2.31.1

Comments

Stafford Horne via Gdb-patches Oct. 19, 2021, 7:26 p.m. | #1
>>>>> "Tom" == Tom Tromey via Gdb-patches <gdb-patches@sourceware.org> writes:


Tom> The Rust lex selftest fails on our Windows build.  I tracked this down
Tom> to a use of UTF-32 as a parameter to convert_between_encodings.  Here,
Tom> iconv_open succeeds, but the actual conversion of a tab character
Tom> fails with EILSEQ.  I suspect that "UTF-32" is being interpreted as
Tom> big-endian, as changing the call to use "UTF-32LE" makes it work.
Tom> This patch implements this fix.

I'm checking this in.

Tom

Patch

diff --git a/gdb/rust-parse.c b/gdb/rust-parse.c
index 539e1c8256d..e12bf29a71d 100644
--- a/gdb/rust-parse.c
+++ b/gdb/rust-parse.c
@@ -695,9 +695,16 @@  rust_parser::lex_string ()
 	  if (is_byte)
 	    obstack_1grow (&obstack, value);
 	  else
-	    convert_between_encodings ("UTF-32", "UTF-8", (gdb_byte *) &value,
-				       sizeof (value), sizeof (value),
-				       &obstack, translit_none);
+	    {
+#if WORDS_BIGENDIAN
+#define UTF32 "UTF-32BE"
+#else
+#define UTF32 "UTF-32LE"
+#endif
+	      convert_between_encodings (UTF32, "UTF-8", (gdb_byte *) &value,
+					 sizeof (value), sizeof (value),
+					 &obstack, translit_none);
+	    }
 	}
       else if (pstate->lexptr[0] == '\0')
 	error (_("Unexpected EOF in string"));