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 335