X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=entity_t.h;h=03cfd7ad8696777370b24b61b00518813d247a7a;hb=2e7e36a9f01d1dc07e450ab3ecf082a133b3099e;hp=1f4c35fdf104cc8cb88679a84c9a5ababedbc49a;hpb=eb5f3999086e7755261a8b248f430bbb81d81168;p=cparser diff --git a/entity_t.h b/entity_t.h index 1f4c35f..03cfd7a 100644 --- a/entity_t.h +++ b/entity_t.h @@ -23,11 +23,13 @@ #include "lexer.h" #include "symbol.h" #include "entity.h" +#include typedef enum { ENTITY_INVALID, ENTITY_VARIABLE, ENTITY_COMPOUND_MEMBER, + ENTITY_PARAMETER, ENTITY_FUNCTION, ENTITY_TYPEDEF, ENTITY_STRUCT, @@ -57,9 +59,6 @@ typedef enum storage_class_tag_t { STORAGE_CLASS_TYPEDEF, STORAGE_CLASS_AUTO, STORAGE_CLASS_REGISTER, - STORAGE_CLASS_THREAD, - STORAGE_CLASS_THREAD_EXTERN, - STORAGE_CLASS_THREAD_STATIC, } storage_class_tag_t; typedef unsigned char storage_class_t; @@ -90,7 +89,8 @@ typedef enum decl_modifier_t { DM_FASTCALL = 1 << 22, DM_STDCALL = 1 << 23, DM_THISCALL = 1 << 24, - DM_DEPRECATED = 1 << 25 + DM_DEPRECATED = 1 << 25, + DM_RETURNS_TWICE = 1 << 26, } decl_modifier_t; typedef unsigned decl_modifiers_t; @@ -101,7 +101,6 @@ typedef unsigned decl_modifiers_t; struct scope_t { entity_t *entities; entity_t *last_entity; - scope_t *parent; /**< points to the parent scope. */ unsigned depth; /**< while parsing, the depth of this scope in the scope stack. */ }; @@ -115,7 +114,8 @@ struct entity_base_t { entity_namespace_t namespc; symbol_t *symbol; source_position_t source_position; - scope_t *parent_scope; /**< The parent scope where this declaration lives. */ + scope_t *parent_scope; /**< The scope where this entity + is contained in */ /** next declaration in a scope */ entity_t *next; @@ -125,6 +125,7 @@ struct entity_base_t { struct compound_t { entity_base_t base; + entity_t *alias; /* used for name mangling of anonymous types */ scope_t members; decl_modifiers_t modifiers; bool complete : 1; @@ -137,6 +138,7 @@ struct compound_t { struct enum_t { entity_base_t base; + entity_t *alias; /* used for name mangling of anonymous types */ bool complete : 1; /* ast2firm info */ @@ -190,7 +192,9 @@ struct declaration_t { struct compound_member_t { declaration_t base; - bool read : 1; + unsigned char alignment; + bool read : 1; + bool address_taken : 1; /**< Set if the address of this declaration was taken. */ /* ast2firm info */ ir_entity *entity; @@ -199,9 +203,10 @@ struct compound_member_t { struct variable_t { declaration_t base; + bool thread_local : 1; /**< GCC __thread */ bool address_taken : 1; /**< Set if the address of this declaration was taken. */ bool read : 1; - unsigned char alignment; /**< Alignment of the declaration, 0 for default. */ + unsigned char alignment; symbol_t *get_property_sym; /**< MS get property. */ symbol_t *put_property_sym; /**< MS put property. */ @@ -215,6 +220,18 @@ struct variable_t { } v; }; +struct parameter_t { + declaration_t base; + bool address_taken : 1; + bool read : 1; + + /* ast2firm info */ + union { + unsigned int value_number; + ir_entity *entity; + } v; +}; + struct function_t { declaration_t base; bool is_inline : 1; @@ -241,6 +258,7 @@ union entity_t { typedef_t typedefe; declaration_t declaration; variable_t variable; + parameter_t parameter; function_t function; compound_member_t compound_member; }; @@ -248,7 +266,11 @@ union entity_t { static inline bool is_declaration(const entity_t *entity) { return entity->kind == ENTITY_FUNCTION || entity->kind == ENTITY_VARIABLE + || entity->kind == ENTITY_PARAMETER || entity->kind == ENTITY_COMPOUND_MEMBER; } + +const char *get_entity_kind_name(entity_kind_t kind); + #endif