summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog9
-rw-r--r--ld/ldctor.c38
-rw-r--r--ld/ldctor.h5
3 files changed, 31 insertions, 21 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 19ed0b5f21c..f8dca8633f7 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,14 @@
2019-10-14 Alan Modra <amodra@gmail.com>
+ * ldctor.h (struct set_element): Make next field a union, adding
+ idx field.
+ * ldctor.c (ctor_cmp): Dereference pointer and lose unnecessary
+ const. Replace final sort on pointer value with final sort on idx.
+ (ldctor_add_set_entry): Adjust next field access.
+ (ldctor_build_sets): Likewise. Set u.idx field for sort.
+
+2019-10-14 Alan Modra <amodra@gmail.com>
+
* pe-dll.c (reloc_data_type): Add idx field.
(reloc_sort): Perform final sort by idx.
(generate_reloc): Set idx.
diff --git a/ld/ldctor.c b/ld/ldctor.c
index ba8cac1e353..881ca258cbc 100644
--- a/ld/ldctor.c
+++ b/ld/ldctor.c
@@ -106,12 +106,12 @@ ldctor_add_set_entry (struct bfd_link_hash_entry *h,
}
e = (struct set_element *) xmalloc (sizeof (struct set_element));
- e->next = NULL;
+ e->u.next = NULL;
e->name = name;
e->section = section;
e->value = value;
- for (epp = &p->elements; *epp != NULL; epp = &(*epp)->next)
+ for (epp = &p->elements; *epp != NULL; epp = &(*epp)->u.next)
;
*epp = e;
@@ -152,19 +152,17 @@ ctor_prio (const char *name)
static int
ctor_cmp (const void *p1, const void *p2)
{
- const struct set_element *const *pe1
- = (const struct set_element *const *) p1;
- const struct set_element *const *pe2
- = (const struct set_element *const *) p2;
+ const struct set_element *pe1 = *(const struct set_element **) p1;
+ const struct set_element *pe2 = *(const struct set_element **) p2;
const char *n1;
const char *n2;
int prio1;
int prio2;
- n1 = (*pe1)->name;
+ n1 = pe1->name;
if (n1 == NULL)
n1 = "";
- n2 = (*pe2)->name;
+ n2 = pe2->name;
if (n2 == NULL)
n2 = "";
@@ -178,17 +176,15 @@ ctor_cmp (const void *p1, const void *p2)
/* We sort in reverse order because that is what g++ expects. */
if (prio1 < prio2)
return 1;
- else if (prio1 > prio2)
+ if (prio1 > prio2)
return -1;
/* Force a stable sort. */
-
- if (pe1 < pe2)
+ if (pe1->u.idx < pe2->u.idx)
return -1;
- else if (pe1 > pe2)
+ if (pe1->u.idx > pe2->u.idx)
return 1;
- else
- return 0;
+ return 0;
}
/* This function is called after the first phase of the link and
@@ -214,22 +210,24 @@ ldctor_build_sets (void)
for (p = sets; p != NULL; p = p->next)
{
int c, i;
- struct set_element *e;
+ struct set_element *e, *enext;
struct set_element **array;
if (p->elements == NULL)
continue;
c = 0;
- for (e = p->elements; e != NULL; e = e->next)
+ for (e = p->elements; e != NULL; e = e->u.next)
++c;
array = (struct set_element **) xmalloc (c * sizeof *array);
i = 0;
- for (e = p->elements; e != NULL; e = e->next)
+ for (e = p->elements; e != NULL; e = enext)
{
array[i] = e;
+ enext = e->u.next;
+ e->u.idx = i;
++i;
}
@@ -238,8 +236,8 @@ ldctor_build_sets (void)
e = array[0];
p->elements = e;
for (i = 0; i < c - 1; i++)
- array[i]->next = array[i + 1];
- array[i]->next = NULL;
+ array[i]->u.next = array[i + 1];
+ array[i]->u.next = NULL;
free (array);
}
@@ -334,7 +332,7 @@ ldctor_build_sets (void)
FALSE));
lang_add_data (size, exp_intop (p->count));
- for (e = p->elements; e != NULL; e = e->next)
+ for (e = p->elements; e != NULL; e = e->u.next)
{
if (config.map_file != NULL)
{
diff --git a/ld/ldctor.h b/ld/ldctor.h
index fa21277fe63..b48a0dbb635 100644
--- a/ld/ldctor.h
+++ b/ld/ldctor.h
@@ -40,7 +40,10 @@ struct set_info {
};
struct set_element {
- struct set_element *next; /* Next element. */
+ union {
+ struct set_element *next; /* Next element. */
+ long idx;
+ } u;
const char *name; /* Name in set (may be NULL). */
asection *section; /* Section of value in set. */
bfd_vma value; /* Value in set. */