blob: 506f7532b3d66243345bd395a903cf7325a462ff [file] [log] [blame]
#include <ISO_Fortran_binding.h>
intptr_t assumed_rank_alloc_f (CFI_cdesc_t *);
intptr_t assumed_rank_pointer_f (CFI_cdesc_t *);
intptr_t assumed_rank_f (CFI_cdesc_t *);
intptr_t assumed_rank_cont_f (CFI_cdesc_t *);
intptr_t assumed_shape_f (CFI_cdesc_t *);
intptr_t assumed_shape_cont_f (CFI_cdesc_t *);
intptr_t deferred_shape_alloc_f (CFI_cdesc_t *);
intptr_t deferred_shape_pointer_f (CFI_cdesc_t *);
static void
basic_check(CFI_cdesc_t *x)
{
if (!x->base_addr)
__builtin_abort ();
if (x->elem_len != sizeof(int32_t))
__builtin_abort ();
if (x->version != CFI_VERSION)
__builtin_abort ();
if (x->rank != 4)
__builtin_abort ();
if (x->type != CFI_type_int32_t)
__builtin_abort ();
if (x->attribute == CFI_attribute_other)
{
if (x->dim[0].lower_bound != 0)
__builtin_abort ();
if (x->dim[1].lower_bound != 0)
__builtin_abort ();
if (x->dim[2].lower_bound != 0)
__builtin_abort ();
if (x->dim[3].lower_bound != 0)
__builtin_abort ();
}
}
intptr_t
assumed_rank_alloc_c (CFI_cdesc_t *x)
{
basic_check (x);
if (!CFI_is_contiguous (x))
__builtin_abort ();
if (x->attribute != CFI_attribute_allocatable)
__builtin_abort ();
intptr_t addr = (intptr_t) x->base_addr;
intptr_t addr2 = assumed_rank_alloc_f (x);
if (addr != addr2 || addr != (intptr_t) x->base_addr)
__builtin_abort ();
return addr;
}
intptr_t
assumed_rank_pointer_c (CFI_cdesc_t *x)
{
basic_check (x);
if (x->attribute != CFI_attribute_pointer)
__builtin_abort ();
intptr_t addr = (intptr_t) x->base_addr;
intptr_t addr2 = assumed_rank_pointer_f (x);
if (addr != addr2 || addr != (intptr_t) x->base_addr)
__builtin_abort ();
return addr;
}
intptr_t
assumed_rank_c (CFI_cdesc_t *x)
{
basic_check (x);
if (x->attribute != CFI_attribute_other)
__builtin_abort ();
intptr_t addr = (intptr_t) x->base_addr;
intptr_t addr2 = assumed_rank_f (x);
if (addr != addr2 || addr != (intptr_t) x->base_addr)
__builtin_abort ();
return addr;
}
intptr_t
assumed_rank_cont_c (CFI_cdesc_t *x)
{
basic_check (x);
if (!CFI_is_contiguous (x))
__builtin_abort ();
if (x->attribute != CFI_attribute_other)
__builtin_abort ();
intptr_t addr = (intptr_t) x->base_addr;
intptr_t addr2 = assumed_rank_cont_f (x);
if (addr != addr2 || addr != (intptr_t) x->base_addr)
__builtin_abort ();
return addr;
}
intptr_t
assumed_shape_c (CFI_cdesc_t *x, int num)
{
basic_check (x);
if (x->attribute != CFI_attribute_other)
__builtin_abort ();
intptr_t addr = (intptr_t) x->base_addr;
intptr_t addr2;
if (num == 1 || num == 2 || num == 3)
{
if (!CFI_is_contiguous (x))
__builtin_abort ();
}
else
{
if (CFI_is_contiguous (x))
__builtin_abort ();
}
if (num == 1 || num == 4)
addr2 = assumed_shape_f (x);
else if (num == 2 || num == 5)
addr2 = assumed_shape_cont_f (x);
else if (num == 3 || num == 6)
addr2 = assumed_rank_cont_f (x);
else
__builtin_abort ();
if (num == 1 || num == 2 || num == 3)
{
if (addr != addr2)
__builtin_abort ();
}
else
{
if (CFI_is_contiguous (x))
__builtin_abort ();
}
if (addr != (intptr_t) x->base_addr)
__builtin_abort ();
return addr2;
}
intptr_t
assumed_shape_cont_c (CFI_cdesc_t *x)
{
basic_check (x);
if (!CFI_is_contiguous (x))
__builtin_abort ();
if (x->attribute != CFI_attribute_other)
__builtin_abort ();
intptr_t addr = (intptr_t) x->base_addr;
intptr_t addr2 = assumed_shape_cont_f (x);
if (addr != addr2 || addr != (intptr_t) x->base_addr)
__builtin_abort ();
return addr;
}
intptr_t
deferred_shape_alloc_c (CFI_cdesc_t *x)
{
basic_check (x);
if (!CFI_is_contiguous (x))
__builtin_abort ();
if (x->attribute != CFI_attribute_allocatable)
__builtin_abort ();
intptr_t addr = (intptr_t) x->base_addr;
intptr_t addr2 = deferred_shape_alloc_f (x);
if (addr != addr2 || addr != (intptr_t) x->base_addr)
__builtin_abort ();
return addr;
}
intptr_t
deferred_shape_pointer_c (CFI_cdesc_t *x)
{
basic_check (x);
if (x->attribute != CFI_attribute_pointer)
__builtin_abort ();
intptr_t addr = (intptr_t) x->base_addr;
intptr_t addr2 = deferred_shape_pointer_f (x);
if (addr != addr2 || addr != (intptr_t) x->base_addr)
__builtin_abort ();
return addr;
}