From 8151645076ce927e0ee866c598a19f192e68e103 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Tue, 15 Mar 2016 14:37:29 -0700 Subject: Extend flags to support multibit and enum bitfields. gdb/ChangeLog: Extend flags to support multibit and enum bitfields. NEWS: Document new features. * c-typeprint.c (c_type_print_varspec_prefix): Handle TYPE_CODE_FLAGS. (c_type_print_varspec_suffix, c_type_print_base): Ditto. * gdbtypes.c (arch_flags_type): Don't assume all fields are one bit. (append_flags_type_field): New function. (append_flags_type_flag): Call it. * gdbtypes.h (append_flags_type_field): Declare. * target-descriptions.c (struct tdesc_type_flag): Delete. (enum tdesc_type_kind) : New enum value. (enum tdesc_type_kind) : Ditto. (struct tdesc_type) : Delete. (tdesc_predefined_types): Add "bool". (tdesc_predefined_type): New function. (tdesc_gdb_type): Handle TDESC_TYPE_BOOL, TDESC_TYPE_ENUM. Update TDESC_TYPE_FLAGS support. (tdesc_free_type): Handle TDESC_TYPE_ENUM. Update TDESC_TYPE_FLAGS. (tdesc_create_flags): Update. (tdesc_create_enum): New function. (tdesc_add_field): Initialize start,end to -1. (tdesc_add_typed_bitfield): New function. (tdesc_add_bitfield): Call it. (tdesc_add_flag): Allow TDESC_TYPE_STRUCT. Update. (tdesc_add_enum_value): New function. (maint_print_c_tdesc_cmd): Fold TDESC_TYPE_FLAGS support into TDESC_TYPE_STRUCT. Handle TDESC_TYPE_ENUM. * target-descriptions.h (tdesc_create_enum): Declare. (tdesc_add_typed_bitfield, tdesc_add_enum_value): Declare. * valprint.c (generic_val_print_enum_1): New function. (generic_val_print_enum): Call it. (val_print_type_code_flags): Make static. Handle multibit bitfields and enum bitfields. * valprint.h (val_print_type_code_flags): Delete. * xml-tdesc.c (struct tdesc_parsing_data) : Delete. All uses removed. (tdesc_start_enum): New function. (tdesc_start_field): Handle multibit and enum bitfields. (tdesc_start_enum_value): New function. (enum_value_attributes, enum_children, enum_attributes): New static globals. (feature_children): Add "enum". * features/gdb-target.dtd (enum, evalue): New elements. gdb/doc/ChangeLog: * gdb.texinfo (Target Descriptions): New menu item "Enum Target Types". (Target Description Format): Mention enum types. Update docs on flags types. (Predefined Target Types): Add "bool". (Enum Target Types): New node. gdb/testsuite/ChangeLog: * gdb.xml/extra-regs.xml: Add enum, mixed_flags values. * gdb.xml/tdesc-regs.exp (load_description): New arg xml_file. All callers updated. Add tests for enums, mixed flags register. --- gdb/testsuite/gdb.xml/extra-regs.xml | 25 +++++++++++++++++++++++++ gdb/testsuite/gdb.xml/tdesc-regs.exp | 20 ++++++++++---------- 2 files changed, 35 insertions(+), 10 deletions(-) (limited to 'gdb/testsuite/gdb.xml') diff --git a/gdb/testsuite/gdb.xml/extra-regs.xml b/gdb/testsuite/gdb.xml/extra-regs.xml index f0db04e..cbbaf76 100644 --- a/gdb/testsuite/gdb.xml/extra-regs.xml +++ b/gdb/testsuite/gdb.xml/extra-regs.xml @@ -23,6 +23,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -30,5 +54,6 @@ + diff --git a/gdb/testsuite/gdb.xml/tdesc-regs.exp b/gdb/testsuite/gdb.xml/tdesc-regs.exp index 80e1008..48204cd 100644 --- a/gdb/testsuite/gdb.xml/tdesc-regs.exp +++ b/gdb/testsuite/gdb.xml/tdesc-regs.exp @@ -106,7 +106,7 @@ foreach src ${core-regs} { } # Similarly, we need to copy files under test into the objdir. -proc load_description { file errmsg } { +proc load_description { file errmsg xml_file } { global srcdir global subdir global gdb_prompt @@ -114,7 +114,7 @@ proc load_description { file errmsg } { global architecture global remote_filename - set regs_file [standard_output_file regs.xml] + set regs_file [standard_output_file $xml_file] file delete $regs_file set ifd [open "$srcdir/$subdir/$file" r] @@ -135,22 +135,18 @@ proc load_description { file errmsg } { close $ofd if {[is_remote host]} { - set regs_file [remote_download host "$subdir/regs.xml" "regs.xml"] + set regs_file [remote_download host "$subdir/$xml_file" $xml_file] } # Anchor the test output, so that error messages are detected. set cmd "set tdesc filename [file tail $regs_file]" - set msg "set tdesc filename regs.xml - from $file" + set msg "set tdesc filename $xml_file - from $file" set cmd_regex [string_to_regexp $cmd] gdb_test_multiple $cmd $msg { -re "^$cmd_regex\r\n$errmsg$gdb_prompt $" { pass $msg } } - - if {[is_remote host]} { - remote_file host delete "regs.xml" - } } if {![is_remote host]} { @@ -158,7 +154,7 @@ if {![is_remote host]} { "cd to directory holding xml" } -load_description "extra-regs.xml" "" +load_description "extra-regs.xml" "" "test-extra-regs.xml" gdb_test "ptype \$extrareg" "type = (int|long|long long)" gdb_test "ptype \$uintreg" "type = uint32_t" gdb_test "ptype \$vecreg" "type = int8_t __attribute__ \\(\\(vector_size\\(4\\)\\)\\)" @@ -170,7 +166,11 @@ gdb_test "ptype \$structreg" \ gdb_test "ptype \$structreg.v4" "type = int8_t __attribute__ \\(\\(vector_size\\(4\\)\\)\\)" gdb_test "ptype \$bitfields" \ "type = struct struct2 {\r\n *uint64_t f1 : 35;\r\n *uint64_t f2 : 1;\r\n}" +gdb_test "ptype \$flags" \ + "type = flag flags {\r\n *uint32_t X @0;\r\n *uint32_t Y @2;\r\n}" +gdb_test "ptype \$mixed_flags" \ + "type = flag mixed_flags {\r\n *bool A @0;\r\n *uint32_t B @1;\r\n *bool C @2;\r\n *uint32_t D @3;\r\n *uint32_t @4-5;\r\n *uint32_t E @6-7;\r\n *enum {yes = 1, no = 0, maybe = 2, so} Z @8-9;\r\n}" -load_description "core-only.xml" "" +load_description "core-only.xml" "" "test-regs.xml" # The extra register from the previous description should be gone. gdb_test "ptype \$extrareg" "type = void" -- cgit v1.1