aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorJohn Darrington <john@darrington.wattle.id.au>2018-09-20 19:52:07 +0200
committerJohn Darrington <john@darrington.wattle.id.au>2018-10-08 10:59:59 +0200
commitc258c396faa626a4c7929a5ec97ee9b294073c5e (patch)
tree3c32354dc94c97b4b1ad9ba2fce85a43bbb8d915 /gdb
parent25cbdcbbc5d2d4ca834790b1d370fe5159b560de (diff)
downloadgdb-c258c396faa626a4c7929a5ec97ee9b294073c5e.zip
gdb-c258c396faa626a4c7929a5ec97ee9b294073c5e.tar.gz
gdb-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/ChangeLog9
-rw-r--r--gdb/dwarf2read.c19
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;