Use std::string in dwarf2read.c
[deliverable/binutils-gdb.git] / gdb / typeprint.h
index ba9588a11894979c242a450f4d299ca248e9aa2a..bd643dab8949be8f73e5f690d9b426defdf130ff 100644 (file)
@@ -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-2020 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 *);
This page took 0.025631 seconds and 4 git commands to generate.