X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ast_t.h;h=7a08c2a1dfc8c0e5cd60d5ee1506bb58bfcbb205;hb=1f415533c733c29d10f379642f8caa2ab995fcc3;hp=1c0141dbf9c64b91077f0dfc5778704ba58614c1;hpb=912addb873c5f8b193970fe4f0926ff89aec3fc8;p=cparser diff --git a/ast_t.h b/ast_t.h index 1c0141d..7a08c2a 100644 --- a/ast_t.h +++ b/ast_t.h @@ -86,6 +86,7 @@ typedef enum expression_kind_t { EXPR_OFFSETOF, EXPR_VA_START, EXPR_VA_ARG, + EXPR_VA_COPY, EXPR_STATEMENT, EXPR_LABEL_ADDRESS, /**< GCC extension &&label operator */ @@ -238,6 +239,9 @@ struct expression_base_t { #endif }; +/** + * A constant. + */ struct const_expression_t { expression_base_t base; union { @@ -288,20 +292,25 @@ struct reference_expression_t { entity_t *entity; }; +/** + * An argument of a call. + */ struct call_argument_t { - expression_t *expression; - call_argument_t *next; + expression_t *expression; /**< The expression which value is transmitted. */ + call_argument_t *next; /**< Links to the next argument of this call. */ }; + struct call_expression_t { expression_base_t base; - expression_t *function; - call_argument_t *arguments; + expression_t *function; /**< The address of the function to call. */ + call_argument_t *arguments; /**< List of arguments of this call. */ }; + struct unary_expression_t { expression_base_t base; - expression_t *value; + expression_t *value; /**< The unary operand. */ }; struct binary_expression_t { @@ -318,9 +327,9 @@ struct select_expression_t { struct array_access_expression_t { expression_base_t base; - expression_t *array_ref; - expression_t *index; - bool flipped; /**< index/ref was written in a 5[a] way */ + expression_t *array_ref; /**< the referenced array */ + expression_t *index; /**< the index used */ + bool flipped; /**< True if index/ref was written in a 5[a] way */ }; struct typeprop_expression_t { @@ -331,8 +340,8 @@ struct typeprop_expression_t { struct designator_t { source_position_t source_position; - symbol_t *symbol; - expression_t *array_index; + symbol_t *symbol; /**< the symbol if any */ + expression_t *array_index; /**< the array index if any */ designator_t *next; }; @@ -353,6 +362,12 @@ struct va_arg_expression_t { expression_t *ap; }; +struct va_copy_expression_t { + expression_base_t base; + expression_t *dst; /**< destination argument */ + expression_t *src; /**< source argument */ +}; + struct conditional_expression_t { expression_base_t base; expression_t *condition; @@ -395,6 +410,7 @@ union expression_t { offsetof_expression_t offsetofe; va_start_expression_t va_starte; va_arg_expression_t va_arge; + va_copy_expression_t va_copye; conditional_expression_t conditional; statement_expression_t statement; classify_type_expression_t classify_type; @@ -449,79 +465,6 @@ union initializer_t { initializer_designator_t designator; }; -/** - * GNU attributes. - */ -typedef enum gnu_attribute_kind_t { - GNU_AK_CONST, - GNU_AK_VOLATILE, - GNU_AK_CDECL, - GNU_AK_STDCALL, - GNU_AK_FASTCALL, - GNU_AK_DEPRECATED, - GNU_AK_NOINLINE, - GNU_AK_RETURNS_TWICE, - GNU_AK_NORETURN, - GNU_AK_NAKED, - GNU_AK_PURE, - GNU_AK_ALWAYS_INLINE, - GNU_AK_MALLOC, - GNU_AK_WEAK, - GNU_AK_CONSTRUCTOR, - GNU_AK_DESTRUCTOR, - GNU_AK_NOTHROW, - GNU_AK_TRANSPARENT_UNION, - GNU_AK_COMMON, - GNU_AK_NOCOMMON, - GNU_AK_PACKED, - GNU_AK_SHARED, - GNU_AK_NOTSHARED, - GNU_AK_USED, - GNU_AK_UNUSED, - GNU_AK_NO_INSTRUMENT_FUNCTION, - GNU_AK_WARN_UNUSED_RESULT, - GNU_AK_LONGCALL, - GNU_AK_SHORTCALL, - GNU_AK_LONG_CALL, - GNU_AK_SHORT_CALL, - GNU_AK_FUNCTION_VECTOR, - GNU_AK_INTERRUPT, - GNU_AK_INTERRUPT_HANDLER, - GNU_AK_NMI_HANDLER, - GNU_AK_NESTING, - GNU_AK_NEAR, - GNU_AK_FAR, - GNU_AK_SIGNAL, - GNU_AK_EIGTHBIT_DATA, - GNU_AK_TINY_DATA, - GNU_AK_SAVEALL, - GNU_AK_FLATTEN, - GNU_AK_SSEREGPARM, - GNU_AK_EXTERNALLY_VISIBLE, - GNU_AK_RETURN_TWICE, - GNU_AK_MAY_ALIAS, - GNU_AK_MS_STRUCT, - GNU_AK_GCC_STRUCT, - GNU_AK_DLLIMPORT, - GNU_AK_DLLEXPORT, - GNU_AK_ALIGNED, - GNU_AK_ALIAS, - GNU_AK_SECTION, - GNU_AK_FORMAT, - GNU_AK_FORMAT_ARG, - GNU_AK_WEAKREF, - GNU_AK_NONNULL, - GNU_AK_TLS_MODEL, - GNU_AK_VISIBILITY, - GNU_AK_REGPARM, - GNU_AK_MODEL, - GNU_AK_MODE, - GNU_AK_TRAP_EXIT, - GNU_AK_SP_SWITCH, - GNU_AK_SENTINEL, - GNU_AK_LAST -} gnu_attribute_kind_t; - /** * The statement kinds. */ @@ -552,10 +495,10 @@ typedef enum statement_kind_t { */ struct statement_base_t { statement_kind_t kind; - statement_t *next; + statement_t *next; /**< Point to the next statement in a compound statement. */ source_position_t source_position; - statement_t *parent; - bool reachable; + statement_t *parent; /**< The Parent statement that controls the execution. */ + bool reachable; /**< True, if this statement is reachable. */ #ifndef NDEBUG bool transformed; #endif @@ -571,14 +514,14 @@ struct empty_statement_t { struct return_statement_t { statement_base_t base; - expression_t *value; + expression_t *value; /**< The return value if any. */ }; struct compound_statement_t { statement_base_t base; statement_t *statements; scope_t scope; - bool stmt_expr; /* The compound statement is a statement expression */ + bool stmt_expr; /**< True if this compound statement is a statement expression. */ }; struct declaration_statement_t { @@ -732,7 +675,6 @@ bool is_invalid_statement(statement_t *statement) return statement->base.kind == STATEMENT_INVALID; } - #define allocate_ast(size) _allocate_ast(size) #endif