diff options
author | Richard Biener <rguenther@suse.de> | 2017-01-12 08:33:09 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-01-12 08:33:09 +0000 |
commit | 6bb4ea5cdf9664f2cec861a2a120192b4ac04d1f (patch) | |
tree | 8d757072a4d9f57d69894171f684fe4872d9d218 /gcc/c | |
parent | ef9d56f8acf5f46e30d46836095fb920759a2084 (diff) | |
download | gcc-6bb4ea5cdf9664f2cec861a2a120192b4ac04d1f.zip gcc-6bb4ea5cdf9664f2cec861a2a120192b4ac04d1f.tar.gz gcc-6bb4ea5cdf9664f2cec861a2a120192b4ac04d1f.tar.bz2 |
tree-pretty-print.c (dump_generic_node): Provide -gimple variant for MEM_REF.
2017-01-12 Richard Biener <rguenther@suse.de>
* tree-pretty-print.c (dump_generic_node): Provide -gimple
variant for MEM_REF. Sanitize INTEGER_CST for -gimple.
c/
* gimple-parser.c (c_parser_gimple_postfix_expression): Parse
__MEM.
* gcc.dg/gimplefe-21.c: New testcase.
From-SVN: r244350
Diffstat (limited to 'gcc/c')
-rw-r--r-- | gcc/c/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c/gimple-parser.c | 73 |
2 files changed, 78 insertions, 0 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 341407a..65531aa 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,8 @@ +2017-01-12 Richard Biener <rguenther@suse.de> + + * gimple-parser.c (c_parser_gimple_postfix_expression): Parse + __MEM. + 2017-01-11 Jakub Jelinek <jakub@redhat.com> PR c++/72813 diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c index 37e792a..ee8a01a 100644 --- a/gcc/c/gimple-parser.c +++ b/gcc/c/gimple-parser.c @@ -727,6 +727,79 @@ c_parser_gimple_postfix_expression (c_parser *parser) if (c_parser_peek_token (parser)->id_kind == C_ID_ID) { tree id = c_parser_peek_token (parser)->value; + if (strcmp (IDENTIFIER_POINTER (id), "__MEM") == 0) + { + /* __MEM '<' type-name [ ',' number ] '>' + '(' [ '(' type-name ')' ] unary-expression + [ '+' number ] ')' */ + location_t loc = c_parser_peek_token (parser)->location; + c_parser_consume_token (parser); + struct c_type_name *type_name = NULL; + tree alignment = NULL_TREE; + if (c_parser_require (parser, CPP_LESS, "expected %<<%>")) + { + type_name = c_parser_type_name (parser); + /* Optional alignment. */ + if (c_parser_next_token_is (parser, CPP_COMMA)) + { + c_parser_consume_token (parser); + alignment + = c_parser_gimple_postfix_expression (parser).value; + } + c_parser_skip_until_found (parser, + CPP_GREATER, "expected %<>%>"); + } + struct c_expr ptr; + ptr.value = error_mark_node; + tree alias_off = NULL_TREE; + if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) + { + tree alias_type = NULL_TREE; + /* Optional alias-type cast. */ + if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) + { + c_parser_consume_token (parser); + struct c_type_name *alias_type_name + = c_parser_type_name (parser); + c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, + "expected %<)%>"); + if (alias_type_name) + { + tree tem; + alias_type = groktypename (alias_type_name, + &tem, NULL); + } + } + ptr = c_parser_gimple_unary_expression (parser); + if (! alias_type) + alias_type = TREE_TYPE (ptr.value); + /* Optional constant offset. */ + if (c_parser_next_token_is (parser, CPP_PLUS)) + { + c_parser_consume_token (parser); + alias_off + = c_parser_gimple_postfix_expression (parser).value; + alias_off = fold_convert (alias_type, alias_off); + } + if (! alias_off) + alias_off = build_int_cst (alias_type, 0); + c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, + "expected %<)%>"); + } + if (! type_name || c_parser_error (parser)) + { + c_parser_set_error (parser, false); + return expr; + } + tree tem = NULL_TREE; + tree type = groktypename (type_name, &tem, NULL); + if (alignment) + type = build_aligned_type (type, tree_to_uhwi (alignment)); + expr.value = build2_loc (loc, MEM_REF, + type, ptr.value, alias_off); + break; + } + /* SSA name. */ unsigned version, ver_offset; if (! lookup_name (id) && c_parser_parse_ssa_name_id (id, &version, &ver_offset)) |