X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Ftypeprint.h;h=b93ea9f3630e44deb05ec1677d5a9c2d833091f2;hb=d043f8c867f85f1c36cc957da8204fe2907b3aea;hp=ba9588a11894979c242a450f4d299ca248e9aa2a;hpb=e2882c85786571175a0b0bfc3bcd2f14620b1ea3;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/typeprint.h b/gdb/typeprint.h index ba9588a118..b93ea9f363 100644 --- a/gdb/typeprint.h +++ b/gdb/typeprint.h @@ -1,5 +1,5 @@ /* Language independent support for printing types for GDB, the GNU debugger. - Copyright (C) 1986-2018 Free Software Foundation, Inc. + Copyright (C) 1986-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -19,6 +19,8 @@ #ifndef TYPEPRINT_H #define TYPEPRINT_H +#include "gdb_obstack.h" + enum language; struct ui_file; struct typedef_hash_table; @@ -36,6 +38,39 @@ struct print_offset_data field (where we expect the current field to be if there is no hole). */ unsigned int end_bitpos = 0; + + /* Print information about field at index FIELD_IDX of the struct type + TYPE and update this object. + + If the field is static, it simply prints the correct number of + spaces. + + The output is strongly based on pahole(1). */ + void update (struct type *type, unsigned int field_idx, + struct ui_file *stream); + + /* Call when all fields have been printed. This will print + information about any padding that may exist. LEVEL is the + desired indentation level. */ + void finish (struct type *type, int level, struct ui_file *stream); + + /* When printing the offsets of a struct and its fields (i.e., + 'ptype /o'; type_print_options::print_offsets), we use this many + characters when printing the offset information at the beginning + of the line. This is needed in order to generate the correct + amount of whitespaces when no offset info should be printed for a + certain field. */ + static const int indentation; + +private: + + /* Helper function for ptype/o implementation that prints + information about a hole, if necessary. STREAM is where to + print. BITPOS is the bitpos of the current field. FOR_WHAT is a + string describing the purpose of the hole. */ + + void maybe_print_hole (struct ui_file *stream, unsigned int bitpos, + const char *for_what); }; struct type_print_options @@ -57,11 +92,11 @@ struct type_print_options /* If not NULL, a local typedef hash table used when printing a type. */ - struct typedef_hash_table *local_typedefs; + typedef_hash_table *local_typedefs; /* If not NULL, a global typedef hash table used when printing a type. */ - struct typedef_hash_table *global_typedefs; + typedef_hash_table *global_typedefs; /* The list of type printers associated with the global typedef table. This is intentionally opaque. */ @@ -70,26 +105,53 @@ struct type_print_options extern const struct type_print_options type_print_raw_options; -void recursively_update_typedef_hash (struct typedef_hash_table *, - struct type *); +/* A hash table holding typedef_field objects. This is more + complicated than an ordinary hash because it must also track the + lifetime of some -- but not all -- of the contained objects. */ + +class typedef_hash_table +{ +public: -void add_template_parameters (struct typedef_hash_table *, struct type *); + /* Create a new typedef-lookup hash table. */ + typedef_hash_table (); -struct typedef_hash_table *create_typedef_hash (void); + ~typedef_hash_table (); -void free_typedef_hash (struct typedef_hash_table *); + /* Copy a typedef hash. */ + typedef_hash_table (const typedef_hash_table &); -struct cleanup *make_cleanup_free_typedef_hash (struct typedef_hash_table *); + typedef_hash_table &operator= (const typedef_hash_table &) = delete; -struct typedef_hash_table *copy_typedef_hash (struct typedef_hash_table *); + /* Add typedefs from T to the hash table TABLE. */ + void recursively_update (struct type *); -const char *find_typedef_in_hash (const struct type_print_options *, - struct type *); + /* Add template parameters from T to the typedef hash TABLE. */ + void add_template_parameters (struct type *t); + + /* Look up the type T in the typedef hash tables contained in FLAGS. + The local table is searched first, then the global table (either + table can be NULL, in which case it is skipped). If T is in a + table, return its short (class-relative) typedef name. Otherwise + return NULL. */ + static const char *find_typedef (const struct type_print_options *flags, + struct type *t); + +private: + + static const char *find_global_typedef (const struct type_print_options *flags, + struct type *t); -void print_type_scalar (struct type * type, LONGEST, struct ui_file *); -void c_type_print_varspec_suffix (struct type *, struct ui_file *, int, - int, int, const struct type_print_options *); + /* The actual hash table. */ + htab_t m_table; + + /* Storage for typedef_field objects that must be synthesized. */ + auto_obstack m_storage; +}; + + +void print_type_scalar (struct type * type, LONGEST, struct ui_file *); void c_type_print_args (struct type *, struct ui_file *, int, enum language, const struct type_print_options *);