Author: gclayton
Date: Wed Dec 11 19:54:04 2013
New Revision: 197108
URL: http://llvm.org/viewvc/llvm-project?rev=197108&view=rev
Log:
LLDB can crash if given DWARF debug info for a class that has a base class
which isn't a complete definition.
<rdar://problem/15594781>
We need to not crash at any cost. We currently detect if any base classes are
forward declarations, emit an error string that directs the use to file a
compiler bug, and continues by completing the class with no contents. This
avoids a clang crash that would usually follow when we call setBase().
Modified:
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
URL:
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=197108&r1=197107&r2=197108&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Wed Dec 11
19:54:04 2013
@@ -2556,6 +2556,37 @@ SymbolFileDWARF::ResolveClangOpaqueTypeD
if (!base_classes.empty())
{
+ // Make sure all base classes refer to complete types
and not
+ // forward declarations. If we don't do this, clang
will crash
+ // with an assertion in the call to
clang_type.SetBaseClassesForClassType()
+ bool base_class_error = false;
+ for (auto &base_class : base_classes)
+ {
+ clang::TypeSourceInfo *type_source_info =
base_class->getTypeSourceInfo();
+ if (type_source_info)
+ {
+ ClangASTType base_class_type
(GetClangASTContext().getASTContext(), type_source_info->getType());
+ if (base_class_type.GetCompleteType() == false)
+ {
+ if (!base_class_error)
+ {
+
GetObjectFile()->GetModule()->ReportError ("DWARF DIE at 0x%8.8x for class '%s'
has a base class '%s' that is a forward declaration, not a complete
definition.\nPlease file a bug against the compiler and include the
preprocessed output for %s",
+
die->GetOffset(),
+
die->GetName(this, dwarf_cu),
+
base_class_type.GetTypeName().GetCString(),
+
sc.comp_unit ? sc.comp_unit->GetPath().c_str() : "the source file");
+ }
+ // We have no choice other than to pretend
that the base class
+ // is complete. If we don't do this, clang
will crash when we
+ // call setBases() inside of
"clang_type.SetBaseClassesForClassType()"
+ // below. Since we provide layout
assistance, all ivars in this
+ // class and other classe will be fine,
this is the best we can do
+ // short of crashing.
+
base_class_type.StartTagDeclarationDefinition ();
+
base_class_type.CompleteTagDeclarationDefinition ();
+ }
+ }
+ }
clang_type.SetBaseClassesForClassType
(&base_classes.front(),
base_classes.size());
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits