GDB: Work around buggy dwarf line information produced by Codewarrior Version 5.0.40 (build 15175).
gdb/ChangeLog: * dwarf2read.c (dwarf2_cu) <producer_is_codewarrior>: 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.
This commit is contained in:
parent
25cbdcbbc5
commit
c258c396fa
|
@ -1,3 +1,12 @@
|
|||
2018-10-08 John Darrington <john@darrington.wattle.id.au>
|
||||
|
||||
* dwarf2read.c (dwarf2_cu) <producer_is_codewarrior>: 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 <tom@tromey.com>
|
||||
|
||||
PR python/19399:
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue