Lang,
I've done some more research on this and here is what I've found so far.
LLDB uses the ExternalASTSource interface and it provides its own
implementation for it (lldb_private::ClangASTSource).
ClangASTSource is being used in at least 3 modes (all of these uses
the ASTImporter):
(1) to do a minimal import for a Type/Decl, this is used for lookup
(2) to do a minimal import for a Type/Decl, this is used for computing
the record layout
(3) to complete the Type which has been imported in a minimal mode
previously. The completion is done via ASTImporter::ImportDefinition,
which does a full import of a TagDecl even in minimal mode.
Besides, there is a fourth method which exercises the ASTImporter, but
it does not use the ExternalASTSource interface (4). [[ Actually, (4)
happens before than (3) in program runtime. ]]
So, it is kind of weird to me, that we use a simple minimal import in
(2) for computing the record layout, perhaps we could make a change in
LLDB to call `lldb_private::ClangASTSource::CompleteType` to achieve a
full import in this case? Instead of changing the logic in
clang::ASTImporter? By doing so, I think the logic would be aligned
with Richard's idea.
Gabor
(1)
=== "To" ASTContext A, "From" ASTContext X, MINIMAL import through
ExternalASTSource inteface
clang::ASTImporter::Import (this=0x13b3c50, FromT=...) at
../../git/llvm/tools/clang/lib/AST/ASTImporter.cpp:6983
lldb_private::ClangASTImporter::CopyType (this=0x12a3480,
dst_ast=0x1363420, src_ast=0x11f7980, type=...) at
../../git/llvm/tools/lldb/source/Symbol/ClangASTImporter.cpp:61
lldb_private::ClangASTSource::GuardedCopyType (this=0x12394b0,
src_type=...) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp:2038
lldb_private::ClangExpressionDeclMap::GetVariableValue
(this=0x12394b0, var=warning: RTTI symbol not found for class
'std::_Sp_counted_ptr<lldb_private::Variable*,
(__gnu_cxx::_Lock_policy)2>'
lldb_private::ClangExpressionDeclMap::AddOneVariable (this=0x12394b0,
context=..., var=warning: RTTI symbol not found for class
'std::_Sp_counted_ptr<lldb_private::Variable*,
(__gnu_cxx::_Lock_policy)2>'
lldb_private::ClangExpressionDeclMap::FindExternalVisibleDecls
(this=0x12394b0, context=..., module_sp=std::shared_ptr (empty) 0x0,
namespace_decl=..., current_id=3) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp:1235
lldb_private::ClangExpressionDeclMap::FindExternalVisibleDecls
(this=0x12394b0, context=...) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp:842
lldb_private::ClangASTSource::FindExternalVisibleDeclsByName
(this=0x12394b0, decl_ctx=0x1371298, clang_decl_name=...) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp:261
lldb_private::ClangASTSource::ClangASTSourceProxy::FindExternalVisibleDeclsByName
(this=0x105e230, DC=0x1371298, Name=...) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h:244
clang::DeclContext::lookup (this=0x1371298, Name=...) at
../../git/llvm/tools/clang/lib/AST/DeclBase.cpp:1599
LookupDirect (S=..., R=..., DC=0x1371298) at
../../git/llvm/tools/clang/lib/Sema/SemaLookup.cpp:84
CppNamespaceLookup (S=..., R=..., Context=..., NS=0x1d69dd8,
UDirs=...) at ../../git/llvm/tools/clang/lib/Sema/SemaLookup.cpp:942
clang::Sema::CppLookupName (this=0x1d74cd0, R=..., S=0x1d80510) at
../../git/llvm/tools/clang/lib/Sema/SemaLookup.cpp:1322
...
clang::Sema::ActOnUsingDeclaration (this=0x1d74cd0, S=0x1d93820,
AS=clang::AS_none, UsingLoc=..., TypenameLoc=..., SS=..., Name=...,
EllipsisLoc=..., AttrList=...) at
../../git/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp:9418
clang::Parser::ParseUsingDeclaration (this=0x1d7bd90,
Context=clang::DeclaratorContext::BlockContext, TemplateInfo=...,
UsingLoc=..., DeclEnd=..., AS=clang::AS_none) at
../../git/llvm/tools/clang/lib/Parse/ParseDeclCXX.cpp:710
...
clang::Parser::ParseTopLevelDecl (this=0x1d7bd90, Result=...) at
../../git/llvm/tools/clang/lib/Parse/Parser.cpp:610
clang::ParseAST (S=..., PrintStats=false, SkipFunctionBodies=false) at
../../git/llvm/tools/clang/lib/Parse/ParseAST.cpp:158
clang::ParseAST (PP=..., Consumer=0x1a2dfc0, Ctx=...,
PrintStats=false, TUKind=clang::TU_Complete, CompletionConsumer=0x0,
SkipFunctionBodies=false) at
../../git/llvm/tools/clang/lib/Parse/ParseAST.cpp:111
lldb_private::ClangExpressionParser::Parse (this=0x7fff14cdfe90,
diagnostic_manager=...) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp:608
lldb_private::ClangUserExpression::Parse (this=0x1d1d530,
diagnostic_manager=..., exe_ctx=...,
execution_policy=lldb_private::eExecutionPolicyOnlyWhenNeeded,
keep_result_in_memory=true, generate_debug_info=false) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp:495
lldb_private::UserExpression::Evaluate (exe_ctx=..., options=...,
expr="tpi", prefix="", result_valobj_sp=..., error=..., line_offset=0,
fixed_expression=0x1a95738, jit_module_sp_ptr=0x0) at
../../git/llvm/tools/lldb/source/Expression/UserExpression.cpp:237
lldb_private::Target::EvaluateExpression (this=0x1b32570, expr="tpi",
exe_scope=0x7fe73ca42d90, result_valobj_sp=..., options=...,
fixed_expression=0x1a95738) at
../../git/llvm/tools/lldb/source/Target/Target.cpp:2308
lldb_private::CommandObjectExpression::EvaluateExpression
(this=0x1a953b0, expr=0x7fff14ce0d58 "tpi",
output_stream=0x7fff14ce16e8, error_stream=0x7fff14ce1740,
result=0x7fff14ce16e8) at
../../git/llvm/tools/lldb/source/Commands/CommandObjectExpression.cpp:377
(2)
=== ASTContext A, "From" ASTContext X, MINIMAL import through
ExternalASTSource inteface
clang::ASTImporter::Import (this=0x13b3c50, FromD=0x13bba18) at
../../git/llvm/tools/clang/lib/AST/ASTImporter.cpp:7040
lldb_private::ClangASTImporter::CopyDecl (this=0x12a3480,
dst_ast=0x1363420, src_ast=0x11f7980, decl=0x13bba18) at
../../git/llvm/tools/lldb/source/Symbol/ClangASTImporter.cpp:102
lldb_private::ClangASTSource::CopyDecl (this=0x12394b0,
src_decl=0x13bba18) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp:1991
lldb_private::ClangASTSource::FindExternalLexicalDecls(clang::DeclContext
const*, llvm::function_ref<bool (clang::Decl::Kind)>,
llvm::SmallVectorImpl<clang::Decl*>&) (this=0x12394b0,
decl_context=0x13b2048, predicate=..., decls=llvm::SmallVector of Size
0, Capacity 64) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp:635
lldb_private::ClangASTSource::ClangASTSourceProxy::FindExternalLexicalDecls(clang::DeclContext
const*, llvm::function_ref<bool (clang::Decl::Kind)>,
llvm::SmallVectorImpl<clang::Decl*>&) (this=0x105e230, DC=0x13b2048,
IsKindWeWant=..., Decls=llvm::SmallVector of Size 0, Capacity 64) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h:251
clang::RecordDecl::LoadFieldsFromExternalStorage (this=0x13b2010) at
../../git/llvm/tools/clang/lib/AST/Decl.cpp:4137
clang::RecordDecl::field_begin (this=0x13b2010) at
../../git/llvm/tools/clang/lib/AST/Decl.cpp:4109
clang::RecordDecl::fields (this=0x13b2010) at
../../git/llvm/tools/clang/include/clang/AST/Decl.h:3751
(anonymous namespace)::EmptySubobjectMap::ComputeEmptySubobjectSizes
(this=0x7fffd5c774d0) at
../../git/llvm/tools/clang/lib/AST/RecordLayoutBuilder.cpp:206
...
clang::CodeGen::CodeGenTypes::ComputeRecordLayout (this=0x1d6e2d8,
D=0x1daab50, Ty=0x1d70550) at
../../git/llvm/tools/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp:725
...
clang::CodeGen::CodeGenModule::EmitTopLevelDecl (this=0x1d6e200,
D=0x1daaa00) at
../../git/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp:4571
(anonymous namespace)::CodeGeneratorImpl::HandleTopLevelDecl
(this=0x1d6c620, DG=...) at
../../git/llvm/tools/clang/lib/CodeGen/ModuleBuilder.cpp:160
lldb_private::ASTResultSynthesizer::HandleTopLevelDecl
(this=0x1a2dfc0, D=...) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ASTResultSynthesizer.cpp:109
clang::ParseAST (S=..., PrintStats=false, SkipFunctionBodies=false) at
../../git/llvm/tools/clang/lib/Parse/ParseAST.cpp:162
clang::ParseAST (PP=..., Consumer=0x1a2dfc0, Ctx=...,
PrintStats=false, TUKind=clang::TU_Complete, CompletionConsumer=0x0,
SkipFunctionBodies=false) at
../../git/llvm/tools/clang/lib/Parse/ParseAST.cpp:111
lldb_private::ClangExpressionParser::Parse (this=0x7fff14cdfe90,
diagnostic_manager=...) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp:608
lldb_private::ClangUserExpression::Parse (this=0x1d1d530,
diagnostic_manager=..., exe_ctx=...,
execution_policy=lldb_private::eExecutionPolicyOnlyWhenNeeded,
keep_result_in_memory=true, generate_debug_info=false) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp:495
lldb_private::UserExpression::Evaluate (exe_ctx=..., options=...,
expr="tpi", prefix="", result_valobj_sp=..., error=..., line_offset=0,
fixed_expression=0x1a95738, jit_module_sp_ptr=0x0) at
../../git/llvm/tools/lldb/source/Expression/UserExpression.cpp:237
lldb_private::Target::EvaluateExpression (this=0x1b32570, expr="tpi",
exe_scope=0x7fe73ca42d90, result_valobj_sp=..., options=...,
fixed_expression=0x1a95738) at
../../git/llvm/tools/lldb/source/Target/Target.cpp:2308
lldb_private::CommandObjectExpression::EvaluateExpression
(this=0x1a953b0, expr=0x7fff14ce0d58 "tpi",
output_stream=0x7fff14ce16e8, error_stream=0x7fff14ce1740,
result=0x7fff14ce16e8) at
../../git/llvm/tools/lldb/source/Commands/CommandObjectExpression.cpp:377
(3)
=== ASTContext B, "From" ASTContext Z, ASTImporter is in MINIMAL mode,
but ImportDefinition forces a full import
clang::ASTImporter::ImportDefinition (this=0x1d75200, From=0x1c01048)
at ../../git/llvm/tools/clang/lib/AST/ASTImporter.cpp:7519
lldb_private::ClangASTImporter::Minion::ImportDefinitionTo
(this=0x1d75200, to=0x1d1b8d8, from=0x1c01048) at
../../git/llvm/tools/lldb/source/Symbol/ClangASTImporter.cpp:889
lldb_private::ClangASTImporter::CompleteTagDecl (this=0x1c96360,
decl=0x1d1b8d8) at
../../git/llvm/tools/lldb/source/Symbol/ClangASTImporter.cpp:560
lldb_private::ClangASTSource::CompleteType (this=0x1a66560,
tag_decl=0x1d1b8d8) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp:299
lldb_private::ClangASTSource::ClangASTSourceProxy::CompleteType
(this=0x1a24d60, Tag=0x1d1b8d8) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h:255
GetCompleteQualType (ast=0x1cde470, qual_type=...,
allow_completion=true) at
../../git/llvm/tools/lldb/source/Symbol/ClangASTContext.cpp:2515
lldb_private::ClangASTContext::GetNumChildren (this=0x1c456f0,
type=0x1d1b980, omit_empty_base_classes=true) at
../../git/llvm/tools/lldb/source/Symbol/ClangASTContext.cpp:5341
lldb_private::CompilerType::GetNumChildren (this=0x7fff14cdfe18,
omit_empty_base_classes=true) at
../../git/llvm/tools/lldb/source/Symbol/CompilerType.cpp:541
lldb_private::ClangASTContext::GetNumChildren (this=0x1c456f0,
type=0x1d1ba10, omit_empty_base_classes=true) at
../../git/llvm/tools/lldb/source/Symbol/ClangASTContext.cpp:5443
lldb_private::CompilerType::GetNumChildren (this=0x7fff14ce0018,
omit_empty_base_classes=true) at
../../git/llvm/tools/lldb/source/Symbol/CompilerType.cpp:541
lldb_private::ClangASTContext::GetNumChildren (this=0x1c456f0,
type=0x1d1baa0, omit_empty_base_classes=true) at
../../git/llvm/tools/lldb/source/Symbol/ClangASTContext.cpp:5472
lldb_private::CompilerType::GetNumChildren (this=0x7fff14ce01d0,
omit_empty_base_classes=true) at
../../git/llvm/tools/lldb/source/Symbol/CompilerType.cpp:541
lldb_private::ValueObjectConstResult::CalculateNumChildren
(this=0x1d6c620, max=4294967295) at
../../git/llvm/tools/lldb/source/Core/ValueObjectConstResult.cpp:211
lldb_private::ValueObject::GetNumChildren (this=0x1d6c620,
max=4294967295) at
../../git/llvm/tools/lldb/source/Core/ValueObject.cpp:601
lldb_private::FormatManager::ShouldPrintAsOneLiner
(this=0x7fe7676031d8 <GetFormatManager()::g_format_manager>,
valobj=...) at ../../git/llvm/tools/lldb/source/DataFormatters/FormatManager.cpp:494
lldb_private::DataVisualization::ShouldPrintAsOneLiner (valobj=...) at
../../git/llvm/tools/lldb/source/DataFormatters/DataVisualization.cpp:33
lldb_private::ValueObjectPrinter::PrintChildrenIfNeeded
(this=0x7fff14ce0560, value_printed=true, summary_printed=false) at
../../git/llvm/tools/lldb/source/DataFormatters/ValueObjectPrinter.cpp:771
lldb_private::ValueObjectPrinter::PrintValueObject
...
lldb_private::ValueObject::Dump (this=0x1d6c620, s=..., options=...)
at ../../git/llvm/tools/lldb/source/Core/ValueObject.cpp:2742
lldb_private::CommandObjectExpression::EvaluateExpression
(4)
==== ASTContext B, "From" ASTContext Y, MINIMAL import, skips
ExternalASTSource interface
clang::ASTImporter::Import (this=0x1d74cd0, FromT=...) at
../../git/llvm/tools/clang/lib/AST/ASTImporter.cpp:6983
lldb_private::ClangASTImporter::CopyType (this=0x1c96360,
dst_ast=0x1cde470, src_ast=0x1d5bf60, type=...) at
../../git/llvm/tools/lldb/source/Symbol/ClangASTImporter.cpp:61
lldb_private::ClangASTImporter::CopyType (this=0x1c96360,
dst_ast=0x1cde470, src_ast=0x1d5bf60, type=0x1daad10) at
../../git/llvm/tools/lldb/source/Symbol/ClangASTImporter.cpp:70
lldb_private::ClangASTImporter::DeportType (this=0x1c96360,
dst_ctx=0x1cde470, src_ctx=0x1d5bf60, type=0x1daad10) at
../../git/llvm/tools/lldb/source/Symbol/ClangASTImporter.cpp:268
lldb_private::ClangExpressionDeclMap::DeportType (this=0x1c98e00,
target=..., source=..., parser_type=...) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp:288
lldb_private::ClangExpressionDeclMap::AddPersistentVariable
(this=0x1c98e00, decl=0x1daaff8, name=..., parser_type=...,
is_result=true, is_lvalue=true) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp:332
IRForTarget::CreateResultVariable (this=0x7fff14cdf8c0,
llvm_function=...) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp:407
IRForTarget::runOnModule (this=0x7fff14cdf8c0, llvm_module=...) at
../../git/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp:2102
lldb_private::ClangExpressionParser::PrepareForExecution
...
lldb_private::CommandObjectExpression::EvaluateExpression
(this=0x1a953b0, expr=0x7fff14ce0d58 "tpi",
output_stream=0x7fff14ce16e8, error_stream=0x7fff14ce1740,
result=0x7fff14ce16e8) at
../../git/llvm/tools/lldb/source/Commands/CommandObjectExpression.cpp:377