handle_attribute_packed_e(attribute, (entity_t*) type->compound.compound);
}
+static void handle_attribute_asm(const attribute_t *attribute,
+ entity_t *entity)
+{
+ attribute_argument_t *argument = attribute->a.arguments;
+ assert (argument->kind == ATTRIBUTE_ARGUMENT_EXPRESSION);
+ expression_t *expression = argument->v.expression;
+ if (expression->kind != EXPR_STRING_LITERAL)
+ errorf(&attribute->source_position,
+ "Invalid asm attribute expression");
+ string_literal_expression_t *strexpr = (string_literal_expression_t*)expression;
+ symbol_t *sym = symbol_table_insert(strexpr->value.begin);
+ entity->function.actual_name = sym;
+ assert (argument->next == NULL);
+ return;
+}
+
void handle_entity_attributes(const attribute_t *attributes, entity_t *entity)
{
if (entity->kind == ENTITY_TYPEDEF) {
handle_attribute_packed_e(attribute, entity);
break;
+ case ATTRIBUTE_GNU_ASM:
+ handle_attribute_asm(attribute, entity);
+ break;
+
case ATTRIBUTE_MS_ALIGN:
case ATTRIBUTE_GNU_ALIGNED:
handle_attribute_aligned(attribute, entity);
*/
ident *create_name_linux_elf(entity_t *entity)
{
- bool needs_mangling = false;
+ const char *name = entity->base.symbol->string;
if (entity->kind == ENTITY_FUNCTION) {
type_t *type = skip_typeref(entity->declaration.type);
switch (type->function.linkage) {
case LINKAGE_INVALID:
panic("linkage type of function is invalid");
-
- case LINKAGE_C: break;
- case LINKAGE_CXX: needs_mangling = true; break;
+ case LINKAGE_C:
+ if (entity->function.actual_name != NULL)
+ name = entity->function.actual_name->string;
+ break;
+ case LINKAGE_CXX:
+ // TODO What about __REDIRECT/actual_name with mangling?
+ mangle_entity(entity);
+ return make_id_from_obst();
}
}
- if (needs_mangling) {
- mangle_entity(entity);
- return make_id_from_obst();
- }
-
- return new_id_from_str(entity->base.symbol->string);
+ return new_id_from_str(name);
}
/**