1 /* Type stack for GDB parser.
3 Copyright (C) 1986-2019 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
);
38 /* If there is anything on the stack (we know it will be a
39 tp_pointer), insert the qualifier above it. Otherwise, simply
40 push this on the top of the stack. */
41 if (!m_elements
.empty () && (tp
== tp_const
|| tp
== tp_volatile
))
47 insert_into (slot
, element
);
50 /* See type-stack.h. */
53 type_stack::insert (struct expr_builder
*pstate
, const char *string
)
55 union type_stack_elt element
;
58 /* If there is anything on the stack (we know it will be a
59 tp_pointer), insert the address space qualifier above it.
60 Otherwise, simply push this on the top of the stack. */
61 if (!m_elements
.empty ())
66 element
.piece
= tp_space_identifier
;
67 insert_into (slot
, element
);
68 element
.int_val
= address_space_name_to_int (pstate
->gdbarch (),
70 insert_into (slot
, element
);
73 /* See type-stack.h. */
76 type_stack::follow_type_instance_flags ()
78 type_instance_flags flags
= 0;
86 flags
|= TYPE_INSTANCE_FLAG_CONST
;
89 flags
|= TYPE_INSTANCE_FLAG_VOLATILE
;
92 gdb_assert_not_reached ("unrecognized tp_ value in follow_types");
96 /* See type-stack.h. */
99 type_stack::follow_types (struct type
*follow_type
)
103 int make_volatile
= 0;
104 int make_addr_space
= 0;
113 follow_type
= make_cv_type (make_const
,
114 TYPE_VOLATILE (follow_type
),
117 follow_type
= make_cv_type (TYPE_CONST (follow_type
),
121 follow_type
= make_type_with_address_space (follow_type
,
123 make_const
= make_volatile
= 0;
132 case tp_space_identifier
:
133 make_addr_space
= pop_int ();
136 follow_type
= lookup_pointer_type (follow_type
);
138 follow_type
= make_cv_type (make_const
,
139 TYPE_VOLATILE (follow_type
),
142 follow_type
= make_cv_type (TYPE_CONST (follow_type
),
146 follow_type
= make_type_with_address_space (follow_type
,
148 make_const
= make_volatile
= 0;
152 follow_type
= lookup_lvalue_reference_type (follow_type
);
153 goto process_reference
;
154 case tp_rvalue_reference
:
155 follow_type
= lookup_rvalue_reference_type (follow_type
);
158 follow_type
= make_cv_type (make_const
,
159 TYPE_VOLATILE (follow_type
),
162 follow_type
= make_cv_type (TYPE_CONST (follow_type
),
166 follow_type
= make_type_with_address_space (follow_type
,
168 make_const
= make_volatile
= 0;
172 array_size
= pop_int ();
173 /* FIXME-type-allocation: need a way to free this type when we are
176 lookup_array_range_type (follow_type
,
177 0, array_size
>= 0 ? array_size
- 1 : 0);
179 TYPE_HIGH_BOUND_KIND (TYPE_INDEX_TYPE (follow_type
))
183 /* FIXME-type-allocation: need a way to free this type when we are
185 follow_type
= lookup_function_type (follow_type
);
188 case tp_function_with_arguments
:
190 std::vector
<struct type
*> *args
= pop_typelist ();
193 = lookup_function_type_with_arguments (follow_type
,
201 struct type_stack
*stack
= pop_type_stack ();
202 follow_type
= stack
->follow_types (follow_type
);
206 gdb_assert_not_reached ("unrecognized tp_ value in follow_types");