Home | History | Annotate | Line # | Download | only in gdb
      1      1.1  christos /* Definitions for Rust expressions
      2      1.1  christos 
      3  1.1.1.2  christos    Copyright (C) 2020-2024 Free Software Foundation, Inc.
      4      1.1  christos 
      5      1.1  christos    This file is part of GDB.
      6      1.1  christos 
      7      1.1  christos    This program is free software; you can redistribute it and/or modify
      8      1.1  christos    it under the terms of the GNU General Public License as published by
      9      1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10      1.1  christos    (at your option) any later version.
     11      1.1  christos 
     12      1.1  christos    This program is distributed in the hope that it will be useful,
     13      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15      1.1  christos    GNU General Public License for more details.
     16      1.1  christos 
     17      1.1  christos    You should have received a copy of the GNU General Public License
     18      1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19      1.1  christos 
     20  1.1.1.3  christos #ifndef GDB_RUST_EXP_H
     21  1.1.1.3  christos #define GDB_RUST_EXP_H
     22      1.1  christos 
     23      1.1  christos #include "expop.h"
     24      1.1  christos 
     25      1.1  christos extern struct value *eval_op_rust_complement (struct type *expect_type,
     26      1.1  christos 					      struct expression *exp,
     27      1.1  christos 					      enum noside noside,
     28      1.1  christos 					      enum exp_opcode opcode,
     29      1.1  christos 					      struct value *value);
     30      1.1  christos extern struct value *eval_op_rust_array (struct type *expect_type,
     31      1.1  christos 					 struct expression *exp,
     32      1.1  christos 					 enum noside noside,
     33      1.1  christos 					 enum exp_opcode opcode,
     34      1.1  christos 					 struct value *ncopies,
     35      1.1  christos 					 struct value *elt);
     36      1.1  christos extern struct value *rust_subscript (struct type *expect_type,
     37      1.1  christos 				     struct expression *exp,
     38      1.1  christos 				     enum noside noside, bool for_addr,
     39      1.1  christos 				     struct value *lhs, struct value *rhs);
     40      1.1  christos extern struct value *rust_range (struct type *expect_type,
     41      1.1  christos 				 struct expression *exp,
     42      1.1  christos 				 enum noside noside, enum range_flag kind,
     43      1.1  christos 				 struct value *low, struct value *high);
     44      1.1  christos 
     45      1.1  christos namespace expr
     46      1.1  christos {
     47      1.1  christos 
     48      1.1  christos using rust_unop_compl_operation = unop_operation<UNOP_COMPLEMENT,
     49      1.1  christos 						  eval_op_rust_complement>;
     50      1.1  christos using rust_array_operation = binop_operation<OP_RUST_ARRAY,
     51      1.1  christos 					     eval_op_rust_array>;
     52      1.1  christos 
     53      1.1  christos /* The Rust indirection operation.  */
     54      1.1  christos class rust_unop_ind_operation
     55      1.1  christos   : public unop_ind_operation
     56      1.1  christos {
     57      1.1  christos public:
     58      1.1  christos 
     59      1.1  christos   using unop_ind_operation::unop_ind_operation;
     60      1.1  christos 
     61      1.1  christos   value *evaluate (struct type *expect_type,
     62      1.1  christos 		   struct expression *exp,
     63      1.1  christos 		   enum noside noside) override;
     64      1.1  christos };
     65      1.1  christos 
     66      1.1  christos /* Subscript operator for Rust.  */
     67      1.1  christos class rust_subscript_operation
     68      1.1  christos   : public tuple_holding_operation<operation_up, operation_up>
     69      1.1  christos {
     70      1.1  christos public:
     71      1.1  christos 
     72      1.1  christos   using tuple_holding_operation::tuple_holding_operation;
     73      1.1  christos 
     74      1.1  christos   value *evaluate (struct type *expect_type,
     75      1.1  christos 		   struct expression *exp,
     76      1.1  christos 		   enum noside noside) override
     77      1.1  christos   {
     78      1.1  christos     value *arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
     79      1.1  christos     value *arg2 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
     80      1.1  christos     return rust_subscript (expect_type, exp, noside, false, arg1, arg2);
     81      1.1  christos   }
     82      1.1  christos 
     83      1.1  christos   value *slice (struct type *expect_type,
     84      1.1  christos 		struct expression *exp,
     85      1.1  christos 		enum noside noside)
     86      1.1  christos   {
     87      1.1  christos     value *arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
     88      1.1  christos     value *arg2 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
     89      1.1  christos     return rust_subscript (expect_type, exp, noside, true, arg1, arg2);
     90      1.1  christos   }
     91      1.1  christos 
     92      1.1  christos   enum exp_opcode opcode () const override
     93      1.1  christos   { return BINOP_SUBSCRIPT; }
     94      1.1  christos };
     95      1.1  christos 
     96      1.1  christos class rust_unop_addr_operation
     97      1.1  christos   : public tuple_holding_operation<operation_up>
     98      1.1  christos {
     99      1.1  christos public:
    100      1.1  christos 
    101      1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    102      1.1  christos 
    103      1.1  christos   value *evaluate (struct type *expect_type,
    104      1.1  christos 		   struct expression *exp,
    105      1.1  christos 		   enum noside noside) override
    106      1.1  christos   {
    107      1.1  christos     operation *oper = std::get<0> (m_storage).get ();
    108      1.1  christos     rust_subscript_operation *sub_op
    109      1.1  christos       = dynamic_cast<rust_subscript_operation *> (oper);
    110      1.1  christos     if (sub_op != nullptr)
    111      1.1  christos       return sub_op->slice (expect_type, exp, noside);
    112      1.1  christos     return oper->evaluate_for_address (exp, noside);
    113      1.1  christos   }
    114      1.1  christos 
    115      1.1  christos   enum exp_opcode opcode () const override
    116      1.1  christos   { return UNOP_ADDR; }
    117      1.1  christos };
    118      1.1  christos 
    119      1.1  christos /* The Rust range operators.  */
    120      1.1  christos class rust_range_operation
    121      1.1  christos   : public tuple_holding_operation<enum range_flag, operation_up, operation_up>
    122      1.1  christos {
    123      1.1  christos public:
    124      1.1  christos 
    125      1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    126      1.1  christos 
    127      1.1  christos   value *evaluate (struct type *expect_type,
    128      1.1  christos 		   struct expression *exp,
    129      1.1  christos 		   enum noside noside) override
    130      1.1  christos   {
    131      1.1  christos     auto kind = std::get<0> (m_storage);
    132      1.1  christos     value *low = nullptr;
    133      1.1  christos     if (std::get<1> (m_storage) != nullptr)
    134      1.1  christos       low = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
    135      1.1  christos     value *high = nullptr;
    136      1.1  christos     if (std::get<2> (m_storage) != nullptr)
    137      1.1  christos       high = std::get<2> (m_storage)->evaluate (nullptr, exp, noside);
    138      1.1  christos     return rust_range (expect_type, exp, noside, kind, low, high);
    139      1.1  christos   }
    140      1.1  christos 
    141      1.1  christos   enum exp_opcode opcode () const override
    142      1.1  christos   { return OP_RANGE; }
    143      1.1  christos };
    144      1.1  christos 
    145      1.1  christos /* Tuple field reference (using an integer).  */
    146      1.1  christos class rust_struct_anon
    147      1.1  christos   : public tuple_holding_operation<int, operation_up>
    148      1.1  christos {
    149      1.1  christos public:
    150      1.1  christos 
    151      1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    152      1.1  christos 
    153      1.1  christos   value *evaluate (struct type *expect_type,
    154      1.1  christos 		   struct expression *exp,
    155      1.1  christos 		   enum noside noside) override;
    156      1.1  christos 
    157      1.1  christos   enum exp_opcode opcode () const override
    158      1.1  christos   { return STRUCTOP_ANONYMOUS; }
    159      1.1  christos };
    160      1.1  christos 
    161      1.1  christos /* Structure (or union or enum) field reference.  */
    162      1.1  christos class rust_structop
    163      1.1  christos   : public structop_base_operation
    164      1.1  christos {
    165      1.1  christos public:
    166      1.1  christos 
    167      1.1  christos   using structop_base_operation::structop_base_operation;
    168      1.1  christos 
    169      1.1  christos   value *evaluate (struct type *expect_type,
    170      1.1  christos 		   struct expression *exp,
    171      1.1  christos 		   enum noside noside) override;
    172      1.1  christos 
    173      1.1  christos   value *evaluate_funcall (struct type *expect_type,
    174      1.1  christos 			   struct expression *exp,
    175      1.1  christos 			   enum noside noside,
    176      1.1  christos 			   const std::vector<operation_up> &args) override;
    177      1.1  christos 
    178      1.1  christos   enum exp_opcode opcode () const override
    179      1.1  christos   { return STRUCTOP_STRUCT; }
    180      1.1  christos };
    181      1.1  christos 
    182      1.1  christos /* Rust aggregate initialization.  */
    183      1.1  christos class rust_aggregate_operation
    184      1.1  christos   : public tuple_holding_operation<struct type *, operation_up,
    185      1.1  christos 				   std::vector<std::pair<std::string,
    186      1.1  christos 							 operation_up>>>
    187      1.1  christos {
    188      1.1  christos public:
    189      1.1  christos 
    190      1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    191      1.1  christos 
    192      1.1  christos   value *evaluate (struct type *expect_type,
    193      1.1  christos 		   struct expression *exp,
    194      1.1  christos 		   enum noside noside) override;
    195      1.1  christos 
    196      1.1  christos   enum exp_opcode opcode () const override
    197      1.1  christos   { return OP_AGGREGATE; }
    198      1.1  christos };
    199      1.1  christos 
    200      1.1  christos /* Rust parenthesized operation.  This is needed to distinguish
    201      1.1  christos    between 'obj.f()', which is a method call, and '(obj.f)()', which
    202      1.1  christos    is a call of a function-valued field 'f'.  */
    203      1.1  christos class rust_parenthesized_operation
    204      1.1  christos   : public tuple_holding_operation<operation_up>
    205      1.1  christos {
    206      1.1  christos public:
    207      1.1  christos 
    208      1.1  christos   explicit rust_parenthesized_operation (operation_up op)
    209      1.1  christos     : tuple_holding_operation (std::move (op))
    210      1.1  christos   {
    211      1.1  christos   }
    212      1.1  christos 
    213      1.1  christos   value *evaluate (struct type *expect_type,
    214      1.1  christos 		   struct expression *exp,
    215      1.1  christos 		   enum noside noside) override
    216      1.1  christos   {
    217      1.1  christos     return std::get<0> (m_storage)->evaluate (expect_type, exp, noside);
    218      1.1  christos   }
    219      1.1  christos 
    220      1.1  christos   enum exp_opcode opcode () const override
    221      1.1  christos   {
    222      1.1  christos     /* A lie but this isn't worth introducing a new opcode for.  */
    223      1.1  christos     return UNOP_PLUS;
    224      1.1  christos   }
    225      1.1  christos };
    226      1.1  christos 
    227      1.1  christos } /* namespace expr */
    228      1.1  christos 
    229  1.1.1.3  christos #endif /* GDB_RUST_EXP_H */
    230