diff options
author | Max Filippov <jcmvbkbc@gmail.com> | 2018-05-24 11:22:14 -0700 |
---|---|---|
committer | Max Filippov <jcmvbkbc@gmail.com> | 2018-06-04 10:38:55 -0700 |
commit | 4b8e28c79356265b2c111e044142fb6d6d2db44e (patch) | |
tree | 91af77906ed4ca6606d9b44854cd5283e656a233 /bfd | |
parent | 8255c61b8ad5ac933672d26e5c9454aaf09ccaeb (diff) | |
download | gdb-4b8e28c79356265b2c111e044142fb6d6d2db44e.zip gdb-4b8e28c79356265b2c111e044142fb6d6d2db44e.tar.gz gdb-4b8e28c79356265b2c111e044142fb6d6d2db44e.tar.bz2 |
xtensa: use property tables for correct disassembly
xtensa disassembler does not use information from the .xt.prop sections
to switch between code/data disassembly in text sections. This may
result in incorrect disassembly when data is interpreted as code and
disassembler loses synchronization with instruction stream. Use .xt.prop
section information to correctly interpret code and data and synchronize
with instruction stream.
2018-06-04 Max Filippov <jcmvbkbc@gmail.com>
bfd/
* elf32-xtensa.c (xtensa_read_table_entries): Make global.
(compute_fill_extra_space): Drop declaration. Rename function to
xtensa_compute_fill_extra_space.
(compute_ebb_actions, remove_dead_literal): Update references to
compute_fill_extra_space.
include/
* elf/xtensa.h (xtensa_read_table_entries)
(xtensa_compute_fill_extra_space): New declarations.
opcodes/
* xtensa-dis.c (bfd.h, elf/xtensa.h): New includes.
(dis_private): Add new fields for property section tracking.
(xtensa_coalesce_insn_tables, xtensa_find_table_entry)
(xtensa_instruction_fits): New functions.
(fetch_data): Bump minimal fetch size to 4.
(print_insn_xtensa): Make struct dis_private static.
Load and prepare property table on section change.
Don't disassemble literals. Don't disassemble instructions that
cross property table boundaries.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elf32-xtensa.c | 9 |
2 files changed, 12 insertions, 5 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f373b8b..d776d0b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2018-06-04 Max Filippov <jcmvbkbc@gmail.com> + + * elf32-xtensa.c (xtensa_read_table_entries): Make global. + (compute_fill_extra_space): Drop declaration. Rename function to + xtensa_compute_fill_extra_space. + (compute_ebb_actions, remove_dead_literal): Update references to + compute_fill_extra_space. + 2018-06-04 Volodymyr Arbatov <arbatov@cadence.com> * elf32-xtensa.c (elf32xtensa_separate_props): New global diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c index db3c8f4..44c1074 100644 --- a/bfd/elf32-xtensa.c +++ b/bfd/elf32-xtensa.c @@ -802,7 +802,7 @@ property_table_matches (const void *ap, const void *bp) section. Sets TABLE_P and returns the number of entries. On error, returns a negative value. */ -static int +int xtensa_read_table_entries (bfd *abfd, asection *section, property_table_entry **table_p, @@ -6730,7 +6730,6 @@ static bfd_boolean check_section_ebb_pcrels_fit static bfd_boolean check_section_ebb_reduces (const ebb_constraint *); static void text_action_add_proposed (text_action_list *, const ebb_constraint *, asection *); -static int compute_fill_extra_space (property_table_entry *); /* First pass: */ static bfd_boolean compute_removed_literals @@ -8136,7 +8135,7 @@ compute_ebb_actions (ebb_constraint *ebb_table) BFD_ASSERT (action->action == ta_fill); BFD_ASSERT (ebb->ends_unreachable->flags & XTENSA_PROP_UNREACHABLE); - extra_space = compute_fill_extra_space (ebb->ends_unreachable); + extra_space = xtensa_compute_fill_extra_space (ebb->ends_unreachable); br = action->removed_bytes + removed_bytes + extra_space; br = br & ((1 << ebb->sec->alignment_power ) - 1); @@ -8560,7 +8559,7 @@ text_action_add_proposed (text_action_list *l, int -compute_fill_extra_space (property_table_entry *entry) +xtensa_compute_fill_extra_space (property_table_entry *entry) { int fill_extra_space; @@ -8841,7 +8840,7 @@ remove_dead_literal (bfd *abfd, do not add fill. */ the_add_entry = elf_xtensa_find_property_entry (prop_table, ptblsize, entry_sec_offset); - fill_extra_space = compute_fill_extra_space (the_add_entry); + fill_extra_space = xtensa_compute_fill_extra_space (the_add_entry); fa = find_fill_action (&relax_info->action_list, sec, entry_sec_offset); removed_diff = compute_removed_action_diff (fa, sec, entry_sec_offset, |