+static void mangle_class_enum_type(const entity_base_t *ent)
+{
+ const symbol_t *sym = ent->symbol;
+ if (sym != NULL) {
+ const char *name = sym->string;
+ obstack_printf(&obst, "%u%s", (unsigned) strlen(name), name);
+ } else {
+ /* TODO need the first typedef name here */
+ panic("mangling of unnamed class/enum types not implemented yet");
+ }
+}
+
+static void mangle_array_type(const array_type_t *type)
+{
+ if (type->is_vla) {
+ obstack_1grow(&obst, 'A');
+ obstack_1grow(&obst, '_');
+ } else if (type->size_constant) {
+ obstack_printf(&obst, "A%u_", (unsigned) type->size);
+ } else {
+ panic("mangling of non-constant sized array types not implemented yet");
+ }
+ mangle_type(type->element_type);
+}
+
+static void mangle_complex_type(const complex_type_t *type)
+{
+ obstack_1grow(&obst, 'C');
+ obstack_1grow(&obst, get_atomic_type_mangle(type->akind));
+}
+
+static void mangle_imaginary_type(const imaginary_type_t *type)
+{
+ obstack_1grow(&obst, 'G');
+ obstack_1grow(&obst, get_atomic_type_mangle(type->akind));
+}
+