+/*
+ * This file is part of cparser.
+ * Copyright (C) 2007-2008 Matthias Braun <matze@braunis.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
#include <config.h>
#include <stdbool.h>
static unsigned hash_atomic_type(const atomic_type_t *type)
{
unsigned some_prime = 27644437;
- unsigned result = type->atype * some_prime;
+ unsigned result = type->akind * some_prime;
+
+ return result;
+}
+
+static unsigned hash_complex_type(const complex_type_t *type)
+{
+ unsigned some_prime = 27644437;
+ unsigned result = type->akind * some_prime;
+
+ return result;
+}
+
+static unsigned hash_imaginary_type(const imaginary_type_t *type)
+{
+ unsigned some_prime = 27644437;
+ unsigned result = type->akind * some_prime;
return result;
}
return result;
}
+static unsigned hash_bitfield_type(const bitfield_type_t *type)
+{
+ unsigned result = hash_ptr(type->base_type);
+ result ^= 27172145;
+
+ return result;
+}
+
static unsigned hash_type(const type_t *type)
{
unsigned hash = 0;
case TYPE_INVALID:
panic("internalizing void or invalid types not possible");
return 0;
+ case TYPE_ERROR:
+ return 0;
case TYPE_ATOMIC:
hash = hash_atomic_type(&type->atomic);
break;
+ case TYPE_COMPLEX:
+ hash = hash_complex_type(&type->complex);
+ break;
+ case TYPE_IMAGINARY:
+ hash = hash_imaginary_type(&type->imaginary);
+ break;
case TYPE_ENUM:
hash = hash_enum_type(&type->enumt);
break;
case TYPE_TYPEOF:
hash = hash_typeof_type(&type->typeoft);
break;
+ case TYPE_BITFIELD:
+ hash = hash_bitfield_type(&type->bitfield);
+ break;
}
unsigned some_prime = 99991;
}
static bool atomic_types_equal(const atomic_type_t *type1,
- const atomic_type_t *type2)
+ const atomic_type_t *type2)
+{
+ return type1->akind == type2->akind;
+}
+
+static bool complex_types_equal(const complex_type_t *type1,
+ const complex_type_t *type2)
+{
+ return type1->akind == type2->akind;
+}
+
+static bool imaginary_types_equal(const imaginary_type_t *type1,
+ const imaginary_type_t *type2)
{
- return type1->atype == type2->atype;
+ return type1->akind == type2->akind;
}
static bool function_types_equal(const function_type_t *type1,
return false;
if(type1->is_static != type2->is_static)
return false;
- /* TODO: compare expressions for equality... */
- if(type1->size != type2->size)
+ if(type1->size_constant != type2->size_constant)
return false;
- return true;
+ /* never identify vla types, because we need them for caching calculated
+ * sizes later in ast2firm */
+ if(type1->is_vla || type2->is_vla)
+ return false;
+
+ /* TODO: compare size expressions for equality... */
+
+ return false;
}
static bool builtin_types_equal(const builtin_type_t *type1,
return true;
}
+static bool bitfield_types_equal(const bitfield_type_t *type1,
+ const bitfield_type_t *type2)
+{
+ if(type1->base_type != type2->base_type)
+ return false;
+ /* TODO: compare size expression */
+ return false;
+}
+
static bool types_equal(const type_t *type1, const type_t *type2)
{
if(type1 == type2)
return false;
switch(type1->kind) {
+ case TYPE_ERROR:
+ /* Hmm, the error type is never equal */
+ return false;
case TYPE_INVALID:
return false;
case TYPE_ATOMIC:
return atomic_types_equal(&type1->atomic, &type2->atomic);
+ case TYPE_COMPLEX:
+ return complex_types_equal(&type1->complex, &type2->complex);
+ case TYPE_IMAGINARY:
+ return imaginary_types_equal(&type1->imaginary, &type2->imaginary);
case TYPE_ENUM:
return enum_types_equal(&type1->enumt, &type2->enumt);
case TYPE_COMPOUND_STRUCT:
return typeof_types_equal(&type1->typeoft, &type2->typeoft);
case TYPE_TYPEDEF:
return typedef_types_equal(&type1->typedeft, &type2->typedeft);
+ case TYPE_BITFIELD:
+ return bitfield_types_equal(&type1->bitfield, &type2->bitfield);
}
abort();