]>
Commit | Line | Data |
---|---|---|
c906108c | 1 | /* Language independent support for printing types for GDB, the GNU debugger. |
4a94e368 | 2 | Copyright (C) 1986-2022 Free Software Foundation, Inc. |
c906108c | 3 | |
c5aa993b | 4 | This file is part of GDB. |
c906108c | 5 | |
c5aa993b JM |
6 | This program is free software; you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | |
a9762ec7 | 8 | the Free Software Foundation; either version 3 of the License, or |
c5aa993b | 9 | (at your option) any later version. |
c906108c | 10 | |
c5aa993b JM |
11 | This program is distributed in the hope that it will be useful, |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | GNU General Public License for more details. | |
c906108c | 15 | |
c5aa993b | 16 | You should have received a copy of the GNU General Public License |
a9762ec7 | 17 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
c906108c | 18 | |
17732724 AC |
19 | #ifndef TYPEPRINT_H |
20 | #define TYPEPRINT_H | |
21 | ||
bf31fd38 | 22 | #include "gdbsupport/gdb_obstack.h" |
c819b2c0 | 23 | |
94af9270 | 24 | enum language; |
da3331ec | 25 | struct ui_file; |
bd69fc68 | 26 | struct typedef_hash_table; |
6dddc817 | 27 | struct ext_lang_type_printers; |
da3331ec | 28 | |
18bbba46 LS |
29 | struct type_print_options |
30 | { | |
31 | /* True means that no special printing flags should apply. */ | |
32 | unsigned int raw : 1; | |
33 | ||
34 | /* True means print methods in a class. */ | |
35 | unsigned int print_methods : 1; | |
36 | ||
37 | /* True means print typedefs in a class. */ | |
38 | unsigned int print_typedefs : 1; | |
39 | ||
40 | /* True means to print offsets, a la 'pahole'. */ | |
41 | unsigned int print_offsets : 1; | |
42 | ||
fbb46296 LS |
43 | /* True means to print offsets in hex, otherwise use decimal. */ |
44 | unsigned int print_in_hex : 1; | |
45 | ||
18bbba46 LS |
46 | /* The number of nested type definitions to print. -1 == all. */ |
47 | int print_nested_type_limit; | |
48 | ||
49 | /* If not NULL, a local typedef hash table used when printing a | |
50 | type. */ | |
51 | typedef_hash_table *local_typedefs; | |
52 | ||
53 | /* If not NULL, a global typedef hash table used when printing a | |
54 | type. */ | |
55 | typedef_hash_table *global_typedefs; | |
56 | ||
57 | /* The list of type printers associated with the global typedef | |
58 | table. This is intentionally opaque. */ | |
59 | struct ext_lang_type_printers *global_printers; | |
60 | }; | |
61 | ||
7c161838 SDJ |
62 | struct print_offset_data |
63 | { | |
fbb46296 LS |
64 | /* Indicate if the offset an d size fields should be printed in decimal |
65 | (default) or hexadecimal. */ | |
66 | bool print_in_hex = false; | |
67 | ||
7c161838 SDJ |
68 | /* The offset to be applied to bitpos when PRINT_OFFSETS is true. |
69 | This is needed for when we are printing nested structs and want | |
70 | to make sure that the printed offset for each field carries over | |
71 | the offset of the outter struct. */ | |
72 | unsigned int offset_bitpos = 0; | |
73 | ||
74 | /* END_BITPOS is the one-past-the-end bit position of the previous | |
75 | field (where we expect the current field to be if there is no | |
76 | hole). */ | |
77 | unsigned int end_bitpos = 0; | |
e0c547d1 TT |
78 | |
79 | /* Print information about field at index FIELD_IDX of the struct type | |
80 | TYPE and update this object. | |
81 | ||
82 | If the field is static, it simply prints the correct number of | |
83 | spaces. | |
84 | ||
85 | The output is strongly based on pahole(1). */ | |
86 | void update (struct type *type, unsigned int field_idx, | |
87 | struct ui_file *stream); | |
88 | ||
89 | /* Call when all fields have been printed. This will print | |
90 | information about any padding that may exist. LEVEL is the | |
91 | desired indentation level. */ | |
92 | void finish (struct type *type, int level, struct ui_file *stream); | |
93 | ||
94 | /* When printing the offsets of a struct and its fields (i.e., | |
95 | 'ptype /o'; type_print_options::print_offsets), we use this many | |
96 | characters when printing the offset information at the beginning | |
97 | of the line. This is needed in order to generate the correct | |
98 | amount of whitespaces when no offset info should be printed for a | |
99 | certain field. */ | |
100 | static const int indentation; | |
101 | ||
fbb46296 LS |
102 | explicit print_offset_data (const struct type_print_options *flags); |
103 | ||
e0c547d1 TT |
104 | private: |
105 | ||
106 | /* Helper function for ptype/o implementation that prints | |
107 | information about a hole, if necessary. STREAM is where to | |
108 | print. BITPOS is the bitpos of the current field. FOR_WHAT is a | |
109 | string describing the purpose of the hole. */ | |
110 | ||
111 | void maybe_print_hole (struct ui_file *stream, unsigned int bitpos, | |
112 | const char *for_what); | |
7c161838 SDJ |
113 | }; |
114 | ||
79d43c61 TT |
115 | extern const struct type_print_options type_print_raw_options; |
116 | ||
c819b2c0 TT |
117 | /* A hash table holding typedef_field objects. This is more |
118 | complicated than an ordinary hash because it must also track the | |
119 | lifetime of some -- but not all -- of the contained objects. */ | |
120 | ||
121 | class typedef_hash_table | |
122 | { | |
123 | public: | |
124 | ||
125 | /* Create a new typedef-lookup hash table. */ | |
126 | typedef_hash_table (); | |
127 | ||
c819b2c0 TT |
128 | /* Copy a typedef hash. */ |
129 | typedef_hash_table (const typedef_hash_table &); | |
bd69fc68 | 130 | |
c819b2c0 | 131 | typedef_hash_table &operator= (const typedef_hash_table &) = delete; |
bd69fc68 | 132 | |
c819b2c0 TT |
133 | /* Add typedefs from T to the hash table TABLE. */ |
134 | void recursively_update (struct type *); | |
bd69fc68 | 135 | |
c819b2c0 TT |
136 | /* Add template parameters from T to the typedef hash TABLE. */ |
137 | void add_template_parameters (struct type *t); | |
bd69fc68 | 138 | |
c819b2c0 TT |
139 | /* Look up the type T in the typedef hash tables contained in FLAGS. |
140 | The local table is searched first, then the global table (either | |
141 | table can be NULL, in which case it is skipped). If T is in a | |
142 | table, return its short (class-relative) typedef name. Otherwise | |
143 | return NULL. */ | |
144 | static const char *find_typedef (const struct type_print_options *flags, | |
145 | struct type *t); | |
bd69fc68 | 146 | |
c819b2c0 TT |
147 | private: |
148 | ||
149 | static const char *find_global_typedef (const struct type_print_options *flags, | |
150 | struct type *t); | |
151 | ||
152 | ||
153 | /* The actual hash table. */ | |
fa9b1164 | 154 | htab_up m_table; |
c819b2c0 TT |
155 | |
156 | /* Storage for typedef_field objects that must be synthesized. */ | |
157 | auto_obstack m_storage; | |
158 | }; | |
bd69fc68 | 159 | |
bd69fc68 | 160 | |
d9fcf2fb | 161 | void print_type_scalar (struct type * type, LONGEST, struct ui_file *); |
c906108c | 162 | |
0c9150e4 JB |
163 | /* Assuming the TYPE is a fixed point type, print its type description |
164 | on STREAM. */ | |
165 | ||
166 | void print_type_fixed_point (struct type *type, struct ui_file *stream); | |
167 | ||
79d43c61 TT |
168 | void c_type_print_args (struct type *, struct ui_file *, int, enum language, |
169 | const struct type_print_options *); | |
94af9270 | 170 | |
7022349d PA |
171 | /* Print <unknown return type> to stream STREAM. */ |
172 | ||
173 | void type_print_unknown_return_type (struct ui_file *stream); | |
174 | ||
46a4882b PA |
175 | /* Throw an error indicating that the user tried to use a symbol that |
176 | has unknown type. SYM_PRINT_NAME is the name of the symbol, to be | |
177 | included in the error message. */ | |
178 | extern void error_unknown_type (const char *sym_print_name); | |
179 | ||
3f2f83dd KB |
180 | extern void val_print_not_allocated (struct ui_file *stream); |
181 | ||
182 | extern void val_print_not_associated (struct ui_file *stream); | |
183 | ||
17732724 | 184 | #endif |