Skip to content

Commit

Permalink
Fix overlay for breakpad.
Browse files Browse the repository at this point in the history
 Version 1091 of breakpad change signature of some methods that were
overlayed, resulting in the wrong method being called and preventing
file and line number to be computed.

R=mark@chromium.org
BUG=174340


Review URL: https://chromiumcodereview.appspot.com/12213014

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@180727 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
qsr@chromium.org committed Feb 5, 2013
1 parent 4814eda commit 839cfc3
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 133 deletions.
12 changes: 4 additions & 8 deletions breakpad/pending/src/common/dwarf_cu_to_module.cc
Original file line number Diff line number Diff line change
Expand Up @@ -506,8 +506,7 @@ class DwarfCUToModule::NamedScopeHandler: public GenericDIEHandler {
uint64 offset)
: GenericDIEHandler(cu_context, parent_context, offset) { }
bool EndAttributes();
DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag,
const AttributeList &attrs);
DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag);

private:
DIEContext child_context_; // A context for our children.
Expand All @@ -521,8 +520,7 @@ bool DwarfCUToModule::NamedScopeHandler::EndAttributes() {

dwarf2reader::DIEHandler *DwarfCUToModule::NamedScopeHandler::FindChildHandler(
uint64 offset,
enum DwarfTag tag,
const AttributeList &attrs) {
enum DwarfTag tag) {
switch (tag) {
case dwarf2reader::DW_TAG_subprogram:
return new FuncHandler(cu_context_, &child_context_, offset);
Expand Down Expand Up @@ -663,8 +661,7 @@ bool DwarfCUToModule::EndAttributes() {

dwarf2reader::DIEHandler *DwarfCUToModule::FindChildHandler(
uint64 offset,
enum DwarfTag tag,
const AttributeList &attrs) {
enum DwarfTag tag) {
switch (tag) {
case dwarf2reader::DW_TAG_subprogram:
return new FuncHandler(cu_context_, child_context_, offset);
Expand Down Expand Up @@ -1017,8 +1014,7 @@ bool DwarfCUToModule::StartCompilationUnit(uint64 offset,
return dwarf_version >= 2;
}

bool DwarfCUToModule::StartRootDIE(uint64 offset, enum DwarfTag tag,
const AttributeList& attrs) {
bool DwarfCUToModule::StartRootDIE(uint64 offset, enum DwarfTag tag) {
// We don't deal with partial compilation units (the only other tag
// likely to be used for root DIE).
return tag == dwarf2reader::DW_TAG_compile_unit;
Expand Down
7 changes: 2 additions & 5 deletions breakpad/pending/src/common/dwarf_cu_to_module.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@

namespace google_breakpad {

using dwarf2reader::AttributeList;
using dwarf2reader::DwarfAttribute;
using dwarf2reader::DwarfForm;
using dwarf2reader::DwarfLanguage;
Expand Down Expand Up @@ -199,8 +198,7 @@ class DwarfCUToModule: public dwarf2reader::RootDIEHandler {
enum DwarfForm form,
const string &data);
bool EndAttributes();
DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag,
const AttributeList &attrs);
DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag);

// Assign all our source Lines to the Functions that cover their
// addresses, and then add them to module_.
Expand All @@ -209,8 +207,7 @@ class DwarfCUToModule: public dwarf2reader::RootDIEHandler {
bool StartCompilationUnit(uint64 offset, uint8 address_size,
uint8 offset_size, uint64 cu_length,
uint8 dwarf_version);
bool StartRootDIE(uint64 offset, enum DwarfTag tag,
const AttributeList& attrs);
bool StartRootDIE(uint64 offset, enum DwarfTag tag);

private:

Expand Down
138 changes: 18 additions & 120 deletions breakpad/pending/src/common/dwarf_cu_to_module_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@

using std::vector;

using dwarf2reader::AttributeList;
using dwarf2reader::DIEHandler;
using dwarf2reader::DwarfTag;
using dwarf2reader::DwarfAttribute;
Expand Down Expand Up @@ -174,11 +173,7 @@ class CUFixtureBase {
// this.root_handler_.EndAttributes, but not this.root_handler_.Finish.
void StartCU();

// Add some strange attributes/form pairs to the end of ATTRS.
void PushBackStrangeAttributes(dwarf2reader::AttributeList *attrs);

// Have HANDLER process some strange attribute/form/value triples.
// These will match those promised by PushBackStrangeAttributes.
void ProcessStrangeAttributes(dwarf2reader::DIEHandler *handler);

// Start a child DIE of PARENT with the given tag and name. Leave
Expand Down Expand Up @@ -328,20 +323,8 @@ void CUFixtureBase::StartCU() {
.StartCompilationUnit(0x51182ec307610b51ULL, 0x81, 0x44,
0x4241b4f33720dd5cULL, 3));
{
dwarf2reader::AttributeList attrs;
attrs.push_back(make_pair(dwarf2reader::DW_AT_name,
dwarf2reader::DW_FORM_strp));
if (!lines_.empty())
attrs.push_back(make_pair(dwarf2reader::DW_AT_stmt_list,
dwarf2reader::DW_FORM_ref4));
if (language_ != dwarf2reader::DW_LANG_none)
attrs.push_back(make_pair(dwarf2reader::DW_AT_language,
language_signed_
? dwarf2reader::DW_FORM_sdata
: dwarf2reader::DW_FORM_udata));
ASSERT_TRUE(root_handler_.StartRootDIE(0x02e56bfbda9e7337ULL,
dwarf2reader::DW_TAG_compile_unit,
attrs));
dwarf2reader::DW_TAG_compile_unit));
}
root_handler_.ProcessAttributeString(dwarf2reader::DW_AT_name,
dwarf2reader::DW_FORM_strp,
Expand All @@ -363,20 +346,6 @@ void CUFixtureBase::StartCU() {
ASSERT_TRUE(root_handler_.EndAttributes());
}

void CUFixtureBase::PushBackStrangeAttributes(
dwarf2reader::AttributeList *attrs) {
attrs->push_back(make_pair((DwarfAttribute) 0xf560dead,
(DwarfForm) 0x4106e4db));
attrs->push_back(make_pair((DwarfAttribute) 0x85380095,
(DwarfForm) 0x0f16fe87));
attrs->push_back(make_pair((DwarfAttribute) 0xf7f7480f,
(DwarfForm) 0x829e038a));
attrs->push_back(make_pair((DwarfAttribute) 0xa55ffb51,
(DwarfForm) 0x2f43b041));
attrs->push_back(make_pair((DwarfAttribute) 0x2fde304a,
(DwarfForm) 0x895ffa23));
}

void CUFixtureBase::ProcessStrangeAttributes(
dwarf2reader::DIEHandler *handler) {
handler->ProcessAttributeUnsigned((DwarfAttribute) 0xf560dead,
Expand All @@ -400,12 +369,8 @@ void CUFixtureBase::ProcessStrangeAttributes(
DIEHandler *CUFixtureBase::StartNamedDIE(DIEHandler *parent,
DwarfTag tag,
const string &name) {
dwarf2reader::AttributeList attrs;
attrs.push_back(make_pair(dwarf2reader::DW_AT_name,
dwarf2reader::DW_FORM_strp));
PushBackStrangeAttributes(&attrs);
dwarf2reader::DIEHandler *handler
= parent->FindChildHandler(incrementing_offset_++, tag, attrs);
= parent->FindChildHandler(incrementing_offset_++, tag);
if (!handler)
return NULL;
handler->ProcessAttributeString(dwarf2reader::DW_AT_name,
Expand All @@ -425,14 +390,8 @@ DIEHandler *CUFixtureBase::StartSpecifiedDIE(DIEHandler *parent,
DwarfTag tag,
uint64 specification,
const char *name) {
dwarf2reader::AttributeList attrs;
if (name)
attrs.push_back(make_pair(dwarf2reader::DW_AT_name,
dwarf2reader::DW_FORM_strp));
attrs.push_back(make_pair(dwarf2reader::DW_AT_specification,
dwarf2reader::DW_FORM_ref4));
dwarf2reader::DIEHandler *handler
= parent->FindChildHandler(incrementing_offset_++, tag, attrs);
= parent->FindChildHandler(incrementing_offset_++, tag);
if (!handler)
return NULL;
if (name)
Expand All @@ -454,18 +413,9 @@ DIEHandler *CUFixtureBase::StartSpecifiedDIE(DIEHandler *parent,
void CUFixtureBase::DefineFunction(dwarf2reader::DIEHandler *parent,
const string &name, Module::Address address,
Module::Address size) {
dwarf2reader::AttributeList func_attrs;
func_attrs.push_back(make_pair(dwarf2reader::DW_AT_name,
dwarf2reader::DW_FORM_strp));
func_attrs.push_back(make_pair(dwarf2reader::DW_AT_low_pc,
dwarf2reader::DW_FORM_addr));
func_attrs.push_back(make_pair(dwarf2reader::DW_AT_high_pc,
dwarf2reader::DW_FORM_addr));
PushBackStrangeAttributes(&func_attrs);
dwarf2reader::DIEHandler *func
= parent->FindChildHandler(incrementing_offset_++,
dwarf2reader::DW_TAG_subprogram,
func_attrs);
dwarf2reader::DW_TAG_subprogram);
ASSERT_TRUE(func != NULL);
func->ProcessAttributeString(dwarf2reader::DW_AT_name,
dwarf2reader::DW_FORM_strp,
Expand All @@ -485,13 +435,7 @@ void CUFixtureBase::DefineFunction(dwarf2reader::DIEHandler *parent,
void CUFixtureBase::DeclarationDIE(DIEHandler *parent, uint64 offset,
DwarfTag tag,
const string &name) {
dwarf2reader::AttributeList attrs;
if (!name.empty())
attrs.push_back(make_pair(dwarf2reader::DW_AT_name,
dwarf2reader::DW_FORM_strp));
attrs.push_back(make_pair(dwarf2reader::DW_AT_declaration,
dwarf2reader::DW_FORM_flag));
dwarf2reader::DIEHandler *die = parent->FindChildHandler(offset, tag, attrs);
dwarf2reader::DIEHandler *die = parent->FindChildHandler(offset, tag);
ASSERT_TRUE(die != NULL);
if (!name.empty())
die->ProcessAttributeString(dwarf2reader::DW_AT_name,
Expand All @@ -511,20 +455,8 @@ void CUFixtureBase::DefinitionDIE(DIEHandler *parent,
const string &name,
Module::Address address,
Module::Address size) {
dwarf2reader::AttributeList attrs;
attrs.push_back(make_pair(dwarf2reader::DW_AT_specification,
dwarf2reader::DW_FORM_ref4));
if (!name.empty())
attrs.push_back(make_pair(dwarf2reader::DW_AT_name,
dwarf2reader::DW_FORM_strp));
if (size) {
attrs.push_back(make_pair(dwarf2reader::DW_AT_low_pc,
dwarf2reader::DW_FORM_addr));
attrs.push_back(make_pair(dwarf2reader::DW_AT_high_pc,
dwarf2reader::DW_FORM_addr));
}
dwarf2reader::DIEHandler *die
= parent->FindChildHandler(0x6ccfea031a9e6cc9ULL, tag, attrs);
= parent->FindChildHandler(0x6ccfea031a9e6cc9ULL, tag);
ASSERT_TRUE(die != NULL);
die->ProcessAttributeReference(dwarf2reader::DW_AT_specification,
dwarf2reader::DW_FORM_ref4,
Expand Down Expand Up @@ -552,16 +484,8 @@ void CUFixtureBase::AbstractInstanceDIE(DIEHandler *parent,
uint64 specification,
const string &name,
DwarfForm form) {
dwarf2reader::AttributeList attrs;
if (specification != 0ULL)
attrs.push_back(make_pair(dwarf2reader::DW_AT_specification,
dwarf2reader::DW_FORM_ref4));
attrs.push_back(make_pair(dwarf2reader::DW_AT_inline, form));
if (!name.empty())
attrs.push_back(make_pair(dwarf2reader::DW_AT_name,
dwarf2reader::DW_FORM_strp));
dwarf2reader::DIEHandler *die
= parent->FindChildHandler(offset, dwarf2reader::DW_TAG_subprogram, attrs);
= parent->FindChildHandler(offset, dwarf2reader::DW_TAG_subprogram);
ASSERT_TRUE(die != NULL);
if (specification != 0ULL)
die->ProcessAttributeReference(dwarf2reader::DW_AT_specification,
Expand All @@ -587,21 +511,9 @@ void CUFixtureBase::DefineInlineInstanceDIE(DIEHandler *parent,
uint64 origin,
Module::Address address,
Module::Address size) {
dwarf2reader::AttributeList func_attrs;
if (!name.empty())
func_attrs.push_back(make_pair(dwarf2reader::DW_AT_name,
dwarf2reader::DW_FORM_strp));
func_attrs.push_back(make_pair(dwarf2reader::DW_AT_low_pc,
dwarf2reader::DW_FORM_addr));
func_attrs.push_back(make_pair(dwarf2reader::DW_AT_high_pc,
dwarf2reader::DW_FORM_addr));
func_attrs.push_back(make_pair(dwarf2reader::DW_AT_abstract_origin,
dwarf2reader::DW_FORM_ref4));
PushBackStrangeAttributes(&func_attrs);
dwarf2reader::DIEHandler *func
= parent->FindChildHandler(0x11c70f94c6e87ccdLL,
dwarf2reader::DW_TAG_subprogram,
func_attrs);
dwarf2reader::DW_TAG_subprogram);
ASSERT_TRUE(func != NULL);
if (!name.empty()) {
func->ProcessAttributeString(dwarf2reader::DW_AT_name,
Expand Down Expand Up @@ -704,22 +616,19 @@ TEST_F(SimpleCU, OneFunc) {

TEST_F(SimpleCU, IrrelevantRootChildren) {
StartCU();
dwarf2reader::AttributeList no_attrs;
EXPECT_FALSE(root_handler_
.FindChildHandler(0x7db32bff4e2dcfb1ULL,
dwarf2reader::DW_TAG_lexical_block, no_attrs));
dwarf2reader::DW_TAG_lexical_block));
}

TEST_F(SimpleCU, IrrelevantNamedScopeChildren) {
StartCU();
dwarf2reader::AttributeList no_attrs;
DIEHandler *class_A_handler
= StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type, "class_A");
EXPECT_TRUE(class_A_handler != NULL);
EXPECT_FALSE(class_A_handler
->FindChildHandler(0x02e55999b865e4e9ULL,
dwarf2reader::DW_TAG_lexical_block,
no_attrs));
dwarf2reader::DW_TAG_lexical_block));
delete class_A_handler;
}

Expand Down Expand Up @@ -1568,7 +1477,6 @@ TEST_F(Specifications, InterCU) {
EXPECT_CALL(reporter_, UncoveredFunction(_)).WillOnce(Return());
MockLineToModuleFunctor lr;
EXPECT_CALL(lr, mock_apply(_,_,_,_)).Times(0);
dwarf2reader::AttributeList no_attrs;

// Kludge: satisfy reporter_'s expectation.
reporter_.SetCUName("compilation-unit-name");
Expand All @@ -1577,10 +1485,8 @@ TEST_F(Specifications, InterCU) {
{
DwarfCUToModule root1_handler(&fc, &lr, &reporter_);
ASSERT_TRUE(root1_handler.StartCompilationUnit(0, 1, 2, 3, 3));
dwarf2reader::AttributeList attrs;
PushBackStrangeAttributes(&attrs);
ASSERT_TRUE(root1_handler.StartRootDIE(1, dwarf2reader::DW_TAG_compile_unit,
attrs));
ASSERT_TRUE(root1_handler.StartRootDIE(1,
dwarf2reader::DW_TAG_compile_unit));
ProcessStrangeAttributes(&root1_handler);
ASSERT_TRUE(root1_handler.EndAttributes());
DeclarationDIE(&root1_handler, 0xb8fbfdd5f0b26fceULL,
Expand All @@ -1592,8 +1498,8 @@ TEST_F(Specifications, InterCU) {
{
DwarfCUToModule root2_handler(&fc, &lr, &reporter_);
ASSERT_TRUE(root2_handler.StartCompilationUnit(0, 1, 2, 3, 3));
ASSERT_TRUE(root2_handler.StartRootDIE(1, dwarf2reader::DW_TAG_compile_unit,
no_attrs));
ASSERT_TRUE(root2_handler.StartRootDIE(1,
dwarf2reader::DW_TAG_compile_unit));
ASSERT_TRUE(root2_handler.EndAttributes());
DIEHandler *class_A_handler
= StartSpecifiedDIE(&root2_handler, dwarf2reader::DW_TAG_class_type,
Expand All @@ -1609,8 +1515,8 @@ TEST_F(Specifications, InterCU) {
{
DwarfCUToModule root3_handler(&fc, &lr, &reporter_);
ASSERT_TRUE(root3_handler.StartCompilationUnit(0, 1, 2, 3, 3));
ASSERT_TRUE(root3_handler.StartRootDIE(1, dwarf2reader::DW_TAG_compile_unit,
no_attrs));
ASSERT_TRUE(root3_handler.StartRootDIE(1,
dwarf2reader::DW_TAG_compile_unit));
ASSERT_TRUE(root3_handler.EndAttributes());
DefinitionDIE(&root3_handler, dwarf2reader::DW_TAG_subprogram,
0xb01fef8b380bd1a2ULL, "",
Expand Down Expand Up @@ -1724,14 +1630,8 @@ TEST_F(CUErrors, BadStmtList) {
ASSERT_TRUE(root_handler_
.StartCompilationUnit(0xc591d5b037543d7cULL, 0x11, 0xcd,
0x2d7d19546cf6590cULL, 3));
dwarf2reader::AttributeList attrs;
attrs.push_back(make_pair(dwarf2reader::DW_AT_name,
dwarf2reader::DW_FORM_strp));
attrs.push_back(make_pair(dwarf2reader::DW_AT_stmt_list,
dwarf2reader::DW_FORM_ref4));
ASSERT_TRUE(root_handler_.StartRootDIE(0xae789dc102cfca54ULL,
dwarf2reader::DW_TAG_compile_unit,
attrs));
dwarf2reader::DW_TAG_compile_unit));
root_handler_.ProcessAttributeString(dwarf2reader::DW_AT_name,
dwarf2reader::DW_FORM_strp,
"compilation-unit-name");
Expand Down Expand Up @@ -1787,10 +1687,8 @@ TEST_F(CUErrors, BadCURootDIETag) {
.StartCompilationUnit(0xadf6e0eb71e2b0d9ULL, 0x4d, 0x90,
0xc9de224ccb99ac3eULL, 3));

dwarf2reader::AttributeList no_attrs;
ASSERT_FALSE(root_handler_.StartRootDIE(0x02e56bfbda9e7337ULL,
dwarf2reader::DW_TAG_subprogram,
no_attrs));
dwarf2reader::DW_TAG_subprogram));
}

// Tests for DwarfCUToModule::Reporter. These just produce (or fail to
Expand Down

0 comments on commit 839cfc3

Please sign in to comment.