/* { dg-do compile } */
/* { dg-require-effective-target ilp32 } */
/* { dg-options "-g -O -w" } */

typedef unsigned _GCC_ATTR_ALIGN_u32t;
typedef _GCC_ATTR_ALIGN_u32t _Uint32t __attribute__((__aligned__(4)));
typedef int _Intptrt __attribute__((__mode__(__pointer__)));
typedef unsigned int _Uintptrt __attribute__((__mode__(__pointer__)));
typedef _Intptrt ptrdiff_t;
typedef _Uintptrt uintptr_t;
typedef _Uint32t Elf32_Word;
typedef struct list_head list_head_t;

struct list_head {
  list_head_t *next;
};

struct object { };

struct objlist {
  struct object *object;
};

static uintptr_t ldd(void *frame) __attribute__((__used__));
static list_head_t *_dl_all_objects_ptr;
static void fini_array(struct object *const obj) {
  if ((dynvec(obj,(unsigned)26)) != ((Elf32_Word)-1)) {
    unsigned i;
    const unsigned funcs = (dynvec(obj,(unsigned)28)) / 4;
    const Elf32_Word fa = (dynvec(obj,(unsigned)26));
    const int *const p = relative_relocp(obj);
    for (i = (funcs ? (funcs - 1) : 0U); i != 0U; i--) {
      void (*const func)(void) = (void *) p[i];
      (*func)();
    }
  }
}
static void _do_exit_fini(void) {
  const struct objlist *o;
  for (((o)) = ((void *)(((list_head_t *)(_dl_all_objects_ptr))->next));
       !((((o))) == ((void *)((list_head_t *)(_dl_all_objects_ptr))));
       ((o)) = ((void *)(((list_head_t *)((o)))->next)))
    fini_array (o->object);
}
static uintptr_t ldd (void *frame) {
  atexit(_do_exit_fini);
}
