/* PR 41750 - IPA-SRA used to pass hash->sgot by value rather than by reference. */ struct bfd_link_hash_table { int hash; }; struct foo_link_hash_table { struct bfd_link_hash_table root; int *dynobj; int *sgot; }; struct foo_link_info { struct foo_link_hash_table *hash; }; extern void abort (void); int __attribute__((noinline)) foo_create_got_section (int *abfd, struct foo_link_info *info) { info->hash->sgot = abfd; return 1; } static int * get_got (int *abfd, struct foo_link_info *info, struct foo_link_hash_table *hash) { int *got; int *dynobj; got = hash->sgot; if (!got) { dynobj = hash->dynobj; if (!dynobj) hash->dynobj = dynobj = abfd; if (!foo_create_got_section (dynobj, info)) return 0; got = hash->sgot; } return got; } int * __attribute__((noinline,noclone)) elf64_ia64_check_relocs (int *abfd, struct foo_link_info *info) { return get_got (abfd, info, info->hash); } struct foo_link_info link_info; struct foo_link_hash_table hash; int abfd; int main () { link_info.hash = &hash; if (elf64_ia64_check_relocs (&abfd, &link_info) != &abfd) abort (); return 0; }