X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=entity_t.h;h=7c54b353d4f5f8905e03165d9395999994d705c4;hb=bf69cc60f5e4c0743513754dec05978a57d5e76c;hp=d6002f9447960790558783080b7989e1393905c1;hpb=0335cc63b6df85713621a797bbafe6d7ca99f0a3;p=cparser diff --git a/entity_t.h b/entity_t.h index d6002f9..7c54b35 100644 --- a/entity_t.h +++ b/entity_t.h @@ -20,6 +20,8 @@ #ifndef ENTITY_T_H #define ENTITY_T_H +#include "lexer.h" +#include "symbol.h" #include "entity.h" typedef enum { @@ -33,7 +35,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 +48,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 +57,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, @@ -91,13 +92,24 @@ typedef enum decl_modifier_t { typedef unsigned decl_modifiers_t; +/** + * A scope containing entities. + */ +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. */ +}; + /** * 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. */ @@ -110,6 +122,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 +135,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 +161,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; @@ -179,6 +198,7 @@ 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. */ @@ -217,6 +237,7 @@ 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;