159 lines
4.4 KiB
C
159 lines
4.4 KiB
C
/* { dg-do compile } */
|
|
/* { dg-options "-O2" } */
|
|
typedef long unsigned int size_t;
|
|
typedef long int intmax_t;
|
|
typedef long unsigned int uintmax_t;
|
|
extern void *xmalloc (size_t) __attribute__ ((__malloc__));
|
|
extern const char *trim_filename (const char *);
|
|
extern void error (const char *, ...);
|
|
|
|
static __inline void *
|
|
__inline_memcpy_chk (void *__dest, const void *__src, size_t __len)
|
|
{
|
|
return __builtin___memcpy_chk (__dest, __src, __len, __builtin_object_size (__dest, 0));
|
|
}
|
|
|
|
typedef unsigned int hashval_t;
|
|
typedef hashval_t (*htab_hash) (const void *);
|
|
typedef int (*htab_eq) (const void *, const void *);
|
|
typedef void (*htab_del) (void *);
|
|
typedef int (*htab_trav) (void **, void *);
|
|
typedef void *(*htab_alloc) (size_t, size_t);
|
|
typedef void (*htab_free) (void *);
|
|
|
|
typedef void *(*htab_alloc_with_arg) (void *, size_t, size_t);
|
|
typedef void (*htab_free_with_arg) (void *, void *);
|
|
struct htab {
|
|
htab_hash hash_f;
|
|
htab_eq eq_f;
|
|
htab_del del_f;
|
|
void ** entries;
|
|
size_t size;
|
|
size_t n_elements;
|
|
size_t n_deleted;
|
|
unsigned int searches;
|
|
unsigned int collisions;
|
|
htab_alloc alloc_f;
|
|
htab_free free_f;
|
|
void * alloc_arg;
|
|
htab_alloc_with_arg alloc_with_arg_f;
|
|
htab_free_with_arg free_with_arg_f;
|
|
unsigned int size_prime_index;
|
|
};
|
|
|
|
typedef struct htab *htab_t;
|
|
enum insert_option {NO_INSERT, INSERT};
|
|
extern void * htab_find (htab_t, const void *);
|
|
extern void ** htab_find_slot (htab_t, const void *, enum insert_option);
|
|
|
|
enum mode_class { MODE_RANDOM, MODE_CC, MODE_INT, MODE_PARTIAL_INT, MODE_FRACT, MODE_UFRACT, MODE_ACCUM, MODE_UACCUM, MODE_FLOAT, MODE_DECIMAL_FLOAT, MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT, MODE_VECTOR_INT, MODE_VECTOR_FRACT, MODE_VECTOR_UFRACT, MODE_VECTOR_ACCUM, MODE_VECTOR_UACCUM, MODE_VECTOR_FLOAT, MAX_MODE_CLASS };
|
|
|
|
static const char *const mode_class_names[MAX_MODE_CLASS] =
|
|
{
|
|
"MODE_RANDOM", "MODE_CC", "MODE_INT", "MODE_PARTIAL_INT", "MODE_FRACT", "MODE_UFRACT", "MODE_ACCUM", "MODE_UACCUM", "MODE_FLOAT", "MODE_DECIMAL_FLOAT", "MODE_COMPLEX_INT", "MODE_COMPLEX_FLOAT", "MODE_VECTOR_INT", "MODE_VECTOR_FRACT", "MODE_VECTOR_UFRACT", "MODE_VECTOR_ACCUM", "MODE_VECTOR_UACCUM", "MODE_VECTOR_FLOAT"
|
|
};
|
|
struct mode_data
|
|
{
|
|
struct mode_data *next;
|
|
|
|
const char *name;
|
|
enum mode_class cl;
|
|
unsigned int precision;
|
|
unsigned int bytesize;
|
|
unsigned int ncomponents;
|
|
unsigned int alignment;
|
|
const char *format;
|
|
|
|
struct mode_data *component;
|
|
struct mode_data *wider;
|
|
struct mode_data *wider_2x;
|
|
|
|
struct mode_data *contained;
|
|
|
|
struct mode_data *next_cont;
|
|
|
|
const char *file;
|
|
unsigned int line;
|
|
unsigned int counter;
|
|
unsigned int ibit;
|
|
unsigned int fbit;
|
|
};
|
|
|
|
static struct mode_data *modes[MAX_MODE_CLASS];
|
|
static unsigned int n_modes[MAX_MODE_CLASS];
|
|
static struct mode_data *void_mode;
|
|
|
|
static const struct mode_data blank_mode = {
|
|
0, "<unknown>", MAX_MODE_CLASS,
|
|
-1U, -1U, -1U, -1U,
|
|
0, 0, 0, 0, 0, 0,
|
|
"<unknown>", 0, 0, 0, 0
|
|
};
|
|
|
|
static htab_t modes_by_name;
|
|
|
|
static __inline__ struct mode_data *
|
|
find_mode (const char *name)
|
|
{
|
|
struct mode_data key;
|
|
|
|
key.name = name;
|
|
return (struct mode_data *) htab_find (modes_by_name, &key);
|
|
}
|
|
|
|
static struct mode_data *
|
|
new_mode (enum mode_class cl, const char *name,
|
|
const char *file, unsigned int line)
|
|
{
|
|
struct mode_data *m;
|
|
static unsigned int count = 0;
|
|
|
|
m = find_mode (name);
|
|
if (m)
|
|
{
|
|
error ("%s:%d: duplicate definition of mode \"%s\"",
|
|
trim_filename (file), line, name);
|
|
error ("%s:%d: previous definition here", m->file, m->line);
|
|
return m;
|
|
}
|
|
|
|
m = ((struct mode_data *) xmalloc (sizeof (struct mode_data)));
|
|
((__builtin_object_size (m, 0) != (size_t) -1) ? __builtin___memcpy_chk (m, &blank_mode, sizeof (struct mode_data), __builtin_object_size (m, 0)) : __inline_memcpy_chk (m, &blank_mode, sizeof (struct mode_data)));
|
|
m->cl = cl;
|
|
m->name = name;
|
|
if (file)
|
|
m->file = trim_filename (file);
|
|
m->line = line;
|
|
m->counter = count++;
|
|
|
|
m->next = modes[cl];
|
|
modes[cl] = m;
|
|
n_modes[cl]++;
|
|
|
|
*htab_find_slot (modes_by_name, m, INSERT) = m;
|
|
|
|
return m;
|
|
}
|
|
|
|
static void
|
|
make_int_mode (const char *name,
|
|
unsigned int precision, unsigned int bytesize,
|
|
const char *file, unsigned int line)
|
|
{
|
|
struct mode_data *m = new_mode (MODE_INT, name, file, line);
|
|
m->bytesize = bytesize;
|
|
m->precision = precision;
|
|
}
|
|
|
|
static void
|
|
create_modes (void)
|
|
{
|
|
make_int_mode ("HI", -1U, 2, "../../work/gcc/machmode.def", 182);
|
|
}
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
create_modes ();
|
|
}
|