1 #ifndef EXPRESSION_H
   2 #define EXPRESSION_H
   3 /*
   4  * sparse/expression.h
   5  *
   6  * Copyright (C) 2003 Transmeta Corp.
   7  *               2003 Linus Torvalds
   8  *
   9  * Permission is hereby granted, free of charge, to any person obtaining a copy
  10  * of this software and associated documentation files (the "Software"), to deal
  11  * in the Software without restriction, including without limitation the rights
  12  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  13  * copies of the Software, and to permit persons to whom the Software is
  14  * furnished to do so, subject to the following conditions:
  15  *
  16  * The above copyright notice and this permission notice shall be included in
  17  * all copies or substantial portions of the Software.
  18  *
  19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  20  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  22  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  23  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  24  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  25  * THE SOFTWARE.
  26  *
  27  * Declarations and helper functions for expression parsing.
  28  */
  29 
  30 #include "allocate.h"
  31 #include "lib.h"
  32 #include "symbol.h"
  33 
  34 struct expression_list;
  35 
  36 enum expression_type {
  37         EXPR_VALUE = 1,
  38         EXPR_STRING,
  39         EXPR_SYMBOL,
  40         EXPR_TYPE,
  41         EXPR_BINOP,
  42         EXPR_ASSIGNMENT,
  43         EXPR_LOGICAL,
  44         EXPR_DEREF,
  45         EXPR_PREOP,
  46         EXPR_POSTOP,
  47         EXPR_CAST,
  48         EXPR_FORCE_CAST,
  49         EXPR_IMPLIED_CAST,
  50         EXPR_SIZEOF,
  51         EXPR_ALIGNOF,
  52         EXPR_PTRSIZEOF,
  53         EXPR_CONDITIONAL,
  54         EXPR_SELECT,            // a "safe" conditional expression
  55         EXPR_STATEMENT,
  56         EXPR_CALL,
  57         EXPR_COMMA,
  58         EXPR_COMPARE,
  59         EXPR_LABEL,
  60         EXPR_INITIALIZER,       // initializer list
  61         EXPR_IDENTIFIER,        // identifier in initializer
  62         EXPR_INDEX,             // index in initializer
  63         EXPR_POS,               // position in initializer
  64         EXPR_FVALUE,
  65         EXPR_SLICE,
  66         EXPR_OFFSETOF,
  67         EXPR_ASM_OPERAND,
  68 };
  69 
  70 
  71 /*
  72  * Flags for tracking the promotion of constness related attributes
  73  * from subexpressions to their parents.
  74  *
  75  * The flags are not independent as one might imply another.
  76  * The implications are as follows:
  77  * - CEF_INT, CEF_ENUM and
  78  *   CEF_CHAR imply CEF_ICE.
  79  *
  80  * Use the CEF_*_SET_MASK and CEF_*_CLEAR_MASK
  81  * helper macros defined below to set or clear one of these flags.
  82  */
  83 enum constexpr_flag {
  84         CEF_NONE = 0,
  85         /*
  86          * A constant in the sense of [6.4.4]:
  87          * - Integer constant [6.4.4.1]
  88          * - Floating point constant [6.4.4.2]
  89          * - Enumeration constant [6.4.4.3]
  90          * - Character constant [6.4.4.4]
  91          */
  92         CEF_INT = (1 << 0),
  93         CEF_FLOAT = (1 << 1),
  94         CEF_ENUM = (1 << 2),
  95         CEF_CHAR = (1 << 3),
  96 
  97         /*
  98          * A constant expression in the sense of [6.6]:
  99          * - integer constant expression [6.6(6)]
 100          * - arithmetic constant expression [6.6(8)]
 101          * - address constant [6.6(9)]
 102          */
 103         CEF_ICE = (1 << 4),
 104         CEF_ACE = (1 << 5),
 105         CEF_ADDR = (1 << 6),
 106 
 107         /* integer constant expression => arithmetic constant expression */
 108         CEF_SET_ICE = (CEF_ICE | CEF_ACE),
 109 
 110         /* integer constant => integer constant expression */
 111         CEF_SET_INT = (CEF_INT | CEF_SET_ICE),
 112 
 113         /* floating point constant => arithmetic constant expression */
 114         CEF_SET_FLOAT = (CEF_FLOAT | CEF_ACE),
 115 
 116         /* enumeration constant => integer constant expression */
 117         CEF_SET_ENUM = (CEF_ENUM | CEF_SET_ICE),
 118 
 119         /* character constant => integer constant expression */
 120         CEF_SET_CHAR = (CEF_CHAR | CEF_SET_ICE),
 121 
 122         /*
 123          * Remove any "Constant" [6.4.4] flag, but retain the "constant
 124          * expression" [6.6] flags.
 125          */
 126         CEF_CONST_MASK = (CEF_INT | CEF_FLOAT | CEF_CHAR),
 127 
 128         /*
 129          * not an integer constant expression => neither of integer,
 130          * enumeration and character constant
 131          */
 132         CEF_CLR_ICE = (CEF_ICE | CEF_INT | CEF_ENUM | CEF_CHAR),
 133 };
 134 
 135 enum {
 136         Handled = 1 << 0,
 137         Fake    = 1 << 1,
 138 }; /* for expr->flags */
 139 
 140 enum {
 141         Taint_comma = 1,
 142 }; /* for expr->taint */
 143 
 144 struct expression {
 145         enum expression_type type:8;
 146         unsigned flags:8;
 147         unsigned smatch_flags:16;
 148         int op;
 149         struct position pos;
 150         struct symbol *ctype;
 151         unsigned long parent;
 152         union {
 153                 // EXPR_VALUE
 154                 struct {
 155                         unsigned long long value;
 156                         unsigned taint;
 157                 };
 158 
 159                 // EXPR_FVALUE
 160                 long double fvalue;
 161 
 162                 // EXPR_STRING
 163                 struct {
 164                         int wide;
 165                         struct string *string;
 166                 };
 167 
 168                 // EXPR_UNOP, EXPR_PREOP and EXPR_POSTOP
 169                 struct /* unop */ {
 170                         struct expression *unop;
 171                         unsigned long op_value;
 172                 };
 173 
 174                 // EXPR_SYMBOL, EXPR_TYPE
 175                 struct /* symbol_arg */ {
 176                         struct symbol *symbol;
 177                         struct ident *symbol_name;
 178                 };
 179 
 180                 // EXPR_STATEMENT
 181                 struct statement *statement;
 182 
 183                 // EXPR_BINOP, EXPR_COMMA, EXPR_COMPARE, EXPR_LOGICAL and EXPR_ASSIGNMENT
 184                 struct /* binop_arg */ {
 185                         struct expression *left, *right;
 186                 };
 187                 // EXPR_DEREF
 188                 struct /* deref_arg */ {
 189                         struct expression *deref;
 190                         struct ident *member;
 191                         int member_offset;
 192                 };
 193                 // EXPR_SLICE
 194                 struct /* slice */ {
 195                         struct expression *base;
 196                         unsigned r_bitpos, r_nrbits;
 197                 };
 198                 // EXPR_CAST, EXPR_FORCE_CAST, EXPR_IMPLIED_CAST,
 199                 // EXPR_SIZEOF, EXPR_ALIGNOF and EXPR_PTRSIZEOF
 200                 struct /* cast_arg */ {
 201                         struct symbol *cast_type;
 202                         struct expression *cast_expression;
 203                 };
 204                 // EXPR_CONDITIONAL
 205                 // EXPR_SELECT
 206                 struct /* conditional_expr */ {
 207                         struct expression *conditional, *cond_true, *cond_false;
 208                 };
 209                 // EXPR_CALL
 210                 struct /* call_expr */ {
 211                         struct expression *fn;
 212                         struct expression_list *args;
 213                 };
 214                 // EXPR_LABEL
 215                 struct /* label_expr */ {
 216                         struct symbol *label_symbol;
 217                 };
 218                 // EXPR_INITIALIZER
 219                 struct expression_list *expr_list;
 220                 // EXPR_IDENTIFIER
 221                 struct /* ident_expr */ {
 222                         int offset;
 223                         struct ident *expr_ident;
 224                         struct symbol *field;
 225                         struct expression *ident_expression;
 226                 };
 227                 // EXPR_INDEX
 228                 struct /* index_expr */ {
 229                         unsigned int idx_from, idx_to;
 230                         struct expression *idx_expression;
 231                 };
 232                 // EXPR_POS
 233                 struct /* initpos_expr */ {
 234                         unsigned int init_offset, init_nr;
 235                         struct expression *init_expr;
 236                 };
 237                 // EXPR_OFFSETOF
 238                 struct {
 239                         struct symbol *in;
 240                         struct expression *down;
 241                         union {
 242                                 struct ident *ident;
 243                                 struct expression *index;
 244                         };
 245                 };
 246                 // EXPR_ASM_OPERAND
 247                 struct {
 248                         struct ident *name;
 249                         struct expression *constraint;
 250                         struct expression *expr;
 251                 };
 252         };
 253 };
 254 
 255 ///
 256 // Constant expression values
 257 // --------------------------
 258 
 259 ///
 260 // test if an expression evaluates to the constant ``0``.
 261 // @return: ``1`` if @expr evaluate to ``0``,
 262 //      ``0`` otherwise.
 263 int is_zero_constant(struct expression *expr);
 264 
 265 ///
 266 // test the compile time truth value of an expression
 267 // @return:
 268 //      * ``-1`` if @expr is not constant,
 269 //      * ``0`` or ``1`` depending on the truth value of @expr.
 270 int expr_truth_value(struct expression *expr);
 271 
 272 long long get_expression_value(struct expression *);
 273 long long const_expression_value(struct expression *);
 274 long long get_expression_value_silent(struct expression *expr);
 275 
 276 /* Expression parsing */
 277 struct token *parse_expression(struct token *token, struct expression **tree);
 278 struct token *conditional_expression(struct token *token, struct expression **tree);
 279 struct token *primary_expression(struct token *token, struct expression **tree);
 280 struct token *parens_expression(struct token *token, struct expression **expr, const char *where);
 281 struct token *assignment_expression(struct token *token, struct expression **tree);
 282 
 283 extern void evaluate_symbol_list(struct symbol_list *list);
 284 extern struct symbol *evaluate_statement(struct statement *stmt);
 285 extern struct symbol *evaluate_expression(struct expression *);
 286 struct symbol *find_identifier(struct ident *ident, struct symbol_list *_list, int *offset);
 287 
 288 extern int expand_symbol(struct symbol *);
 289 
 290 static inline struct expression *alloc_expression(struct position pos, int type)
 291 {
 292         struct expression *expr = __alloc_expression(0);
 293         expr->type = type;
 294         expr->pos = pos;
 295         expr->flags = CEF_NONE;
 296         return expr;
 297 }
 298 
 299 static inline struct expression *alloc_const_expression(struct position pos, int value)
 300 {
 301         struct expression *expr = __alloc_expression(0);
 302         expr->type = EXPR_VALUE;
 303         expr->pos = pos;
 304         expr->value = value;
 305         expr->ctype = &int_ctype;
 306         expr->flags = CEF_SET_INT;
 307         return expr;
 308 }
 309 
 310 /* Type name parsing */
 311 struct token *typename(struct token *, struct symbol **, int *);
 312 
 313 static inline int lookup_type(struct token *token)
 314 {
 315         if (token->pos.type == TOKEN_IDENT) {
 316                 struct symbol *sym = lookup_symbol(token->ident, NS_SYMBOL | NS_TYPEDEF);
 317                 return sym && (sym->namespace & NS_TYPEDEF);
 318         }
 319         return 0;
 320 }
 321 
 322 /* Statement parsing */
 323 struct statement *alloc_statement(struct position pos, int type);
 324 struct token *initializer(struct expression **tree, struct token *token);
 325 struct token *compound_statement(struct token *, struct statement *);
 326 
 327 /* The preprocessor calls this 'constant_expression()' */
 328 #define constant_expression(token,tree) conditional_expression(token, tree)
 329 
 330 /* Cast folding of constant values.. */
 331 void cast_value(struct expression *expr, struct symbol *newtype,
 332         struct expression *old, struct symbol *oldtype);
 333 
 334 #endif