From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 83193 invoked by alias); 21 Dec 2017 02:35:44 -0000 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 Received: (qmail 83179 invoked by uid 89); 21 Dec 2017 02:35:43 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=insights X-HELO: smtp.polymtl.ca Received: from smtp.polymtl.ca (HELO smtp.polymtl.ca) (132.207.4.11) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 21 Dec 2017 02:35:42 +0000 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 vBL2ZZCq019672 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 20 Dec 2017 21:35:40 -0500 Received: by simark.ca (Postfix, from userid 112) id D54AF1E59F; Wed, 20 Dec 2017 21:35:35 -0500 (EST) Received: from simark.ca (localhost [127.0.0.1]) by simark.ca (Postfix) with ESMTP id 1CB5D1E4C4; Wed, 20 Dec 2017 21:35:34 -0500 (EST) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Thu, 21 Dec 2017 02:35:00 -0000 From: Simon Marchi To: Xavier Roirand Cc: gdb-patches@sourceware.org, brobecker@adacore.com Subject: Re: [RFA/DWARF v2] Fix breakpoint add on inlined function using function name. In-Reply-To: <1513776096-19313-1-git-send-email-roirand@adacore.com> References: <1513776096-19313-1-git-send-email-roirand@adacore.com> Message-ID: <848029766ceee39c449712a53db88482@polymtl.ca> X-Sender: simon.marchi@polymtl.ca User-Agent: Roundcube Webmail/1.3.2 X-Poly-FromMTA: (simark.ca [158.69.221.121]) at Thu, 21 Dec 2017 02:35:35 +0000 X-IsSubscribed: yes X-SW-Source: 2017-12/txt/msg00459.txt.bz2 On 2017-12-20 08:21, Xavier Roirand wrote: > So far only approved by Joel B. > > Using this Ada example: > > package B is > procedure Read_Small with Inline_Always; > end B; > > package body B is > Total : Natural := 0; > procedure Read_Small is > begin > Total := Total + 1; > end Read_Small; > end B; > > and > > with B; > > procedure M is > begin > B.Read_Small; > end M; > > % gnatmake -g -O0 -m m.adb -cargs -gnatn > % gdb m > > Inserting a breakpoint on Read_Small inlined function does not work: > > (gdb) b read_small > Breakpoint 1 at 0x40250e: file b.adb, line 5. > (gdb) info b > Num Type Disp Enb Address What > 1 breakpoint keep y 0x000000000040250e in b.doit at b.adb:5 > (gdb) > > In this exemple we should have two breakpoints set, one in package B > and "example" > the other one in the inlined instance inside procedure M), like below: > > (gdb) b read_small > Breakpoint 1 at 0x40250e: b.adb:5. (2 locations) > (gdb) info b > Num Type Disp Enb Address What > 1 breakpoint keep y > 1.1 y 0x000000000040250e in b.doit at > b.adb:5 > 1.2 y 0x0000000000402540 in m at b.adb:5 > (gdb) > > Looking at the DWARF info for inlined instance of Read_Small: > > <1><1526>: Abbrev Number: 2 (DW_TAG_subprogram) > <1527> DW_AT_name : ([...], offset: 0x1e82): b__read_small > <152b> DW_AT_decl_file : 2 > <152c> DW_AT_decl_line : 3 > <152d> DW_AT_inline : 3 (declared as inline and > inlined) > [...] > <2><1547>: Abbrev Number: 4 (DW_TAG_inlined_subroutine) > <1548> DW_AT_abstract_origin: <0x1526> > <154c> DW_AT_low_pc : 0x402552 > <1554> DW_AT_high_pc : 0x2b > <155c> DW_AT_call_file : 1 > <155d> DW_AT_call_line : 5 > <2><155e>: Abbrev Number: 0 > > During the parsing of DWARF info in order to produce partial DIE linked > list, the DW_TAG_inlined_subroutine were skipped thus not present in > the > final partial dies. > Taking DW_TAG_inlined_subroutine in account during the parsing process > fixes the problem. Do you have some insights as to why we don't see the same problem in other languages such as C? I tried to make a test case in C similar to yours. I made a shared library that contained a function, with both the standalone instance and an inlined instance. In the beginning, we have only loaded partial symbols for the library. I tried placing a breakpoint on the function, and got the expected two locations. What seems to happen is that placing the breakpoint triggers the read of the full symbols, which eventually finds the inline instance. Do you have any idea what's different about Ada? I don't see anything wrong with the change, but I'm far from an expert in that area :) Simon