/* ldctor.c -- constructor support routines
- Copyright (C) 1991-2019 Free Software Foundation, Inc.
+ Copyright (C) 1991-2021 Free Software Foundation, Inc.
By Steve Chamberlain <sac@cygnus.com>
This file is part of the GNU Binutils.
#include "bfd.h"
#include "bfdlink.h"
#include "safe-ctype.h"
+#include "ctf-api.h"
#include "ld.h"
#include "ldexp.h"
/* Whether the constructors should be sorted. Note that this is
global for the entire link; we assume that there is only a single
CONSTRUCTORS command in the linker script. */
-bfd_boolean constructors_sorted;
+bool constructors_sorted;
/* The sets we have seen. */
struct set_info *sets;
}
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;
while (*name == '_')
++name;
- if (!CONST_STRNEQ (name, "GLOBAL_"))
+ if (!startswith (name, "GLOBAL_"))
return -1;
name += sizeof "GLOBAL_" - 1;
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 = "";
/* 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
void
ldctor_build_sets (void)
{
- static bfd_boolean called;
- bfd_boolean header_printed;
+ static bool called;
+ bool header_printed;
struct set_info *p;
/* The emulation code may call us directly, but we only want to do
this once. */
if (called)
return;
- called = TRUE;
+ called = true;
if (constructors_sorted)
{
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;
}
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);
}
lang_list_init (&constructor_list);
push_stat_ptr (&constructor_list);
- header_printed = FALSE;
+ header_printed = false;
for (p = sets; p != NULL; p = p->next)
{
struct set_element *e;
lang_add_assignment (exp_assign (".",
exp_unop (ALIGN_K,
exp_intop (reloc_size)),
- FALSE));
+ false));
lang_add_assignment (exp_assign (p->h->root.string,
exp_nameop (NAME, "."),
- FALSE));
+ 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)
{
if (!header_printed)
{
minfo (_("\nSet Symbol\n\n"));
- header_printed = TRUE;
+ header_printed = true;
}
minfo ("%s", p->h->root.string);