X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=mangle.c;h=e4f1092bcbce9222c9335627e7bfc8e9356ea01a;hb=070ce965198effd91ca08112df7f41b0e0b5049d;hp=0a064b039f37d0267a0d6a2497145a00c0863405;hpb=216583a2751bb4c9cc5b1194f7be8a2a48e65e7d;p=cparser diff --git a/mangle.c b/mangle.c index 0a064b0..e4f1092 100644 --- a/mangle.c +++ b/mangle.c @@ -103,6 +103,43 @@ static void mangle_function_type(const function_type_t *type) obstack_1grow(&obst, 'E'); } +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)); +} + static void mangle_qualifiers(type_qualifiers_t qualifiers) { if (qualifiers & TYPE_QUALIFIER_RESTRICT) @@ -131,6 +168,22 @@ static void mangle_type(type_t *orig_type) case TYPE_FUNCTION: mangle_function_type(&type->function); return; + case TYPE_COMPOUND_STRUCT: + case TYPE_COMPOUND_UNION: + mangle_class_enum_type(&type->compound.compound->base); + return; + case TYPE_ENUM: + mangle_class_enum_type(&type->enumt.enume->base); + return; + case TYPE_ARRAY: + mangle_array_type(&type->array); + return; + case TYPE_COMPLEX: + mangle_complex_type(&type->complex); + return; + case TYPE_IMAGINARY: + mangle_imaginary_type(&type->imaginary); + return; case TYPE_INVALID: panic("invalid type encountered while mangling"); case TYPE_ERROR: @@ -141,12 +194,6 @@ static void mangle_type(type_t *orig_type) panic("typeref not resolved while manging?!?"); case TYPE_BITFIELD: - case TYPE_COMPLEX: - case TYPE_IMAGINARY: - case TYPE_COMPOUND_STRUCT: - case TYPE_COMPOUND_UNION: - case TYPE_ENUM: - case TYPE_ARRAY: panic("no mangling for this type implemented yet"); break; } @@ -161,7 +208,7 @@ static void mangle_entity(entity_t *entity) /* TODO: mangle scope */ const char *name = entity->base.symbol->string; - obstack_printf(&obst, "%zu%s", strlen(name), name); + obstack_printf(&obst, "%u%s", (unsigned) strlen(name), name); if (entity->kind == ENTITY_FUNCTION) { mangle_parameters(&entity->declaration.type->function); @@ -227,12 +274,12 @@ ident *create_name_win32(entity_t *entity) case CC_STDCALL: case CC_FASTCALL: { - ir_type *irtype = get_ir_type(entity->declaration.type); - size_t size = 0; + ir_type *irtype = get_ir_type(entity->declaration.type); + unsigned size = 0; for (int i = get_method_n_params(irtype) - 1; i >= 0; --i) { size += get_type_size_bytes(get_method_param_type(irtype, i)); } - obstack_printf(o, "@%zu", size); + obstack_printf(o, "@%u", size); break; }