[Lldb-commits] [lldb] r144969 - in /lldb/trunk: include/lldb/Symbol/ClangASTImporter.h llvm.zip scripts/build-llvm.pl scripts/clang.is-being-completed-from-lexical-storage.diff scripts/clang.visit-translation-unit-decl.diff source/Expression/ClangASTSource.cpp source/Expression/ClangExpressionDeclMap.cpp source/Expression/IRForTarget.cpp source/Symbol/ClangASTImporter.cpp

Sean Callanan scallanan at apple.com
Thu Nov 17 19:28:10 PST 2011


Author: spyffe
Date: Thu Nov 17 21:28:09 2011
New Revision: 144969

URL: http://llvm.org/viewvc/llvm-project?rev=144969&view=rev
Log:
This commit completes the rearchitecting of ClangASTSource
to allow variables in the persistent variable store to know
how to complete themselves from debug information.  That
fixes a variety of bugs during dematerialization of 
expression results and also makes persistent variable and
result variables ($foo, $4, ...) more useful.

I have also added logging improvements that make it much
easier to figure out how types are moving from place to 
place, and made some checking a little more aggressive.

The commit includes patches to Clang which are currently being
integrated into Clang proper; once these fixes are in Clang
top-of-tree, these patches will be removed.  The patches don't
fix API; rather, they fix some internal bugs in Clang's 
ASTImporter that were exposed when LLDB was moving types from
place to place multiple times.

Added:
    lldb/trunk/scripts/clang.is-being-completed-from-lexical-storage.diff
    lldb/trunk/scripts/clang.visit-translation-unit-decl.diff
Modified:
    lldb/trunk/include/lldb/Symbol/ClangASTImporter.h
    lldb/trunk/llvm.zip
    lldb/trunk/scripts/build-llvm.pl
    lldb/trunk/source/Expression/ClangASTSource.cpp
    lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp
    lldb/trunk/source/Expression/IRForTarget.cpp
    lldb/trunk/source/Symbol/ClangASTImporter.cpp

Modified: lldb/trunk/include/lldb/Symbol/ClangASTImporter.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTImporter.h?rev=144969&r1=144968&r2=144969&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/ClangASTImporter.h (original)
+++ lldb/trunk/include/lldb/Symbol/ClangASTImporter.h Thu Nov 17 21:28:09 2011
@@ -129,6 +129,12 @@
             decl = rhs.decl;
         }
         
+        void operator= (const DeclOrigin &rhs)
+        {
+            ctx = rhs.ctx;
+            decl = rhs.decl;
+        }
+        
         bool 
         Valid ()
         {

Modified: lldb/trunk/llvm.zip
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/llvm.zip?rev=144969&r1=144968&r2=144969&view=diff
==============================================================================
Binary files - no diff available.

Modified: lldb/trunk/scripts/build-llvm.pl
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/build-llvm.pl?rev=144969&r1=144968&r2=144969&view=diff
==============================================================================
--- lldb/trunk/scripts/build-llvm.pl (original)
+++ lldb/trunk/scripts/build-llvm.pl Thu Nov 17 21:28:09 2011
@@ -156,7 +156,7 @@
     do_command ("cd '$SRCROOT' && svn co --quiet --revision $llvm_revision http://llvm.org/svn/llvm-project/llvm/trunk llvm", "checking out llvm from repository", 1); 
     print "Checking out clang sources from revision $clang_revision...\n";
     do_command ("cd '$llvm_srcroot/tools' && svn co --quiet --revision $clang_revision http://llvm.org/svn/llvm-project/cfe/trunk clang", "checking out clang from repository", 1);
-    print "Applying any local patches to LLVM...";
+    print "Applying any local patches to LLVM/Clang...";
     
     my @llvm_patches = bsd_glob("$ENV{SRCROOT}/scripts/llvm.*.diff");
     
@@ -164,6 +164,13 @@
     {
         do_command ("cd '$llvm_srcroot' && patch -p0 < $patch");
     }
+
+    my @clang_patches = bsd_glob("$ENV{SRCROOT}/scripts/clang.*.diff");
+    
+    foreach my $patch (@clang_patches)
+    {
+        do_command ("cd '$llvm_srcroot/tools/clang' && patch -p0 < $patch");
+    }
     
     print "Removing the llvm/test and llvm/tools/clang/test directories...\n";
     do_command ("cd '$llvm_srcroot' && rm -rf test && rm -rf tools/clang/test ", "removing test directories", 1); 

Added: lldb/trunk/scripts/clang.is-being-completed-from-lexical-storage.diff
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/clang.is-being-completed-from-lexical-storage.diff?rev=144969&view=auto
==============================================================================
--- lldb/trunk/scripts/clang.is-being-completed-from-lexical-storage.diff (added)
+++ lldb/trunk/scripts/clang.is-being-completed-from-lexical-storage.diff Thu Nov 17 21:28:09 2011
@@ -0,0 +1,78 @@
+Index: include/clang/AST/DeclBase.h
+===================================================================
+--- include/clang/AST/DeclBase.h	(revision 144573)
++++ include/clang/AST/DeclBase.h	(working copy)
+@@ -807,6 +807,12 @@
+   /// storage that contains additional declarations that are visible
+   /// in this context.
+   mutable unsigned ExternalVisibleStorage : 1;
++  
++  /// \brief True if this declaration context is currently having
++  /// declarations added from its external lexical storage.  This flag
++  /// is intended to prevent One Definition Rule checking as the
++  /// declarations are imported.
++  mutable unsigned IsBeingCompletedFromLexicalStorage : 1;
+ 
+   /// \brief Pointer to the data structure used to lookup declarations
+   /// within this context (or a DependentStoredDeclsMap if this is a
+@@ -834,8 +840,8 @@
+ 
+    DeclContext(Decl::Kind K)
+      : DeclKind(K), ExternalLexicalStorage(false),
+-       ExternalVisibleStorage(false), LookupPtr(0), FirstDecl(0),
+-       LastDecl(0) { }
++       ExternalVisibleStorage(false), IsBeingCompletedFromLexicalStorage(false),
++       LookupPtr(0), FirstDecl(0), LastDecl(0) { }
+ 
+ public:
+   ~DeclContext();
+@@ -1339,6 +1345,14 @@
+     ExternalVisibleStorage = ES;
+   }
+ 
++  bool isBeingCompletedFromLexicalStorage() const { 
++    return IsBeingCompletedFromLexicalStorage;
++  }
++
++  void setIsBeingCompletedFromLexicalStorage(bool IBC) const {
++    IsBeingCompletedFromLexicalStorage = IBC;     
++  }
++
+   /// \brief Determine whether the given declaration is stored in the list of
+   /// declarations lexically within this context.
+   bool isDeclInLexicalTraversal(const Decl *D) const {
+Index: lib/AST/Decl.cpp
+===================================================================
+--- lib/AST/Decl.cpp	(revision 144573)
++++ lib/AST/Decl.cpp	(working copy)
+@@ -2405,8 +2405,14 @@
+   ExternalASTSource::Deserializing TheFields(Source);
+ 
+   SmallVector<Decl*, 64> Decls;
+-  LoadedFieldsFromExternalStorage = true;  
+-  switch (Source->FindExternalLexicalDeclsBy<FieldDecl>(this, Decls)) {
++  LoadedFieldsFromExternalStorage = true;
++    
++  setIsBeingCompletedFromLexicalStorage(true);
++  ExternalLoadResult LoadResult = 
++    Source->FindExternalLexicalDeclsBy<FieldDecl>(this, Decls);
++  setIsBeingCompletedFromLexicalStorage(false);
++
++  switch (LoadResult) {
+   case ELR_Success:
+     break;
+     
+Index: lib/AST/ASTImporter.cpp
+===================================================================
+--- lib/AST/ASTImporter.cpp	(revision 144573)
++++ lib/AST/ASTImporter.cpp	(working copy)
+@@ -2290,7 +2290,8 @@
+       
+       if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) {
+         if (RecordDecl *FoundDef = FoundRecord->getDefinition()) {
+-          if (!D->isCompleteDefinition() || IsStructuralMatch(D, FoundDef)) {
++          if (FoundDef->isBeingCompletedFromLexicalStorage() ||
++              !D->isCompleteDefinition() || IsStructuralMatch(D, FoundDef)) {
+             // The record types structurally match, or the "from" translation
+             // unit only had a forward declaration anyway; call it the same
+             // function.

Added: lldb/trunk/scripts/clang.visit-translation-unit-decl.diff
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/clang.visit-translation-unit-decl.diff?rev=144969&view=auto
==============================================================================
--- lldb/trunk/scripts/clang.visit-translation-unit-decl.diff (added)
+++ lldb/trunk/scripts/clang.visit-translation-unit-decl.diff Thu Nov 17 21:28:09 2011
@@ -0,0 +1,28 @@
+Index: lib/AST/ASTImporter.cpp
+===================================================================
+--- lib/AST/ASTImporter.cpp	(revision 144573)
++++ lib/AST/ASTImporter.cpp	(working copy)
+@@ -100,6 +100,7 @@
+     bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord);
+     bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To);
+     Decl *VisitDecl(Decl *D);
++    Decl *VisitTranslationUnitDecl(TranslationUnitDecl *D);
+     Decl *VisitNamespaceDecl(NamespaceDecl *D);
+     Decl *VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);
+     Decl *VisitTypedefDecl(TypedefDecl *D);
+@@ -2030,6 +2031,15 @@
+   return 0;
+ }
+ 
++Decl *ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
++  TranslationUnitDecl *ToD = 
++    Importer.getToContext().getTranslationUnitDecl();
++    
++  Importer.Imported(D, ToD);
++    
++  return ToD;
++}
++
+ Decl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
+   // Import the major distinguishing characteristics of this namespace.
+   DeclContext *DC, *LexicalDC;

Modified: lldb/trunk/source/Expression/ClangASTSource.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ClangASTSource.cpp?rev=144969&r1=144968&r2=144969&view=diff
==============================================================================
--- lldb/trunk/source/Expression/ClangASTSource.cpp (original)
+++ lldb/trunk/source/Expression/ClangASTSource.cpp Thu Nov 17 21:28:09 2011
@@ -135,7 +135,7 @@
     
     if (log)
     {
-        log->Printf("    [CompleteTagDecl] Completing a TagDecl named %s", tag_decl->getName().str().c_str());
+        log->Printf("    [CompleteTagDecl] on (ASTContext*)%p Completing a TagDecl named %s", m_ast_context, tag_decl->getName().str().c_str());
         log->Printf("      [CTD] Before:");
         ASTDumper dumper((Decl*)tag_decl);
         dumper.ToLog(log, "      [CTD] ");
@@ -158,7 +158,7 @@
     
     if (log)
     {
-        log->Printf("    [CompleteObjCInterfaceDecl] Completing an ObjCInterfaceDecl named %s", interface_decl->getName().str().c_str());
+        log->Printf("    [CompleteObjCInterfaceDecl] on (ASTContext*)%p Completing an ObjCInterfaceDecl named %s", m_ast_context, interface_decl->getName().str().c_str());
         log->Printf("      [COID] Before:");
         ASTDumper dumper((Decl*)interface_decl);
         dumper.ToLog(log, "      [COID] ");    
@@ -192,19 +192,24 @@
     if (log)
     {
         if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl))
-            log->Printf("FindExternalLexicalDecls[%u] in '%s' (a %s) with %s predicate",
+            log->Printf("FindExternalLexicalDecls[%u] on (ASTContext*)%p in '%s' (%sDecl*)%p with %s predicate",
                         current_id,
+                        m_ast_context,
                         context_named_decl->getNameAsString().c_str(),
-                        context_decl->getDeclKindName(), 
+                        context_decl->getDeclKindName(),
+                        context_decl,
                         (predicate ? "non-null" : "null"));
         else if(context_decl)
-            log->Printf("FindExternalLexicalDecls[%u] in a %s with %s predicate",
+            log->Printf("FindExternalLexicalDecls[%u] on (ASTContext*)%p in (%sDecl*)%p with %s predicate",
                         current_id,
+                        m_ast_context,
                         context_decl->getDeclKindName(), 
+                        context_decl,
                         (predicate ? "non-null" : "null"));
         else
-            log->Printf("FindExternalLexicalDecls[%u] in a NULL context with %s predicate",
+            log->Printf("FindExternalLexicalDecls[%u] on (ASTContext*)%p in a NULL context with %s predicate",
                         current_id,
+                        m_ast_context,
                         (predicate ? "non-null" : "null"));
     }
     
@@ -274,11 +279,11 @@
     if (log)
     {
         if (!context.m_decl_context)
-            log->Printf("ClangASTSource::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
+            log->Printf("ClangASTSource::FindExternalVisibleDecls[%u] on (ASTContext*)%p for '%s' in a NULL DeclContext", current_id,                         m_ast_context, name.GetCString());
         else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
-            log->Printf("ClangASTSource::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str());
+            log->Printf("ClangASTSource::FindExternalVisibleDecls[%u] on (ASTContext*)%p for '%s' in '%s'", current_id, m_ast_context, name.GetCString(), context_named_decl->getNameAsString().c_str());
         else
-            log->Printf("ClangASTSource::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName());
+            log->Printf("ClangASTSource::FindExternalVisibleDecls[%u] on (ASTContext*)%p for '%s' in a '%s'", current_id, m_ast_context, name.GetCString(), context.m_decl_context->getDeclKindName());
     }
     
     context.m_namespace_map.reset(new ClangASTImporter::NamespaceMap);
@@ -511,8 +516,9 @@
     ConstString selector_name(ss.GetData());
     
     if (log)
-        log->Printf("ClangASTSource::FindObjCMethodDecls[%d] for selector [%s %s]",
-                    current_id, 
+        log->Printf("ClangASTSource::FindObjCMethodDecls[%d] on (ASTContext*)%p for selector [%s %s]",
+                    current_id,
+                    m_ast_context,
                     interface_decl->getNameAsString().c_str(), 
                     selector_name.AsCString());
 
@@ -603,8 +609,9 @@
     ObjCPropertyDecl *property_decl = orig_iface_decl->FindPropertyDeclaration(&orig_ast_ctx->Idents.get(property_name));
     
     if (log)
-        log->Printf("ClangASTSource::FindObjCPropertyDecls[%d] for property '%s.%s'",
+        log->Printf("ClangASTSource::FindObjCPropertyDecls[%d] on (ASTContext*)%p for property '%s.%s'",
                     current_id, 
+                    m_ast_context,
                     iface_decl->getNameAsString().c_str(), 
                     property_name_str.c_str());
     
@@ -643,13 +650,15 @@
     if (log)
     {
         if (parent_map && parent_map->size())
-            log->Printf("CompleteNamespaceMap[%u] Searching for namespace %s in namespace %s",
+            log->Printf("CompleteNamespaceMap[%u] on (ASTContext*)%p Searching for namespace %s in namespace %s",
                         current_id,
+                        m_ast_context,
                         name.GetCString(),
                         parent_map->begin()->second.GetNamespaceDecl()->getDeclName().getAsString().c_str());
         else
-            log->Printf("CompleteNamespaceMap[%u] Searching for namespace %s",
+            log->Printf("CompleteNamespaceMap[%u] on (ASTContext*)%p Searching for namespace %s",
                         current_id,
+                        m_ast_context,
                         name.GetCString());
     }
     

Modified: lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp?rev=144969&r1=144968&r2=144969&view=diff
==============================================================================
--- lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp (original)
+++ lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp Thu Nov 17 21:28:09 2011
@@ -196,9 +196,9 @@
 
     ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
     
-    TypeFromUser user_type(ClangASTContext::CopyType(context, 
-                                                     type.GetASTContext(),
-                                                     type.GetOpaqueQualType()),
+    TypeFromUser user_type(m_ast_importer->CopyType(context, 
+                                                    type.GetASTContext(),
+                                                    type.GetOpaqueQualType()),
                            context);
     
     if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
@@ -285,9 +285,9 @@
     if (!var_sp)
         return ClangExpressionVariableSP();
     
-    TypeFromUser user_type(ClangASTContext::CopyType(context, 
-                                                     type.GetASTContext(),
-                                                     type.GetOpaqueQualType()),
+    TypeFromUser user_type(m_ast_importer->CopyType(context, 
+                                                    type.GetASTContext(),
+                                                    type.GetOpaqueQualType()),
                            context);
     
     TypeFromUser var_type = var_sp->GetTypeFromUser();
@@ -424,10 +424,17 @@
 
     ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
     
-    TypeFromUser user_type(ClangASTContext::CopyType(context, 
-                                                     parser_type.GetASTContext(),
-                                                     parser_type.GetOpaqueQualType()),
+    TypeFromUser user_type(m_ast_importer->CopyType(context, 
+                                                    parser_type.GetASTContext(),
+                                                    parser_type.GetOpaqueQualType()),
                            context);
+    
+    if (!user_type.GetOpaqueQualType())
+    {
+        if (log)
+            log->Printf("Persistent variable's type wasn't copied successfully");
+        return false;
+    }
         
     if (!m_parser_vars->m_target_info.IsValid())
         return false;
@@ -499,7 +506,7 @@
         return false;
     
     if (log)
-        log->Printf("Adding value for decl %p [%s - %s] to the structure",
+        log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
                     decl,
                     name.GetCString(),
                     var_sp->GetName().GetCString());
@@ -936,8 +943,15 @@
                 return err.Success();
             }
             case Value::eValueTypeHostAddress:
-                memcpy (data, (const void *)value.GetScalar().ULongLong(), length);
+            {
+                void *host_addr = (void*)value.GetScalar().ULongLong();
+                
+                if (!host_addr)
+                    return false;
+                
+                memcpy (data, host_addr, length);
                 return true;
+            }
             case Value::eValueTypeScalar:
                 return false;
         }
@@ -1370,12 +1384,16 @@
             log->PutCString("Allocating memory for materialized argument struct");
         
         lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size, 
-                                                           lldb::ePermissionsReadable | lldb::ePermissionsWritable,
-                                                           err);
+                                                   lldb::ePermissionsReadable | lldb::ePermissionsWritable,
+                                                   err);
         
         if (mem == LLDB_INVALID_ADDRESS)
+        {
+            err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct", 
+                                         (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size));
             return false;
-        
+        }
+            
         m_material_vars->m_allocated_area = mem;
     }
     
@@ -1400,8 +1418,11 @@
                 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
                 
                 if (!reg_ctx)
+                {
+                    err.SetErrorString("Couldn't get register context");
                     return false;
-                
+                }
+                    
                 if (!DoMaterializeOneRegister (dematerialize, 
                                                exe_ctx, 
                                                *reg_ctx, 
@@ -1413,7 +1434,10 @@
             else
             {
                 if (!member_sp->m_jit_vars.get())
+                {
+                    err.SetErrorString("Variable being materialized doesn't have necessary state");
                     return false;
+                }
                 
                 if (!DoMaterializeOneVariable (dematerialize, 
                                                exe_ctx, 
@@ -1485,7 +1509,10 @@
     
     uint8_t *pvar_data = var_sp->GetValueBytes();
     if (pvar_data == NULL)
+    {
+        err.SetErrorString("Persistent variable being materialized contains no data");
         return false;
+    }
     
     Error error;
     Process *process = exe_ctx.GetProcessPtr();
@@ -1689,7 +1716,10 @@
     StackFrame *frame = exe_ctx.GetFramePtr();
 
     if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
+    {
+        err.SetErrorString("Necessary state for variable materialization isn't present");
         return false;
+    }
     
     // Vital information about the value
     
@@ -2200,7 +2230,7 @@
         ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
         
         if (log && log->GetVerbose())
-            log->Printf("  CEDM::FEVD[%u] Inspecting namespace map %p (%d entries)", 
+            log->Printf("  CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)", 
                         current_id, 
                         namespace_map.get(), 
                         (int)namespace_map->size());
@@ -2873,7 +2903,7 @@
             QualType var_type = var_decl->getType();
             TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
             
-            lldb::clang_type_t copied_type = ClangASTContext::CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
+            lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
             
             TypeFromUser user_type(copied_type, scratch_ast_context);
                         

Modified: lldb/trunk/source/Expression/IRForTarget.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/IRForTarget.cpp?rev=144969&r1=144968&r2=144969&view=diff
==============================================================================
--- lldb/trunk/source/Expression/IRForTarget.cpp (original)
+++ lldb/trunk/source/Expression/IRForTarget.cpp Thu Nov 17 21:28:09 2011
@@ -647,12 +647,25 @@
         clang::QualType element_qual_type = pointer_pointertype->getPointeeType();
         
         m_result_type = lldb_private::TypeFromParser(element_qual_type.getAsOpaquePtr(),
-                                                        &result_decl->getASTContext());
+                                                     &result_decl->getASTContext());
     }
     else
     {
         m_result_type = lldb_private::TypeFromParser(result_var->getType().getAsOpaquePtr(),
-                                                        &result_decl->getASTContext());
+                                                     &result_decl->getASTContext());
+    }
+    
+    if (m_result_type.GetClangTypeBitWidth() == 0)
+    {
+        lldb_private::StreamString type_desc_stream;
+        m_result_type.DumpTypeDescription(&type_desc_stream);
+        
+        if (log)
+            log->Printf("Result type has size 0");
+        
+        if (m_error_stream)
+            m_error_stream->Printf("Internal error [IRForTarget]: Result type '%s' has invalid size\n", 
+                                   type_desc_stream.GetData());
     }
     
     if (log)
@@ -660,13 +673,15 @@
         lldb_private::StreamString type_desc_stream;
         m_result_type.DumpTypeDescription(&type_desc_stream);
         
-        log->Printf("Result decl type: \"%s\"", type_desc_stream.GetString().c_str());
+        log->Printf("Result decl type: \"%s\"", type_desc_stream.GetData());
     }
     
     m_result_name = m_decl_map->GetPersistentResultName();
     
     if (log)
-        log->Printf("Creating a new result global: \"%s\"", m_result_name.GetCString());
+        log->Printf("Creating a new result global: \"%s\" with size 0x%x", 
+                    m_result_name.GetCString(),
+                    m_result_type.GetClangTypeBitWidth() / 8);
         
     // Construct a new result global and set up its metadata
     
@@ -755,11 +770,12 @@
     }
     
     if (!m_const_result)
-        m_decl_map->AddPersistentVariable(result_decl, 
-                                          m_result_name, 
-                                          m_result_type,
-                                          true,
-                                          m_result_is_pointer);
+        if (!m_decl_map->AddPersistentVariable(result_decl, 
+                                               m_result_name, 
+                                               m_result_type,
+                                               true,
+                                               m_result_is_pointer))
+            return false;
         
     result_global->eraseFromParent();
     

Modified: lldb/trunk/source/Symbol/ClangASTImporter.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTImporter.cpp?rev=144969&r1=144968&r2=144969&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/ClangASTImporter.cpp (original)
+++ lldb/trunk/source/Symbol/ClangASTImporter.cpp Thu Nov 17 21:28:09 2011
@@ -193,7 +193,26 @@
 *ClangASTImporter::Minion::Imported (clang::Decl *from, clang::Decl *to)
 {
     lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
-    
+        
+    if (log)
+    {
+        if (NamedDecl *from_named_decl = dyn_cast<clang::NamedDecl>(from))
+        {
+            log->Printf("    [ClangASTImporter] Imported (%sDecl*)%p, named %s (from (Decl*)%p)",
+                        from->getDeclKindName(),
+                        to,
+                        from_named_decl->getName().str().c_str(),
+                        from);
+        }
+        else
+        {
+            log->Printf("    [ClangASTImporter] Imported (%sDecl*)%p (from (Decl*)%p)",
+                        from->getDeclKindName(),
+                        to,
+                        from);
+        }
+    }
+
     ASTContextMetadataSP to_context_md = m_master.GetContextMetadata(&to->getASTContext());
     ASTContextMetadataSP from_context_md = m_master.MaybeGetContextMetadata(m_source_ctx);
     
@@ -204,7 +223,22 @@
         OriginMap::iterator origin_iter = origins.find(from);
         
         if (origin_iter != origins.end())
+        {
             to_context_md->m_origins[to] = origin_iter->second;
+            
+            if (log)
+                log->Printf("    [ClangASTImporter] Propagated origin (Decl*)%p/(ASTContext*)%p from (ASTContext*)%p to (ASTContext*)%p",
+                            origin_iter->second.decl,
+                            origin_iter->second.ctx,
+                            &from->getASTContext(),
+                            &to->getASTContext());
+        }
+        else
+        {
+            if (log)
+                log->Printf("    [ClangASTImporter] Decl has no origin information in (ASTContext*)%p",
+                            &from->getASTContext());
+        }
         
         if (clang::NamespaceDecl *to_namespace = dyn_cast<clang::NamespaceDecl>(to))
         {
@@ -221,6 +255,12 @@
     else
     {
         to_context_md->m_origins[to] = DeclOrigin (m_source_ctx, from);
+        
+        if (log)
+            log->Printf("    [ClangASTImporter] Sourced origin (Decl*)%p/(ASTContext*)%p into (ASTContext*)%p",
+                        from,
+                        m_source_ctx,
+                        &to->getASTContext());
     }
         
     if (TagDecl *from_tag_decl = dyn_cast<TagDecl>(from))
@@ -230,14 +270,13 @@
         to_tag_decl->setHasExternalLexicalStorage();
                         
         if (log)
-            log->Printf("    [ClangASTImporter] Imported %p, a %s named %s%s%s [%s->%s]",
-                        to,
-                        ((clang::Decl*)from_tag_decl)->getDeclKindName(),
-                        from_tag_decl->getName().str().c_str(),
+            log->Printf("    [ClangASTImporter] To is a TagDecl - attributes %s%s [%s->%s]",
                         (to_tag_decl->hasExternalLexicalStorage() ? " Lexical" : ""),
                         (to_tag_decl->hasExternalVisibleStorage() ? " Visible" : ""),
                         (from_tag_decl->isCompleteDefinition() ? "complete" : "incomplete"),
                         (to_tag_decl->isCompleteDefinition() ? "complete" : "incomplete"));
+        
+        to_tag_decl = NULL;
     }
     
     if (isa<NamespaceDecl>(from))
@@ -249,7 +288,7 @@
         to_namespace_decl->setHasExternalVisibleStorage();
     }
     
-    if (ObjCInterfaceDecl *from_interface_decl = dyn_cast<ObjCInterfaceDecl>(from))
+    if (isa<ObjCInterfaceDecl>(from))
     {
         ObjCInterfaceDecl *to_interface_decl = dyn_cast<ObjCInterfaceDecl>(to);
         
@@ -262,10 +301,7 @@
         to_interface_decl->setExternallyCompleted();
         
         if (log)
-            log->Printf("    [ClangASTImporter] Imported %p, a %s named %s%s%s%s",
-                        to,
-                        ((clang::Decl*)from_interface_decl)->getDeclKindName(),
-                        from_interface_decl->getName().str().c_str(),
+            log->Printf("    [ClangASTImporter] To is an ObjCInterfaceDecl - attributes %s%s%s",
                         (to_interface_decl->hasExternalLexicalStorage() ? " Lexical" : ""),
                         (to_interface_decl->hasExternalVisibleStorage() ? " Visible" : ""),
                         (to_interface_decl->isForwardDecl() ? " Forward" : ""));





More information about the lldb-commits mailing list