From patchwork Mon Dec 23 01:51:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 37074 Received: (qmail 42063 invoked by alias); 23 Dec 2019 01:51:16 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 42005 invoked by uid 89); 23 Dec 2019 01:51:16 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.1 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=indication, survived, developing, get_builder X-HELO: mail-wm1-f53.google.com Received: from mail-wm1-f53.google.com (HELO mail-wm1-f53.google.com) (209.85.128.53) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 23 Dec 2019 01:51:14 +0000 Received: by mail-wm1-f53.google.com with SMTP id b19so14421970wmj.4 for ; Sun, 22 Dec 2019 17:51:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=XetHzsO/0J2dlDon2WEVzlE4R+vX728OBeVc9ZuDPnc=; b=HYafVqSyZ5yUc5oWMOe4tBodTRFBt5JhEg5/+h2P2Hj47QSYZebiXNvWFRHTR5wq3D 2D07nxwzJUV6w64OOuNn6HGOvz8IULERts66JTq+RO3WJVl6ND/05cRfx4NiJr6Uzijl HkhlkFV8+CFfbUxtDrgKuRS0rB7S3FXlHB2PkrGhnZQBSrzFodN69ZZDZXTJpF4dUlJk JSgIDC2iu5MTpEaZuu46yDqBOZu/hA2mvIoT5mZV5UxR6NfseZ5YZ5ke2MnH+IcEJxUr oPRtToaq5bw666COmOKvr1kxTbrK9uDTTlA39Wkv+nZ4tSO+ZuWK3dkdEMxX8CQjGPpA SRig== Return-Path: Received: from localhost (host86-186-80-236.range86-186.btcentralplus.com. [86.186.80.236]) by smtp.gmail.com with ESMTPSA id k16sm19807807wru.0.2019.12.22.17.51.11 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 22 Dec 2019 17:51:11 -0800 (PST) From: Andrew Burgess To: gdb-patches@sourceware.org Cc: Andrew Burgess Subject: [PATCH 1/3] gdb: Include end of sequence markers in the line table Date: Mon, 23 Dec 2019 01:51:05 +0000 Message-Id: In-Reply-To: References: In-Reply-To: References: X-IsSubscribed: yes In this commit: commit d9b3de22f33e400f7f409cce3acf6c7dab07dd79 Date: Wed May 27 14:44:29 2015 -0700 Add struct to record dwarf line number state machine. I believe an unintended change was made to how we store the DWARF line table, the end of sequence markers between sequences of lines were lost from the line table. This commit fixes this small oversight and restores the end of sequence markers. Given that we've survived this long without noticing is clearly an indication that this isn't that serious, however, a later patch that I am developing would benefit from having the markers in place, so I'd like to restore them. Having the markers also means that the output of 'maintenance info line-table' now more closely reflects the DWARF line table. I've taken this opportunity to improve how 'maintenance info line-table' displays the end of sequence markers - it now uses the END keyword, rather than just printing an entry with line number 0. So we see this: INDEX LINE ADDRESS 0 12 0x00000000004003b0 1 17 0x00000000004003b0 2 18 0x00000000004003b0 3 END 0x00000000004003b7 4 5 0x00000000004004a0 5 6 0x00000000004004a0 6 END 0x00000000004004a7 Instead of what we would have seen, which was this: INDEX LINE ADDRESS 0 12 0x00000000004003b0 1 17 0x00000000004003b0 2 18 0x00000000004003b0 3 0 0x00000000004003b7 4 5 0x00000000004004a0 5 6 0x00000000004004a0 6 0 0x00000000004004a7 I've added a small test that uses 'maintenance info line-table' to ensure that we don't regress this again. gdb/ChangeLog: * dwarf2read.c (lnp_state_machine::record_line): Include end_sequence parameter in debug print out. Record the line if we are at an end_sequence marker even if it's not the start of a statement. * symmisc.c (maintenance_print_one_line_table): Print end of sequence markers with 'END' not '0'. gdb/testsuite/ChangeLog: * gdb.base/maint.exp: Update line table parsing test. * gdb.dwarf2/dw2-ranges-base.exp: Add new line table parsing test. Change-Id: I002f872248db82a1d4fefdc6b51ff5dbf932d8a8 --- gdb/ChangeLog | 9 +++++++++ gdb/dwarf2read.c | 8 +++++--- gdb/symmisc.c | 8 ++++++-- gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.base/maint.exp | 20 ++++++++++++++------ gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp | 22 ++++++++++++++++++++++ 6 files changed, 61 insertions(+), 11 deletions(-) diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 685d9962978..c37df3ea9d0 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -21314,10 +21314,11 @@ lnp_state_machine::record_line (bool end_sequence) { fprintf_unfiltered (gdb_stdlog, "Processing actual line %u: file %u," - " address %s, is_stmt %u, discrim %u\n", + " address %s, is_stmt %u, discrim %u%s\n", m_line, m_file, paddress (m_gdbarch, m_address), - m_is_stmt, m_discriminator); + m_is_stmt, m_discriminator, + (end_sequence ? "\t(end sequence)" : "")); } file_entry *fe = current_file (); @@ -21330,7 +21331,8 @@ lnp_state_machine::record_line (bool end_sequence) else if (m_op_index == 0 || end_sequence) { fe->included_p = 1; - if (m_record_lines_p && (producer_is_codewarrior (m_cu) || m_is_stmt)) + if (m_record_lines_p + && (producer_is_codewarrior (m_cu) || m_is_stmt || end_sequence)) { if (m_last_subfile != m_cu->get_builder ()->get_current_subfile () || end_sequence) diff --git a/gdb/symmisc.c b/gdb/symmisc.c index 69d035dc843..9e510432f35 100644 --- a/gdb/symmisc.c +++ b/gdb/symmisc.c @@ -1000,8 +1000,12 @@ maintenance_print_one_line_table (struct symtab *symtab, void *data) struct linetable_entry *item; item = &linetable->item [i]; - printf_filtered (_("%-6d %6d %s\n"), i, item->line, - core_addr_to_string (item->pc)); + printf_filtered ("%-6d ", i); + if (item->line > 0) + printf_filtered ("%6d ", item->line); + else + printf_filtered ("%6s ", _("END")); + printf_filtered ("%s\n", core_addr_to_string (item->pc)); } } diff --git a/gdb/testsuite/gdb.base/maint.exp b/gdb/testsuite/gdb.base/maint.exp index 15988c79386..90220632076 100644 --- a/gdb/testsuite/gdb.base/maint.exp +++ b/gdb/testsuite/gdb.base/maint.exp @@ -508,8 +508,8 @@ gdb_test "maint" \ # Test that "main info line-table" w/o a file name shows the symtab for # $srcfile. set saw_srcfile 0 -set test "maint info line-table w/o a file name" -gdb_test_multiple "maint info line-table" $test { +gdb_test_multiple "maint info line-table" \ + "maint info line-table w/o a file name" { -re "symtab: \[^\n\r\]+${srcfile} \\(\\(struct symtab \\*\\) $hex\\)\r\nlinetable: \\(\\(struct linetable \\*\\) $hex\\):\r\nINDEX\[ \t\]+LINE\[ \t\]+ADDRESS" { set saw_srcfile 1 exp_continue @@ -518,7 +518,11 @@ gdb_test_multiple "maint info line-table" $test { # Match each symtab to avoid overflowing expect's buffer. exp_continue } - -re "$decimal\[ \t\]+$decimal\[ \t\]+$hex\r\n" { + -re "symtab: \[^\n\r\]+ \\(\\(struct symtab \\*\\) $hex\\)\r\nlinetable: \\(\\(struct linetable \\*\\) 0x0\\):\r\nNo line table.\r\n" { + # For symtabs with no linetable. + exp_continue + } + -re "^$decimal\[ \t\]+$decimal\[ \t\]+$hex\r\n" { # Line table entries can be long too: # # INDEX LINE ADDRESS @@ -531,13 +535,17 @@ gdb_test_multiple "maint info line-table" $test { # 6 45 0x0000000000400740 # (...) # 454 129 0x00007ffff7df1d28 - # 455 0 0x00007ffff7df1d3f + # 455 END 0x00007ffff7df1d3f # # Match each line to avoid overflowing expect's buffer. exp_continue } - -re "$gdb_prompt $" { - gdb_assert $saw_srcfile $test + -re "^$decimal\[ \t\]+END\[ \t\]+$hex\r\n" { + # Matches an end marker in the above. + exp_continue + } + -re "^$gdb_prompt $" { + gdb_assert $saw_srcfile $gdb_test_name } } diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp b/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp index 5405d7dc9bb..cff9055cc91 100644 --- a/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp +++ b/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp @@ -141,3 +141,25 @@ gdb_test "info line frame2" \ "Line 21 of .* starts at address .* and ends at .*" gdb_test "info line frame3" \ "Line 31 of .* starts at address .* and ends at .*" + +# Ensure that the line table correctly tracks the end of sequence markers. +set end_seq_count 0 +gdb_test_multiple "maint info line-table" \ + "count END markers in line table" { + -re "^$decimal\[ \t\]+$decimal\[ \t\]+$hex\r\n" { + exp_continue + } + -re "^$decimal\[ \t\]+END\[ \t\]+$hex\r\n" { + incr end_seq_count + exp_continue + } + -re "^$gdb_prompt $" { + gdb_assert [expr $end_seq_count == 3] $gdb_test_name + } + -re ".*linetable: \\(\\(struct linetable \\*\\) 0x0\\):\r\nNo line table.\r\n" { + exp_continue + } + -re ".*linetable: \\(\\(struct linetable \\*\\) $hex\\):\r\nINDEX\[ \t\]+LINE\[ \t\]+ADDRESS\r\n" { + exp_continue + } + }