aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binutils/ChangeLog7
-rw-r--r--binutils/objdump.c1
-rw-r--r--binutils/testsuite/binutils-all/aarch64/out-of-order.T14
-rw-r--r--binutils/testsuite/binutils-all/aarch64/out-of-order.d27
-rw-r--r--binutils/testsuite/binutils-all/aarch64/out-of-order.s28
-rw-r--r--include/ChangeLog4
-rw-r--r--include/dis-asm.h6
-rw-r--r--opcodes/ChangeLog5
-rw-r--r--opcodes/aarch64-dis.c7
9 files changed, 98 insertions, 1 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 6fa4bf4..121c54d 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,10 @@
+2019-03-25 Tamar Christina <tamar.christina@arm.com>
+
+ * objdump.c (disassemble_bytes): Pass stop_offset.
+ * testsuite/binutils-all/aarch64/out-of-order.T: New test.
+ * testsuite/binutils-all/aarch64/out-of-order.d: New test.
+ * testsuite/binutils-all/aarch64/out-of-order.s: New test.
+
2019-03-19 Nick Clifton <nickc@redhat.com>
PR 24360
diff --git a/binutils/objdump.c b/binutils/objdump.c
index 79aed75..d80b3f5 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -1991,6 +1991,7 @@ disassemble_bytes (struct disassemble_info * inf,
disassembling code of course, and when -D is in effect. */
inf->stop_vma = section->vma + stop_offset;
+ inf->stop_offset = stop_offset;
octets = (*disassemble_fn) (section->vma + addr_offset, inf);
inf->stop_vma = 0;
diff --git a/binutils/testsuite/binutils-all/aarch64/out-of-order.T b/binutils/testsuite/binutils-all/aarch64/out-of-order.T
new file mode 100644
index 0000000..489ae80
--- /dev/null
+++ b/binutils/testsuite/binutils-all/aarch64/out-of-order.T
@@ -0,0 +1,14 @@
+ENTRY(v1)
+SECTIONS
+{
+ . = 0xffe00000;
+ .global : { *(.global) }
+ . = 0x4018280;
+ .func2 : { *(.func2) }
+ . = 0x4005000;
+ .func1 : { *(.func1) }
+ . = 0x4015000;
+ .func3 : { *(.func3) }
+ .data : { *(.data) }
+ .rodata : { *(.rodata) }
+} \ No newline at end of file
diff --git a/binutils/testsuite/binutils-all/aarch64/out-of-order.d b/binutils/testsuite/binutils-all/aarch64/out-of-order.d
new file mode 100644
index 0000000..410f37f
--- /dev/null
+++ b/binutils/testsuite/binutils-all/aarch64/out-of-order.d
@@ -0,0 +1,27 @@
+#PROG: objcopy
+#ld: -T out-of-order.T
+#objdump: -d
+#name: Check if disassembler can handle sections in different order than header
+
+.*: +file format .*aarch64.*
+
+Disassembly of section \.func2:
+
+0000000004018280 <\.func2>:
+ 4018280: 8b010000 add x0, x0, x1
+
+Disassembly of section \.func1:
+
+0000000004005000 <v1>:
+ 4005000: 8b010000 add x0, x0, x1
+ 4005004: 00000000 \.word 0x00000000
+
+Disassembly of section \.func3:
+
+0000000004015000 <\.func3>:
+ 4015000: 8b010000 add x0, x0, x1
+ 4015004: 8b010000 add x0, x0, x1
+ 4015008: 8b010000 add x0, x0, x1
+ 401500c: 8b010000 add x0, x0, x1
+ 4015010: 8b010000 add x0, x0, x1
+ 4015014: 00000000 \.word 0x00000000
diff --git a/binutils/testsuite/binutils-all/aarch64/out-of-order.s b/binutils/testsuite/binutils-all/aarch64/out-of-order.s
new file mode 100644
index 0000000..6c52e85
--- /dev/null
+++ b/binutils/testsuite/binutils-all/aarch64/out-of-order.s
@@ -0,0 +1,28 @@
+ .text
+ .global v1
+ .section .func1,"ax",@progbits
+ .type v1 %function
+ .size v1, 4
+v1:
+ add x0, x0, x1
+ .word 0
+
+ .section .func2,"ax",@progbits
+ add x0, x0, x1
+
+ .section .func3,"ax",@progbits
+ add x0, x0, x1
+ add x0, x0, x1
+ add x0, x0, x1
+ add x0, x0, x1
+ add x0, x0, x1
+ .word 0
+
+ .data
+ .section .global,"aw",@progbits
+ .xword 1
+ .xword 1
+ .xword 1
+
+ .section .rodata
+ .word 4
diff --git a/include/ChangeLog b/include/ChangeLog
index b4a0907..ae79b9f 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,7 @@
+2019-03-25 Tamar Christina <tamar.christina@arm.com>
+
+ * dis-asm.h (struct disassemble_info): Add stop_offset.
+
2019-03-13 Sudakshina Das <sudi.das@arm.com>
* elf/aarch64.h (DT_AARCH64_PAC_PLT): New.
diff --git a/include/dis-asm.h b/include/dis-asm.h
index 22c593e..4e1263c 100644
--- a/include/dis-asm.h
+++ b/include/dis-asm.h
@@ -221,6 +221,12 @@ typedef struct disassemble_info
file being disassembled. */
bfd_vma stop_vma;
+ /* The end range of the current range being disassembled. This is required
+ in order to notify the disassembler when it's currently handling a
+ different range than it was before. This prevent unsafe optimizations when
+ disassembling such as the way mapping symbols are found on AArch64. */
+ bfd_vma stop_offset;
+
} disassemble_info;
/* This struct is used to pass information about valid disassembler
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 204c008..81fe9f0 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,8 @@
+2019-03-25 Tamar Christina <tamar.christina@arm.com>
+
+ * aarch64-dis.c (last_stop_offset): New.
+ (print_insn_aarch64): Use stop_offset.
+
2019-03-19 H.J. Lu <hongjiu.lu@intel.com>
PR gas/24359
diff --git a/opcodes/aarch64-dis.c b/opcodes/aarch64-dis.c
index 4c31f57..fc7e95d 100644
--- a/opcodes/aarch64-dis.c
+++ b/opcodes/aarch64-dis.c
@@ -37,6 +37,7 @@ enum map_type
static enum map_type last_type;
static int last_mapping_sym = -1;
+static bfd_vma last_stop_offset = 0;
static bfd_vma last_mapping_addr = 0;
/* Other options */
@@ -3333,7 +3334,10 @@ print_insn_aarch64 (bfd_vma pc,
/* Start scanning at the start of the function, or wherever
we finished last time. */
n = info->symtab_pos + 1;
- if (n < last_mapping_sym)
+ /* If the last stop offset is different from the current one it means we
+ are disassembling a different glob of bytes. As such the optimization
+ would not be safe and we should start over. */
+ if (n < last_mapping_sym && info->stop_offset == last_stop_offset)
n = last_mapping_sym;
/* Scan up to the location being disassembled. */
@@ -3370,6 +3374,7 @@ print_insn_aarch64 (bfd_vma pc,
last_mapping_sym = last_sym;
last_type = type;
+ last_stop_offset = info->stop_offset;
/* Look a little bit ahead to see if we should print out
less than four bytes of data. If there's a symbol,