112 lines
2.0 KiB
C
112 lines
2.0 KiB
C
/* { dg-do run } */
|
|
/* { dg-require-alias "" } */
|
|
/* { dg-options "-O2" } */
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
typedef struct dw_cfi_struct
|
|
{
|
|
struct dw_cfi_struct *dw_cfi_next;
|
|
const char *dw_cfi_addr;
|
|
}
|
|
dw_cfi_node;
|
|
|
|
typedef struct dw_fde_struct
|
|
{
|
|
const char *dw_fde_current_label;
|
|
dw_cfi_node *dw_fde_cfi;
|
|
}
|
|
dw_fde_node;
|
|
|
|
dw_cfi_node *cie_cfi_head;
|
|
unsigned fde_table_in_use;
|
|
dw_fde_node *fde_table;
|
|
|
|
static __inline__ void
|
|
add_cfi (dw_cfi_node **list_head, dw_cfi_node *cfi)
|
|
{
|
|
dw_cfi_node **p;
|
|
|
|
for (p = list_head; (*p) != ((void *)0); p = &(*p)->dw_cfi_next)
|
|
;
|
|
|
|
*p = cfi;
|
|
}
|
|
|
|
static __inline__ struct dw_cfi_struct *
|
|
new_cfi (void)
|
|
{
|
|
dw_cfi_node *cfi = (dw_cfi_node *) malloc (sizeof (dw_cfi_node));
|
|
|
|
memset (cfi, 0, sizeof (dw_cfi_node));
|
|
return cfi;
|
|
}
|
|
|
|
char *
|
|
dwarf2out_cfi_label (void)
|
|
{
|
|
static char label[20];
|
|
static unsigned long label_num = 0;
|
|
|
|
sprintf (label, "*.%s%u", "LCFI", (unsigned) (label_num++));
|
|
return label;
|
|
}
|
|
|
|
void
|
|
add_fde_cfi (const char *label, dw_cfi_node *cfi)
|
|
{
|
|
if (label)
|
|
{
|
|
dw_fde_node *fde = fde_table + fde_table_in_use - 1;
|
|
|
|
if (*label == 0)
|
|
label = dwarf2out_cfi_label ();
|
|
|
|
if (fde->dw_fde_current_label == ((void *)0)
|
|
|| strcmp (label, fde->dw_fde_current_label))
|
|
{
|
|
dw_cfi_node *xcfi;
|
|
|
|
fde->dw_fde_current_label = label = strdup (label);
|
|
|
|
xcfi = new_cfi ();
|
|
xcfi->dw_cfi_addr = label;
|
|
add_cfi (&fde->dw_fde_cfi, xcfi);
|
|
}
|
|
|
|
add_cfi (&fde->dw_fde_cfi, cfi);
|
|
}
|
|
else
|
|
add_cfi (&cie_cfi_head, cfi);
|
|
}
|
|
|
|
int
|
|
main ()
|
|
{
|
|
dw_cfi_node *cfi;
|
|
dw_fde_node *fde;
|
|
|
|
fde_table_in_use = 1;
|
|
fde_table = (dw_fde_node *) realloc (fde_table,
|
|
sizeof (dw_fde_node));
|
|
memset (fde_table, 0, sizeof (dw_fde_node));
|
|
cfi = new_cfi ();
|
|
add_fde_cfi ("", cfi);
|
|
|
|
fde = &fde_table[0];
|
|
cfi = fde->dw_fde_cfi;
|
|
|
|
if (cfi == NULL)
|
|
abort ();
|
|
|
|
if (cfi->dw_cfi_addr == NULL)
|
|
abort ();
|
|
|
|
if (strcmp ("*.LCFI0", cfi->dw_cfi_addr))
|
|
abort ();
|
|
|
|
return 0;
|
|
}
|