]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[AArch64] Cortex-A53 Erratum 835769 -- sort maps
authorJiong Wang <jiong.wang@arm.com>
Mon, 24 Nov 2014 13:46:43 +0000 (13:46 +0000)
committerJiong Wang <jiong.wang@arm.com>
Mon, 24 Nov 2014 13:46:43 +0000 (13:46 +0000)
2014-11-24  Tejas Belagod  <tejas.belagod@arm.com>
  bfd/
    * elfnn-aarch64.c (elf_aarch64_compare_mapping): New.
    (erratum_835769_scan): Sort map list.

bfd/ChangeLog
bfd/elfnn-aarch64.c

index fa584237569373cc1adb9ee621a43b33229b85f0..1be9e53c032dacf2fb3cfc86d743a06972d2db60 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-24  Tejas Belagod  <tejas.belagod@arm.com>
+
+       * elfnn-aarch64.c (elf_aarch64_compare_mapping): New.
+       (erratum_835769_scan): Sort map list.
+
 2014-10-24  Tejas Belagod  <tejas.belagod@arm.com>
 
        * bfd-in.h (bfd_elf64_aarch64_set_options): Add a parameter.
index 9fc734f0ad98d7d746707ac5782a3aa65c91529b..d47b47eb520a7622dfa9de680d007ec16a36f2c4 100644 (file)
@@ -2936,6 +2936,29 @@ aarch64_erratum_sequence (uint32_t insn_1, uint32_t insn_2)
   return FALSE;
 }
 
+/* Used to order a list of mapping symbols by address.  */
+
+static int
+elf_aarch64_compare_mapping (const void *a, const void *b)
+{
+  const elf_aarch64_section_map *amap = (const elf_aarch64_section_map *) a;
+  const elf_aarch64_section_map *bmap = (const elf_aarch64_section_map *) b;
+
+  if (amap->vma > bmap->vma)
+    return 1;
+  else if (amap->vma < bmap->vma)
+    return -1;
+  else if (amap->type > bmap->type)
+    /* Ensure results do not depend on the host qsort for objects with
+       multiple mapping symbols at the same address by sorting on type
+       after vma.  */
+    return 1;
+  else if (amap->type < bmap->type)
+    return -1;
+  else
+    return 0;
+}
+
 static bfd_boolean
 erratum_835769_scan (bfd *input_bfd,
                     struct bfd_link_info *info,
@@ -2973,6 +2996,10 @@ erratum_835769_scan (bfd *input_bfd,
        return TRUE;
 
       sec_data = elf_aarch64_section_data (section);
+
+      qsort (sec_data->map, sec_data->mapcount,
+            sizeof (elf_aarch64_section_map), elf_aarch64_compare_mapping);
+
       for (span = 0; span < sec_data->mapcount; span++)
        {
          unsigned int span_start = sec_data->map[span].vma;