[gdb/symtab] Factor out type::{alloc_fields,copy_fields}
commit2774f2dad5f05e68771c07df6ab0fb23baa2118e
authorTom de Vries <tdevries@suse.de>
Thu, 31 Aug 2023 07:37:44 +0000 (31 09:37 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 31 Aug 2023 07:37:44 +0000 (31 09:37 +0200)
tree41e352c12e7f2dee518fdf504b7e687e887c9baa
parent0b8b932dce26ef8e907b3b3c06b01a99420245fe
[gdb/symtab] Factor out type::{alloc_fields,copy_fields}

After finding this code in buildsym_compunit::finish_block_internal:
...
              ftype->set_fields
                ((struct field *)
                 TYPE_ALLOC (ftype, nparams * sizeof (struct field)));
...
and fixing PR30810 by using TYPE_ZALLOC, I wondered if there were more
locations that needed fixing.

I decided to make things easier to spot by factoring out a new function
alloc_fields:
...
 /* Allocate the fields array of this type, with NFIELDS elements.  If INIT,
     zero-initialize the allocated memory.  */
  void
  type::alloc_fields (unsigned int nfields, bool init = true);
...
where:
- a regular use would be "alloc_fields (nfields)", and
- an exceptional use that needed no initialization would be
  "alloc_fields (nfields, false)".

Pretty soon I discovered that most of the latter cases are due to
initialization by memcpy, so I added two variants of copy_fields as well.

After this rewrite there are 8 uses of set_fields left:
...
gdb/coffread.c:   type->set_fields (nullptr);
gdb/coffread.c:   type->set_fields (nullptr);
gdb/coffread.c:   type->set_fields (nullptr);
gdb/eval.c:  type->set_fields
gdb/gdbtypes.c:  type->set_fields (args);
gdb/gdbtypes.c:  t->set_fields (XRESIZEVEC (struct field, t->fields (),
gdb/dwarf2/read.c:      type->set_fields (new_fields);
gdb/dwarf2/read.c:       sub_type->set_fields (sub_type->fields () + 1);
...

These fall into the following categories:
- set to nullptr (coffread.c),
- type not owned by objfile or gdbarch (eval.c), and
- modifying an existing fields array, like adding an element at the end or
  dropping an element at the start (the rest).

Tested on x86_64-linux.
13 files changed:
gdb/ada-lang.c
gdb/amdgpu-tdep.c
gdb/buildsym.c
gdb/coffread.c
gdb/ctfread.c
gdb/dwarf2/read.c
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/gnu-v3-abi.c
gdb/mdebugread.c
gdb/rust-lang.c
gdb/stabsread.c
gdb/windows-tdep.c