X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=attribute.c;h=5190ac1619652a33eb2dba97c469ba43f2a856f3;hb=0ebbd3e65a57231db1c7346190cb4f04ea52b628;hp=eca3f61d61b9772c2e6d672e3b1374d8f1197c54;hpb=f9580ab07acfdbde64386a8e3d12a1f56dcf4a54;p=cparser diff --git a/attribute.c b/attribute.c index eca3f61..5190ac1 100644 --- a/attribute.c +++ b/attribute.c @@ -242,7 +242,7 @@ static void warn_arguments(const attribute_t *attribute) if (warning.other) { warningf(&attribute->source_position, - "attribute '%s' needs no attributes", + "attribute '%s' needs no arguments", get_attribute_name(attribute->kind)); } } @@ -275,6 +275,22 @@ static void handle_attribute_packed(const attribute_t *attribute, type_t *type) 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) { @@ -329,6 +345,10 @@ void handle_entity_attributes(const attribute_t *attributes, entity_t *entity) 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); @@ -379,7 +399,7 @@ type_t *handle_type_attributes(const attribute_t *attributes, type_t *type) switch(attribute->kind) { case ATTRIBUTE_GNU_PACKED: handle_attribute_packed(attribute, type); - break; + break; case ATTRIBUTE_GNU_CDECL: case ATTRIBUTE_MS_CDECL: type = change_calling_convention(type, CC_CDECL); @@ -420,7 +440,7 @@ const char *get_deprecated_string(const attribute_t *attribute) expression_t *expression = argument->v.expression; if (expression->kind != EXPR_STRING_LITERAL) return NULL; - return expression->string.value.begin; + return expression->literal.value.begin; } return NULL; }