X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=type.c;h=8ae9e378c09f5a15252c8ff392addab4c969df78;hb=d2e6965a9bdae61491e0b88ac661559550999ce5;hp=f2e804e6208c3b64568b480b8636bc4533950a0f;hpb=4599bf70900fbc4c5bf49c326ddb90bb48f346ec;p=cparser diff --git a/type.c b/type.c index f2e804e..8ae9e37 100644 --- a/type.c +++ b/type.c @@ -52,6 +52,12 @@ static atomic_type_properties_t atomic_type_properties[ATOMIC_TYPE_LAST+1] = { .alignment = 0, .flags = ATOMIC_TYPE_FLAG_NONE }, + [ATOMIC_TYPE_WCHAR_T] = { + .size = (unsigned)-1, + .alignment = (unsigned)-1, + /* signed flag will be set when known */ + .flags = ATOMIC_TYPE_FLAG_INTEGER | ATOMIC_TYPE_FLAG_ARITHMETIC, + }, [ATOMIC_TYPE_CHAR] = { .size = 1, .alignment = 1, @@ -177,6 +183,8 @@ void init_types(void) /* TODO: make this configurable for platforms which do not use byte sized * bools. */ props[ATOMIC_TYPE_BOOL] = props[ATOMIC_TYPE_UCHAR]; + + props[ATOMIC_TYPE_WCHAR_T] = props[wchar_atomic_kind]; } void exit_types(void) @@ -216,6 +224,7 @@ const char *get_atomic_kind_name(atomic_type_kind_t kind) switch(kind) { case ATOMIC_TYPE_INVALID: break; case ATOMIC_TYPE_VOID: return "void"; + case ATOMIC_TYPE_WCHAR_T: return "wchar_t"; case ATOMIC_TYPE_BOOL: return c_mode & _CXX ? "bool" : "_Bool"; case ATOMIC_TYPE_CHAR: return "char"; case ATOMIC_TYPE_SCHAR: return "signed char"; @@ -356,15 +365,19 @@ static void print_function_type_post(const function_type_t *type, } } else { entity_t *parameter = parameters->entities; - for( ; parameter != NULL; parameter = parameter->base.next) { + for (; parameter != NULL; parameter = parameter->base.next) { if (first) { first = false; } else { fputs(", ", out); } assert(is_declaration(parameter)); - print_type_ext(parameter->declaration.type, parameter->base.symbol, - NULL); + const type_t *const type = parameter->declaration.type; + if (type == NULL) { + fputs(parameter->base.symbol->string, out); + } else { + print_type_ext(type, parameter->base.symbol, NULL); + } } } if (type->variadic) { @@ -397,10 +410,11 @@ static void print_pointer_type_pre(const pointer_type_t *type) fputs(variable->base.base.symbol->string, out); fputs(") ", out); } - fputs("*", out); - print_type_qualifiers(type->base.qualifiers); - if (type->base.qualifiers != 0) + fputc('*', out); + type_qualifiers_t const qual = type->base.qualifiers; + if (qual != 0) fputc(' ', out); + print_type_qualifiers(qual); } /** @@ -494,9 +508,9 @@ void print_enum_definition(const enum_t *enume) entry = entry->base.next) { print_indent(); - fprintf(out, "%s", entry->base.symbol->string); + fputs(entry->base.symbol->string, out); if (entry->enum_value.value != NULL) { - fprintf(out, " = "); + fputs(" = ", out); /* skip the implicit cast */ expression_t *expression = entry->enum_value.value; @@ -505,12 +519,12 @@ void print_enum_definition(const enum_t *enume) } print_expression(expression); } - fprintf(out, ",\n"); + fputs(",\n", out); } change_indent(-1); print_indent(); - fputs("}", out); + fputc('}', out); } /** @@ -553,7 +567,10 @@ void print_compound_definition(const compound_t *compound) change_indent(-1); print_indent(); - fputs("}", out); + fputc('}', out); + if (compound->modifiers & DM_TRANSPARENT_UNION) { + fputs("__attribute__((__transparent_union__))", out); + } } /** @@ -604,7 +621,6 @@ static void print_typeof_type_pre(const typeof_type_t *const type) { fputs("typeof(", out); if (type->expression != NULL) { - assert(type->typeof_type == NULL); print_expression(type->expression); } else { print_type(type->typeof_type); @@ -708,6 +724,10 @@ static void intern_print_type_post(const type_t *const type, const bool top) case TYPE_TYPEDEF: break; } + + if (type->base.modifiers & DM_TRANSPARENT_UNION) { + fputs("__attribute__((__transparent_union__))", out); + } } /** @@ -782,6 +802,7 @@ type_t *duplicate_type(const type_t *type) type_t *copy = obstack_alloc(type_obst, size); memcpy(copy, type, size); + copy->base.firm_type = NULL; return copy; } @@ -1199,6 +1220,7 @@ type_t *skip_typeref(type_t *type) { type_qualifiers_t qualifiers = TYPE_QUALIFIER_NONE; type_modifiers_t modifiers = TYPE_MODIFIER_NONE; + unsigned char alignment = 0; while (true) { switch (type->kind) { @@ -1207,6 +1229,9 @@ type_t *skip_typeref(type_t *type) case TYPE_TYPEDEF: { qualifiers |= type->base.qualifiers; modifiers |= type->base.modifiers; + if (type->base.alignment > alignment) + alignment = type->base.alignment; + const typedef_type_t *typedef_type = &type->typedeft; if (typedef_type->resolved_type != NULL) { type = typedef_type->resolved_type; @@ -1216,6 +1241,11 @@ type_t *skip_typeref(type_t *type) continue; } case TYPE_TYPEOF: { + qualifiers |= type->base.qualifiers; + modifiers |= type->base.modifiers; + if (type->base.alignment > alignment) + alignment = type->base.alignment; + const typeof_type_t *typeof_type = &type->typeoft; if (typeof_type->typeof_type != NULL) { type = typeof_type->typeof_type; @@ -1230,7 +1260,8 @@ type_t *skip_typeref(type_t *type) break; } - if (qualifiers != TYPE_QUALIFIER_NONE || modifiers != TYPE_MODIFIER_NONE) { + if (qualifiers != TYPE_QUALIFIER_NONE || modifiers != TYPE_MODIFIER_NONE + || (alignment != 0 && alignment > type->base.alignment)) { type_t *const copy = duplicate_type(type); /* for const with typedefed array type the element type has to be @@ -1240,10 +1271,12 @@ type_t *skip_typeref(type_t *type) element_type = duplicate_type(element_type); element_type->base.qualifiers |= qualifiers; element_type->base.modifiers |= modifiers; + element_type->base.alignment = alignment; copy->array.element_type = element_type; } else { copy->base.qualifiers |= qualifiers; copy->base.modifiers |= modifiers; + copy->base.alignment = alignment; } type = typehash_insert(copy);