[AArch64] Cortex-A53 Erratum 835769 -- sort maps
authorJiong Wang <jiong.wang@arm.com>
Mon, 24 Nov 2014 13:43:39 +0000 (13:43 +0000)
committerJiong Wang <jiong.wang@arm.com>
Mon, 24 Nov 2014 13:43:39 +0000 (13:43 +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 4472daf51a6ce8960591778814cfe33fbae017f5..aed2b2cd764cd0cfef40002bfac2e19f8c48605a 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-11-24  Alan Modra  <amodra@gmail.com>
 
        * elf64-ppc.c (plt_stub_pad): Correct.
index 19ad4d29b57404f98637130a4b0eea4a14c5241b..0879db97be80ae76db1034477bc673fb3897f1ae 100644 (file)
@@ -2937,6 +2937,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,
@@ -2974,6 +2997,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;