From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17546 invoked by alias); 19 Mar 2011 21:15:54 -0000 Received: (qmail 17537 invoked by uid 22791); 19 Mar 2011 21:15:53 -0000 X-SWARE-Spam-Status: No, hits=-5.6 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 19 Mar 2011 21:15:48 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p2JLFlOi025495 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sat, 19 Mar 2011 17:15:47 -0400 Received: from host1.jankratochvil.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p2JLFiIx024407 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sat, 19 Mar 2011 17:15:47 -0400 Received: from host1.jankratochvil.net (localhost [127.0.0.1]) by host1.jankratochvil.net (8.14.4/8.14.4) with ESMTP id p2JLFi3a003153 for ; Sat, 19 Mar 2011 22:15:44 +0100 Received: (from jkratoch@localhost) by host1.jankratochvil.net (8.14.4/8.14.4/Submit) id p2JLFiAT003148 for gdb-patches@sourceware.org; Sat, 19 Mar 2011 22:15:44 +0100 Date: Sat, 19 Mar 2011 21:16:00 -0000 From: Jan Kratochvil To: gdb-patches@sourceware.org Subject: [patch 3/7] find_pc_partial_function new parameter Message-ID: <20110319211544.GD30867@host1.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-03/txt/msg00942.txt.bz2 Hi, find_pc_partial_function is heavily called inside GDB, therefore I did not change its prototype and provided find_pc_partial_function_gnu_ifunc instead. While I have no problem with changing all the callers it means passing everywhere the unused additional NULL parameter which may not be a win. Thanks, Jan gdb/ 2011-03-19 Jan Kratochvil GDB find_pc_partial_function support for STT_GNU_IFUNC. * blockframe.c (cache_pc_function_is_gnu_ifunc): New variable. (clear_pc_function_cache): Clear it. (find_pc_partial_function): Rename to ... (find_pc_partial_function_gnu_ifunc): ... this function. New parameter is_gnu_ifunc_p, describe it. Set *IS_GNU_IFUNC_P. (find_pc_partial_function): New wrapper for this function. * symtab.h (find_pc_partial_function_gnu_ifunc): New declaration. --- a/gdb/blockframe.c +++ b/gdb/blockframe.c @@ -163,6 +163,7 @@ static CORE_ADDR cache_pc_function_low = 0; static CORE_ADDR cache_pc_function_high = 0; static char *cache_pc_function_name = 0; static struct obj_section *cache_pc_function_section = NULL; +static int cache_pc_function_is_gnu_ifunc = 0; /* Clear cache, e.g. when symbol table is discarded. */ @@ -173,6 +174,7 @@ clear_pc_function_cache (void) cache_pc_function_high = 0; cache_pc_function_name = (char *) 0; cache_pc_function_section = NULL; + cache_pc_function_is_gnu_ifunc = 0; } /* Finds the "function" (text symbol) that is smaller than PC but @@ -180,17 +182,19 @@ clear_pc_function_cache (void) *NAME and/or *ADDRESS conditionally if that pointer is non-null. If ENDADDR is non-null, then set *ENDADDR to be the end of the function (exclusive), but passing ENDADDR as non-null means that - the function might cause symbols to be read. This function either - succeeds or fails (not halfway succeeds). If it succeeds, it sets - *NAME, *ADDRESS, and *ENDADDR to real information and returns 1. - If it fails, it sets *NAME, *ADDRESS, and *ENDADDR to zero and - returns 0. */ + the function might cause symbols to be read. If IS_GNU_IFUNC_P is provided + *IS_GNU_IFUNC_P is set to 1 on return if the function is STT_GNU_IFUNC. + This function either succeeds or fails (not halfway succeeds). If it + succeeds, it sets *NAME, *ADDRESS, and *ENDADDR to real information and + returns 1. If it fails, it sets *NAME, *ADDRESS, *ENDADDR and + *IS_GNU_IFUNC_P to zero and returns 0. */ /* Backward compatibility, no section argument. */ int -find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address, - CORE_ADDR *endaddr) +find_pc_partial_function_gnu_ifunc (CORE_ADDR pc, char **name, + CORE_ADDR *address, CORE_ADDR *endaddr, + int *is_gnu_ifunc_p) { struct obj_section *section; struct symbol *f; @@ -240,6 +244,7 @@ find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address, cache_pc_function_high = BLOCK_END (SYMBOL_BLOCK_VALUE (f)); cache_pc_function_name = SYMBOL_LINKAGE_NAME (f); cache_pc_function_section = section; + cache_pc_function_is_gnu_ifunc = TYPE_GNU_IFUNC (SYMBOL_TYPE (f)); goto return_cached_value; } } @@ -262,12 +267,15 @@ find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address, *address = 0; if (endaddr != NULL) *endaddr = 0; + if (is_gnu_ifunc_p != NULL) + *is_gnu_ifunc_p = 0; return 0; } cache_pc_function_low = SYMBOL_VALUE_ADDRESS (msymbol); cache_pc_function_name = SYMBOL_LINKAGE_NAME (msymbol); cache_pc_function_section = section; + cache_pc_function_is_gnu_ifunc = MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc; /* If the minimal symbol has a size, use it for the cache. Otherwise use the lesser of the next minimal symbol in the same @@ -330,9 +338,22 @@ find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address, *endaddr = cache_pc_function_high; } + if (is_gnu_ifunc_p) + *is_gnu_ifunc_p = cache_pc_function_is_gnu_ifunc; + return 1; } +/* See find_pc_partial_function_gnu_ifunc, only the IS_GNU_IFUNC_P parameter + is omitted here for backward API compatibility. */ + +int +find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address, + CORE_ADDR *endaddr) +{ + return find_pc_partial_function_gnu_ifunc (pc, name, address, endaddr, NULL); +} + /* Return the innermost stack frame executing inside of BLOCK, or NULL if there is no such frame. If BLOCK is NULL, just return NULL. */ --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -956,6 +956,11 @@ extern struct symbol *find_pc_function (CORE_ADDR); extern struct symbol *find_pc_sect_function (CORE_ADDR, struct obj_section *); +extern int find_pc_partial_function_gnu_ifunc (CORE_ADDR pc, char **name, + CORE_ADDR *address, + CORE_ADDR *endaddr, + int *is_gnu_ifunc_p); + /* lookup function from address, return name, start addr and end addr. */ extern int find_pc_partial_function (CORE_ADDR, char **, CORE_ADDR *,