1 /* { dg-do run } */
2 /* { dg-require-alias "" } */
3 /* { dg-options "-O2" } */
4 
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 
9 typedef struct dw_cfi_struct
10 {
11   struct dw_cfi_struct *dw_cfi_next;
12   const char *dw_cfi_addr;
13 }
14 dw_cfi_node;
15 
16 typedef struct dw_fde_struct
17 {
18   const char *dw_fde_current_label;
19   dw_cfi_node *dw_fde_cfi;
20 }
21 dw_fde_node;
22 
23 dw_cfi_node *cie_cfi_head;
24 unsigned fde_table_in_use;
25 dw_fde_node *fde_table;
26 
27 static __inline__ void
add_cfi(dw_cfi_node ** list_head,dw_cfi_node * cfi)28 add_cfi (dw_cfi_node **list_head, dw_cfi_node *cfi)
29 {
30   dw_cfi_node **p;
31 
32   for (p = list_head; (*p) != ((void *)0); p = &(*p)->dw_cfi_next)
33     ;
34 
35   *p = cfi;
36 }
37 
38 static __inline__ struct dw_cfi_struct *
new_cfi(void)39 new_cfi (void)
40 {
41   dw_cfi_node *cfi = (dw_cfi_node *) malloc (sizeof (dw_cfi_node));
42 
43   memset (cfi, 0, sizeof (dw_cfi_node));
44   return cfi;
45 }
46 
47 char *
dwarf2out_cfi_label(void)48 dwarf2out_cfi_label (void)
49 {
50   static char label[20];
51   static unsigned long label_num = 0;
52 
53   sprintf (label, "*.%s%u", "LCFI", (unsigned) (label_num++));
54   return label;
55 }
56 
57 void
add_fde_cfi(const char * label,dw_cfi_node * cfi)58 add_fde_cfi (const char *label, dw_cfi_node *cfi)
59 {
60   if (label)
61     {
62       dw_fde_node *fde = fde_table + fde_table_in_use - 1;
63 
64       if (*label == 0)
65 	label = dwarf2out_cfi_label ();
66 
67       if (fde->dw_fde_current_label == ((void *)0)
68 	  || strcmp (label, fde->dw_fde_current_label))
69 	{
70 	  dw_cfi_node *xcfi;
71 
72 	  fde->dw_fde_current_label = label = strdup (label);
73 
74 	  xcfi = new_cfi ();
75 	  xcfi->dw_cfi_addr = label;
76 	  add_cfi (&fde->dw_fde_cfi, xcfi);
77 	}
78 
79       add_cfi (&fde->dw_fde_cfi, cfi);
80     }
81   else
82     add_cfi (&cie_cfi_head, cfi);
83 }
84 
85 int
main()86 main ()
87 {
88   dw_cfi_node *cfi;
89   dw_fde_node *fde;
90 
91   fde_table_in_use = 1;
92   fde_table = (dw_fde_node *) realloc (fde_table,
93 				       sizeof (dw_fde_node));
94   memset (fde_table, 0, sizeof (dw_fde_node));
95   cfi = new_cfi ();
96   add_fde_cfi ("", cfi);
97 
98   fde = &fde_table[0];
99   cfi = fde->dw_fde_cfi;
100 
101   if (cfi == NULL)
102     abort ();
103 
104   if (cfi->dw_cfi_addr == NULL)
105     abort ();
106 
107   if (strcmp ("*.LCFI0", cfi->dw_cfi_addr))
108     abort ();
109 
110   return 0;
111 }
112