From c258c396faa626a4c7929a5ec97ee9b294073c5e Mon Sep 17 00:00:00 2001 From: John Darrington Date: Thu, 20 Sep 2018 19:52:07 +0200 Subject: [PATCH] GDB: Work around buggy dwarf line information produced by Codewarrior Version 5.0.40 (build 15175). gdb/ChangeLog: * dwarf2read.c (dwarf2_cu) : New field. (check_producer): Check if the producer is codewarrior. (producer_is_codewarrior): New function. (lnp_state_machine::record_line): Ignore is_stmt flag for records produced by codewarrior. (dwarf2_cu::dwarf2_cu): Initialize producer_is_codewarrior. --- gdb/ChangeLog | 9 +++++++++ gdb/dwarf2read.c | 19 ++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d896bf48e1c..0218bc29c1f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2018-10-08 John Darrington + + * dwarf2read.c (dwarf2_cu) : New field. + (check_producer): Check if the producer is codewarrior. + (producer_is_codewarrior): New function. + (lnp_state_machine::record_line): Ignore is_stmt flag for records + produced by codewarrior. + (dwarf2_cu::dwarf2_cu): Initialize producer_is_codewarrior. + 2018-10-06 Tom Tromey PR python/19399: diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index e0fd56529ca..c952996f4de 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -552,6 +552,7 @@ struct dwarf2_cu unsigned int producer_is_gxx_lt_4_6 : 1; unsigned int producer_is_gcc_lt_4_3 : 1; unsigned int producer_is_icc_lt_14 : 1; + bool producer_is_codewarrior : 1; /* When set, the file that we're processing is known to have debugging info for C++ namespaces. GCC 3.3.x did not produce @@ -14901,6 +14902,8 @@ check_producer (struct dwarf2_cu *cu) } else if (producer_is_icc (cu->producer, &major, &minor)) cu->producer_is_icc_lt_14 = major < 14; + else if (startswith (cu->producer, "CodeWarrior S12/L-ISA")) + cu->producer_is_codewarrior = true; else { /* For other non-GCC compilers, expect their behavior is DWARF version @@ -14923,6 +14926,19 @@ producer_is_gxx_lt_4_6 (struct dwarf2_cu *cu) return cu->producer_is_gxx_lt_4_6; } + +/* Codewarrior (at least as of version 5.0.40) generates dwarf line information + with incorrect is_stmt attributes. */ + +static bool +producer_is_codewarrior (struct dwarf2_cu *cu) +{ + if (!cu->checked_producer) + check_producer (cu); + + return cu->producer_is_codewarrior; +} + /* Return the default accessibility type if it is not overriden by DW_AT_accessibility. */ @@ -20787,7 +20803,7 @@ 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 && m_is_stmt) + if (m_record_lines_p && (producer_is_codewarrior (m_cu) || m_is_stmt)) { if (m_last_subfile != m_cu->builder->get_current_subfile () || end_sequence) @@ -25118,6 +25134,7 @@ dwarf2_cu::dwarf2_cu (struct dwarf2_per_cu_data *per_cu_) producer_is_gxx_lt_4_6 (0), producer_is_gcc_lt_4_3 (0), producer_is_icc_lt_14 (0), + producer_is_codewarrior (false), processing_has_namespace_info (0) { per_cu->cu = this; -- 2.30.2