PR28827, assertion building LLVM 9 on powerpc64le-linux-gnu
Alan Modra
amodra@gmail.com
Sat Jan 29 06:50:10 GMT 2022
On Fri, Jan 28, 2022 at 04:58:00PM +1030, Alan Modra wrote:
> This patch fixes that by also keeping larger individual stub_offset
> addresses past STUB_SHRINK_ITER. It also catches a further
> pathological case where one stub shrinks and another expands in such a
> way that no stub section size change is seen.
The previous patch wasn't quite correct. The size and padding depends
on offset used in the current iteration, and if we're fudging the
offset past STUB_SHRINK_ITER then we'd better use that offset. We
can't have plt_stub_pad using stub_sec->size as the offset.
PR 28827
* elf64-ppc.c (plt_stub_pad): Add stub_off param.
(ppc_size_one_stub): Set up stub_offset to value used in this
iteration before sizing the stub. Adjust plt_stub_pad calls.
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 92f6d0a5d00..d53128debc6 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -11174,12 +11174,12 @@ plt_stub_size (struct ppc_link_hash_table *htab,
static inline unsigned int
plt_stub_pad (struct ppc_link_hash_table *htab,
struct ppc_stub_hash_entry *stub_entry,
+ bfd_vma stub_off,
bfd_vma plt_off,
unsigned int odd)
{
int stub_align;
unsigned stub_size;
- bfd_vma stub_off = stub_entry->group->stub_sec->size;
if (htab->params->plt_stub_align >= 0)
{
@@ -12205,6 +12205,9 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
/* Make a note of the offset within the stubs for this entry. */
stub_offset = stub_entry->group->stub_sec->size;
+ if (htab->stub_iteration > STUB_SHRINK_ITER
+ && stub_entry->stub_offset > stub_offset)
+ stub_offset = stub_entry->stub_offset;
if (stub_entry->h != NULL
&& stub_entry->h->save_res
@@ -12430,10 +12433,9 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
if (htab->params->plt_stub_align != 0)
{
- unsigned pad = plt_stub_pad (htab, stub_entry, off, odd);
+ unsigned pad = plt_stub_pad (htab, stub_entry, stub_offset, off, odd);
- stub_entry->group->stub_sec->size += pad;
- stub_offset = stub_entry->group->stub_sec->size;
+ stub_offset += pad;
off -= pad;
odd ^= pad & 4;
}
@@ -12505,10 +12507,9 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
if (htab->params->plt_stub_align != 0)
{
- unsigned pad = plt_stub_pad (htab, stub_entry, off, 0);
+ unsigned pad = plt_stub_pad (htab, stub_entry, stub_offset, off, 0);
- stub_entry->group->stub_sec->size += pad;
- stub_offset = stub_entry->group->stub_sec->size;
+ stub_offset += pad;
}
if (info->emitrelocations)
@@ -12557,10 +12558,8 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
if (stub_entry->stub_offset != stub_offset)
htab->stub_changed = true;
- if (htab->stub_iteration <= STUB_SHRINK_ITER
- || stub_entry->stub_offset < stub_offset)
- stub_entry->stub_offset = stub_offset;
- stub_entry->group->stub_sec->size = stub_entry->stub_offset + size;
+ stub_entry->stub_offset = stub_offset;
+ stub_entry->group->stub_sec->size = stub_offset + size;
return true;
}
--
Alan Modra
Australia Development Lab, IBM
More information about the Binutils
mailing list