1 /* Type stack for GDB parser.
3 Copyright (C) 1986-2020 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");