projects
/
cparser
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Do not crash on alignof($TYPE).
[cparser]
/
mangle.c
diff --git
a/mangle.c
b/mangle.c
index
c80ec31
..
bcd78d6
100644
(file)
--- a/
mangle.c
+++ b/
mangle.c
@@
-40,6
+40,7
@@
static char get_atomic_type_mangle(atomic_type_kind_t kind)
switch (kind) {
case ATOMIC_TYPE_INVALID: break;
case ATOMIC_TYPE_VOID: return 'v';
switch (kind) {
case ATOMIC_TYPE_INVALID: break;
case ATOMIC_TYPE_VOID: return 'v';
+ case ATOMIC_TYPE_WCHAR_T: return 'w';
case ATOMIC_TYPE_BOOL: return 'b';
case ATOMIC_TYPE_CHAR: return 'c';
case ATOMIC_TYPE_SCHAR: return 'a';
case ATOMIC_TYPE_BOOL: return 'b';
case ATOMIC_TYPE_CHAR: return 'c';
case ATOMIC_TYPE_SCHAR: return 'a';
@@
-70,6
+71,12
@@
static void mangle_pointer_type(const pointer_type_t *type)
mangle_type(type->points_to);
}
mangle_type(type->points_to);
}
+static void mangle_reference_type(const reference_type_t *type)
+{
+ obstack_1grow(&obst, 'R');
+ mangle_type(type->refers_to);
+}
+
static void mangle_parameters(const function_type_t *type)
{
if (type->unspecified_parameters)
static void mangle_parameters(const function_type_t *type)
{
if (type->unspecified_parameters)
@@
-157,8
+164,10
@@
static void mangle_imaginary_type(const imaginary_type_t *type)
static void mangle_qualifiers(type_qualifiers_t qualifiers)
{
static void mangle_qualifiers(type_qualifiers_t qualifiers)
{
+#if 0 /* Do not mangle restrict qualifiers. GCC doesn't either */
if (qualifiers & TYPE_QUALIFIER_RESTRICT)
obstack_1grow(&obst, 'r');
if (qualifiers & TYPE_QUALIFIER_RESTRICT)
obstack_1grow(&obst, 'r');
+#endif
if (qualifiers & TYPE_QUALIFIER_VOLATILE)
obstack_1grow(&obst, 'V');
if (qualifiers & TYPE_QUALIFIER_CONST)
if (qualifiers & TYPE_QUALIFIER_VOLATILE)
obstack_1grow(&obst, 'V');
if (qualifiers & TYPE_QUALIFIER_CONST)
@@
-180,6
+189,9
@@
static void mangle_type(type_t *orig_type)
case TYPE_POINTER:
mangle_pointer_type(&type->pointer);
return;
case TYPE_POINTER:
mangle_pointer_type(&type->pointer);
return;
+ case TYPE_REFERENCE:
+ mangle_reference_type(&type->reference);
+ return;
case TYPE_FUNCTION:
mangle_function_type(&type->function);
return;
case TYPE_FUNCTION:
mangle_function_type(&type->function);
return;
@@
-210,7
+222,6
@@
static void mangle_type(type_t *orig_type)
case TYPE_BITFIELD:
panic("no mangling for this type implemented yet");
case TYPE_BITFIELD:
panic("no mangling for this type implemented yet");
- break;
}
panic("invalid type encountered while mangling");
}
}
panic("invalid type encountered while mangling");
}
@@
-269,7
+280,7
@@
ident *create_name_win32(entity_t *entity)
switch (entity->declaration.type->function.linkage) {
case LINKAGE_INVALID:
switch (entity->declaration.type->function.linkage) {
case LINKAGE_INVALID:
-
break
;
+
panic("linkage type of function is invalid")
;
case LINKAGE_C:
obstack_printf(o, "%s", entity->base.symbol->string);
case LINKAGE_C:
obstack_printf(o, "%s", entity->base.symbol->string);
@@
-319,7
+330,9
@@
ident *create_name_linux_elf(entity_t *entity)
if (entity->kind == ENTITY_FUNCTION) {
switch (entity->declaration.type->function.linkage) {
if (entity->kind == ENTITY_FUNCTION) {
switch (entity->declaration.type->function.linkage) {
- case LINKAGE_INVALID: break;
+ case LINKAGE_INVALID:
+ panic("linkage type of function is invalid");
+
case LINKAGE_C: break;
case LINKAGE_CXX: needs_mangling = true; break;
}
case LINKAGE_C: break;
case LINKAGE_CXX: needs_mangling = true; break;
}
@@
-341,6
+354,9
@@
ident *create_name_linux_elf(entity_t *entity)
*/
ident *create_name_macho(entity_t *entity)
{
*/
ident *create_name_macho(entity_t *entity)
{
+ if (entity->kind == ENTITY_FUNCTION && entity->declaration.type->function.linkage == LINKAGE_INVALID)
+ panic("linkage type of function is invalid");
+
obstack_printf(&obst, "_%s", entity->base.symbol->string);
return make_id_from_obst();
}
obstack_printf(&obst, "_%s", entity->base.symbol->string);
return make_id_from_obst();
}