]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Avoid an allocation in attr_to_dynamic_prop
authorTom Tromey <tom@tromey.com>
Fri, 2 Feb 2024 01:56:43 +0000 (18:56 -0700)
committerTom Tromey <tom@tromey.com>
Mon, 5 Feb 2024 19:12:18 +0000 (12:12 -0700)
I noticed that attr_to_dynamic_prop allocates a dwarf_block, when no
allocation is required.  This patch stack-allocates the object
instead.

Reviewed-By: Tom de Vries <tdevries@suse.de>
gdb/dwarf2/read.c

index eab56ec505d75d915aafad53aa228ae03e5be33c..a5a22c068ebc5d24e15f4087ae8aa892c3d12be8 100644 (file)
@@ -15371,24 +15371,23 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die,
       baton->locexpr.per_cu = cu->per_cu;
       baton->locexpr.per_objfile = per_objfile;
 
-      struct dwarf_block *block;
+      struct dwarf_block block;
       if (attr->form == DW_FORM_data16)
        {
          size_t data_size = 16;
-         block = XOBNEW (obstack, struct dwarf_block);
-         block->size = (data_size
-                        + 2 /* Extra bytes for DW_OP and arg.  */);
-         gdb_byte *data = XOBNEWVEC (obstack, gdb_byte, block->size);
+         block.size = (data_size
+                       + 2 /* Extra bytes for DW_OP and arg.  */);
+         gdb_byte *data = XOBNEWVEC (obstack, gdb_byte, block.size);
          data[0] = DW_OP_implicit_value;
          data[1] = data_size;
          memcpy (&data[2], attr->as_block ()->data, data_size);
-         block->data = data;
+         block.data = data;
        }
       else
-       block = attr->as_block ();
+       block = *attr->as_block ();
 
-      baton->locexpr.size = block->size;
-      baton->locexpr.data = block->data;
+      baton->locexpr.size = block.size;
+      baton->locexpr.data = block.data;
       switch (attr->name)
        {
        case DW_AT_string_length: