diff options
author | Manish Goregaokar <manish@mozilla.com> | 2016-10-29 05:55:58 -0700 |
---|---|---|
committer | Manish Goregaokar <manish@mozilla.com> | 2016-11-03 15:45:14 -0700 |
commit | cdf5a07c75b47481da1e99ee91ee860c2a6bb5f6 (patch) | |
tree | 057640bee6175b7afea74966d85f931736b1522b | |
parent | b96645f1a1e6084ed6a20ddf615bdc4d2487a9c9 (diff) | |
download | gdb-cdf5a07c75b47481da1e99ee91ee860c2a6bb5f6.zip gdb-cdf5a07c75b47481da1e99ee91ee860c2a6bb5f6.tar.gz gdb-cdf5a07c75b47481da1e99ee91ee860c2a6bb5f6.tar.bz2 |
Add support for the sizeof function in Rust
2016-10-29 Manish Goregaokar <manish@mozilla.com>
gdb/ChangeLog:
* rust-exp.y: Parse `sizeof(exp)` as `UNOP_SIZEOF`
gdb/testsuite/ChangeLog:
* gdb.rust/simple.exp: Add tests for `sizeof(expr)`
-rw-r--r-- | gdb/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/rust-exp.y | 8 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.rust/simple.exp | 4 |
4 files changed, 17 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9d88984..8e173a7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2016-10-29 Manish Goregaokar <manish@mozilla.com> + + * rust-exp.y: Parse `sizeof(exp)` as `UNOP_SIZEOF` + 2016-10-28 Manish Goregaokar <manish@mozilla.com> * rust-lang.c (rust_union_is_untagged): Add function to diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y index 6dc4704..dffccd0 100644 --- a/gdb/rust-exp.y +++ b/gdb/rust-exp.y @@ -276,6 +276,7 @@ struct rust_op %token <voidval> KW_EXTERN %token <voidval> KW_CONST %token <voidval> KW_FN +%token <voidval> KW_SIZEOF /* Operator tokens. */ %token <voidval> DOTDOT @@ -371,7 +372,7 @@ expr: | array_expr | idx_expr | range_expr -| unop_expr +| unop_expr /* Must precede call_expr because of ambiguity with sizeof. */ | binop_expr | paren_expr | call_expr @@ -577,7 +578,8 @@ unop_expr: | '&' KW_MUT expr %prec UNARY { $$ = ast_unary (UNOP_ADDR, $3); } - +| KW_SIZEOF '(' expr ')' %prec UNARY + { $$ = ast_unary (UNOP_SIZEOF, $3); } ; binop_expr: @@ -872,6 +874,7 @@ static const struct token_info identifier_tokens[] = { "true", KW_TRUE, OP_NULL }, { "extern", KW_EXTERN, OP_NULL }, { "fn", KW_FN, OP_NULL }, + { "sizeof", KW_SIZEOF, OP_NULL }, }; /* Operator tokens, sorted longest first. */ @@ -2194,6 +2197,7 @@ convert_ast_to_expression (struct parser_state *state, case UNOP_COMPLEMENT: case UNOP_IND: case UNOP_ADDR: + case UNOP_SIZEOF: convert_ast_to_expression (state, operation->left.op, top); write_exp_elt_opcode (state, operation->opcode); break; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 19cb7dc..ebeecf9 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-10-29 Manish Goregaokar <manish@mozilla.com> + + * gdb.rust/simple.exp: Add tests for `sizeof(expr)` + 2016-10-27 Manish Goregaokar <manish@mozilla.com> * gdb.rust/simple.rs: Add test for univariant enums without discriminants diff --git a/gdb/testsuite/gdb.rust/simple.exp b/gdb/testsuite/gdb.rust/simple.exp index 8e84daa..4b9a979 100644 --- a/gdb/testsuite/gdb.rust/simple.exp +++ b/gdb/testsuite/gdb.rust/simple.exp @@ -33,6 +33,7 @@ if {![runto ${srcfile}:$line]} { gdb_test "print a" " = \\(\\)" gdb_test "ptype a" " = \\(\\)" +gdb_test "print sizeof(a)" " = 0" gdb_test "print b" " = \\\[\\\]" gdb_test "ptype b" " = \\\[i32; 0\\\]" @@ -41,6 +42,7 @@ gdb_test "print *(&b as *const \[i32; 0_0\])" " = \\\[\\\]" gdb_test "print c" " = 99" gdb_test "ptype c" " = i32" +gdb_test "print sizeof(c)" " = 4" gdb_test "print c = 87" " = \\(\\)" gdb_test "print c" " = 87" @@ -127,7 +129,7 @@ gdb_test "print nosuchsymbol" \ gdb_test "print e" " = simple::MoreComplicated::Two\\(73\\)" gdb_test "print e2" \ " = simple::MoreComplicated::Four\\{this: true, is: 8, a: 109 'm', struct_: 100, variant: 10\\}" - +gdb_test "print sizeof(e)" " = 24" gdb_test_sequence "ptype e" "" { " = enum simple::MoreComplicated \\{" " One," |