Skip to content

Commit

Permalink
ManualDWARFIndex: Fix misclassification of methods in unions
Browse files Browse the repository at this point in the history
Apple index was already treating them as methods. Not doing the same
seems like an omission.

llvm-svn: 333266
  • Loading branch information
labath committed May 25, 2018
1 parent c82f382 commit a2aad28
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 8 deletions.
31 changes: 31 additions & 0 deletions lldb/lit/SymbolFile/DWARF/find-method.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// REQUIRES: lld

// RUN: clang %s -g -c -o %t.o --target=x86_64-pc-linux
// RUN: ld.lld %t.o -o %t
// RUN: lldb-test symbols --name=foo --find=function --function-flags=method %t | \
// RUN: FileCheck %s
//
// RUN: clang %s -g -c -o %t --target=x86_64-apple-macosx
// RUN: lldb-test symbols --name=foo --find=function --function-flags=method %t | \
// RUN: FileCheck %s

// CHECK-DAG: name = "A::foo()", mangled = "_ZN1A3fooEv"
// CHECK-DAG: name = "B::foo()", mangled = "_ZN1B3fooEv"
// CHECK-DAG: name = "C::foo()", mangled = "_ZN1C3fooEv"

struct A {
void foo();
};
void A::foo() {}

class B {
void foo();
};
void B::foo() {}

union C {
void foo();
};
void C::foo() {}

extern "C" void _start() {}
5 changes: 3 additions & 2 deletions lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -209,9 +209,10 @@ DWARFDIE::GetParentDeclContextDIE() const {
return DWARFDIE();
}

bool DWARFDIE::IsStructOrClass() const {
bool DWARFDIE::IsStructClassOrUnion() const {
const dw_tag_t tag = Tag();
return tag == DW_TAG_class_type || tag == DW_TAG_structure_type;
return tag == DW_TAG_class_type || tag == DW_TAG_structure_type ||
tag == DW_TAG_union_type;
}

DWARFDIE
Expand Down
2 changes: 1 addition & 1 deletion lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class DWARFDIE : public DWARFBaseDIE {
//----------------------------------------------------------------------
// Tests
//----------------------------------------------------------------------
bool IsStructOrClass() const;
bool IsStructClassOrUnion() const;

//----------------------------------------------------------------------
// Accessors
Expand Down
9 changes: 4 additions & 5 deletions lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -290,16 +290,15 @@ void ManualDWARFIndex::IndexUnitImpl(
const DWARFDebugInfoEntry *parent = die.GetParent();
bool is_method = false;
if (parent) {
dw_tag_t parent_tag = parent->Tag();
if (parent_tag == DW_TAG_class_type ||
parent_tag == DW_TAG_structure_type) {
DWARFDIE parent_die(&unit, parent);
if (parent_die.IsStructClassOrUnion())
is_method = true;
} else {
else {
if (specification_die_form.IsValid()) {
DWARFDIE specification_die =
unit.GetSymbolFileDWARF()->DebugInfo()->GetDIE(
DIERef(specification_die_form));
if (specification_die.GetParent().IsStructOrClass())
if (specification_die.GetParent().IsStructClassOrUnion())
is_method = true;
}
}
Expand Down

0 comments on commit a2aad28

Please sign in to comment.