google / google/autofdo

create_gcov ignores discriminators declared as DW_FORM_implicit_const

Open
#248 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.