EXPR_ARRAY_ACCESS,
EXPR_SIZEOF,
EXPR_CLASSIFY_TYPE,
+ EXPR_ALIGNOF,
EXPR_FUNCTION,
EXPR_PRETTY_FUNCTION,
EXPR_BUILTIN_SYMBOL,
+ EXPR_BUILTIN_CONSTANT_P,
+ EXPR_BUILTIN_PREFETCH,
EXPR_OFFSETOF,
EXPR_VA_START,
EXPR_VA_ARG,
EXPR_UNARY_PREFIX_INCREMENT,
EXPR_UNARY_PREFIX_DECREMENT,
EXPR_UNARY_CAST,
- EXPR_UNARY_CAST_IMPLICIT, /* compiler generated cast */
- EXPR_UNARY_LAST = EXPR_UNARY_CAST_IMPLICIT,
+ EXPR_UNARY_CAST_IMPLICIT, /**< compiler generated cast */
+ EXPR_UNARY_ASSUME, /**< MS __assume() */
+ EXPR_UNARY_BITFIELD_EXTRACT,
+ EXPR_UNARY_LAST = EXPR_UNARY_BITFIELD_EXTRACT,
EXPR_BINARY_FIRST,
EXPR_BINARY_ADD = EXPR_BINARY_FIRST,
EXPR_BINARY_BITWISE_OR_ASSIGN,
EXPR_BINARY_COMMA,
+ EXPR_BINARY_BUILTIN_EXPECT,
EXPR_BINARY_ISGREATER,
EXPR_BINARY_ISGREATEREQUAL,
EXPR_BINARY_ISLESS,
EXPR_BINARY_ISLESSGREATER,
EXPR_BINARY_ISUNORDERED,
EXPR_BINARY_LAST = EXPR_BINARY_ISUNORDERED,
-} expression_type_t;
+} expression_kind_t;
/* convenience macros */
#define EXPR_BINARY_CASES \
case EXPR_BINARY_BITWISE_XOR_ASSIGN: \
case EXPR_BINARY_BITWISE_OR_ASSIGN: \
case EXPR_BINARY_COMMA: \
+ case EXPR_BINARY_BUILTIN_EXPECT: \
case EXPR_BINARY_ISGREATER: \
case EXPR_BINARY_ISGREATEREQUAL: \
case EXPR_BINARY_ISLESS: \
case EXPR_UNARY_PREFIX_INCREMENT: \
case EXPR_UNARY_PREFIX_DECREMENT: \
case EXPR_UNARY_CAST: \
- case EXPR_UNARY_CAST_IMPLICIT:
+ case EXPR_UNARY_CAST_IMPLICIT: \
+ case EXPR_UNARY_ASSUME: \
+ case EXPR_UNARY_BITFIELD_EXTRACT:
-struct context_t {
- declaration_t *declarations;
+struct scope_t {
+ declaration_t *declarations; /**< List of declarations in this scope. */
};
struct expression_base_t {
- expression_type_t type;
+ expression_kind_t kind;
type_t *datatype;
source_position_t source_position;
};
struct string_literal_expression_t {
expression_base_t expression;
- const char *value;
+ string_t value;
};
struct wide_string_literal_expression_t {
symbol_t *symbol;
};
+struct builtin_constant_expression_t {
+ expression_base_t expression;
+ expression_t *value;
+};
+
+struct builtin_prefetch_expression_t {
+ expression_base_t expression;
+ expression_t *adr;
+ expression_t *rw;
+ expression_t *locality;
+};
+
struct reference_expression_t {
expression_base_t expression;
symbol_t *symbol;
expression_t *size_expression;
};
+struct alignof_expression_t {
+ expression_base_t expression;
+ type_t *type;
+};
+
struct designator_t {
symbol_t *symbol;
expression_t *array_access;
};
union expression_t {
- expression_type_t type;
+ expression_kind_t kind;
expression_base_t base;
const_expression_t conste;
string_literal_expression_t string;
wide_string_literal_expression_t wide_string;
builtin_symbol_expression_t builtin_symbol;
+ builtin_constant_expression_t builtin_constant;
+ builtin_prefetch_expression_t builtin_prefetch;
reference_expression_t reference;
call_expression_t call;
unary_expression_t unary;
conditional_expression_t conditional;
statement_expression_t statement;
classify_type_expression_t classify_type;
+ alignof_expression_t alignofe;
};
typedef enum {
INITIALIZER_LIST,
INITIALIZER_STRING,
INITIALIZER_WIDE_STRING
-} initializer_type_t;
+} initializer_kind_t;
struct initializer_base_t {
- initializer_type_t type;
+ initializer_kind_t kind;
};
struct initializer_value_t {
};
struct initializer_string_t {
- initializer_base_t initializer;
- const char *string;
+ initializer_base_t initializer;
+ string_t string;
};
struct initializer_wide_string_t {
};
union initializer_t {
- initializer_type_t type;
+ initializer_kind_t kind;
initializer_base_t base;
initializer_value_t value;
initializer_list_t list;
initializer_wide_string_t wide_string;
};
+typedef enum {
+ DM_DLLIMPORT = (1 << 0),
+ DM_DLLEXPORT = (1 << 1),
+ DM_THREAD = (1 << 2),
+ DM_NAKED = (1 << 3),
+ DM_FORCEINLINE = (1 << 4),
+ DM_NOTHROW = (1 << 5),
+ DM_NORETURN = (1 << 6),
+ DM_NOINLINE = (1 << 7)
+} decl_modifier_t;
+
+typedef unsigned short decl_modifiers_t;
+
struct declaration_t {
unsigned char namespc;
unsigned char storage_class;
+ decl_modifiers_t modifiers;
unsigned int address_taken : 1;
unsigned int is_inline : 1;
+ unsigned int used : 1; /**< Set if the declaration is used. */
type_t *type;
symbol_t *symbol;
source_position_t source_position;
initializer_t *initializer;
expression_t *enum_value;
} init;
- context_t context;
- context_t *parent_context;
+ scope_t scope;
+ scope_t *parent_scope;
- /** next declaration in a context */
+ /** next declaration in a scope */
declaration_t *next;
/** next declaration with same symbol */
declaration_t *symbol_next;
- unsigned char declaration_type; /* used in ast2firm module */
+ /* the following fields are used in ast2firm module */
+ unsigned char declaration_kind;
union {
- unsigned int value_number; /* used in ast2firm module */
- ir_entity *entity; /* used in ast2firm module */
- ir_node *block; /* used in ast2firm module */
- tarval *enum_val; /* used in ast2firm module */
+ unsigned int value_number;
+ ir_entity *entity;
+ ir_node *block;
+ tarval *enum_val;
} v;
};
STATEMENT_DO_WHILE,
STATEMENT_FOR,
STATEMENT_ASM
-} statement_type_t;
+} statement_kind_t;
struct statement_base_t {
- statement_type_t type;
+ statement_kind_t kind;
statement_t *next;
source_position_t source_position;
};
struct compound_statement_t {
statement_base_t statement;
statement_t *statements;
- context_t context;
+ scope_t scope;
};
struct declaration_statement_t {
};
struct switch_statement_t {
- statement_base_t statement;
- expression_t *expression;
- statement_t *body;
+ statement_base_t statement;
+ expression_t *expression;
+ statement_t *body;
+ case_label_statement_t *first_case, *last_case;
};
struct goto_statement_t {
statement_base_t statement;
- declaration_t *label;
+ declaration_t *label; /**< The destination label. */
+ goto_statement_t *next; /**< links all goto statements of a function */
};
struct case_label_statement_t {
- statement_base_t statement;
- expression_t *expression;
- statement_t *label_statement;
+ statement_base_t statement;
+ expression_t *expression;
+ statement_t *label_statement;
+ case_label_statement_t *next; /**< link to the next case label in the switch */
};
struct label_statement_t {
- statement_base_t statement;
- declaration_t *label;
- statement_t *label_statement;
+ statement_base_t statement;
+ declaration_t *label;
+ statement_t *label_statement;
+ label_statement_t *next; /**< links all label statements of a function */
};
struct expression_statement_t {
expression_t *condition;
expression_t *step;
statement_t *body;
- context_t context;
+ scope_t scope;
};
struct asm_constraint_t {
- const char *constraints;
+ string_t constraints;
expression_t *expression;
symbol_t *symbol;
asm_constraint_t *next;
};
struct asm_clobber_t {
- const char *clobber;
+ string_t clobber;
asm_clobber_t *next;
};
struct asm_statement_t {
statement_base_t statement;
- const char *asm_text;
+ string_t asm_text;
asm_constraint_t *inputs;
asm_constraint_t *outputs;
asm_clobber_t *clobbers;
};
union statement_t {
- statement_type_t type;
+ statement_kind_t kind;
statement_base_t base;
return_statement_t returns;
compound_statement_t compound;
};
struct translation_unit_t {
- context_t context;
+ scope_t scope;
};
static inline