ada-exp.h revision 1.1.1.1 1 1.1 christos /* Definitions for Ada expressions
2 1.1 christos
3 1.1 christos Copyright (C) 2020-2023 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 christos #ifndef ADA_EXP_H
21 1.1 christos #define ADA_EXP_H
22 1.1 christos
23 1.1 christos #include "expop.h"
24 1.1 christos
25 1.1 christos extern struct value *ada_unop_neg (struct type *expect_type,
26 1.1 christos struct expression *exp,
27 1.1 christos enum noside noside, enum exp_opcode op,
28 1.1 christos struct value *arg1);
29 1.1 christos extern struct value *ada_atr_tag (struct type *expect_type,
30 1.1 christos struct expression *exp,
31 1.1 christos enum noside noside, enum exp_opcode op,
32 1.1 christos struct value *arg1);
33 1.1 christos extern struct value *ada_atr_size (struct type *expect_type,
34 1.1 christos struct expression *exp,
35 1.1 christos enum noside noside, enum exp_opcode op,
36 1.1 christos struct value *arg1);
37 1.1 christos extern struct value *ada_abs (struct type *expect_type,
38 1.1 christos struct expression *exp,
39 1.1 christos enum noside noside, enum exp_opcode op,
40 1.1 christos struct value *arg1);
41 1.1 christos extern struct value *ada_unop_in_range (struct type *expect_type,
42 1.1 christos struct expression *exp,
43 1.1 christos enum noside noside, enum exp_opcode op,
44 1.1 christos struct value *arg1, struct type *type);
45 1.1 christos extern struct value *ada_mult_binop (struct type *expect_type,
46 1.1 christos struct expression *exp,
47 1.1 christos enum noside noside, enum exp_opcode op,
48 1.1 christos struct value *arg1, struct value *arg2);
49 1.1 christos extern struct value *ada_equal_binop (struct type *expect_type,
50 1.1 christos struct expression *exp,
51 1.1 christos enum noside noside, enum exp_opcode op,
52 1.1 christos struct value *arg1, struct value *arg2);
53 1.1 christos extern struct value *ada_ternop_slice (struct expression *exp,
54 1.1 christos enum noside noside,
55 1.1 christos struct value *array,
56 1.1 christos struct value *low_bound_val,
57 1.1 christos struct value *high_bound_val);
58 1.1 christos extern struct value *ada_binop_in_bounds (struct expression *exp,
59 1.1 christos enum noside noside,
60 1.1 christos struct value *arg1,
61 1.1 christos struct value *arg2,
62 1.1 christos int n);
63 1.1 christos extern struct value *ada_binop_minmax (struct type *expect_type,
64 1.1 christos struct expression *exp,
65 1.1 christos enum noside noside, enum exp_opcode op,
66 1.1 christos struct value *arg1,
67 1.1 christos struct value *arg2);
68 1.1 christos extern struct value *ada_pos_atr (struct type *expect_type,
69 1.1 christos struct expression *exp,
70 1.1 christos enum noside noside, enum exp_opcode op,
71 1.1 christos struct value *arg);
72 1.1 christos extern struct value *ada_val_atr (enum noside noside, struct type *type,
73 1.1 christos struct value *arg);
74 1.1 christos extern struct value *ada_binop_exp (struct type *expect_type,
75 1.1 christos struct expression *exp,
76 1.1 christos enum noside noside, enum exp_opcode op,
77 1.1 christos struct value *arg1, struct value *arg2);
78 1.1 christos
79 1.1 christos namespace expr
80 1.1 christos {
81 1.1 christos
82 1.1 christos /* The base class for Ada type resolution. Ada operations that want
83 1.1 christos to participate in resolution implement this interface. */
84 1.1 christos struct ada_resolvable
85 1.1 christos {
86 1.1 christos /* Resolve this object. EXP is the expression being resolved.
87 1.1 christos DEPROCEDURE_P is true if a symbol that refers to a zero-argument
88 1.1 christos function may be turned into a function call. PARSE_COMPLETION
89 1.1 christos and TRACKER are passed in from the parser context. CONTEXT_TYPE
90 1.1 christos is the expected type of the expression, or nullptr if none is
91 1.1 christos known. This method should return true if the operation should be
92 1.1 christos replaced by a function call with this object as the callee. */
93 1.1 christos virtual bool resolve (struct expression *exp,
94 1.1 christos bool deprocedure_p,
95 1.1 christos bool parse_completion,
96 1.1 christos innermost_block_tracker *tracker,
97 1.1 christos struct type *context_type) = 0;
98 1.1 christos
99 1.1 christos /* Possibly replace this object with some other expression object.
100 1.1 christos This is like 'resolve', but can return a replacement.
101 1.1 christos
102 1.1 christos The default implementation calls 'resolve' and wraps this object
103 1.1 christos in a function call if that call returns true. OWNER is a
104 1.1 christos reference to the unique pointer that owns the 'this'; it can be
105 1.1 christos 'move'd from to construct the replacement.
106 1.1 christos
107 1.1 christos This should either return a new object, or OWNER -- never
108 1.1 christos nullptr. */
109 1.1 christos
110 1.1 christos virtual operation_up replace (operation_up &&owner,
111 1.1 christos struct expression *exp,
112 1.1 christos bool deprocedure_p,
113 1.1 christos bool parse_completion,
114 1.1 christos innermost_block_tracker *tracker,
115 1.1 christos struct type *context_type);
116 1.1 christos };
117 1.1 christos
118 1.1 christos /* In Ada, some generic operations must be wrapped with a handler that
119 1.1 christos handles some Ada-specific type conversions. */
120 1.1 christos class ada_wrapped_operation
121 1.1 christos : public tuple_holding_operation<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 enum exp_opcode opcode () const override
132 1.1 christos { return std::get<0> (m_storage)->opcode (); }
133 1.1 christos };
134 1.1 christos
135 1.1 christos /* An Ada string constant. */
136 1.1 christos class ada_string_operation
137 1.1 christos : public string_operation
138 1.1 christos {
139 1.1 christos public:
140 1.1 christos
141 1.1 christos using string_operation::string_operation;
142 1.1 christos
143 1.1 christos /* Return the underlying string. */
144 1.1 christos const char *get_name () const
145 1.1 christos {
146 1.1 christos return std::get<0> (m_storage).c_str ();
147 1.1 christos }
148 1.1 christos
149 1.1 christos value *evaluate (struct type *expect_type,
150 1.1 christos struct expression *exp,
151 1.1 christos enum noside noside) override;
152 1.1 christos };
153 1.1 christos
154 1.1 christos /* The Ada TYPE'(EXP) construct. */
155 1.1 christos class ada_qual_operation
156 1.1 christos : public tuple_holding_operation<operation_up, struct type *>
157 1.1 christos {
158 1.1 christos public:
159 1.1 christos
160 1.1 christos using tuple_holding_operation::tuple_holding_operation;
161 1.1 christos
162 1.1 christos value *evaluate (struct type *expect_type,
163 1.1 christos struct expression *exp,
164 1.1 christos enum noside noside) override;
165 1.1 christos
166 1.1 christos enum exp_opcode opcode () const override
167 1.1 christos { return UNOP_QUAL; }
168 1.1 christos };
169 1.1 christos
170 1.1 christos /* Ternary in-range operator. */
171 1.1 christos class ada_ternop_range_operation
172 1.1 christos : public tuple_holding_operation<operation_up, operation_up, operation_up>
173 1.1 christos {
174 1.1 christos public:
175 1.1 christos
176 1.1 christos using tuple_holding_operation::tuple_holding_operation;
177 1.1 christos
178 1.1 christos value *evaluate (struct type *expect_type,
179 1.1 christos struct expression *exp,
180 1.1 christos enum noside noside) override;
181 1.1 christos
182 1.1 christos enum exp_opcode opcode () const override
183 1.1 christos { return TERNOP_IN_RANGE; }
184 1.1 christos };
185 1.1 christos
186 1.1 christos using ada_neg_operation = unop_operation<UNOP_NEG, ada_unop_neg>;
187 1.1 christos using ada_atr_tag_operation = unop_operation<OP_ATR_TAG, ada_atr_tag>;
188 1.1 christos using ada_atr_size_operation = unop_operation<OP_ATR_SIZE, ada_atr_size>;
189 1.1 christos using ada_abs_operation = unop_operation<UNOP_ABS, ada_abs>;
190 1.1 christos using ada_pos_operation = unop_operation<OP_ATR_POS, ada_pos_atr>;
191 1.1 christos
192 1.1 christos /* The in-range operation, given a type. */
193 1.1 christos class ada_unop_range_operation
194 1.1 christos : public tuple_holding_operation<operation_up, struct type *>
195 1.1 christos {
196 1.1 christos public:
197 1.1 christos
198 1.1 christos using tuple_holding_operation::tuple_holding_operation;
199 1.1 christos
200 1.1 christos value *evaluate (struct type *expect_type,
201 1.1 christos struct expression *exp,
202 1.1 christos enum noside noside) override
203 1.1 christos {
204 1.1 christos value *val = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
205 1.1 christos return ada_unop_in_range (expect_type, exp, noside, UNOP_IN_RANGE,
206 1.1 christos val, std::get<1> (m_storage));
207 1.1 christos }
208 1.1 christos
209 1.1 christos enum exp_opcode opcode () const override
210 1.1 christos { return UNOP_IN_RANGE; }
211 1.1 christos };
212 1.1 christos
213 1.1 christos /* The Ada + and - operators. */
214 1.1 christos class ada_binop_addsub_operation
215 1.1 christos : public tuple_holding_operation<enum exp_opcode, operation_up, operation_up>
216 1.1 christos {
217 1.1 christos public:
218 1.1 christos
219 1.1 christos using tuple_holding_operation::tuple_holding_operation;
220 1.1 christos
221 1.1 christos value *evaluate (struct type *expect_type,
222 1.1 christos struct expression *exp,
223 1.1 christos enum noside noside) override;
224 1.1 christos
225 1.1 christos enum exp_opcode opcode () const override
226 1.1 christos { return std::get<0> (m_storage); }
227 1.1 christos };
228 1.1 christos
229 1.1 christos using ada_binop_mul_operation = binop_operation<BINOP_MUL, ada_mult_binop>;
230 1.1 christos using ada_binop_div_operation = binop_operation<BINOP_DIV, ada_mult_binop>;
231 1.1 christos using ada_binop_rem_operation = binop_operation<BINOP_REM, ada_mult_binop>;
232 1.1 christos using ada_binop_mod_operation = binop_operation<BINOP_MOD, ada_mult_binop>;
233 1.1 christos
234 1.1 christos using ada_binop_min_operation = binop_operation<BINOP_MIN, ada_binop_minmax>;
235 1.1 christos using ada_binop_max_operation = binop_operation<BINOP_MAX, ada_binop_minmax>;
236 1.1 christos
237 1.1 christos using ada_binop_exp_operation = binop_operation<BINOP_EXP, ada_binop_exp>;
238 1.1 christos
239 1.1 christos /* Implement the equal and not-equal operations for Ada. */
240 1.1 christos class ada_binop_equal_operation
241 1.1 christos : public tuple_holding_operation<enum exp_opcode, operation_up, operation_up>
242 1.1 christos {
243 1.1 christos public:
244 1.1 christos
245 1.1 christos using tuple_holding_operation::tuple_holding_operation;
246 1.1 christos
247 1.1 christos value *evaluate (struct type *expect_type,
248 1.1 christos struct expression *exp,
249 1.1 christos enum noside noside) override
250 1.1 christos {
251 1.1 christos value *arg1 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
252 1.1 christos value *arg2 = std::get<2> (m_storage)->evaluate (value_type (arg1),
253 1.1 christos exp, noside);
254 1.1 christos return ada_equal_binop (expect_type, exp, noside, std::get<0> (m_storage),
255 1.1 christos arg1, arg2);
256 1.1 christos }
257 1.1 christos
258 1.1 christos enum exp_opcode opcode () const override
259 1.1 christos { return std::get<0> (m_storage); }
260 1.1 christos };
261 1.1 christos
262 1.1 christos /* Bitwise operators for Ada. */
263 1.1 christos template<enum exp_opcode OP>
264 1.1 christos class ada_bitwise_operation
265 1.1 christos : public maybe_constant_operation<operation_up, operation_up>
266 1.1 christos {
267 1.1 christos public:
268 1.1 christos
269 1.1 christos using maybe_constant_operation::maybe_constant_operation;
270 1.1 christos
271 1.1 christos value *evaluate (struct type *expect_type,
272 1.1 christos struct expression *exp,
273 1.1 christos enum noside noside) override
274 1.1 christos {
275 1.1 christos value *lhs = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
276 1.1 christos value *rhs = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
277 1.1 christos value *result = eval_op_binary (expect_type, exp, noside, OP, lhs, rhs);
278 1.1 christos return value_cast (value_type (lhs), result);
279 1.1 christos }
280 1.1 christos
281 1.1 christos enum exp_opcode opcode () const override
282 1.1 christos { return OP; }
283 1.1 christos };
284 1.1 christos
285 1.1 christos using ada_bitwise_and_operation = ada_bitwise_operation<BINOP_BITWISE_AND>;
286 1.1 christos using ada_bitwise_ior_operation = ada_bitwise_operation<BINOP_BITWISE_IOR>;
287 1.1 christos using ada_bitwise_xor_operation = ada_bitwise_operation<BINOP_BITWISE_XOR>;
288 1.1 christos
289 1.1 christos /* Ada array- or string-slice operation. */
290 1.1 christos class ada_ternop_slice_operation
291 1.1 christos : public maybe_constant_operation<operation_up, operation_up, operation_up>,
292 1.1 christos public ada_resolvable
293 1.1 christos {
294 1.1 christos public:
295 1.1 christos
296 1.1 christos using maybe_constant_operation::maybe_constant_operation;
297 1.1 christos
298 1.1 christos value *evaluate (struct type *expect_type,
299 1.1 christos struct expression *exp,
300 1.1 christos enum noside noside) override
301 1.1 christos {
302 1.1 christos value *array = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
303 1.1 christos value *low = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
304 1.1 christos value *high = std::get<2> (m_storage)->evaluate (nullptr, exp, noside);
305 1.1 christos return ada_ternop_slice (exp, noside, array, low, high);
306 1.1 christos }
307 1.1 christos
308 1.1 christos enum exp_opcode opcode () const override
309 1.1 christos { return TERNOP_SLICE; }
310 1.1 christos
311 1.1 christos bool resolve (struct expression *exp,
312 1.1 christos bool deprocedure_p,
313 1.1 christos bool parse_completion,
314 1.1 christos innermost_block_tracker *tracker,
315 1.1 christos struct type *context_type) override;
316 1.1 christos };
317 1.1 christos
318 1.1 christos /* Implement BINOP_IN_BOUNDS for Ada. */
319 1.1 christos class ada_binop_in_bounds_operation
320 1.1 christos : public maybe_constant_operation<operation_up, operation_up, int>
321 1.1 christos {
322 1.1 christos public:
323 1.1 christos
324 1.1 christos using maybe_constant_operation::maybe_constant_operation;
325 1.1 christos
326 1.1 christos value *evaluate (struct type *expect_type,
327 1.1 christos struct expression *exp,
328 1.1 christos enum noside noside) override
329 1.1 christos {
330 1.1 christos value *arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
331 1.1 christos value *arg2 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
332 1.1 christos return ada_binop_in_bounds (exp, noside, arg1, arg2,
333 1.1 christos std::get<2> (m_storage));
334 1.1 christos }
335 1.1 christos
336 1.1 christos enum exp_opcode opcode () const override
337 1.1 christos { return BINOP_IN_BOUNDS; }
338 1.1 christos };
339 1.1 christos
340 1.1 christos /* Implement several unary Ada OP_ATR_* operations. */
341 1.1 christos class ada_unop_atr_operation
342 1.1 christos : public maybe_constant_operation<operation_up, enum exp_opcode, int>
343 1.1 christos {
344 1.1 christos public:
345 1.1 christos
346 1.1 christos using maybe_constant_operation::maybe_constant_operation;
347 1.1 christos
348 1.1 christos value *evaluate (struct type *expect_type,
349 1.1 christos struct expression *exp,
350 1.1 christos enum noside noside) override;
351 1.1 christos
352 1.1 christos enum exp_opcode opcode () const override
353 1.1 christos { return std::get<1> (m_storage); }
354 1.1 christos };
355 1.1 christos
356 1.1 christos /* Variant of var_value_operation for Ada. */
357 1.1 christos class ada_var_value_operation
358 1.1 christos : public var_value_operation, public ada_resolvable
359 1.1 christos {
360 1.1 christos public:
361 1.1 christos
362 1.1 christos using var_value_operation::var_value_operation;
363 1.1 christos
364 1.1 christos value *evaluate (struct type *expect_type,
365 1.1 christos struct expression *exp,
366 1.1 christos enum noside noside) override;
367 1.1 christos
368 1.1 christos value *evaluate_for_cast (struct type *expect_type,
369 1.1 christos struct expression *exp,
370 1.1 christos enum noside noside) override;
371 1.1 christos
372 1.1 christos const block *get_block () const
373 1.1 christos { return std::get<0> (m_storage).block; }
374 1.1 christos
375 1.1 christos bool resolve (struct expression *exp,
376 1.1 christos bool deprocedure_p,
377 1.1 christos bool parse_completion,
378 1.1 christos innermost_block_tracker *tracker,
379 1.1 christos struct type *context_type) override;
380 1.1 christos
381 1.1 christos protected:
382 1.1 christos
383 1.1 christos using operation::do_generate_ax;
384 1.1 christos };
385 1.1 christos
386 1.1 christos /* Variant of var_msym_value_operation for Ada. */
387 1.1 christos class ada_var_msym_value_operation
388 1.1 christos : public var_msym_value_operation
389 1.1 christos {
390 1.1 christos public:
391 1.1 christos
392 1.1 christos using var_msym_value_operation::var_msym_value_operation;
393 1.1 christos
394 1.1 christos value *evaluate_for_cast (struct type *expect_type,
395 1.1 christos struct expression *exp,
396 1.1 christos enum noside noside) override;
397 1.1 christos
398 1.1 christos protected:
399 1.1 christos
400 1.1 christos using operation::do_generate_ax;
401 1.1 christos };
402 1.1 christos
403 1.1 christos /* Implement the Ada 'val attribute. */
404 1.1 christos class ada_atr_val_operation
405 1.1 christos : public tuple_holding_operation<struct type *, operation_up>
406 1.1 christos {
407 1.1 christos public:
408 1.1 christos
409 1.1 christos using tuple_holding_operation::tuple_holding_operation;
410 1.1 christos
411 1.1 christos value *evaluate (struct type *expect_type,
412 1.1 christos struct expression *exp,
413 1.1 christos enum noside noside) override;
414 1.1 christos
415 1.1 christos enum exp_opcode opcode () const override
416 1.1 christos { return OP_ATR_VAL; }
417 1.1 christos };
418 1.1 christos
419 1.1 christos /* The indirection operator for Ada. */
420 1.1 christos class ada_unop_ind_operation
421 1.1 christos : public unop_ind_base_operation
422 1.1 christos {
423 1.1 christos public:
424 1.1 christos
425 1.1 christos using unop_ind_base_operation::unop_ind_base_operation;
426 1.1 christos
427 1.1 christos value *evaluate (struct type *expect_type,
428 1.1 christos struct expression *exp,
429 1.1 christos enum noside noside) override;
430 1.1 christos };
431 1.1 christos
432 1.1 christos /* Implement STRUCTOP_STRUCT for Ada. */
433 1.1 christos class ada_structop_operation
434 1.1 christos : public structop_base_operation
435 1.1 christos {
436 1.1 christos public:
437 1.1 christos
438 1.1 christos using structop_base_operation::structop_base_operation;
439 1.1 christos
440 1.1 christos value *evaluate (struct type *expect_type,
441 1.1 christos struct expression *exp,
442 1.1 christos enum noside noside) override;
443 1.1 christos
444 1.1 christos enum exp_opcode opcode () const override
445 1.1 christos { return STRUCTOP_STRUCT; }
446 1.1 christos
447 1.1 christos /* Set the completion prefix. */
448 1.1 christos void set_prefix (std::string &&prefix)
449 1.1 christos {
450 1.1 christos m_prefix = std::move (prefix);
451 1.1 christos }
452 1.1 christos
453 1.1 christos bool complete (struct expression *exp, completion_tracker &tracker) override
454 1.1 christos {
455 1.1 christos return structop_base_operation::complete (exp, tracker, m_prefix.c_str ());
456 1.1 christos }
457 1.1 christos
458 1.1 christos void dump (struct ui_file *stream, int depth) const override
459 1.1 christos {
460 1.1 christos structop_base_operation::dump (stream, depth);
461 1.1 christos dump_for_expression (stream, depth + 1, m_prefix);
462 1.1 christos }
463 1.1 christos
464 1.1 christos private:
465 1.1 christos
466 1.1 christos /* We may need to provide a prefix to field name completion. See
467 1.1 christos ada-exp.y:find_completion_bounds for details. */
468 1.1 christos std::string m_prefix;
469 1.1 christos };
470 1.1 christos
471 1.1 christos /* Function calls for Ada. */
472 1.1 christos class ada_funcall_operation
473 1.1 christos : public tuple_holding_operation<operation_up, std::vector<operation_up>>,
474 1.1 christos public ada_resolvable
475 1.1 christos {
476 1.1 christos public:
477 1.1 christos
478 1.1 christos using tuple_holding_operation::tuple_holding_operation;
479 1.1 christos
480 1.1 christos value *evaluate (struct type *expect_type,
481 1.1 christos struct expression *exp,
482 1.1 christos enum noside noside) override;
483 1.1 christos
484 1.1 christos bool resolve (struct expression *exp,
485 1.1 christos bool deprocedure_p,
486 1.1 christos bool parse_completion,
487 1.1 christos innermost_block_tracker *tracker,
488 1.1 christos struct type *context_type) override;
489 1.1 christos
490 1.1 christos enum exp_opcode opcode () const override
491 1.1 christos { return OP_FUNCALL; }
492 1.1 christos };
493 1.1 christos
494 1.1 christos /* An Ada assignment operation. */
495 1.1 christos class ada_assign_operation
496 1.1 christos : public assign_operation
497 1.1 christos {
498 1.1 christos public:
499 1.1 christos
500 1.1 christos using assign_operation::assign_operation;
501 1.1 christos
502 1.1 christos value *evaluate (struct type *expect_type,
503 1.1 christos struct expression *exp,
504 1.1 christos enum noside noside) override;
505 1.1 christos
506 1.1 christos enum exp_opcode opcode () const override
507 1.1 christos { return BINOP_ASSIGN; }
508 1.1 christos };
509 1.1 christos
510 1.1 christos /* This abstract class represents a single component in an Ada
511 1.1 christos aggregate assignment. */
512 1.1 christos class ada_component
513 1.1 christos {
514 1.1 christos public:
515 1.1 christos
516 1.1 christos /* Assign to LHS, which is part of CONTAINER. EXP is the expression
517 1.1 christos being evaluated. INDICES, LOW, and HIGH indicate which
518 1.1 christos sub-components have already been assigned; INDICES should be
519 1.1 christos updated by this call. */
520 1.1 christos virtual void assign (struct value *container,
521 1.1 christos struct value *lhs, struct expression *exp,
522 1.1 christos std::vector<LONGEST> &indices,
523 1.1 christos LONGEST low, LONGEST high) = 0;
524 1.1 christos
525 1.1 christos /* Same as operation::uses_objfile. */
526 1.1 christos virtual bool uses_objfile (struct objfile *objfile) = 0;
527 1.1 christos
528 1.1 christos /* Same as operation::dump. */
529 1.1 christos virtual void dump (ui_file *stream, int depth) = 0;
530 1.1 christos
531 1.1 christos virtual ~ada_component () = default;
532 1.1 christos
533 1.1 christos protected:
534 1.1 christos
535 1.1 christos ada_component () = default;
536 1.1 christos DISABLE_COPY_AND_ASSIGN (ada_component);
537 1.1 christos };
538 1.1 christos
539 1.1 christos /* Unique pointer specialization for Ada assignment components. */
540 1.1 christos typedef std::unique_ptr<ada_component> ada_component_up;
541 1.1 christos
542 1.1 christos /* An operation that holds a single component. */
543 1.1 christos class ada_aggregate_operation
544 1.1 christos : public tuple_holding_operation<ada_component_up>
545 1.1 christos {
546 1.1 christos public:
547 1.1 christos
548 1.1 christos using tuple_holding_operation::tuple_holding_operation;
549 1.1 christos
550 1.1 christos /* Assuming that LHS represents an lvalue having a record or array
551 1.1 christos type, evaluate an assignment of this aggregate's value to LHS.
552 1.1 christos CONTAINER is an lvalue containing LHS (possibly LHS itself).
553 1.1 christos Does not modify the inferior's memory, nor does it modify the
554 1.1 christos contents of LHS (unless == CONTAINER). Returns the modified
555 1.1 christos CONTAINER. */
556 1.1 christos
557 1.1 christos value *assign_aggregate (struct value *container,
558 1.1 christos struct value *lhs,
559 1.1 christos struct expression *exp);
560 1.1 christos
561 1.1 christos value *evaluate (struct type *expect_type,
562 1.1 christos struct expression *exp,
563 1.1 christos enum noside noside) override
564 1.1 christos {
565 1.1 christos error (_("Aggregates only allowed on the right of an assignment"));
566 1.1 christos }
567 1.1 christos
568 1.1 christos enum exp_opcode opcode () const override
569 1.1 christos { return OP_AGGREGATE; }
570 1.1 christos };
571 1.1 christos
572 1.1 christos /* A component holding a vector of other components to assign. */
573 1.1 christos class ada_aggregate_component : public ada_component
574 1.1 christos {
575 1.1 christos public:
576 1.1 christos
577 1.1 christos explicit ada_aggregate_component (std::vector<ada_component_up> &&components)
578 1.1 christos : m_components (std::move (components))
579 1.1 christos {
580 1.1 christos }
581 1.1 christos
582 1.1 christos void assign (struct value *container,
583 1.1 christos struct value *lhs, struct expression *exp,
584 1.1 christos std::vector<LONGEST> &indices,
585 1.1 christos LONGEST low, LONGEST high) override;
586 1.1 christos
587 1.1 christos bool uses_objfile (struct objfile *objfile) override;
588 1.1 christos
589 1.1 christos void dump (ui_file *stream, int depth) override;
590 1.1 christos
591 1.1 christos private:
592 1.1 christos
593 1.1 christos std::vector<ada_component_up> m_components;
594 1.1 christos };
595 1.1 christos
596 1.1 christos /* A component that assigns according to a provided index (which is
597 1.1 christos relative to the "low" value). */
598 1.1 christos class ada_positional_component : public ada_component
599 1.1 christos {
600 1.1 christos public:
601 1.1 christos
602 1.1 christos ada_positional_component (int index, operation_up &&op)
603 1.1 christos : m_index (index),
604 1.1 christos m_op (std::move (op))
605 1.1 christos {
606 1.1 christos }
607 1.1 christos
608 1.1 christos void assign (struct value *container,
609 1.1 christos struct value *lhs, struct expression *exp,
610 1.1 christos std::vector<LONGEST> &indices,
611 1.1 christos LONGEST low, LONGEST high) override;
612 1.1 christos
613 1.1 christos bool uses_objfile (struct objfile *objfile) override;
614 1.1 christos
615 1.1 christos void dump (ui_file *stream, int depth) override;
616 1.1 christos
617 1.1 christos private:
618 1.1 christos
619 1.1 christos int m_index;
620 1.1 christos operation_up m_op;
621 1.1 christos };
622 1.1 christos
623 1.1 christos /* A component which handles an "others" clause. */
624 1.1 christos class ada_others_component : public ada_component
625 1.1 christos {
626 1.1 christos public:
627 1.1 christos
628 1.1 christos explicit ada_others_component (operation_up &&op)
629 1.1 christos : m_op (std::move (op))
630 1.1 christos {
631 1.1 christos }
632 1.1 christos
633 1.1 christos void assign (struct value *container,
634 1.1 christos struct value *lhs, struct expression *exp,
635 1.1 christos std::vector<LONGEST> &indices,
636 1.1 christos LONGEST low, LONGEST high) override;
637 1.1 christos
638 1.1 christos bool uses_objfile (struct objfile *objfile) override;
639 1.1 christos
640 1.1 christos void dump (ui_file *stream, int depth) override;
641 1.1 christos
642 1.1 christos private:
643 1.1 christos
644 1.1 christos operation_up m_op;
645 1.1 christos };
646 1.1 christos
647 1.1 christos /* An interface that represents an association that is used in
648 1.1 christos aggregate assignment. */
649 1.1 christos class ada_association
650 1.1 christos {
651 1.1 christos public:
652 1.1 christos
653 1.1 christos /* Like ada_component::assign, but takes an operation as a
654 1.1 christos parameter. The operation is evaluated and then assigned into LHS
655 1.1 christos according to the rules of the concrete implementation. */
656 1.1 christos virtual void assign (struct value *container,
657 1.1 christos struct value *lhs,
658 1.1 christos struct expression *exp,
659 1.1 christos std::vector<LONGEST> &indices,
660 1.1 christos LONGEST low, LONGEST high,
661 1.1 christos operation_up &op) = 0;
662 1.1 christos
663 1.1 christos /* Same as operation::uses_objfile. */
664 1.1 christos virtual bool uses_objfile (struct objfile *objfile) = 0;
665 1.1 christos
666 1.1 christos /* Same as operation::dump. */
667 1.1 christos virtual void dump (ui_file *stream, int depth) = 0;
668 1.1 christos
669 1.1 christos virtual ~ada_association () = default;
670 1.1 christos
671 1.1 christos protected:
672 1.1 christos
673 1.1 christos ada_association () = default;
674 1.1 christos DISABLE_COPY_AND_ASSIGN (ada_association);
675 1.1 christos };
676 1.1 christos
677 1.1 christos /* Unique pointer specialization for Ada assignment associations. */
678 1.1 christos typedef std::unique_ptr<ada_association> ada_association_up;
679 1.1 christos
680 1.1 christos /* A component that holds a vector of associations and an operation.
681 1.1 christos The operation is re-evaluated for each choice. */
682 1.1 christos class ada_choices_component : public ada_component
683 1.1 christos {
684 1.1 christos public:
685 1.1 christos
686 1.1 christos explicit ada_choices_component (operation_up &&op)
687 1.1 christos : m_op (std::move (op))
688 1.1 christos {
689 1.1 christos }
690 1.1 christos
691 1.1 christos /* Set the vector of associations. This is done separately from the
692 1.1 christos constructor because it was simpler for the implementation of the
693 1.1 christos parser. */
694 1.1 christos void set_associations (std::vector<ada_association_up> &&assoc)
695 1.1 christos {
696 1.1 christos m_assocs = std::move (assoc);
697 1.1 christos }
698 1.1 christos
699 1.1 christos void assign (struct value *container,
700 1.1 christos struct value *lhs, struct expression *exp,
701 1.1 christos std::vector<LONGEST> &indices,
702 1.1 christos LONGEST low, LONGEST high) override;
703 1.1 christos
704 1.1 christos bool uses_objfile (struct objfile *objfile) override;
705 1.1 christos
706 1.1 christos void dump (ui_file *stream, int depth) override;
707 1.1 christos
708 1.1 christos private:
709 1.1 christos
710 1.1 christos std::vector<ada_association_up> m_assocs;
711 1.1 christos operation_up m_op;
712 1.1 christos };
713 1.1 christos
714 1.1 christos /* An association that uses a discrete range. */
715 1.1 christos class ada_discrete_range_association : public ada_association
716 1.1 christos {
717 1.1 christos public:
718 1.1 christos
719 1.1 christos ada_discrete_range_association (operation_up &&low, operation_up &&high)
720 1.1 christos : m_low (std::move (low)),
721 1.1 christos m_high (std::move (high))
722 1.1 christos {
723 1.1 christos }
724 1.1 christos
725 1.1 christos void assign (struct value *container,
726 1.1 christos struct value *lhs, struct expression *exp,
727 1.1 christos std::vector<LONGEST> &indices,
728 1.1 christos LONGEST low, LONGEST high,
729 1.1 christos operation_up &op) override;
730 1.1 christos
731 1.1 christos bool uses_objfile (struct objfile *objfile) override;
732 1.1 christos
733 1.1 christos void dump (ui_file *stream, int depth) override;
734 1.1 christos
735 1.1 christos private:
736 1.1 christos
737 1.1 christos operation_up m_low;
738 1.1 christos operation_up m_high;
739 1.1 christos };
740 1.1 christos
741 1.1 christos /* An association that uses a name. The name may be an expression
742 1.1 christos that evaluates to an integer (for arrays), or an Ada string or
743 1.1 christos variable value operation. */
744 1.1 christos class ada_name_association : public ada_association
745 1.1 christos {
746 1.1 christos public:
747 1.1 christos
748 1.1 christos explicit ada_name_association (operation_up val)
749 1.1 christos : m_val (std::move (val))
750 1.1 christos {
751 1.1 christos }
752 1.1 christos
753 1.1 christos void assign (struct value *container,
754 1.1 christos struct value *lhs, struct expression *exp,
755 1.1 christos std::vector<LONGEST> &indices,
756 1.1 christos LONGEST low, LONGEST high,
757 1.1 christos operation_up &op) override;
758 1.1 christos
759 1.1 christos bool uses_objfile (struct objfile *objfile) override;
760 1.1 christos
761 1.1 christos void dump (ui_file *stream, int depth) override;
762 1.1 christos
763 1.1 christos private:
764 1.1 christos
765 1.1 christos operation_up m_val;
766 1.1 christos };
767 1.1 christos
768 1.1 christos /* A character constant expression. This is a separate operation so
769 1.1 christos that it can participate in resolution, so that TYPE'(CST) can
770 1.1 christos work correctly for enums with character enumerators. */
771 1.1 christos class ada_char_operation : public long_const_operation,
772 1.1 christos public ada_resolvable
773 1.1 christos {
774 1.1 christos public:
775 1.1 christos
776 1.1 christos using long_const_operation::long_const_operation;
777 1.1 christos
778 1.1 christos bool resolve (struct expression *exp,
779 1.1 christos bool deprocedure_p,
780 1.1 christos bool parse_completion,
781 1.1 christos innermost_block_tracker *tracker,
782 1.1 christos struct type *context_type) override
783 1.1 christos {
784 1.1 christos /* This should never be called, because this class also implements
785 1.1 christos 'replace'. */
786 1.1 christos gdb_assert_not_reached ("unexpected call");
787 1.1 christos }
788 1.1 christos
789 1.1 christos operation_up replace (operation_up &&owner,
790 1.1 christos struct expression *exp,
791 1.1 christos bool deprocedure_p,
792 1.1 christos bool parse_completion,
793 1.1 christos innermost_block_tracker *tracker,
794 1.1 christos struct type *context_type) override;
795 1.1 christos
796 1.1 christos value *evaluate (struct type *expect_type,
797 1.1 christos struct expression *exp,
798 1.1 christos enum noside noside) override;
799 1.1 christos };
800 1.1 christos
801 1.1 christos class ada_concat_operation : public concat_operation
802 1.1 christos {
803 1.1 christos public:
804 1.1 christos
805 1.1 christos using concat_operation::concat_operation;
806 1.1 christos
807 1.1 christos value *evaluate (struct type *expect_type,
808 1.1 christos struct expression *exp,
809 1.1 christos enum noside noside) override;
810 1.1 christos };
811 1.1 christos
812 1.1 christos } /* namespace expr */
813 1.1 christos
814 1.1 christos #endif /* ADA_EXP_H */
815