aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorMax Filippov <jcmvbkbc@gmail.com>2018-05-24 11:22:14 -0700
committerMax Filippov <jcmvbkbc@gmail.com>2018-06-04 10:38:55 -0700
commit4b8e28c79356265b2c111e044142fb6d6d2db44e (patch)
tree91af77906ed4ca6606d9b44854cd5283e656a233 /bfd
parent8255c61b8ad5ac933672d26e5c9454aaf09ccaeb (diff)
downloadgdb-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/ChangeLog8
-rw-r--r--bfd/elf32-xtensa.c9
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,