X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=ld%2Fldctor.c;h=7b9013c059a6707745f1811326a0c1c88ce3c858;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=ba8cac1e353dd7503ce44968878aace90a3b5b3f;hpb=1ff6de031241c59d0ff9fa01d3c0a4049b0e97c9;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldctor.c b/ld/ldctor.c index ba8cac1e35..7b9013c059 100644 --- a/ld/ldctor.c +++ b/ld/ldctor.c @@ -1,5 +1,5 @@ /* ldctor.c -- constructor support routines - Copyright (C) 1991-2019 Free Software Foundation, Inc. + Copyright (C) 1991-2020 Free Software Foundation, Inc. By Steve Chamberlain This file is part of the GNU Binutils. @@ -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) {