create_gcov ignores discriminators declared as DW_FORM_implicit_const
- Dominant language
- C++
- Stars
- 619
- Forks
- 127
- PR merge metrics
- No merged PRs in 30d
Description
If debug info contains
.uleb128 0x2136 # (DW_AT_GNU_discriminator)
.uleb128 0x21 # (DW_FORM_implicit_const)
.sleb128
create_gcov will ignore it. See [](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120938) for testcases.
This can be fixed by handling discriminators both as signed and unsigned same way line numbers are handled already.
diff --git a/util/symbolize/addr2line_inlinestack.cc b/util/symbolize/addr2line_inlinestack.cc
index f68f6e1..8eeb8bd 100644
--- a/util/symbolize/addr2line_inlinestack.cc
+++ b/util/symbolize/addr2line_inlinestack.cc
@@ -493,6 +493,12 @@ void InlineStackHandler::ProcessAttributeSigned(
subprogram_stack_.back()->set_callsite_line(data);
break;
+ // In case discriminator is implicit const, it is processed as signed
+ // rather then unsigned value.
+ case DW_AT_GNU_discriminator:
+ CHECK(form == DW_FORM_implicit_const);
+ subprogram_stack_.back()->set_callsite_discr(data);
+ break;
default:
break;
}
Contributor guide
Assessment
This issue has not been assessed yet.