[dump_syms] Handle DW_TAG_lexical_block to caputre inline info inside.
Bug: b/317143556 Change-Id: Iba82712fedf7d126c2392cfc0f157ded2bca5219 Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/5171059 Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
This commit is contained in:
parent
062f7124f6
commit
22f54f197f
2 changed files with 53 additions and 0 deletions
|
@ -562,6 +562,29 @@ static bool IsEmptyRange(const vector<Module::Range>& ranges) {
|
||||||
return size == 0;
|
return size == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A handler for DW_TAG_lexical_block DIEs.
|
||||||
|
class DwarfCUToModule::LexicalBlockHandler : public GenericDIEHandler {
|
||||||
|
public:
|
||||||
|
LexicalBlockHandler(CUContext* cu_context,
|
||||||
|
uint64_t offset,
|
||||||
|
int inline_nest_level,
|
||||||
|
vector<unique_ptr<Module::Inline>>& inlines)
|
||||||
|
: GenericDIEHandler(cu_context, nullptr, offset),
|
||||||
|
inline_nest_level_(inline_nest_level),
|
||||||
|
inlines_(inlines) {}
|
||||||
|
|
||||||
|
DIEHandler* FindChildHandler(uint64_t offset, enum DwarfTag tag);
|
||||||
|
bool EndAttributes() { return true; }
|
||||||
|
void Finish();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int inline_nest_level_;
|
||||||
|
// A vector of inlines in the same nest level. It's owned by its parent
|
||||||
|
// function/inline. At Finish(), add this inline into the vector.
|
||||||
|
vector<unique_ptr<Module::Inline>>& inlines_;
|
||||||
|
// A vector of child inlines.
|
||||||
|
vector<unique_ptr<Module::Inline>> child_inlines_;
|
||||||
|
};
|
||||||
|
|
||||||
// A handler for DW_TAG_inlined_subroutine DIEs.
|
// A handler for DW_TAG_inlined_subroutine DIEs.
|
||||||
class DwarfCUToModule::InlineHandler : public GenericDIEHandler {
|
class DwarfCUToModule::InlineHandler : public GenericDIEHandler {
|
||||||
|
@ -645,6 +668,9 @@ DIEHandler* DwarfCUToModule::InlineHandler::FindChildHandler(
|
||||||
case DW_TAG_inlined_subroutine:
|
case DW_TAG_inlined_subroutine:
|
||||||
return new InlineHandler(cu_context_, nullptr, offset,
|
return new InlineHandler(cu_context_, nullptr, offset,
|
||||||
inline_nest_level_ + 1, child_inlines_);
|
inline_nest_level_ + 1, child_inlines_);
|
||||||
|
case DW_TAG_lexical_block:
|
||||||
|
return new LexicalBlockHandler(cu_context_, offset,
|
||||||
|
inline_nest_level_ + 1, child_inlines_);
|
||||||
default:
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -715,6 +741,29 @@ void DwarfCUToModule::InlineHandler::Finish() {
|
||||||
inlines_.push_back(std::move(in));
|
inlines_.push_back(std::move(in));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DIEHandler* DwarfCUToModule::LexicalBlockHandler::FindChildHandler(
|
||||||
|
uint64_t offset,
|
||||||
|
enum DwarfTag tag) {
|
||||||
|
switch (tag) {
|
||||||
|
case DW_TAG_inlined_subroutine:
|
||||||
|
return new InlineHandler(cu_context_, nullptr, offset, inline_nest_level_,
|
||||||
|
child_inlines_);
|
||||||
|
case DW_TAG_lexical_block:
|
||||||
|
return new LexicalBlockHandler(cu_context_, offset, inline_nest_level_,
|
||||||
|
child_inlines_);
|
||||||
|
default:
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DwarfCUToModule::LexicalBlockHandler::Finish() {
|
||||||
|
// Insert child inlines inside the lexical block into the inline vector from
|
||||||
|
// parent as if the block does not exit.
|
||||||
|
inlines_.insert(inlines_.end(),
|
||||||
|
std::make_move_iterator(child_inlines_.begin()),
|
||||||
|
std::make_move_iterator(child_inlines_.end()));
|
||||||
|
}
|
||||||
|
|
||||||
// A handler for DIEs that contain functions and contribute a
|
// A handler for DIEs that contain functions and contribute a
|
||||||
// component to their names: namespaces, classes, etc.
|
// component to their names: namespaces, classes, etc.
|
||||||
class DwarfCUToModule::NamedScopeHandler: public GenericDIEHandler {
|
class DwarfCUToModule::NamedScopeHandler: public GenericDIEHandler {
|
||||||
|
@ -831,6 +880,9 @@ DIEHandler* DwarfCUToModule::FuncHandler::FindChildHandler(
|
||||||
case DW_TAG_union_type:
|
case DW_TAG_union_type:
|
||||||
return new NamedScopeHandler(cu_context_, &child_context_, offset,
|
return new NamedScopeHandler(cu_context_, &child_context_, offset,
|
||||||
handle_inline_);
|
handle_inline_);
|
||||||
|
case DW_TAG_lexical_block:
|
||||||
|
if (handle_inline_)
|
||||||
|
return new LexicalBlockHandler(cu_context_, offset, 0, child_inlines_);
|
||||||
default:
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -357,6 +357,7 @@ class DwarfCUToModule: public RootDIEHandler {
|
||||||
struct Specification;
|
struct Specification;
|
||||||
class GenericDIEHandler;
|
class GenericDIEHandler;
|
||||||
class FuncHandler;
|
class FuncHandler;
|
||||||
|
class LexicalBlockHandler;
|
||||||
class InlineHandler;
|
class InlineHandler;
|
||||||
class NamedScopeHandler;
|
class NamedScopeHandler;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue