X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=entity_t.h;h=03cfd7ad8696777370b24b61b00518813d247a7a;hb=2e7e36a9f01d1dc07e450ab3ecf082a133b3099e;hp=d6002f9447960790558783080b7989e1393905c1;hpb=0335cc63b6df85713621a797bbafe6d7ca99f0a3;p=cparser diff --git a/entity_t.h b/entity_t.h index d6002f9..03cfd7a 100644 --- a/entity_t.h +++ b/entity_t.h @@ -20,12 +20,16 @@ #ifndef ENTITY_T_H #define ENTITY_T_H +#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, @@ -33,7 +37,8 @@ typedef enum { ENTITY_ENUM, ENTITY_ENUM_VALUE, ENTITY_LABEL, - ENTITY_LOCAL_LABEL + ENTITY_LOCAL_LABEL, + ENTITY_NAMESPACE } entity_kind_tag_t; typedef unsigned char entity_kind_t; @@ -45,7 +50,7 @@ typedef enum namespace_tag_t { NAMESPACE_ENUM, NAMESPACE_LABEL } namespace_tag_t; -typedef unsigned char namespace_t; +typedef unsigned char entity_namespace_t; typedef enum storage_class_tag_t { STORAGE_CLASS_NONE, @@ -54,13 +59,11 @@ 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; typedef enum decl_modifier_t { + DM_NONE = 0, DM_DLLIMPORT = 1 << 0, DM_DLLEXPORT = 1 << 1, DM_THREAD = 1 << 2, @@ -86,21 +89,33 @@ 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; +/** + * A scope containing entities. + */ +struct scope_t { + entity_t *entities; + entity_t *last_entity; + unsigned depth; /**< while parsing, the depth of this scope in the + scope stack. */ +}; + /** * a named entity is something which can be referenced by its name * (a symbol) */ struct entity_base_t { entity_kind_t kind; - namespace_t namespc; + 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; @@ -110,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; @@ -122,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 */ @@ -147,6 +164,11 @@ struct label_t { ir_node *block; }; +struct namespace_t { + entity_base_t base; + scope_t members; +}; + struct typedef_t { entity_base_t base; decl_modifiers_t modifiers; @@ -170,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; @@ -179,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. */ @@ -195,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; @@ -217,9 +254,11 @@ union entity_t { enum_t enume; enum_value_t enum_value; label_t label; + namespace_t namespacee; typedef_t typedefe; declaration_t declaration; variable_t variable; + parameter_t parameter; function_t function; compound_member_t compound_member; }; @@ -227,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