1 /* Type stack for GDB parser.
3 Copyright (C) 1986-2022 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "type-stack.h"
24 #include "parser-defs.h"
26 /* See type-stack.h. */
29 type_stack::insert (enum type_pieces tp
)
31 union type_stack_elt element
;
34 gdb_assert (tp
== tp_pointer
|| tp
== tp_reference
35 || tp
== tp_rvalue_reference
|| tp
== tp_const
36 || tp
== tp_volatile
|| tp
== tp_restrict
39 /* If there is anything on the stack (we know it will be a
40 tp_pointer), insert the qualifier above it. Otherwise, simply
41 push this on the top of the stack. */
42 if (!m_elements
.empty () && (tp
== tp_const
|| tp
== tp_volatile
43 || tp
== tp_restrict
))
49 insert_into (slot
, element
);
52 /* See type-stack.h. */
55 type_stack::insert (struct expr_builder
*pstate
, const char *string
)
57 union type_stack_elt element
;
60 /* If there is anything on the stack (we know it will be a
61 tp_pointer), insert the address space qualifier above it.
62 Otherwise, simply push this on the top of the stack. */
63 if (!m_elements
.empty ())
68 element
.piece
= tp_space_identifier
;
69 insert_into (slot
, element
);
71 = address_space_name_to_type_instance_flags (pstate
->gdbarch (),
73 insert_into (slot
, element
);
76 /* See type-stack.h. */
79 type_stack::follow_type_instance_flags ()
81 type_instance_flags flags
= 0;
89 flags
|= TYPE_INSTANCE_FLAG_CONST
;
92 flags
|= TYPE_INSTANCE_FLAG_VOLATILE
;
95 flags
|= TYPE_INSTANCE_FLAG_ATOMIC
;
98 flags
|= TYPE_INSTANCE_FLAG_RESTRICT
;
101 gdb_assert_not_reached ("unrecognized tp_ value in follow_types");
105 /* See type-stack.h. */
108 type_stack::follow_types (struct type
*follow_type
)
112 int make_volatile
= 0;
113 type_instance_flags make_addr_space
= 0;
114 bool make_restrict
= false;
115 bool make_atomic
= false;
123 goto process_qualifiers
;
131 case tp_space_identifier
:
132 make_addr_space
= (enum type_instance_flag_value
) pop_int ();
138 make_restrict
= true;
141 follow_type
= lookup_pointer_type (follow_type
);
142 goto process_qualifiers
;
144 follow_type
= lookup_lvalue_reference_type (follow_type
);
145 goto process_qualifiers
;
146 case tp_rvalue_reference
:
147 follow_type
= lookup_rvalue_reference_type (follow_type
);
150 follow_type
= make_cv_type (make_const
,
151 TYPE_VOLATILE (follow_type
),
154 follow_type
= make_cv_type (TYPE_CONST (follow_type
),
158 follow_type
= make_type_with_address_space (follow_type
,
161 follow_type
= make_restrict_type (follow_type
);
163 follow_type
= make_atomic_type (follow_type
);
164 make_const
= make_volatile
= 0;
166 make_restrict
= make_atomic
= false;
169 array_size
= pop_int ();
170 /* FIXME-type-allocation: need a way to free this type when we are
173 lookup_array_range_type (follow_type
,
174 0, array_size
>= 0 ? array_size
- 1 : 0);
176 follow_type
->bounds ()->high
.set_undefined ();
179 /* FIXME-type-allocation: need a way to free this type when we are
181 follow_type
= lookup_function_type (follow_type
);
184 case tp_function_with_arguments
:
186 std::vector
<struct type
*> *args
= pop_typelist ();
189 = lookup_function_type_with_arguments (follow_type
,
197 struct type_stack
*stack
= pop_type_stack ();
198 follow_type
= stack
->follow_types (follow_type
);
202 gdb_assert_not_reached ("unrecognized tp_ value in follow_types");