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