From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id McmkDE+5jmks3jgAWB0awg (envelope-from ) for ; Fri, 13 Feb 2026 00:40:31 -0500 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=polymtl.ca header.i=@polymtl.ca header.a=rsa-sha256 header.s=oct2025 header.b=RtaEAYIg; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 2CCF41E0BA; Fri, 13 Feb 2026 00:40:31 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 147701E089 for ; Fri, 13 Feb 2026 00:40:30 -0500 (EST) Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id 7BE064B9DB49 for ; Fri, 13 Feb 2026 05:40:24 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7BE064B9DB49 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=polymtl.ca header.i=@polymtl.ca header.a=rsa-sha256 header.s=oct2025 header.b=RtaEAYIg Received: from smtp.polymtl.ca (smtp.polymtl.ca [132.207.4.11]) by sourceware.org (Postfix) with ESMTPS id 6CE164B9DB4A for ; Fri, 13 Feb 2026 05:39:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6CE164B9DB4A Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=polymtl.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=polymtl.ca ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 6CE164B9DB4A Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=132.207.4.11 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1770961162; cv=none; b=XptdUiWSsP/UUalxUZxF7G4yqZYCU7COe1lsp9Z2YPmNizkzatFMSlGx8BhWNx9zj2WwUQX/io4PwJmZywIDP7Y4/7r5Mpu7FVsfeDPq3grPBWYu0NBTV1INuoL/to5Ey2+MPEPd8X2jkKC9goe+nMmp2KPupWYltUc97vZX0To= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1770961162; c=relaxed/simple; bh=e/Y9R+RyfPbtfPhABdNkIrcSh3Awx2PdH3TYd1kidDg=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=hp3klZXkBJHGyoMRcQv5tUsq+3I2Ngcd/iw7ZJ3jB3n7eQMGmZ22BB9oYlQ+Wtu28scIawH2sT5E3NjPyCCK5CIT7NOH0xxLVa5NAnK29WwgQdKy/B15IRf3cb9jyw3H4B+qHSYcjkE8Tl5wHrQgkYJ1Z9pBxJXBdA9R03iN8Pc= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6CE164B9DB4A Received: from simark.ca (simark.ca [158.69.221.121]) (authenticated bits=0) by smtp.polymtl.ca (8.14.7/8.14.7) with ESMTP id 61D5dF3e014804 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 13 Feb 2026 00:39:20 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp.polymtl.ca 61D5dF3e014804 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=polymtl.ca; s=oct2025; t=1770961160; bh=KtHzrksOeDzkPQ43lgWLf1DZqAFaSDyWSbOXQCrZPig=; h=From:To:Cc:Subject:Date:In-Reply-To:From; b=RtaEAYIgyQtvqbqn9F+CH43DDm9fhKNiRkThJZDPqZLinZMtyVq+COUIRVKaGVfmt dKbyr9Bd1GOv4EgZdLsIPx0g22Fb/2RQTCfnlv3Njc54Av0Sr9XQFjTmgJA8mSdvbY VVt0wljR0vLMxutkYzZxLBQZqZECQjCmH7MK7OBYstBdEiyZ75LmVQVgO+WquwsfGY OXMyojsOMBsdvA9R6kihUMFDyyNCdw+66vOssMX31PC7+I7dxjHkWmfHQDVlaCDEj8 JadscpjvvQnqYp0+AVsH8NT1JgYYA65mwT+aA/i/WHuNs3GENj7f06E/+aeHvkifSu jWHzSXfI9acbw== Received: by simark.ca (Postfix) id 5DDC81E09A; Fri, 13 Feb 2026 00:39:14 -0500 (EST) From: simon.marchi@polymtl.ca To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH 2/4] gdb/elfread: replace ifunc htab_t with gdb::unordered_map Date: Fri, 13 Feb 2026 00:38:49 -0500 Message-ID: <20260213053912.3520505-2-simon.marchi@polymtl.ca> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260213053912.3520505-1-simon.marchi@polymtl.ca> References: <20260213053912.3520505-1-simon.marchi@polymtl.ca> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Poly-FromMTA: (simark.ca [158.69.221.121]) at Fri, 13 Feb 2026 05:39:15 +0000 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org From: Simon Marchi Replace this htab_t with gdb::unordered_map. No functional change expected. Change-Id: Icad43938f761a032b6a6257f4be0f4ab5c60661c --- gdb/elfread.c | 120 ++++++++++++-------------------------------------- 1 file changed, 27 insertions(+), 93 deletions(-) diff --git a/gdb/elfread.c b/gdb/elfread.c index 61dd8ad260ba..010744639118 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -43,6 +43,7 @@ #include #include "dwarf2/public.h" #include "cli/cli-cmds.h" +#include "gdbsupport/unordered_map.h" /* Whether ctf should always be read, or only if no dwarf is present. */ static bool always_read_ctf; @@ -657,44 +658,12 @@ elf_rel_plt_read (minimal_symbol_reader &reader, } } -/* The data pointer is htab_t for gnu_ifunc_record_cache_unchecked. */ +/* Per-objfile cache mapping function names to resolved ifunc addresses. */ -static const registry::key - elf_objfile_gnu_ifunc_cache_data; - -/* Map function names to CORE_ADDR in elf_objfile_gnu_ifunc_cache_data. */ - -struct elf_gnu_ifunc_cache -{ - /* This is always a function entry address, not a function descriptor. */ - CORE_ADDR addr; - - char name[1]; -}; - -/* htab_hash for elf_objfile_gnu_ifunc_cache_data. */ - -static hashval_t -elf_gnu_ifunc_cache_hash (const void *a_voidp) -{ - const struct elf_gnu_ifunc_cache *a - = (const struct elf_gnu_ifunc_cache *) a_voidp; - - return htab_hash_string (a->name); -} - -/* htab_eq for elf_objfile_gnu_ifunc_cache_data. */ - -static int -elf_gnu_ifunc_cache_eq (const void *a_voidp, const void *b_voidp) -{ - const struct elf_gnu_ifunc_cache *a - = (const struct elf_gnu_ifunc_cache *) a_voidp; - const struct elf_gnu_ifunc_cache *b - = (const struct elf_gnu_ifunc_cache *) b_voidp; +using elf_gnu_ifunc_cache = gdb::unordered_map; - return strcmp (a->name, b->name) == 0; -} +static const registry::key + elf_objfile_gnu_ifunc_cache_data; /* Record the target function address of a STT_GNU_IFUNC function NAME is the function entry address ADDR. Return 1 if NAME and ADDR are considered as @@ -707,13 +676,8 @@ elf_gnu_ifunc_cache_eq (const void *a_voidp, const void *b_voidp) static int elf_gnu_ifunc_record_cache (const char *name, CORE_ADDR addr) { - struct objfile *objfile; - htab_t htab; - struct elf_gnu_ifunc_cache entry_local, *entry_p; - void **slot; - - gnu_ifunc_debug_printf ("recording cache entry for \"%s\" at %s", - name, paddress (current_inferior ()->arch (), addr)); + gnu_ifunc_debug_printf ("recording cache entry for \"%s\" at %s", name, + paddress (current_inferior ()->arch (), addr)); bound_minimal_symbol msym = lookup_minimal_symbol_by_pc (addr); if (msym.minsym == NULL) @@ -734,7 +698,7 @@ elf_gnu_ifunc_record_cache (const char *name, CORE_ADDR addr) return 0; } - objfile = msym.objfile; + objfile *objfile = msym.objfile; /* If .plt jumps back to .plt the symbol is still deferred for later resolution and it has no use for GDB. */ @@ -758,43 +722,23 @@ elf_gnu_ifunc_record_cache (const char *name, CORE_ADDR addr) return 0; } - htab = elf_objfile_gnu_ifunc_cache_data.get (objfile); - if (htab == NULL) - { - htab = htab_create_alloc (1, elf_gnu_ifunc_cache_hash, - elf_gnu_ifunc_cache_eq, - NULL, xcalloc, xfree); - elf_objfile_gnu_ifunc_cache_data.set (objfile, htab); - } + elf_gnu_ifunc_cache &cache + = elf_objfile_gnu_ifunc_cache_data.try_emplace (objfile); - entry_local.addr = addr; - obstack_grow (&objfile->objfile_obstack, &entry_local, - offsetof (struct elf_gnu_ifunc_cache, name)); - obstack_grow_str0 (&objfile->objfile_obstack, name); - entry_p - = (struct elf_gnu_ifunc_cache *) obstack_finish (&objfile->objfile_obstack); - - slot = htab_find_slot (htab, entry_p, INSERT); - if (*slot != NULL) + auto [it, inserted] = cache.emplace (name, addr); + if (!inserted && it->second != addr) { - struct elf_gnu_ifunc_cache *entry_found_p - = (struct elf_gnu_ifunc_cache *) *slot; + /* This case indicates buggy inferior program, the resolved + address should never change. */ struct gdbarch *gdbarch = objfile->arch (); - if (entry_found_p->addr != addr) - { - /* This case indicates buggy inferior program, the resolved address - should never change. */ - - warning (_("gnu-indirect-function \"%s\" has changed its resolved " - "function_address from %s to %s"), - name, paddress (gdbarch, entry_found_p->addr), - paddress (gdbarch, addr)); - } + warning (_("gnu-indirect-function \"%s\" has changed its " + "resolved function_address from %s to %s"), + name, paddress (gdbarch, it->second), + paddress (gdbarch, addr)); - /* New ENTRY_P is here leaked/duplicate in the OBJFILE obstack. */ + it->second = addr; } - *slot = entry_p; gnu_ifunc_debug_printf ("cached \"%s\" -> %s in objfile %s", name, paddress (objfile->arch (), addr), @@ -822,30 +766,20 @@ elf_gnu_ifunc_resolve_by_cache (const char *name, CORE_ADDR *addr_p) current_program_space->iterate_over_objfiles_in_search_order ([name, &addr_p, &found] (struct objfile *objfile) { - htab_t htab; - elf_gnu_ifunc_cache *entry_p; - void **slot; - - htab = elf_objfile_gnu_ifunc_cache_data.get (objfile); - if (htab == NULL) + elf_gnu_ifunc_cache *cache + = elf_objfile_gnu_ifunc_cache_data.get (objfile); + if (cache == nullptr) return 0; - entry_p = ((elf_gnu_ifunc_cache *) - alloca (sizeof (*entry_p) + strlen (name))); - strcpy (entry_p->name, name); - - slot = htab_find_slot (htab, entry_p, NO_INSERT); - if (slot == NULL) + auto it = cache->find (name); + if (it == cache->end ()) return 0; - entry_p = (elf_gnu_ifunc_cache *) *slot; - gdb_assert (entry_p != NULL); - if (addr_p) - *addr_p = entry_p->addr; + if (addr_p != nullptr) + *addr_p = it->second; gnu_ifunc_debug_printf ("cache hit for \"%s\" -> %s in objfile %s", - name, - paddress (objfile->arch (), entry_p->addr), + name, paddress (objfile->arch (), it->second), objfile_name (objfile)); found = 1; return 1; -- 2.53.0