From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1062) id 0B96B384A898; Sat, 9 Jul 2022 12:36:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0B96B384A898 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Alan Modra To: bfd-cvs@sourceware.org Subject: [binutils-gdb] ppc gas: don't leak ppc_hash memory X-Act-Checkin: binutils-gdb X-Git-Author: Alan Modra X-Git-Refname: refs/heads/master X-Git-Oldrev: 1309c3165cc0751f5c4657e0e0ac4335640f2f03 X-Git-Newrev: a887be69963c40ced36e319e5fb14b3de4b6658b Message-Id: <20220709123616.0B96B384A898@sourceware.org> Date: Sat, 9 Jul 2022 12:36:16 +0000 (GMT) X-BeenThere: binutils-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 09 Jul 2022 12:36:16 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3Da887be69963c= 40ced36e319e5fb14b3de4b6658b commit a887be69963c40ced36e319e5fb14b3de4b6658b Author: Alan Modra Date: Thu Jul 7 22:03:15 2022 +0930 ppc gas: don't leak ppc_hash memory =20 * config/tc-ppc.c (insn_obstack): New. (insn_calloc): New function. (ppc_setup_opcodes): Use insn_obstack for ppc_hash. (ppc_md_end): New function. * config/tc-ppc.h (ppc_md_end): Declare (md_end): Define. Diff: --- gas/config/tc-ppc.c | 36 ++++++++++++++++++++++++++++++++++-- gas/config/tc-ppc.h | 3 +++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c index 0c3e670d11b..ac61cd8f122 100644 --- a/gas/config/tc-ppc.c +++ b/gas/config/tc-ppc.c @@ -976,6 +976,10 @@ ppc_optimize_expr (expressionS *left, operatorT op, ex= pressionS *right) /* Whether to target xcoff64/elf64. */ static unsigned int ppc_obj64 =3D BFD_DEFAULT_TARGET_SIZE =3D=3D 64; =20 +/* A separate obstack for use by ppc_hash, so that we can quickly + throw away hash table memory . */ +struct obstack insn_obstack; + /* Opcode hash table. */ static htab_t ppc_hash; =20 @@ -1613,6 +1617,21 @@ insn_validate (const struct powerpc_opcode *op) return false; } =20 +static void * +insn_calloc (size_t n, size_t size) +{ + size_t amt; + void *ret; + if (gas_mul_overflow (n, size, &amt)) + { + obstack_alloc_failed_handler (); + abort (); + } + ret =3D obstack_alloc (&insn_obstack, amt); + memset (ret, 0, amt); + return ret; +} + /* Insert opcodes into hash tables. Called at startup and for .machine pseudo. */ =20 @@ -1624,10 +1643,16 @@ ppc_setup_opcodes (void) bool bad_insn =3D false; =20 if (ppc_hash !=3D NULL) - htab_delete (ppc_hash); + { + htab_delete (ppc_hash); + _obstack_free (&insn_obstack, NULL); + } + + obstack_begin (&insn_obstack, chunksize); =20 /* Insert the opcodes into a hash table. */ - ppc_hash =3D str_htab_create (); + ppc_hash =3D htab_create_alloc (5000, hash_string_tuple, eq_string_tuple, + NULL, insn_calloc, NULL); =20 if (ENABLE_CHECKING) { @@ -1875,6 +1900,13 @@ md_begin (void) #endif } =20 +void +ppc_md_end (void) +{ + htab_delete (ppc_hash); + _obstack_free (&insn_obstack, NULL); +} + void ppc_cleanup (void) { diff --git a/gas/config/tc-ppc.h b/gas/config/tc-ppc.h index e335aa611fe..ed06a296382 100644 --- a/gas/config/tc-ppc.h +++ b/gas/config/tc-ppc.h @@ -256,6 +256,9 @@ extern void ppc_elf_md_finish (void); =20 #endif /* OBJ_ELF */ =20 +extern void ppc_md_end (void); +#define md_end ppc_md_end + #if defined (OBJ_ELF) || defined (OBJ_XCOFF) #define TC_FORCE_RELOCATION(FIX) ppc_force_relocation (FIX) extern int ppc_force_relocation (struct fix *);