Author: gclayton
Date: Tue Nov  3 16:40:07 2015
New Revision: 252001

URL: http://llvm.org/viewvc/llvm-project?rev=252001&view=rev
Log:
With the new modules debugging, we have seen cases where clang is not emitting 
full definitions for types that are member variables of classes. If we try to 
make a class with a member where the type of the class in a forward 
declaration, clang will assert and crash and bring down the IDE. This is not 
acceptable so we need to work around it. We work around it by making sure that 
if we have a member that is an instance (not a pointer or reference) of a 
class/struct/union, that it is a complete type. If it isn't then we emit an 
error to let the user know to file a bug against the compiler, and then we make 
the class complete, but empty. We also do this for base classes elsewhere. We 
use the DWARF to help layout the type, so we will get all instance variables 
correct, but we just won't have visibility into this instance variable.


Modified:
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp?rev=252001&r1=252000&r2=252001&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp 
(original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp Tue Nov  
3 16:40:07 2015
@@ -2777,6 +2777,23 @@ DWARFASTParserClang::ParseChildMembers (
                                     }
                                 }
 
+                                if 
(ClangASTContext::IsCXXClassType(member_clang_type) && 
member_clang_type.GetCompleteType() == false)
+                                {
+                                    module_sp->ReportError ("DWARF DIE at 
0x%8.8x (class %s) has a member variable 0x%8.8x (%s) whose type is a forward 
declaration, not a complete definition.\nPlease file a bug against the compiler 
and include the preprocessed output for %s",
+                                                            
parent_die.GetOffset(),
+                                                            
parent_die.GetName(),
+                                                            die.GetOffset(),
+                                                            name,
+                                                            sc.comp_unit ? 
sc.comp_unit->GetPath().c_str() : "the source file");
+                                    // We have no choice other than to pretend 
that the member class
+                                    // is complete. If we don't do this, clang 
will crash when trying
+                                    // to layout the class. Since we provide 
layout assistance, all
+                                    // ivars in this class and other classes 
will be fine, this is
+                                    // the best we can do short of crashing.
+                                    
ClangASTContext::StartTagDeclarationDefinition(member_clang_type);
+                                    
ClangASTContext::CompleteTagDeclarationDefinition(member_clang_type);
+                                }
+
                                 field_decl = 
ClangASTContext::AddFieldToRecordType (class_clang_type,
                                                                                
     name,
                                                                                
     member_clang_type,


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to