forked from OSchip/llvm-project
<rdar://problem/15001220>
Fixed an issue with the lldb/test/lang/cpp/virtual test case had a virtual class that had a DW_TAG_inheritance child that was virtual and had a DW_AT_data_member_location of: DW_AT_data_member_location( DW_OP_dup, DW_OP_deref, DW_OP_constu(0x00000018), DW_OP_minus, DW_OP_deref, DW_OP_plus ) We failed to evaluate this and then we were passing the incorrect offset back to clang and clang would crash. The AST external source has a function named LayoutRecordType which allows us to supply the virtual base class offsets, but that really doesn't make sense to do as clang will lay them out correctly. So we must ignore virtual base classes when doing layout. llvm-svn: 190811
This commit is contained in:
parent
3a446ff6a4
commit
52694e3bb8
|
@ -2214,8 +2214,13 @@ SymbolFileDWARF::ParseChildMembers
|
|||
|
||||
if (is_virtual)
|
||||
{
|
||||
layout_info.vbase_offsets.insert(std::make_pair(base_class_clang_type.GetAsCXXRecordDecl(),
|
||||
clang::CharUnits::fromQuantity(member_byte_offset)));
|
||||
// Do not specify any offset for virtual inheritance. The DWARF produced by clang doesn't
|
||||
// give us a constant offset, but gives us a DWARF expressions that requires an actual object
|
||||
// in memory. the DW_AT_data_member_location for a virtual base class looks like:
|
||||
// DW_AT_data_member_location( DW_OP_dup, DW_OP_deref, DW_OP_constu(0x00000018), DW_OP_minus, DW_OP_deref, DW_OP_plus )
|
||||
// Given this, there is really no valid response we can give to clang for virtual base
|
||||
// class offsets, and this should eventually be removed from LayoutRecordType() in the external
|
||||
// AST source in clang.
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue