diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-01-24 22:49:06 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-01-24 22:49:06 +0000 |
commit | f9ca30f930737e3a881d6df727d54c60b001964e (patch) | |
tree | 068ef35f26bbcc80832ef93e80c3a72c61be0d26 /gcc/go/go-gcc.cc | |
parent | bc9669de87ee7ad0014f1cfb47b8e86d9859f2e6 (diff) | |
download | ppe42-gcc-f9ca30f930737e3a881d6df727d54c60b001964e.tar.gz ppe42-gcc-f9ca30f930737e3a881d6df727d54c60b001964e.zip |
compiler: Use backend interface for unary expressions.
* go-gcc.cc (Gcc_backend::unary_expression): New function.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@207063 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/go/go-gcc.cc')
-rw-r--r-- | gcc/go/go-gcc.cc | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc index 6a0d1e7a001..b2760f131d8 100644 --- a/gcc/go/go-gcc.cc +++ b/gcc/go/go-gcc.cc @@ -254,6 +254,9 @@ class Gcc_backend : public Backend Location); Bexpression* + unary_expression(Operator, Bexpression*, Location); + + Bexpression* binary_expression(Operator, Bexpression*, Bexpression*, Location); // Statements. @@ -1081,6 +1084,47 @@ Gcc_backend::conditional_expression(Btype* btype, Bexpression* condition, return this->make_expression(ret); } +// Return an expression for the unary operation OP EXPR. + +Bexpression* +Gcc_backend::unary_expression(Operator op, Bexpression* expr, Location location) +{ + tree expr_tree = expr->get_tree(); + if (expr_tree == error_mark_node + || TREE_TYPE(expr_tree) == error_mark_node) + return this->error_expression(); + + tree type_tree = TREE_TYPE(expr_tree); + enum tree_code code; + switch (op) + { + case OPERATOR_MINUS: + { + tree computed_type = excess_precision_type(type_tree); + if (computed_type != NULL_TREE) + { + expr_tree = convert(computed_type, expr_tree); + type_tree = computed_type; + } + code = NEGATE_EXPR; + break; + } + case OPERATOR_NOT: + code = TRUTH_NOT_EXPR; + break; + case OPERATOR_XOR: + code = BIT_NOT_EXPR; + break; + default: + gcc_unreachable(); + break; + } + + tree ret = fold_build1_loc(location.gcc_location(), code, type_tree, + expr_tree); + return this->make_expression(ret); +} + // Convert a gofrontend operator to an equivalent tree_code. static enum tree_code |