modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/pr41750.c (about)

     1  /* PR 41750 - IPA-SRA used to pass hash->sgot by value rather than by
     2     reference.  */
     3  
     4  struct bfd_link_hash_table
     5  {
     6    int hash;
     7  };
     8  
     9  struct foo_link_hash_table
    10  {
    11    struct bfd_link_hash_table root;
    12    int *dynobj;
    13    int *sgot;
    14  };
    15  
    16  struct foo_link_info
    17  {
    18    struct foo_link_hash_table *hash;
    19  };
    20  
    21  extern void abort (void);
    22  
    23  int __attribute__((noinline))
    24  foo_create_got_section (int *abfd, struct foo_link_info *info)
    25  {
    26    info->hash->sgot = abfd;
    27    return 1;
    28  }
    29  
    30  static int *
    31  get_got (int *abfd, struct foo_link_info *info,
    32  	 struct foo_link_hash_table *hash)
    33  {
    34    int *got;
    35    int *dynobj;
    36  
    37    got = hash->sgot;
    38    if (!got)
    39      {
    40        dynobj = hash->dynobj;
    41        if (!dynobj)
    42  	hash->dynobj = dynobj = abfd;
    43        if (!foo_create_got_section (dynobj, info))
    44  	return 0;
    45        got = hash->sgot;
    46      }
    47    return got;
    48  }
    49  
    50  int * __attribute__((noinline,noclone))
    51  elf64_ia64_check_relocs (int *abfd, struct foo_link_info *info)
    52  {
    53    return get_got (abfd, info, info->hash);
    54  }
    55  
    56  struct foo_link_info link_info;
    57  struct foo_link_hash_table hash;
    58  int abfd;
    59  
    60  int
    61  main ()
    62  {
    63    link_info.hash = &hash;
    64    if (elf64_ia64_check_relocs (&abfd, &link_info) != &abfd)
    65      abort ();
    66    return 0;
    67  }
    68