]>
Commit | Line | Data |
---|---|---|
c44af4eb TT |
1 | /* Rust language support definitions for GDB, the GNU debugger. |
2 | ||
4a94e368 | 3 | Copyright (C) 2016-2022 Free Software Foundation, Inc. |
c44af4eb TT |
4 | |
5 | This file is part of GDB. | |
6 | ||
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. | |
11 | ||
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. | |
16 | ||
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/>. */ | |
19 | ||
20 | #ifndef RUST_LANG_H | |
21 | #define RUST_LANG_H | |
22 | ||
1c485265 AB |
23 | #include "demangle.h" |
24 | #include "language.h" | |
25 | #include "value.h" | |
26 | #include "c-lang.h" | |
27 | ||
c44af4eb TT |
28 | struct parser_state; |
29 | struct type; | |
30 | ||
c44af4eb | 31 | /* Return true if TYPE is a tuple type; otherwise false. */ |
65c40c95 | 32 | extern bool rust_tuple_type_p (struct type *type); |
c44af4eb TT |
33 | |
34 | /* Return true if TYPE is a tuple struct type; otherwise false. */ | |
65c40c95 | 35 | extern bool rust_tuple_struct_type_p (struct type *type); |
c44af4eb | 36 | |
03c85b11 TT |
37 | /* Given a block, find the name of the block's crate. Returns an empty |
38 | stringif no crate name can be found. */ | |
39 | extern std::string rust_crate_for_block (const struct block *block); | |
c44af4eb | 40 | |
c9317f21 TT |
41 | /* Returns the last segment of a Rust path like foo::bar::baz. Will |
42 | not handle cases where the last segment contains generics. */ | |
43 | ||
44 | extern const char *rust_last_path_segment (const char *path); | |
45 | ||
c44af4eb TT |
46 | /* Create a new slice type. NAME is the name of the type. ELT_TYPE |
47 | is the type of the elements of the slice. USIZE_TYPE is the Rust | |
48 | "usize" type to use. The new type is allocated whereever ELT_TYPE | |
49 | is allocated. */ | |
888e3ddb TT |
50 | extern struct type *rust_slice_type (const char *name, struct type *elt_type, |
51 | struct type *usize_type); | |
c44af4eb | 52 | |
1c485265 AB |
53 | /* Class representing the Rust language. */ |
54 | ||
55 | class rust_language : public language_defn | |
56 | { | |
57 | public: | |
58 | rust_language () | |
59 | : language_defn (language_rust) | |
60 | { /* Nothing. */ } | |
61 | ||
62 | /* See language.h. */ | |
63 | ||
64 | const char *name () const override | |
65 | { return "rust"; } | |
66 | ||
67 | /* See language.h. */ | |
68 | ||
69 | const char *natural_name () const override | |
70 | { return "Rust"; } | |
71 | ||
72 | /* See language.h. */ | |
73 | ||
21a527df EL |
74 | const char *get_digit_separator () const override |
75 | { return "_"; } | |
76 | ||
77 | /* See language.h. */ | |
78 | ||
1c485265 AB |
79 | const std::vector<const char *> &filename_extensions () const override |
80 | { | |
81 | static const std::vector<const char *> extensions = { ".rs" }; | |
82 | return extensions; | |
83 | } | |
84 | ||
85 | /* See language.h. */ | |
86 | ||
87 | void language_arch_info (struct gdbarch *gdbarch, | |
88 | struct language_arch_info *lai) const override; | |
89 | ||
90 | /* See language.h. */ | |
91 | ||
3456e70c TT |
92 | bool sniff_from_mangled_name |
93 | (const char *mangled, gdb::unique_xmalloc_ptr<char> *demangled) | |
94 | const override | |
1c485265 AB |
95 | { |
96 | *demangled = gdb_demangle (mangled, DMGL_PARAMS | DMGL_ANSI); | |
97 | return *demangled != NULL; | |
98 | } | |
99 | ||
100 | /* See language.h. */ | |
101 | ||
3456e70c TT |
102 | gdb::unique_xmalloc_ptr<char> demangle_symbol (const char *mangled, |
103 | int options) const override | |
1c485265 AB |
104 | { |
105 | return gdb_demangle (mangled, options); | |
106 | } | |
107 | ||
108 | /* See language.h. */ | |
109 | ||
97e20099 TT |
110 | bool can_print_type_offsets () const override |
111 | { | |
112 | return true; | |
113 | } | |
114 | ||
115 | /* See language.h. */ | |
116 | ||
1c485265 AB |
117 | void print_type (struct type *type, const char *varstring, |
118 | struct ui_file *stream, int show, int level, | |
119 | const struct type_print_options *flags) const override; | |
120 | ||
121 | /* See language.h. */ | |
122 | ||
123 | gdb::unique_xmalloc_ptr<char> watch_location_expression | |
124 | (struct type *type, CORE_ADDR addr) const override | |
125 | { | |
27710edb | 126 | type = check_typedef (check_typedef (type)->target_type ()); |
1c485265 | 127 | std::string name = type_to_string (type); |
8579fd13 AB |
128 | return xstrprintf ("*(%s as *mut %s)", core_addr_to_string (addr), |
129 | name.c_str ()); | |
1c485265 AB |
130 | } |
131 | ||
132 | /* See language.h. */ | |
133 | ||
134 | void value_print_inner | |
135 | (struct value *val, struct ui_file *stream, int recurse, | |
136 | const struct value_print_options *options) const override; | |
137 | ||
138 | /* See language.h. */ | |
139 | ||
1c9cc052 TT |
140 | void value_print (struct value *val, struct ui_file *stream, |
141 | const struct value_print_options *options) const override; | |
142 | ||
143 | /* See language.h. */ | |
144 | ||
1c485265 AB |
145 | struct block_symbol lookup_symbol_nonlocal |
146 | (const char *name, const struct block *block, | |
147 | const domain_enum domain) const override | |
148 | { | |
149 | struct block_symbol result = {}; | |
150 | ||
b1e678d9 AB |
151 | symbol_lookup_debug_printf |
152 | ("rust_lookup_symbol_non_local (%s, %s (scope %s), %s)", | |
153 | name, host_address_to_string (block), block_scope (block), | |
154 | domain_name (domain)); | |
1c485265 AB |
155 | |
156 | /* Look up bare names in the block's scope. */ | |
157 | std::string scopedname; | |
158 | if (name[cp_find_first_component (name)] == '\0') | |
159 | { | |
160 | const char *scope = block_scope (block); | |
161 | ||
162 | if (scope[0] != '\0') | |
163 | { | |
164 | scopedname = std::string (scope) + "::" + name; | |
165 | name = scopedname.c_str (); | |
166 | } | |
167 | else | |
168 | name = NULL; | |
169 | } | |
170 | ||
171 | if (name != NULL) | |
172 | { | |
173 | result = lookup_symbol_in_static_block (name, block, domain); | |
174 | if (result.symbol == NULL) | |
175 | result = lookup_global_symbol (name, block, domain); | |
176 | } | |
177 | return result; | |
178 | } | |
179 | ||
180 | /* See language.h. */ | |
181 | ||
182 | int parser (struct parser_state *ps) const override; | |
183 | ||
184 | /* See language.h. */ | |
185 | ||
186 | void emitchar (int ch, struct type *chtype, | |
187 | struct ui_file *stream, int quoter) const override; | |
188 | ||
189 | /* See language.h. */ | |
190 | ||
191 | void printchar (int ch, struct type *chtype, | |
192 | struct ui_file *stream) const override | |
193 | { | |
0426ad51 | 194 | gdb_puts ("'", stream); |
1c485265 | 195 | emitchar (ch, chtype, stream, '\''); |
0426ad51 | 196 | gdb_puts ("'", stream); |
1c485265 AB |
197 | } |
198 | ||
199 | /* See language.h. */ | |
200 | ||
201 | void printstr (struct ui_file *stream, struct type *elttype, | |
202 | const gdb_byte *string, unsigned int length, | |
203 | const char *encoding, int force_ellipses, | |
204 | const struct value_print_options *options) const override; | |
205 | ||
206 | /* See language.h. */ | |
207 | ||
208 | void print_typedef (struct type *type, struct symbol *new_symbol, | |
209 | struct ui_file *stream) const override | |
210 | { | |
211 | type = check_typedef (type); | |
6cb06a8c | 212 | gdb_printf (stream, "type %s = ", new_symbol->print_name ()); |
1c485265 | 213 | type_print (type, "", stream, 0); |
6cb06a8c | 214 | gdb_printf (stream, ";"); |
1c485265 AB |
215 | } |
216 | ||
217 | /* See language.h. */ | |
218 | ||
219 | bool is_string_type_p (struct type *type) const override; | |
220 | ||
221 | /* See language.h. */ | |
222 | ||
223 | bool range_checking_on_by_default () const override | |
224 | { return true; } | |
225 | ||
1c485265 AB |
226 | private: |
227 | ||
1c485265 AB |
228 | /* Helper for value_print_inner, arguments are as for that function. |
229 | Prints structs and untagged unions. */ | |
230 | ||
231 | void val_print_struct (struct value *val, struct ui_file *stream, | |
232 | int recurse, | |
233 | const struct value_print_options *options) const; | |
234 | ||
235 | /* Helper for value_print_inner, arguments are as for that function. | |
236 | Prints discriminated unions (Rust enums). */ | |
237 | ||
238 | void print_enum (struct value *val, struct ui_file *stream, int recurse, | |
239 | const struct value_print_options *options) const; | |
240 | }; | |
241 | ||
c44af4eb | 242 | #endif /* RUST_LANG_H */ |