(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
attr-weakref-1-darwin.c
       1  // { dg-do run { target { *-*-darwin* } } }
       2  // { dg-require-weak "" }
       3  // { dg-options "-O2" }
       4  // { dg-options "-O2 -mmacosx-version-min=10.2" { target { powerpc-*-darwin* } } }
       5  // { dg-additional-sources "attr-weakref-1a.c attr-weakref-1b.c" }
       6  
       7  // Copyright 2005 Free Software Foundation, Inc.
       8  // Contributed by Alexandre Oliva <aoliva@redhat.com>
       9  
      10  // Torture test for weakrefs.  The first letter of an identifier
      11  // indicates whether/how it is defined; the second letter indicates
      12  // whether it is part of a variable or function test; the number that
      13  // follows is a test counter, and a letter that may follow enables
      14  // multiple identifiers within the same test (e.g., multiple weakrefs
      15  // or pointers to the same identifier).
      16  
      17  // Identifiers starting with W are weakrefs; those with p are
      18  // pointers; those with g are global definitions; those with l are
      19  // local definitions; those with w are expected to be weak undefined
      20  // in the symbol table; those with u are expected to be marked as
      21  // non-weak undefined in the symbol table.
      22  
      23  #include <stdlib.h>
      24  
      25  #define USED __attribute__((used))
      26  
      27  typedef int vtype;
      28  
      29  extern vtype wv1;
      30  static vtype Wv1a __attribute__((weakref ("wv1")));
      31  static vtype *pv1a USED = &Wv1a;
      32  
      33  vtype gv2;
      34  static vtype Wv2a __attribute__((weakref ("gv2")));
      35  static vtype *pv2a USED = &Wv2a;
      36  
      37  static vtype lv3;
      38  static vtype Wv3a __attribute__((weakref ("lv3")));
      39  static vtype *pv3a USED = &Wv3a;
      40  
      41  extern vtype uv4;
      42  static vtype Wv4a __attribute__((weakref ("uv4")));
      43  static vtype *pv4a USED = &Wv4a;
      44  static vtype *pv4 USED = &uv4;
      45  
      46  static vtype Wv5a __attribute__((weakref ("uv5")));
      47  static vtype *pv5a USED = &Wv5a;
      48  extern vtype uv5;
      49  static vtype *pv5 USED = &uv5;
      50  
      51  static vtype Wv6a __attribute__((weakref ("wv6")));
      52  static vtype *pv6a USED = &Wv6a;
      53  extern vtype wv6;
      54  
      55  static vtype Wv7a __attribute__((weakref ("uv7")));
      56  static vtype* USED fv7 (void) {
      57    return &Wv7a;
      58  }
      59  extern vtype uv7;
      60  static vtype* USED fv7a (void) {
      61    return &uv7;
      62  }
      63  
      64  extern vtype uv8;
      65  static vtype* USED fv8a (void) {
      66    return &uv8;
      67  }
      68  static vtype Wv8a __attribute__((weakref ("uv8")));
      69  static vtype* USED fv8 (void) {
      70    return &Wv8a;
      71  }
      72  
      73  extern vtype wv9 __attribute__((weak));
      74  static vtype Wv9a __attribute__((weakref ("wv9")));
      75  static vtype *pv9a USED = &Wv9a;
      76  
      77  static vtype Wv10a __attribute__((weakref ("Wv10b")));
      78  static vtype Wv10b __attribute__((weakref ("Wv10c")));
      79  static vtype Wv10c __attribute__((weakref ("Wv10d")));
      80  static vtype Wv10d __attribute__((weakref ("wv10")));
      81  extern vtype wv10;
      82  
      83  extern vtype wv11;
      84  static vtype Wv11d __attribute__((weakref ("wv11")));
      85  static vtype Wv11c __attribute__((weakref ("Wv11d")));
      86  static vtype Wv11b __attribute__((weakref ("Wv11c")));
      87  static vtype Wv11a __attribute__((weakref ("Wv11b")));
      88  
      89  static vtype Wv12 __attribute__((weakref ("wv12")));
      90  extern vtype wv12 __attribute__((weak));
      91  
      92  static vtype Wv13 __attribute__((weakref ("wv13")));
      93  extern vtype wv13 __attribute__((weak));
      94  
      95  static vtype Wv14a __attribute__((weakref ("wv14")));
      96  static vtype Wv14b __attribute__((weakref ("wv14")));
      97  extern vtype wv14 __attribute__((weak));
      98  
      99  typedef void ftype(void);
     100  
     101  extern ftype wf1;
     102  static ftype Wf1a __attribute__((weakref ("wf1")));
     103  static ftype *pf1a USED = &Wf1a;
     104  static ftype Wf1c __attribute__((weakref));
     105  extern ftype Wf1c __attribute__((alias ("wf1")));
     106  static ftype *pf1c USED = &Wf1c;
     107  
     108  void gf2(void) {}
     109  static ftype Wf2a __attribute__((weakref ("gf2")));
     110  static ftype *pf2a USED = &Wf2a;
     111  
     112  static void lf3(void) {}
     113  static ftype Wf3a __attribute__((weakref ("lf3")));
     114  static ftype *pf3a USED = &Wf3a;
     115  
     116  extern ftype uf4;
     117  static ftype Wf4a __attribute__((weakref ("uf4")));
     118  static ftype *pf4a USED = &Wf4a;
     119  static ftype *pf4 USED = &uf4;
     120  
     121  static ftype Wf5a __attribute__((weakref ("uf5")));
     122  static ftype *pf5a USED = &Wf5a;
     123  extern ftype uf5;
     124  static ftype *pf5 USED = &uf5;
     125  
     126  static ftype Wf6a __attribute__((weakref ("wf6")));
     127  static ftype *pf6a USED = &Wf6a;
     128  extern ftype wf6;
     129  
     130  static ftype Wf7a __attribute__((weakref ("uf7")));
     131  static ftype* USED ff7 (void) {
     132    return &Wf7a;
     133  }
     134  extern ftype uf7;
     135  static ftype* USED ff7a (void) {
     136    return &uf7;
     137  }
     138  
     139  extern ftype uf8;
     140  static ftype* USED ff8a (void) {
     141    return &uf8;
     142  }
     143  static ftype Wf8a __attribute__((weakref ("uf8")));
     144  static ftype* USED ff8 (void) {
     145    return &Wf8a;
     146  }
     147  
     148  extern ftype wf9 __attribute__((weak));
     149  static ftype Wf9a __attribute__((weakref ("wf9")));
     150  static ftype *pf9a USED = &Wf9a;
     151  
     152  static ftype Wf10a __attribute__((weakref ("Wf10b")));
     153  static ftype Wf10b __attribute__((weakref ("Wf10c")));
     154  static ftype Wf10c __attribute__((weakref ("Wf10d")));
     155  static ftype Wf10d __attribute__((weakref ("wf10")));
     156  extern ftype wf10;
     157  
     158  extern ftype wf11;
     159  static ftype Wf11d __attribute__((weakref ("wf11")));
     160  static ftype Wf11c __attribute__((weakref ("Wf11d")));
     161  static ftype Wf11b __attribute__((weakref ("Wf11c")));
     162  static ftype Wf11a __attribute__((weakref ("Wf11b")));
     163  
     164  static ftype Wf12 __attribute__((weakref ("wf12")));
     165  extern ftype wf12 __attribute__((weak));
     166  
     167  static ftype Wf13 __attribute__((weakref ("wf13")));
     168  extern ftype wf13 __attribute__((weak));
     169  
     170  static ftype Wf14a __attribute__((weakref ("wf14")));
     171  static ftype Wf14b __attribute__((weakref ("wf14")));
     172  extern ftype wf14 __attribute__((weak));
     173  
     174  #ifndef __APPLE__
     175  #define chk(p) do { if (!p) abort (); } while (0)
     176  #else
     177  #define chk(p) /* */
     178  #endif
     179  
     180  int main () {
     181    chk (!pv1a);
     182    chk (pv2a);
     183    chk (pv3a);
     184    chk (pv4a);
     185    chk (pv4);
     186    chk (pv5a);
     187    chk (pv5);
     188    chk (!pv6a);
     189    chk (fv7 ());
     190    chk (fv7a ());
     191    chk (fv8 ());
     192    chk (fv8a ());
     193    chk (!pv9a);
     194    chk (!&Wv10a);
     195    chk (!&Wv11a);
     196    chk (!&Wv12);
     197    chk (!&wv12);
     198    chk (!&wv13);
     199    chk (!&Wv14a);
     200  
     201    chk (!pf1a);
     202    chk (!pf1c);
     203    chk (pf2a);
     204    chk (pf3a);
     205    chk (pf4a);
     206    chk (pf4);
     207    chk (pf5a);
     208    chk (pf5);
     209    chk (!pf6a);
     210    chk (ff7 ());
     211    chk (ff7a ());
     212    chk (ff8 ());
     213    chk (ff8a ());
     214    chk (!pf9a);
     215    chk (!&Wf10a);
     216    chk (!&Wf11a);
     217    chk (!&Wf12);
     218    chk (!&wf12);
     219    chk (!&wf13);
     220    chk (!&Wf14a);
     221  
     222    exit (0);
     223  }