From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 87191 invoked by alias); 10 Feb 2020 21:48:50 -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 87182 invoked by uid 89); 10 Feb 2020 21:48:49 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.8 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy=1908 X-HELO: mail-wm1-f68.google.com Received: from mail-wm1-f68.google.com (HELO mail-wm1-f68.google.com) (209.85.128.68) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 10 Feb 2020 21:48:47 +0000 Received: by mail-wm1-f68.google.com with SMTP id t23so966329wmi.1 for ; Mon, 10 Feb 2020 13:48:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=zAQFaQK4NxciTDYGQEP8YcnBNq5Z/nnAjYAbSjt+hhE=; b=XBTDOgoZNdNigzJqhKeD3Lrxq7ZCaXbaW0GalWmSAzkd+RZnU5Y+gpRkIzySU1iAAL FcSrUVb8qdk8k/TEVjuh6wM1463yKRHWpBfW9qKFwWhtxGowzVyPWaljVJ9LP0nY/0qn PlPdWl4lOctG1wlF6GXXGT+YyopHkExbb4TfRkcuZnh23bFc6lisAbaLzJlXsmhgXbvz kPjY2EszUGYT9l7i9oDoL3QbZDAh0TbV3gjkcwkaK1k2LrNTmKKeCJWtnfGeOrZ+5v1y z96d1vMgzHypnhMal3PGcxccv7Kw0gk2lI9hTrDDCo1eo5XPBg4arvHdDXTo6BfG7Osy klIQ== Return-Path: Received: from localhost (host81-151-181-192.range81-151.btcentralplus.com. [81.151.181.192]) by smtp.gmail.com with ESMTPSA id g15sm2292478wro.65.2020.02.10.13.48.44 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 10 Feb 2020 13:48:45 -0800 (PST) Date: Mon, 10 Feb 2020 21:48:00 -0000 From: Andrew Burgess To: Bernd Edlinger Cc: "gdb-patches@sourceware.org" Subject: Re: [PATCH] Fix range end handling of inlined subroutines Message-ID: <20200210214844.GN4020@embecosm.com> References: <94e33268f64060fc887670f4ee5ed524050cbcc7.1580902412.git.andrew.burgess@embecosm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Fortune: spaghetti cable cause packet failure X-Editor: GNU Emacs [ http://www.gnu.org/software/emacs ] User-Agent: Mutt/1.9.2 (2017-12-15) X-IsSubscribed: yes X-SW-Source: 2020-02/txt/msg00296.txt.bz2 * Bernd Edlinger [2020-02-09 21:07:32 +0000]: > This patch itself is preliminary, since the is-stmt patch > needs to be rebased after the refactoring of > dwarf2read.c from yesterday, so I will have to rebase > this patch as well, but decided to wait for Andrew. I've been busy with other projects for the last few days, but plan to look at this series tomorrow. Thanks, Andrew > > > Thanks > Bernd. > From d15f3346feb1ed5cbbc14e708f3f6b58d88bc0fe Mon Sep 17 00:00:00 2001 > From: Bernd Edlinger > Date: Sun, 9 Feb 2020 21:13:17 +0100 > Subject: [PATCH] Fix range end handling of inlined subroutines > > Since the is_stmt is now handled, it became > possible to locate dubious is_stmt line entries > at the end of an inlined function, in the same > subfile. > > If any is-stmt line is followed by a non-is-stmt, > at the same PC as the inlined subroutine ends, > clear the is-stmt there (except the line = 0 > end marker, of course). > > This is about the best we can do at the moment, > unless location view information are added to the > block ranges debug info structure, and location > views are implemented in gdb in general. > > gdb: > 2020-02-09 Bernd Edlinger > > * buildsym.c (buildsym_compunit::record_inline_range_end): > New function. > * buildsym.h (buildsym_compunit::record_inline_range_end): Declare. > * dwarf2read.c (dwarf2_rnglists_process, > dwarf2_ranges_process): Don't ignore empty ranges here. > (dwarf2_ranges_read): Ignore empty ranges here. > (dwarf2_record_block_ranges): Pass end of range PC to > record_inline_range_end for inline functions. > > gdb/testsuite: > 2020-02-09 Bernd Edlinger > > * gdb.cp/next-inline.exp: Adjust test. > --- > gdb/buildsym.c | 23 +++++++++++++++++++++++ > gdb/buildsym.h | 2 ++ > gdb/dwarf2read.c | 22 +++++++++++++--------- > gdb/testsuite/gdb.cp/next-inline.exp | 9 --------- > 4 files changed, 38 insertions(+), 18 deletions(-) > > diff --git a/gdb/buildsym.c b/gdb/buildsym.c > index 7fd256f..381a7c8 100644 > --- a/gdb/buildsym.c > +++ b/gdb/buildsym.c > @@ -732,6 +732,29 @@ buildsym_compunit::record_line (struct subfile *subfile, int line, > } > > > +/* Record a PC where a inlined subroutine ends. */ > + > +void > +buildsym_compunit::record_inline_range_end (CORE_ADDR end) > +{ > + struct subfile *subfile; > + > + for (subfile = m_subfiles; subfile != NULL; subfile = subfile->next) > + { > + if (subfile->line_vector != NULL) > + { > + struct linetable_entry *items = subfile->line_vector->item; > + int i; > + > + for (i = subfile->line_vector->nitems - 1; i > 0; i--) > + if (items[i].pc == end && items[i - 1].pc == end > + && !items[i].is_stmt && items[i - 1].line != 0) > + items[i - 1].is_stmt = 0; > + } > + } > +} > + > + > /* Subroutine of end_symtab to simplify it. Look for a subfile that > matches the main source file's basename. If there is only one, and > if the main source file doesn't have any symbol or line number > diff --git a/gdb/buildsym.h b/gdb/buildsym.h > index c768a4c..3cf0f8b 100644 > --- a/gdb/buildsym.h > +++ b/gdb/buildsym.h > @@ -190,6 +190,8 @@ struct buildsym_compunit > void record_line (struct subfile *subfile, int line, CORE_ADDR pc, > bool is_stmt); > > + void record_inline_range_end (CORE_ADDR end); > + > struct compunit_symtab *get_compunit_symtab () > { > return m_compunit_symtab; > diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c > index cbee4ab..6919bf1 100644 > --- a/gdb/dwarf2read.c > +++ b/gdb/dwarf2read.c > @@ -14407,10 +14407,6 @@ dwarf2_rnglists_process (unsigned offset, struct dwarf2_cu *cu, > return false; > } > > - /* Empty range entries have no effect. */ > - if (range_beginning == range_end) > - continue; > - > range_beginning += base; > range_end += base; > > @@ -14521,10 +14517,6 @@ dwarf2_ranges_process (unsigned offset, struct dwarf2_cu *cu, > return 0; > } > > - /* Empty range entries have no effect. */ > - if (range_beginning == range_end) > - continue; > - > range_beginning += base; > range_end += base; > > @@ -14564,6 +14556,10 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return, > retval = dwarf2_ranges_process (offset, cu, > [&] (CORE_ADDR range_beginning, CORE_ADDR range_end) > { > + /* Empty range entries have no effect. */ > + if (range_beginning == range_end) > + return; > + > if (ranges_pst != NULL) > { > CORE_ADDR lowpc; > @@ -14801,6 +14797,7 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block, > struct gdbarch *gdbarch = get_objfile_arch (objfile); > struct attribute *attr; > struct attribute *attr_high; > + bool inlined_subroutine = (die->tag == DW_TAG_inlined_subroutine); > > attr_high = dwarf2_attr (die, DW_AT_high_pc, cu); > if (attr_high) > @@ -14816,7 +14813,10 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block, > > low = gdbarch_adjust_dwarf2_addr (gdbarch, low + baseaddr); > high = gdbarch_adjust_dwarf2_addr (gdbarch, high + baseaddr); > - cu->get_builder ()->record_block_range (block, low, high - 1); > + if (inlined_subroutine) > + cu->get_builder ()->record_inline_range_end (high); > + if (low < high) > + cu->get_builder ()->record_block_range (block, low, high - 1); > } > } > > @@ -14841,6 +14841,10 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block, > end += baseaddr; > start = gdbarch_adjust_dwarf2_addr (gdbarch, start); > end = gdbarch_adjust_dwarf2_addr (gdbarch, end); > + if (inlined_subroutine) > + cu->get_builder ()->record_inline_range_end (end); > + if (start == end) > + return; > cu->get_builder ()->record_block_range (block, start, end - 1); > blockvec.emplace_back (start, end); > }); > diff --git a/gdb/testsuite/gdb.cp/next-inline.exp b/gdb/testsuite/gdb.cp/next-inline.exp > index 0b2b22d..11d9e2e 100644 > --- a/gdb/testsuite/gdb.cp/next-inline.exp > +++ b/gdb/testsuite/gdb.cp/next-inline.exp > @@ -42,24 +42,15 @@ proc do_test { use_header } { > gdb_test "step" ".*" "step into get_alias_set" > gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \ > "not in inline 1" > - # It's possible that this first failure (when not using a header > - # file) is GCC's fault, though the remaining failures would best > - # be fixed by adding location views support (though it could be > - # that some easier heuristic could be figured out). Still, it is > - # not certain that the first failure wouldn't also be fixed by > - # having location view support, so for now it is tagged as such. > - if {!$use_header} { setup_kfail "*-*-*" symtab/25507 } > gdb_test "next" ".*TREE_TYPE.*" "next step 1" > gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \ > "not in inline 2" > gdb_test "next" ".*TREE_TYPE.*" "next step 2" > gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \ > "not in inline 3" > - if {!$use_header} { setup_kfail "*-*-*" symtab/25507 } > gdb_test "next" ".*TREE_TYPE.*" "next step 3" > gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \ > "not in inline 4" > - if {!$use_header} { setup_kfail "*-*-*" symtab/25507 } > gdb_test "next" "return 0.*" "next step 4" > gdb_test "bt" \ > "\\s*\\#0\\s+(main|get_alias_set)\[^\r\]*${srcfile}:.*" \ > -- > 1.9.1 >