EXPR_ALIGNOF,
EXPR_FUNCNAME,
- EXPR_BUILTIN_SYMBOL,
EXPR_BUILTIN_CONSTANT_P,
- EXPR_BUILTIN_PREFETCH,
+ EXPR_BUILTIN_TYPES_COMPATIBLE_P,
EXPR_OFFSETOF,
EXPR_VA_START,
EXPR_VA_ARG,
+ EXPR_VA_COPY,
EXPR_STATEMENT,
EXPR_LABEL_ADDRESS, /**< GCC extension &&label operator */
EXPR_UNARY_CASES_MANDATORY \
EXPR_UNARY_CASES_OPTIONAL
+/**
+ * The base class of every expression.
+ */
struct expression_base_t {
- expression_kind_t kind;
- type_t *type;
- source_position_t source_position;
+ expression_kind_t kind; /**< The expression kind. */
+ type_t *type; /**< The type of the expression. */
+ source_position_t source_position; /**< The source position of this expression. */
bool parenthesized;
#ifndef NDEBUG
- bool transformed;
+ bool transformed; /**< Set if this expression was transformed. */
#endif
};
+/**
+ * A constant.
+ */
struct const_expression_t {
expression_base_t base;
union {
initializer_t *initializer;
};
-struct builtin_symbol_expression_t {
- expression_base_t base;
- symbol_t *symbol;
-};
-
struct builtin_constant_expression_t {
expression_base_t base;
expression_t *value;
};
-struct builtin_prefetch_expression_t {
+struct builtin_types_compatible_expression_t {
expression_base_t base;
- expression_t *adr;
- expression_t *rw;
- expression_t *locality;
+ type_t *left;
+ type_t *right;
};
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 {
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 {
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;
};
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;
};
union expression_t {
- expression_kind_t kind;
- expression_base_t base;
- const_expression_t conste;
- funcname_expression_t funcname;
- string_literal_expression_t string;
- wide_string_literal_expression_t wide_string;
- compound_literal_expression_t compound_literal;
- 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;
- binary_expression_t binary;
- select_expression_t select;
- array_access_expression_t array_access;
- typeprop_expression_t typeprop;
- offsetof_expression_t offsetofe;
- va_start_expression_t va_starte;
- va_arg_expression_t va_arge;
- conditional_expression_t conditional;
- statement_expression_t statement;
- classify_type_expression_t classify_type;
- label_address_expression_t label_address;
+ expression_kind_t kind;
+ expression_base_t base;
+ const_expression_t conste;
+ funcname_expression_t funcname;
+ string_literal_expression_t string;
+ wide_string_literal_expression_t wide_string;
+ compound_literal_expression_t compound_literal;
+ builtin_constant_expression_t builtin_constant;
+ builtin_types_compatible_expression_t builtin_types_compatible;
+ reference_expression_t reference;
+ call_expression_t call;
+ unary_expression_t unary;
+ binary_expression_t binary;
+ select_expression_t select;
+ array_access_expression_t array_access;
+ typeprop_expression_t typeprop;
+ 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;
+ label_address_expression_t label_address;
};
typedef enum initializer_kind_t {
GNU_AK_LAST
} gnu_attribute_kind_t;
+/**
+ * The statement kinds.
+ */
typedef enum statement_kind_t {
STATEMENT_INVALID,
STATEMENT_EMPTY,
STATEMENT_COMPOUND,
STATEMENT_RETURN,
STATEMENT_DECLARATION,
- STATEMENT_LOCAL_LABEL,
STATEMENT_IF,
STATEMENT_SWITCH,
STATEMENT_EXPRESSION,
STATEMENT_LEAVE /**< MS __leave */
} statement_kind_t;
+/**
+ * The base class of every statement.
+ */
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
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 {
entity_t *declarations_end;
};
-struct local_label_statement_t {
- statement_base_t base;
- entity_t *labels_begin;
- entity_t *labels_end;
-};
-
struct if_statement_t {
statement_base_t base;
expression_t *condition;
return_statement_t returns;
compound_statement_t compound;
declaration_statement_t declaration;
- local_label_statement_t local_label;
if_statement_t ifs;
switch_statement_t switchs;
goto_statement_t gotos;