36 lines
1.6 KiB
Diff
36 lines
1.6 KiB
Diff
|
commit 542447d4708d4418a08e678dcf467af92b90b7ad
|
||
|
Author: Mark Wielaard <mark@klomp.org>
|
||
|
Date: Mon Nov 22 13:07:59 2021 +0100
|
||
|
|
||
|
readdwarf3.c (parse_inl_DIE) inlined_subroutine can appear in namespaces
|
||
|
|
||
|
This was broken by commit 75e3ef0f3 "readdwarf3: Skip units without
|
||
|
addresses when looking for inlined functions". Specifically by this
|
||
|
part: "Also use skip_DIE instead of read_DIE when not parsing
|
||
|
(skipping) children"
|
||
|
|
||
|
rustc puts concrete function instances in namespaces (which is
|
||
|
allowed in DWARF since there is no strict separation between type
|
||
|
declarations and program scope entries in a DIE tree), the inline
|
||
|
parser didn't expect this and so skipped any DIE under a namespace
|
||
|
entry. This wasn't an issue before because "skipping" a DIE tree was
|
||
|
done by reading it, so it wasn't actually skipped. But now that we
|
||
|
really skip the DIE (sub)tree (which is faster than actually parsing
|
||
|
it) some entries were missed in the rustc case.
|
||
|
|
||
|
https://bugs.kde.org/show_bug.cgi?id=445668
|
||
|
|
||
|
diff --git a/coregrind/m_debuginfo/readdwarf3.c b/coregrind/m_debuginfo/readdwarf3.c
|
||
|
index 18eecea9f..5489f8d13 100644
|
||
|
--- a/coregrind/m_debuginfo/readdwarf3.c
|
||
|
+++ b/coregrind/m_debuginfo/readdwarf3.c
|
||
|
@@ -3358,7 +3358,7 @@ static Bool parse_inl_DIE (
|
||
|
// might maybe contain a DW_TAG_inlined_subroutine:
|
||
|
Bool ret = (unit_has_addrs
|
||
|
|| dtag == DW_TAG_lexical_block || dtag == DW_TAG_subprogram
|
||
|
- || dtag == DW_TAG_inlined_subroutine);
|
||
|
+ || dtag == DW_TAG_inlined_subroutine || dtag == DW_TAG_namespace);
|
||
|
return ret;
|
||
|
|
||
|
bad_DIE:
|