mirror of
https://github.com/nArnoSNES/tcc-65816.git
synced 2024-06-11 22:29:28 +00:00
124 lines
2.7 KiB
C
124 lines
2.7 KiB
C
struct obstack
|
|
{
|
|
long chunk_size;
|
|
struct _obstack_chunk *chunk;
|
|
char *object_base;
|
|
char *next_free;
|
|
char *chunk_limit;
|
|
int alignment_mask;
|
|
unsigned maybe_empty_object;
|
|
};
|
|
|
|
struct objfile
|
|
{
|
|
struct objfile *next;
|
|
struct obstack type_obstack;
|
|
};
|
|
|
|
struct type
|
|
{
|
|
unsigned length;
|
|
struct objfile *objfile;
|
|
short nfields;
|
|
struct field
|
|
{
|
|
union field_location
|
|
{
|
|
int bitpos;
|
|
unsigned long physaddr;
|
|
char *physname;
|
|
}
|
|
loc;
|
|
int bitsize;
|
|
struct type *type;
|
|
char *name;
|
|
}
|
|
*fields;
|
|
};
|
|
|
|
struct type *alloc_type (void);
|
|
void * xmalloc (unsigned int z);
|
|
void _obstack_newchunk (struct obstack *o, int i);
|
|
void get_discrete_bounds (long long *lowp, long long *highp);
|
|
|
|
extern void *memset(void *, int, __SIZE_TYPE__);
|
|
|
|
struct type *
|
|
create_array_type (struct type *result_type, struct type *element_type)
|
|
{
|
|
long long low_bound, high_bound;
|
|
if (result_type == ((void *)0))
|
|
{
|
|
result_type = alloc_type ();
|
|
}
|
|
get_discrete_bounds (&low_bound, &high_bound);
|
|
(result_type)->length =
|
|
(element_type)->length * (high_bound - low_bound + 1);
|
|
(result_type)->nfields = 1;
|
|
(result_type)->fields =
|
|
(struct field *) ((result_type)->objfile != ((void *)0)
|
|
? (
|
|
{
|
|
struct obstack *__h =
|
|
(&(result_type)->objfile -> type_obstack);
|
|
{
|
|
struct obstack *__o = (__h);
|
|
int __len = ((sizeof (struct field)));
|
|
if (__o->chunk_limit - __o->next_free < __len)
|
|
_obstack_newchunk (__o, __len);
|
|
__o->next_free += __len; (void) 0;
|
|
};
|
|
({
|
|
struct obstack *__o1 = (__h);
|
|
void *value;
|
|
value = (void *) __o1->object_base;
|
|
if (__o1->next_free == value)
|
|
__o1->maybe_empty_object = 1;
|
|
__o1->next_free = (((((__o1->next_free) - (char *) 0)
|
|
+__o1->alignment_mask)
|
|
& ~ (__o1->alignment_mask))
|
|
+ (char *) 0);
|
|
if (__o1->next_free - (char *)__o1->chunk
|
|
> __o1->chunk_limit - (char *)__o1->chunk)
|
|
__o1->next_free = __o1->chunk_limit;
|
|
__o1->object_base = __o1->next_free;
|
|
value;
|
|
});
|
|
}) : xmalloc (sizeof (struct field)));
|
|
return (result_type);
|
|
}
|
|
|
|
struct type *
|
|
alloc_type (void)
|
|
{
|
|
abort ();
|
|
}
|
|
void * xmalloc (unsigned int z)
|
|
{
|
|
return 0;
|
|
}
|
|
void _obstack_newchunk (struct obstack *o, int i)
|
|
{
|
|
abort ();
|
|
}
|
|
void
|
|
get_discrete_bounds (long long *lowp, long long *highp)
|
|
{
|
|
*lowp = 0;
|
|
*highp = 2;
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
struct type element_type;
|
|
struct type result_type;
|
|
|
|
memset (&element_type, 0, sizeof (struct type));
|
|
memset (&result_type, 0, sizeof (struct type));
|
|
element_type.length = 4;
|
|
create_array_type (&result_type, &element_type);
|
|
if (result_type.length != 12)
|
|
abort ();
|
|
exit (0);
|
|
}
|