diff options
author | John Darrington <john@darrington.wattle.id.au> | 2018-09-20 19:52:07 +0200 |
---|---|---|
committer | John Darrington <john@darrington.wattle.id.au> | 2018-10-08 10:59:59 +0200 |
commit | c258c396faa626a4c7929a5ec97ee9b294073c5e (patch) | |
tree | 3c32354dc94c97b4b1ad9ba2fce85a43bbb8d915 /gdb | |
parent | 25cbdcbbc5d2d4ca834790b1d370fe5159b560de (diff) | |
download | binutils-c258c396faa626a4c7929a5ec97ee9b294073c5e.zip binutils-c258c396faa626a4c7929a5ec97ee9b294073c5e.tar.gz binutils-c258c396faa626a4c7929a5ec97ee9b294073c5e.tar.bz2 |
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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 19 |
2 files changed, 27 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d896bf4..0218bc2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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: diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index e0fd565..c952996 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; |