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.
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@144969 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Expression/IRForTarget.cpp b/source/Expression/IRForTarget.cpp
index ba8df14..ef3fa76 100644
--- a/source/Expression/IRForTarget.cpp
+++ b/source/Expression/IRForTarget.cpp
@@ -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();