aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/c-lang.c2
-rw-r--r--gdb/c-valprint.c2
-rw-r--r--gdb/dwarf2/read.c15
-rw-r--r--gdb/testsuite/gdb.dwarf2/utf-rust.exp69
4 files changed, 75 insertions, 13 deletions
diff --git a/gdb/c-lang.c b/gdb/c-lang.c
index 2a7dd4d..6c6d160 100644
--- a/gdb/c-lang.c
+++ b/gdb/c-lang.c
@@ -88,7 +88,7 @@ classify_type (struct type *elttype, struct gdbarch *gdbarch,
{
const char *name = elttype->name ();
- if (elttype->code () == TYPE_CODE_CHAR || !name)
+ if (name == nullptr)
{
result = C_CHAR;
goto done;
diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c
index daf2453..feca0a7 100644
--- a/gdb/c-valprint.c
+++ b/gdb/c-valprint.c
@@ -438,6 +438,7 @@ c_value_print_inner (struct value *val, struct ui_file *stream, int recurse,
c_value_print_struct (val, stream, recurse, options);
break;
+ case TYPE_CODE_CHAR:
case TYPE_CODE_INT:
c_value_print_int (val, stream, options);
break;
@@ -458,7 +459,6 @@ c_value_print_inner (struct value *val, struct ui_file *stream, int recurse,
case TYPE_CODE_ERROR:
case TYPE_CODE_UNDEF:
case TYPE_CODE_COMPLEX:
- case TYPE_CODE_CHAR:
default:
generic_value_print (val, stream, recurse, options, &c_decorations);
break;
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 737d8a4..57538fc 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -18261,16 +18261,7 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
break;
case DW_ATE_UTF:
{
- if (bits == 16)
- type = builtin_type (arch)->builtin_char16;
- else if (bits == 32)
- type = builtin_type (arch)->builtin_char32;
- else
- {
- complaint (_("unsupported DW_ATE_UTF bit size: '%d'"),
- bits);
- type = dwarf2_init_integer_type (cu, objfile, bits, 1, name);
- }
+ type = init_character_type (objfile, bits, 1, name);
return set_die_type (die, type, cu);
}
break;
@@ -18290,7 +18281,9 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
break;
}
- if (name && strcmp (name, "char") == 0)
+ if (type->code () == TYPE_CODE_INT
+ && name != nullptr
+ && strcmp (name, "char") == 0)
type->set_has_no_signedness (true);
maybe_set_alignment (cu, die, type);
diff --git a/gdb/testsuite/gdb.dwarf2/utf-rust.exp b/gdb/testsuite/gdb.dwarf2/utf-rust.exp
new file mode 100644
index 0000000..3a2d944
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/utf-rust.exp
@@ -0,0 +1,69 @@
+# Copyright 2021 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Test DW_ATE_UTF for Rust.
+
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2 and use
+# gas.
+if {![dwarf2_support]} {
+ return 0
+}
+
+standard_testfile main.c .S
+
+# Make some DWARF for the test.
+set asm_file [standard_output_file $srcfile2]
+Dwarf::assemble $asm_file {
+ upvar cu_lang cu_lang
+
+ declare_labels char_label
+
+ # Creating a CU with 4-byte addresses lets this test link on
+ # both 32- and 64-bit machines.
+ cu { addr_size 4 } {
+ compile_unit {
+ {name file1.txt}
+ {language @DW_LANG_Rust}
+ } {
+ char_label: DW_TAG_base_type {
+ {DW_AT_byte_size 4 DW_FORM_sdata}
+ {DW_AT_encoding @DW_ATE_UTF}
+ {DW_AT_name char}
+ }
+
+ DW_TAG_variable {
+ {name cvalue}
+ {type :$char_label}
+ {const_value 97 DW_FORM_udata}
+ }
+ }
+ }
+}
+
+if {[prepare_for_testing "failed to prepare" ${testfile} \
+ [list $srcfile $asm_file] debug]} {
+ return -1
+}
+
+if {![runto main]} {
+ return -1
+}
+
+gdb_test "set language rust" \
+ "Warning: the current language does not match this frame."
+# Get the values into history so we can use it from Rust.
+gdb_test "print cvalue" "\\\$1 = 97 'a'"