1 //===-- ClangExpressionDeclMap.cpp ----------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "ClangExpressionDeclMap.h"
11 #include "ClangASTSource.h"
12 #include "ClangExpressionUtil.h"
13 #include "ClangExpressionVariable.h"
14 #include "ClangModulesDeclVendor.h"
15 #include "ClangPersistentVariables.h"
16 #include "ClangUtil.h"
18 #include "NameSearchContext.h"
19 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
20 #include "lldb/Core/Address.h"
21 #include "lldb/Core/Module.h"
22 #include "lldb/Core/ModuleSpec.h"
23 #include "lldb/Core/ValueObjectConstResult.h"
24 #include "lldb/Core/ValueObjectVariable.h"
25 #include "lldb/Expression/DiagnosticManager.h"
26 #include "lldb/Expression/Materializer.h"
27 #include "lldb/Symbol/CompileUnit.h"
28 #include "lldb/Symbol/CompilerDecl.h"
29 #include "lldb/Symbol/CompilerDeclContext.h"
30 #include "lldb/Symbol/Function.h"
31 #include "lldb/Symbol/ObjectFile.h"
32 #include "lldb/Symbol/SymbolContext.h"
33 #include "lldb/Symbol/SymbolFile.h"
34 #include "lldb/Symbol/SymbolVendor.h"
35 #include "lldb/Symbol/Type.h"
36 #include "lldb/Symbol/TypeList.h"
37 #include "lldb/Symbol/Variable.h"
38 #include "lldb/Symbol/VariableList.h"
39 #include "lldb/Target/ExecutionContext.h"
40 #include "lldb/Target/Process.h"
41 #include "lldb/Target/RegisterContext.h"
42 #include "lldb/Target/StackFrame.h"
43 #include "lldb/Target/Target.h"
44 #include "lldb/Target/Thread.h"
45 #include "lldb/Utility/Endian.h"
46 #include "lldb/Utility/LLDBLog.h"
47 #include "lldb/Utility/Log.h"
48 #include "lldb/Utility/RegisterValue.h"
49 #include "lldb/Utility/Status.h"
50 #include "lldb/lldb-private-types.h"
51 #include "lldb/lldb-private.h"
52 #include "clang/AST/ASTConsumer.h"
53 #include "clang/AST/ASTContext.h"
54 #include "clang/AST/ASTImporter.h"
55 #include "clang/AST/Decl.h"
56 #include "clang/AST/DeclarationName.h"
57 #include "clang/AST/RecursiveASTVisitor.h"
59 #include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h"
60 #include "Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.h"
61 #include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h"
64 using namespace lldb_private
;
65 using namespace clang
;
67 static const char *g_lldb_local_vars_namespace_cstr
= "$__lldb_local_vars";
70 /// A lambda is represented by Clang as an artifical class whose
71 /// members are the lambda captures. If we capture a 'this' pointer,
72 /// the artifical class will contain a member variable named 'this'.
73 /// The function returns a ValueObject for the captured 'this' if such
74 /// member exists. If no 'this' was captured, return a nullptr.
75 lldb::ValueObjectSP
GetCapturedThisValueObject(StackFrame
*frame
) {
78 if (auto thisValSP
= frame
->FindVariable(ConstString("this")))
79 if (auto thisThisValSP
= thisValSP
->GetChildMemberWithName("this"))
86 ClangExpressionDeclMap::ClangExpressionDeclMap(
87 bool keep_result_in_memory
,
88 Materializer::PersistentVariableDelegate
*result_delegate
,
89 const lldb::TargetSP
&target
,
90 const std::shared_ptr
<ClangASTImporter
> &importer
, ValueObject
*ctx_obj
)
91 : ClangASTSource(target
, importer
), m_found_entities(), m_struct_members(),
92 m_keep_result_in_memory(keep_result_in_memory
),
93 m_result_delegate(result_delegate
), m_ctx_obj(ctx_obj
), m_parser_vars(),
98 ClangExpressionDeclMap::~ClangExpressionDeclMap() {
99 // Note: The model is now that the parser's AST context and all associated
100 // data does not vanish until the expression has been executed. This means
101 // that valuable lookup data (like namespaces) doesn't vanish, but
107 bool ClangExpressionDeclMap::WillParse(ExecutionContext
&exe_ctx
,
108 Materializer
*materializer
) {
110 m_parser_vars
->m_exe_ctx
= exe_ctx
;
112 Target
*target
= exe_ctx
.GetTargetPtr();
113 if (exe_ctx
.GetFramePtr())
114 m_parser_vars
->m_sym_ctx
=
115 exe_ctx
.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything
);
116 else if (exe_ctx
.GetThreadPtr() &&
117 exe_ctx
.GetThreadPtr()->GetStackFrameAtIndex(0))
118 m_parser_vars
->m_sym_ctx
=
119 exe_ctx
.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(
120 lldb::eSymbolContextEverything
);
121 else if (exe_ctx
.GetProcessPtr()) {
122 m_parser_vars
->m_sym_ctx
.Clear(true);
123 m_parser_vars
->m_sym_ctx
.target_sp
= exe_ctx
.GetTargetSP();
125 m_parser_vars
->m_sym_ctx
.Clear(true);
126 m_parser_vars
->m_sym_ctx
.target_sp
= exe_ctx
.GetTargetSP();
130 m_parser_vars
->m_persistent_vars
= llvm::cast
<ClangPersistentVariables
>(
131 target
->GetPersistentExpressionStateForLanguage(eLanguageTypeC
));
133 if (!ScratchTypeSystemClang::GetForTarget(*target
))
137 m_parser_vars
->m_target_info
= GetTargetInfo();
138 m_parser_vars
->m_materializer
= materializer
;
143 void ClangExpressionDeclMap::InstallCodeGenerator(
144 clang::ASTConsumer
*code_gen
) {
145 assert(m_parser_vars
);
146 m_parser_vars
->m_code_gen
= code_gen
;
149 void ClangExpressionDeclMap::InstallDiagnosticManager(
150 DiagnosticManager
&diag_manager
) {
151 assert(m_parser_vars
);
152 m_parser_vars
->m_diagnostics
= &diag_manager
;
155 void ClangExpressionDeclMap::DidParse() {
156 if (m_parser_vars
&& m_parser_vars
->m_persistent_vars
) {
157 for (size_t entity_index
= 0, num_entities
= m_found_entities
.GetSize();
158 entity_index
< num_entities
; ++entity_index
) {
159 ExpressionVariableSP
var_sp(
160 m_found_entities
.GetVariableAtIndex(entity_index
));
162 llvm::cast
<ClangExpressionVariable
>(var_sp
.get())
163 ->DisableParserVars(GetParserID());
166 for (size_t pvar_index
= 0,
167 num_pvars
= m_parser_vars
->m_persistent_vars
->GetSize();
168 pvar_index
< num_pvars
; ++pvar_index
) {
169 ExpressionVariableSP
pvar_sp(
170 m_parser_vars
->m_persistent_vars
->GetVariableAtIndex(pvar_index
));
171 if (ClangExpressionVariable
*clang_var
=
172 llvm::dyn_cast
<ClangExpressionVariable
>(pvar_sp
.get()))
173 clang_var
->DisableParserVars(GetParserID());
180 // Interface for IRForTarget
182 ClangExpressionDeclMap::TargetInfo
ClangExpressionDeclMap::GetTargetInfo() {
183 assert(m_parser_vars
.get());
187 ExecutionContext
&exe_ctx
= m_parser_vars
->m_exe_ctx
;
189 Process
*process
= exe_ctx
.GetProcessPtr();
191 ret
.byte_order
= process
->GetByteOrder();
192 ret
.address_byte_size
= process
->GetAddressByteSize();
194 Target
*target
= exe_ctx
.GetTargetPtr();
196 ret
.byte_order
= target
->GetArchitecture().GetByteOrder();
197 ret
.address_byte_size
= target
->GetArchitecture().GetAddressByteSize();
204 TypeFromUser
ClangExpressionDeclMap::DeportType(TypeSystemClang
&target
,
205 TypeSystemClang
&source
,
206 TypeFromParser parser_type
) {
207 assert(&target
== GetScratchContext(*m_target
).get());
208 assert((TypeSystem
*)&source
==
209 parser_type
.GetTypeSystem().GetSharedPointer().get());
210 assert(&source
.getASTContext() == m_ast_context
);
212 return TypeFromUser(m_ast_importer_sp
->DeportType(target
, parser_type
));
215 bool ClangExpressionDeclMap::AddPersistentVariable(const NamedDecl
*decl
,
217 TypeFromParser parser_type
,
220 assert(m_parser_vars
.get());
221 auto ast
= parser_type
.GetTypeSystem().dyn_cast_or_null
<TypeSystemClang
>();
225 // Check if we already declared a persistent variable with the same name.
226 if (lldb::ExpressionVariableSP conflicting_var
=
227 m_parser_vars
->m_persistent_vars
->GetVariable(name
)) {
228 std::string msg
= llvm::formatv("redefinition of persistent variable '{0}'",
230 m_parser_vars
->m_diagnostics
->AddDiagnostic(
231 msg
, DiagnosticSeverity::eDiagnosticSeverityError
,
232 DiagnosticOrigin::eDiagnosticOriginLLDB
);
236 if (m_parser_vars
->m_materializer
&& is_result
) {
239 ExecutionContext
&exe_ctx
= m_parser_vars
->m_exe_ctx
;
240 Target
*target
= exe_ctx
.GetTargetPtr();
241 if (target
== nullptr)
244 auto clang_ast_context
= GetScratchContext(*target
);
245 if (!clang_ast_context
)
248 TypeFromUser user_type
= DeportType(*clang_ast_context
, *ast
, parser_type
);
250 uint32_t offset
= m_parser_vars
->m_materializer
->AddResultVariable(
251 user_type
, is_lvalue
, m_keep_result_in_memory
, m_result_delegate
, err
);
253 ClangExpressionVariable
*var
= new ClangExpressionVariable(
254 exe_ctx
.GetBestExecutionContextScope(), name
, user_type
,
255 m_parser_vars
->m_target_info
.byte_order
,
256 m_parser_vars
->m_target_info
.address_byte_size
);
258 m_found_entities
.AddNewlyConstructedVariable(var
);
260 var
->EnableParserVars(GetParserID());
262 ClangExpressionVariable::ParserVars
*parser_vars
=
263 var
->GetParserVars(GetParserID());
265 parser_vars
->m_named_decl
= decl
;
267 var
->EnableJITVars(GetParserID());
269 ClangExpressionVariable::JITVars
*jit_vars
= var
->GetJITVars(GetParserID());
271 jit_vars
->m_offset
= offset
;
276 Log
*log
= GetLog(LLDBLog::Expressions
);
277 ExecutionContext
&exe_ctx
= m_parser_vars
->m_exe_ctx
;
278 Target
*target
= exe_ctx
.GetTargetPtr();
279 if (target
== nullptr)
282 auto context
= GetScratchContext(*target
);
286 TypeFromUser user_type
= DeportType(*context
, *ast
, parser_type
);
288 if (!user_type
.GetOpaqueQualType()) {
289 LLDB_LOG(log
, "Persistent variable's type wasn't copied successfully");
293 if (!m_parser_vars
->m_target_info
.IsValid())
296 if (!m_parser_vars
->m_persistent_vars
)
299 ClangExpressionVariable
*var
= llvm::cast
<ClangExpressionVariable
>(
300 m_parser_vars
->m_persistent_vars
301 ->CreatePersistentVariable(
302 exe_ctx
.GetBestExecutionContextScope(), name
, user_type
,
303 m_parser_vars
->m_target_info
.byte_order
,
304 m_parser_vars
->m_target_info
.address_byte_size
)
310 var
->m_frozen_sp
->SetHasCompleteType();
313 var
->m_flags
|= ClangExpressionVariable::EVNeedsFreezeDry
;
316 ClangExpressionVariable::EVKeepInTarget
; // explicitly-declared
317 // persistent variables should
321 var
->m_flags
|= ClangExpressionVariable::EVIsProgramReference
;
323 var
->m_flags
|= ClangExpressionVariable::EVIsLLDBAllocated
;
324 var
->m_flags
|= ClangExpressionVariable::EVNeedsAllocation
;
327 if (m_keep_result_in_memory
) {
328 var
->m_flags
|= ClangExpressionVariable::EVKeepInTarget
;
331 LLDB_LOG(log
, "Created persistent variable with flags {0:x}", var
->m_flags
);
333 var
->EnableParserVars(GetParserID());
335 ClangExpressionVariable::ParserVars
*parser_vars
=
336 var
->GetParserVars(GetParserID());
338 parser_vars
->m_named_decl
= decl
;
343 bool ClangExpressionDeclMap::AddValueToStruct(const NamedDecl
*decl
,
345 llvm::Value
*value
, size_t size
,
346 lldb::offset_t alignment
) {
347 assert(m_struct_vars
.get());
348 assert(m_parser_vars
.get());
350 bool is_persistent_variable
= false;
352 Log
*log
= GetLog(LLDBLog::Expressions
);
354 m_struct_vars
->m_struct_laid_out
= false;
356 if (ClangExpressionVariable::FindVariableInList(m_struct_members
, decl
,
360 ClangExpressionVariable
*var(ClangExpressionVariable::FindVariableInList(
361 m_found_entities
, decl
, GetParserID()));
363 if (!var
&& m_parser_vars
->m_persistent_vars
) {
364 var
= ClangExpressionVariable::FindVariableInList(
365 *m_parser_vars
->m_persistent_vars
, decl
, GetParserID());
366 is_persistent_variable
= true;
372 LLDB_LOG(log
, "Adding value for (NamedDecl*){0} [{1} - {2}] to the structure",
373 decl
, name
, var
->GetName());
375 // We know entity->m_parser_vars is valid because we used a parser variable
378 ClangExpressionVariable::ParserVars
*parser_vars
=
379 llvm::cast
<ClangExpressionVariable
>(var
)->GetParserVars(GetParserID());
381 parser_vars
->m_llvm_value
= value
;
383 if (ClangExpressionVariable::JITVars
*jit_vars
=
384 llvm::cast
<ClangExpressionVariable
>(var
)->GetJITVars(GetParserID())) {
385 // We already laid this out; do not touch
387 LLDB_LOG(log
, "Already placed at {0:x}", jit_vars
->m_offset
);
390 llvm::cast
<ClangExpressionVariable
>(var
)->EnableJITVars(GetParserID());
392 ClangExpressionVariable::JITVars
*jit_vars
=
393 llvm::cast
<ClangExpressionVariable
>(var
)->GetJITVars(GetParserID());
395 jit_vars
->m_alignment
= alignment
;
396 jit_vars
->m_size
= size
;
398 m_struct_members
.AddVariable(var
->shared_from_this());
400 if (m_parser_vars
->m_materializer
) {
405 if (is_persistent_variable
) {
406 ExpressionVariableSP
var_sp(var
->shared_from_this());
407 offset
= m_parser_vars
->m_materializer
->AddPersistentVariable(
408 var_sp
, nullptr, err
);
410 if (const lldb_private::Symbol
*sym
= parser_vars
->m_lldb_sym
)
411 offset
= m_parser_vars
->m_materializer
->AddSymbol(*sym
, err
);
412 else if (const RegisterInfo
*reg_info
= var
->GetRegisterInfo())
413 offset
= m_parser_vars
->m_materializer
->AddRegister(*reg_info
, err
);
414 else if (parser_vars
->m_lldb_var
)
415 offset
= m_parser_vars
->m_materializer
->AddVariable(
416 parser_vars
->m_lldb_var
, err
);
417 else if (parser_vars
->m_lldb_valobj_provider
) {
418 offset
= m_parser_vars
->m_materializer
->AddValueObject(
419 name
, parser_vars
->m_lldb_valobj_provider
, err
);
426 LLDB_LOG(log
, "Placed at {0:x}", offset
);
429 offset
; // TODO DoStructLayout() should not change this.
435 bool ClangExpressionDeclMap::DoStructLayout() {
436 assert(m_struct_vars
.get());
438 if (m_struct_vars
->m_struct_laid_out
)
441 if (!m_parser_vars
->m_materializer
)
444 m_struct_vars
->m_struct_alignment
=
445 m_parser_vars
->m_materializer
->GetStructAlignment();
446 m_struct_vars
->m_struct_size
=
447 m_parser_vars
->m_materializer
->GetStructByteSize();
448 m_struct_vars
->m_struct_laid_out
= true;
452 bool ClangExpressionDeclMap::GetStructInfo(uint32_t &num_elements
, size_t &size
,
453 lldb::offset_t
&alignment
) {
454 assert(m_struct_vars
.get());
456 if (!m_struct_vars
->m_struct_laid_out
)
459 num_elements
= m_struct_members
.GetSize();
460 size
= m_struct_vars
->m_struct_size
;
461 alignment
= m_struct_vars
->m_struct_alignment
;
466 bool ClangExpressionDeclMap::GetStructElement(const NamedDecl
*&decl
,
468 lldb::offset_t
&offset
,
471 assert(m_struct_vars
.get());
473 if (!m_struct_vars
->m_struct_laid_out
)
476 if (index
>= m_struct_members
.GetSize())
479 ExpressionVariableSP
member_sp(m_struct_members
.GetVariableAtIndex(index
));
484 ClangExpressionVariable::ParserVars
*parser_vars
=
485 llvm::cast
<ClangExpressionVariable
>(member_sp
.get())
486 ->GetParserVars(GetParserID());
487 ClangExpressionVariable::JITVars
*jit_vars
=
488 llvm::cast
<ClangExpressionVariable
>(member_sp
.get())
489 ->GetJITVars(GetParserID());
491 if (!parser_vars
|| !jit_vars
|| !member_sp
->GetValueObject())
494 decl
= parser_vars
->m_named_decl
;
495 value
= parser_vars
->m_llvm_value
;
496 offset
= jit_vars
->m_offset
;
497 name
= member_sp
->GetName();
502 bool ClangExpressionDeclMap::GetFunctionInfo(const NamedDecl
*decl
,
504 ClangExpressionVariable
*entity(ClangExpressionVariable::FindVariableInList(
505 m_found_entities
, decl
, GetParserID()));
510 // We know m_parser_vars is valid since we searched for the variable by its
513 ClangExpressionVariable::ParserVars
*parser_vars
=
514 entity
->GetParserVars(GetParserID());
516 ptr
= parser_vars
->m_lldb_value
.GetScalar().ULongLong();
521 addr_t
ClangExpressionDeclMap::GetSymbolAddress(Target
&target
,
524 lldb::SymbolType symbol_type
,
525 lldb_private::Module
*module
) {
526 SymbolContextList sc_list
;
529 module
->FindSymbolsWithNameAndType(name
, symbol_type
, sc_list
);
531 target
.GetImages().FindSymbolsWithNameAndType(name
, symbol_type
, sc_list
);
533 addr_t symbol_load_addr
= LLDB_INVALID_ADDRESS
;
535 for (const SymbolContext
&sym_ctx
: sc_list
) {
536 if (symbol_load_addr
!= 0 && symbol_load_addr
!= LLDB_INVALID_ADDRESS
)
539 const Address sym_address
= sym_ctx
.symbol
->GetAddress();
541 if (!sym_address
.IsValid())
544 switch (sym_ctx
.symbol
->GetType()) {
545 case eSymbolTypeCode
:
546 case eSymbolTypeTrampoline
:
547 symbol_load_addr
= sym_address
.GetCallableLoadAddress(&target
);
550 case eSymbolTypeResolver
:
551 symbol_load_addr
= sym_address
.GetCallableLoadAddress(&target
, true);
554 case eSymbolTypeReExported
: {
555 ConstString reexport_name
= sym_ctx
.symbol
->GetReExportedSymbolName();
557 ModuleSP reexport_module_sp
;
558 ModuleSpec reexport_module_spec
;
559 reexport_module_spec
.GetPlatformFileSpec() =
560 sym_ctx
.symbol
->GetReExportedSymbolSharedLibrary();
561 if (reexport_module_spec
.GetPlatformFileSpec()) {
563 target
.GetImages().FindFirstModule(reexport_module_spec
);
564 if (!reexport_module_sp
) {
565 reexport_module_spec
.GetPlatformFileSpec().ClearDirectory();
567 target
.GetImages().FindFirstModule(reexport_module_spec
);
570 symbol_load_addr
= GetSymbolAddress(
571 target
, process
, sym_ctx
.symbol
->GetReExportedSymbolName(),
572 symbol_type
, reexport_module_sp
.get());
576 case eSymbolTypeData
:
577 case eSymbolTypeRuntime
:
578 case eSymbolTypeVariable
:
579 case eSymbolTypeLocal
:
580 case eSymbolTypeParam
:
581 case eSymbolTypeInvalid
:
582 case eSymbolTypeAbsolute
:
583 case eSymbolTypeException
:
584 case eSymbolTypeSourceFile
:
585 case eSymbolTypeHeaderFile
:
586 case eSymbolTypeObjectFile
:
587 case eSymbolTypeCommonBlock
:
588 case eSymbolTypeBlock
:
589 case eSymbolTypeVariableType
:
590 case eSymbolTypeLineEntry
:
591 case eSymbolTypeLineHeader
:
592 case eSymbolTypeScopeBegin
:
593 case eSymbolTypeScopeEnd
:
594 case eSymbolTypeAdditional
:
595 case eSymbolTypeCompiler
:
596 case eSymbolTypeInstrumentation
:
597 case eSymbolTypeUndefined
:
598 case eSymbolTypeObjCClass
:
599 case eSymbolTypeObjCMetaClass
:
600 case eSymbolTypeObjCIVar
:
601 symbol_load_addr
= sym_address
.GetLoadAddress(&target
);
606 if (symbol_load_addr
== LLDB_INVALID_ADDRESS
&& process
) {
607 ObjCLanguageRuntime
*runtime
= ObjCLanguageRuntime::Get(*process
);
610 symbol_load_addr
= runtime
->LookupRuntimeSymbol(name
);
614 return symbol_load_addr
;
617 addr_t
ClangExpressionDeclMap::GetSymbolAddress(ConstString name
,
618 lldb::SymbolType symbol_type
) {
619 assert(m_parser_vars
.get());
621 if (!m_parser_vars
->m_exe_ctx
.GetTargetPtr())
624 return GetSymbolAddress(m_parser_vars
->m_exe_ctx
.GetTargetRef(),
625 m_parser_vars
->m_exe_ctx
.GetProcessPtr(), name
,
629 lldb::VariableSP
ClangExpressionDeclMap::FindGlobalVariable(
630 Target
&target
, ModuleSP
&module
, ConstString name
,
631 const CompilerDeclContext
&namespace_decl
) {
634 if (module
&& namespace_decl
)
635 module
->FindGlobalVariables(name
, namespace_decl
, -1, vars
);
637 target
.GetImages().FindGlobalVariables(name
, -1, vars
);
639 if (vars
.GetSize() == 0)
641 return vars
.GetVariableAtIndex(0);
644 TypeSystemClang
*ClangExpressionDeclMap::GetTypeSystemClang() {
645 StackFrame
*frame
= m_parser_vars
->m_exe_ctx
.GetFramePtr();
646 if (frame
== nullptr)
649 SymbolContext sym_ctx
= frame
->GetSymbolContext(lldb::eSymbolContextFunction
|
650 lldb::eSymbolContextBlock
);
651 if (sym_ctx
.block
== nullptr)
654 CompilerDeclContext frame_decl_context
= sym_ctx
.block
->GetDeclContext();
655 if (!frame_decl_context
)
658 return llvm::dyn_cast_or_null
<TypeSystemClang
>(
659 frame_decl_context
.GetTypeSystem());
662 // Interface for ClangASTSource
664 void ClangExpressionDeclMap::FindExternalVisibleDecls(
665 NameSearchContext
&context
) {
666 assert(m_ast_context
);
668 const ConstString
name(context
.m_decl_name
.getAsString().c_str());
670 Log
*log
= GetLog(LLDBLog::Expressions
);
673 if (!context
.m_decl_context
)
675 "ClangExpressionDeclMap::FindExternalVisibleDecls for "
676 "'{0}' in a NULL DeclContext",
678 else if (const NamedDecl
*context_named_decl
=
679 dyn_cast
<NamedDecl
>(context
.m_decl_context
))
681 "ClangExpressionDeclMap::FindExternalVisibleDecls for "
683 name
, context_named_decl
->getNameAsString());
686 "ClangExpressionDeclMap::FindExternalVisibleDecls for "
688 name
, context
.m_decl_context
->getDeclKindName());
691 if (const NamespaceDecl
*namespace_context
=
692 dyn_cast
<NamespaceDecl
>(context
.m_decl_context
)) {
693 if (namespace_context
->getName().str() ==
694 std::string(g_lldb_local_vars_namespace_cstr
)) {
695 CompilerDeclContext compiler_decl_ctx
=
696 m_clang_ast_context
->CreateDeclContext(
697 const_cast<clang::DeclContext
*>(context
.m_decl_context
));
698 FindExternalVisibleDecls(context
, lldb::ModuleSP(), compiler_decl_ctx
);
702 ClangASTImporter::NamespaceMapSP namespace_map
=
703 m_ast_importer_sp
->GetNamespaceMap(namespace_context
);
708 LLDB_LOGV(log
, " CEDM::FEVD Inspecting (NamespaceMap*){0:x} ({1} entries)",
709 namespace_map
.get(), namespace_map
->size());
711 for (ClangASTImporter::NamespaceMapItem
&n
: *namespace_map
) {
712 LLDB_LOG(log
, " CEDM::FEVD Searching namespace {0} in module {1}",
713 n
.second
.GetName(), n
.first
->GetFileSpec().GetFilename());
715 FindExternalVisibleDecls(context
, n
.first
, n
.second
);
717 } else if (isa
<TranslationUnitDecl
>(context
.m_decl_context
)) {
718 CompilerDeclContext namespace_decl
;
720 LLDB_LOG(log
, " CEDM::FEVD Searching the root namespace");
722 FindExternalVisibleDecls(context
, lldb::ModuleSP(), namespace_decl
);
725 ClangASTSource::FindExternalVisibleDecls(context
);
728 void ClangExpressionDeclMap::MaybeRegisterFunctionBody(
729 FunctionDecl
*copied_function_decl
) {
730 if (copied_function_decl
->getBody() && m_parser_vars
->m_code_gen
) {
731 clang::DeclGroupRef
decl_group_ref(copied_function_decl
);
732 m_parser_vars
->m_code_gen
->HandleTopLevelDecl(decl_group_ref
);
736 clang::NamedDecl
*ClangExpressionDeclMap::GetPersistentDecl(ConstString name
) {
739 Target
*target
= m_parser_vars
->m_exe_ctx
.GetTargetPtr();
743 ScratchTypeSystemClang::GetForTarget(*target
);
745 if (!m_parser_vars
->m_persistent_vars
)
747 return m_parser_vars
->m_persistent_vars
->GetPersistentDecl(name
);
750 void ClangExpressionDeclMap::SearchPersistenDecls(NameSearchContext
&context
,
751 const ConstString name
) {
752 Log
*log
= GetLog(LLDBLog::Expressions
);
754 NamedDecl
*persistent_decl
= GetPersistentDecl(name
);
756 if (!persistent_decl
)
759 Decl
*parser_persistent_decl
= CopyDecl(persistent_decl
);
761 if (!parser_persistent_decl
)
764 NamedDecl
*parser_named_decl
= dyn_cast
<NamedDecl
>(parser_persistent_decl
);
766 if (!parser_named_decl
)
769 if (clang::FunctionDecl
*parser_function_decl
=
770 llvm::dyn_cast
<clang::FunctionDecl
>(parser_named_decl
)) {
771 MaybeRegisterFunctionBody(parser_function_decl
);
774 LLDB_LOG(log
, " CEDM::FEVD Found persistent decl {0}", name
);
776 context
.AddNamedDecl(parser_named_decl
);
779 void ClangExpressionDeclMap::LookUpLldbClass(NameSearchContext
&context
) {
780 Log
*log
= GetLog(LLDBLog::Expressions
);
782 StackFrame
*frame
= m_parser_vars
->m_exe_ctx
.GetFramePtr();
783 SymbolContext sym_ctx
;
784 if (frame
!= nullptr)
785 sym_ctx
= frame
->GetSymbolContext(lldb::eSymbolContextFunction
|
786 lldb::eSymbolContextBlock
);
790 lldb::ValueObjectSP ctx_obj_ptr
= m_ctx_obj
->AddressOf(status
);
791 if (!ctx_obj_ptr
|| status
.Fail())
794 AddContextClassType(context
, TypeFromUser(m_ctx_obj
->GetCompilerType()));
798 // Clang is looking for the type of "this"
800 if (frame
== nullptr)
803 // Find the block that defines the function represented by "sym_ctx"
804 Block
*function_block
= sym_ctx
.GetFunctionBlock();
809 CompilerDeclContext function_decl_ctx
= function_block
->GetDeclContext();
811 if (!function_decl_ctx
)
814 clang::CXXMethodDecl
*method_decl
=
815 TypeSystemClang::DeclContextGetAsCXXMethodDecl(function_decl_ctx
);
818 if (auto capturedThis
= GetCapturedThisValueObject(frame
)) {
819 // We're inside a lambda and we captured a 'this'.
820 // Import the outer class's AST instead of the
821 // (unnamed) lambda structure AST so unqualified
822 // member lookups are understood by the Clang parser.
824 // If we're in a lambda which didn't capture 'this',
825 // $__lldb_class will correspond to the lambda closure
826 // AST and references to captures will resolve like
827 // regular member varaiable accesses do.
828 TypeFromUser pointee_type
=
829 capturedThis
->GetCompilerType().GetPointeeType();
832 " CEDM::FEVD Adding captured type ({0} for"
833 " $__lldb_class: {1}",
834 capturedThis
->GetTypeName(), capturedThis
->GetName());
836 AddContextClassType(context
, pointee_type
);
840 clang::CXXRecordDecl
*class_decl
= method_decl
->getParent();
842 QualType
class_qual_type(class_decl
->getTypeForDecl(), 0);
844 TypeFromUser
class_user_type(
845 class_qual_type
.getAsOpaquePtr(),
846 function_decl_ctx
.GetTypeSystem()->weak_from_this());
848 LLDB_LOG(log
, " CEDM::FEVD Adding type for $__lldb_class: {0}",
849 class_qual_type
.getAsString());
851 AddContextClassType(context
, class_user_type
);
855 // This branch will get hit if we are executing code in the context of
856 // a function that claims to have an object pointer (through
857 // DW_AT_object_pointer?) but is not formally a method of the class.
858 // In that case, just look up the "this" variable in the current scope
860 // FIXME: This code is formally correct, but clang doesn't currently
861 // emit DW_AT_object_pointer
862 // for C++ so it hasn't actually been tested.
864 VariableList
*vars
= frame
->GetVariableList(false, nullptr);
866 lldb::VariableSP this_var
= vars
->FindVariable(ConstString("this"));
868 if (this_var
&& this_var
->IsInScope(frame
) &&
869 this_var
->LocationIsValidForFrame(frame
)) {
870 Type
*this_type
= this_var
->GetType();
875 TypeFromUser pointee_type
=
876 this_type
->GetForwardCompilerType().GetPointeeType();
878 LLDB_LOG(log
, " FEVD Adding type for $__lldb_class: {0}",
879 ClangUtil::GetQualType(pointee_type
).getAsString());
881 AddContextClassType(context
, pointee_type
);
885 void ClangExpressionDeclMap::LookUpLldbObjCClass(NameSearchContext
&context
) {
886 Log
*log
= GetLog(LLDBLog::Expressions
);
888 StackFrame
*frame
= m_parser_vars
->m_exe_ctx
.GetFramePtr();
892 lldb::ValueObjectSP ctx_obj_ptr
= m_ctx_obj
->AddressOf(status
);
893 if (!ctx_obj_ptr
|| status
.Fail())
896 AddOneType(context
, TypeFromUser(m_ctx_obj
->GetCompilerType()));
900 // Clang is looking for the type of "*self"
905 SymbolContext sym_ctx
= frame
->GetSymbolContext(lldb::eSymbolContextFunction
|
906 lldb::eSymbolContextBlock
);
908 // Find the block that defines the function represented by "sym_ctx"
909 Block
*function_block
= sym_ctx
.GetFunctionBlock();
914 CompilerDeclContext function_decl_ctx
= function_block
->GetDeclContext();
916 if (!function_decl_ctx
)
919 clang::ObjCMethodDecl
*method_decl
=
920 TypeSystemClang::DeclContextGetAsObjCMethodDecl(function_decl_ctx
);
923 ObjCInterfaceDecl
*self_interface
= method_decl
->getClassInterface();
928 const clang::Type
*interface_type
= self_interface
->getTypeForDecl();
931 return; // This is unlikely, but we have seen crashes where this
934 TypeFromUser
class_user_type(
935 QualType(interface_type
, 0).getAsOpaquePtr(),
936 function_decl_ctx
.GetTypeSystem()->weak_from_this());
938 LLDB_LOG(log
, " FEVD[{0}] Adding type for $__lldb_objc_class: {1}",
939 ClangUtil::ToString(interface_type
));
941 AddOneType(context
, class_user_type
);
944 // This branch will get hit if we are executing code in the context of
945 // a function that claims to have an object pointer (through
946 // DW_AT_object_pointer?) but is not formally a method of the class.
947 // In that case, just look up the "self" variable in the current scope
950 VariableList
*vars
= frame
->GetVariableList(false, nullptr);
952 lldb::VariableSP self_var
= vars
->FindVariable(ConstString("self"));
956 if (!self_var
->IsInScope(frame
))
958 if (!self_var
->LocationIsValidForFrame(frame
))
961 Type
*self_type
= self_var
->GetType();
966 CompilerType self_clang_type
= self_type
->GetFullCompilerType();
968 if (TypeSystemClang::IsObjCClassType(self_clang_type
)) {
971 if (!TypeSystemClang::IsObjCObjectPointerType(self_clang_type
))
973 self_clang_type
= self_clang_type
.GetPointeeType();
975 if (!self_clang_type
)
978 LLDB_LOG(log
, " FEVD[{0}] Adding type for $__lldb_objc_class: {1}",
979 ClangUtil::ToString(self_type
->GetFullCompilerType()));
981 TypeFromUser
class_user_type(self_clang_type
);
983 AddOneType(context
, class_user_type
);
986 void ClangExpressionDeclMap::LookupLocalVarNamespace(
987 SymbolContext
&sym_ctx
, NameSearchContext
&name_context
) {
988 if (sym_ctx
.block
== nullptr)
991 CompilerDeclContext frame_decl_context
= sym_ctx
.block
->GetDeclContext();
992 if (!frame_decl_context
)
995 TypeSystemClang
*frame_ast
= llvm::dyn_cast_or_null
<TypeSystemClang
>(
996 frame_decl_context
.GetTypeSystem());
1000 clang::NamespaceDecl
*namespace_decl
=
1001 m_clang_ast_context
->GetUniqueNamespaceDeclaration(
1002 g_lldb_local_vars_namespace_cstr
, nullptr, OptionalClangModuleID());
1003 if (!namespace_decl
)
1006 name_context
.AddNamedDecl(namespace_decl
);
1007 clang::DeclContext
*ctxt
= clang::Decl::castToDeclContext(namespace_decl
);
1008 ctxt
->setHasExternalVisibleStorage(true);
1009 name_context
.m_found_local_vars_nsp
= true;
1012 void ClangExpressionDeclMap::LookupInModulesDeclVendor(
1013 NameSearchContext
&context
, ConstString name
) {
1014 Log
*log
= GetLog(LLDBLog::Expressions
);
1019 std::shared_ptr
<ClangModulesDeclVendor
> modules_decl_vendor
=
1020 GetClangModulesDeclVendor();
1021 if (!modules_decl_vendor
)
1024 bool append
= false;
1025 uint32_t max_matches
= 1;
1026 std::vector
<clang::NamedDecl
*> decls
;
1028 if (!modules_decl_vendor
->FindDecls(name
, append
, max_matches
, decls
))
1031 assert(!decls
.empty() && "FindDecls returned true but no decls?");
1032 clang::NamedDecl
*const decl_from_modules
= decls
[0];
1035 " CAS::FEVD Matching decl found for "
1036 "\"{0}\" in the modules",
1039 clang::Decl
*copied_decl
= CopyDecl(decl_from_modules
);
1041 LLDB_LOG(log
, " CAS::FEVD - Couldn't export a "
1042 "declaration from the modules");
1046 if (auto copied_function
= dyn_cast
<clang::FunctionDecl
>(copied_decl
)) {
1047 MaybeRegisterFunctionBody(copied_function
);
1049 context
.AddNamedDecl(copied_function
);
1051 context
.m_found_function_with_type_info
= true;
1052 context
.m_found_function
= true;
1053 } else if (auto copied_var
= dyn_cast
<clang::VarDecl
>(copied_decl
)) {
1054 context
.AddNamedDecl(copied_var
);
1055 context
.m_found_variable
= true;
1059 bool ClangExpressionDeclMap::LookupLocalVariable(
1060 NameSearchContext
&context
, ConstString name
, SymbolContext
&sym_ctx
,
1061 const CompilerDeclContext
&namespace_decl
) {
1062 if (sym_ctx
.block
== nullptr)
1065 CompilerDeclContext decl_context
= sym_ctx
.block
->GetDeclContext();
1069 // Make sure that the variables are parsed so that we have the
1071 StackFrame
*frame
= m_parser_vars
->m_exe_ctx
.GetFramePtr();
1072 VariableListSP vars
= frame
->GetInScopeVariableList(true);
1073 for (size_t i
= 0; i
< vars
->GetSize(); i
++)
1074 vars
->GetVariableAtIndex(i
)->GetDecl();
1076 // Search for declarations matching the name. Do not include imported
1077 // decls in the search if we are looking for decls in the artificial
1078 // namespace $__lldb_local_vars.
1079 std::vector
<CompilerDecl
> found_decls
=
1080 decl_context
.FindDeclByName(name
, namespace_decl
.IsValid());
1083 bool variable_found
= false;
1084 for (CompilerDecl decl
: found_decls
) {
1085 for (size_t vi
= 0, ve
= vars
->GetSize(); vi
!= ve
; ++vi
) {
1086 VariableSP candidate_var
= vars
->GetVariableAtIndex(vi
);
1087 if (candidate_var
->GetDecl() == decl
) {
1088 var
= candidate_var
;
1093 if (var
&& !variable_found
) {
1094 variable_found
= true;
1095 ValueObjectSP valobj
= ValueObjectVariable::Create(frame
, var
);
1096 AddOneVariable(context
, var
, valobj
);
1097 context
.m_found_variable
= true;
1101 // We're in a local_var_lookup but haven't found any local variables
1102 // so far. When performing a variable lookup from within the context of
1103 // a lambda, we count the lambda captures as local variables. Thus,
1104 // see if we captured any variables with the requested 'name'.
1105 if (!variable_found
) {
1106 auto find_capture
= [](ConstString varname
,
1107 StackFrame
*frame
) -> ValueObjectSP
{
1108 if (auto lambda
= ClangExpressionUtil::GetLambdaValueObject(frame
)) {
1109 if (auto capture
= lambda
->GetChildMemberWithName(varname
)) {
1117 if (auto capture
= find_capture(name
, frame
)) {
1118 variable_found
= true;
1119 context
.m_found_variable
= true;
1120 AddOneVariable(context
, std::move(capture
), std::move(find_capture
));
1124 return variable_found
;
1127 /// Structure to hold the info needed when comparing function
1130 struct FuncDeclInfo
{
1132 CompilerType m_copied_type
;
1133 uint32_t m_decl_lvl
;
1134 SymbolContext m_sym_ctx
;
1138 SymbolContextList
ClangExpressionDeclMap::SearchFunctionsInSymbolContexts(
1139 const SymbolContextList
&sc_list
,
1140 const CompilerDeclContext
&frame_decl_context
) {
1141 // First, symplify things by looping through the symbol contexts to
1142 // remove unwanted functions and separate out the functions we want to
1143 // compare and prune into a separate list. Cache the info needed about
1144 // the function declarations in a vector for efficiency.
1145 SymbolContextList sc_sym_list
;
1146 std::vector
<FuncDeclInfo
> decl_infos
;
1147 decl_infos
.reserve(sc_list
.GetSize());
1148 clang::DeclContext
*frame_decl_ctx
=
1149 (clang::DeclContext
*)frame_decl_context
.GetOpaqueDeclContext();
1150 TypeSystemClang
*ast
= llvm::dyn_cast_or_null
<TypeSystemClang
>(
1151 frame_decl_context
.GetTypeSystem());
1153 for (const SymbolContext
&sym_ctx
: sc_list
) {
1156 // We don't know enough about symbols to compare them, but we should
1157 // keep them in the list.
1158 Function
*function
= sym_ctx
.function
;
1160 sc_sym_list
.Append(sym_ctx
);
1163 // Filter out functions without declaration contexts, as well as
1164 // class/instance methods, since they'll be skipped in the code that
1166 CompilerDeclContext func_decl_context
= function
->GetDeclContext();
1167 if (!func_decl_context
|| func_decl_context
.IsClassMethod())
1169 // We can only prune functions for which we can copy the type.
1170 CompilerType func_clang_type
= function
->GetType()->GetFullCompilerType();
1171 CompilerType copied_func_type
= GuardedCopyType(func_clang_type
);
1172 if (!copied_func_type
) {
1173 sc_sym_list
.Append(sym_ctx
);
1177 fdi
.m_sym_ctx
= sym_ctx
;
1178 fdi
.m_name
= function
->GetName();
1179 fdi
.m_copied_type
= copied_func_type
;
1180 fdi
.m_decl_lvl
= LLDB_INVALID_DECL_LEVEL
;
1181 if (fdi
.m_copied_type
&& func_decl_context
) {
1182 // Call CountDeclLevels to get the number of parent scopes we have
1183 // to look through before we find the function declaration. When
1184 // comparing functions of the same type, the one with a lower count
1185 // will be closer to us in the lookup scope and shadows the other.
1186 clang::DeclContext
*func_decl_ctx
=
1187 (clang::DeclContext
*)func_decl_context
.GetOpaqueDeclContext();
1188 fdi
.m_decl_lvl
= ast
->CountDeclLevels(frame_decl_ctx
, func_decl_ctx
,
1189 &fdi
.m_name
, &fdi
.m_copied_type
);
1191 decl_infos
.emplace_back(fdi
);
1194 // Loop through the functions in our cache looking for matching types,
1195 // then compare their scope levels to see which is closer.
1196 std::multimap
<CompilerType
, const FuncDeclInfo
*> matches
;
1197 for (const FuncDeclInfo
&fdi
: decl_infos
) {
1198 const CompilerType t
= fdi
.m_copied_type
;
1199 auto q
= matches
.find(t
);
1200 if (q
!= matches
.end()) {
1201 if (q
->second
->m_decl_lvl
> fdi
.m_decl_lvl
)
1202 // This function is closer; remove the old set.
1204 else if (q
->second
->m_decl_lvl
< fdi
.m_decl_lvl
)
1205 // The functions in our set are closer - skip this one.
1208 matches
.insert(std::make_pair(t
, &fdi
));
1211 // Loop through our matches and add their symbol contexts to our list.
1212 SymbolContextList sc_func_list
;
1213 for (const auto &q
: matches
)
1214 sc_func_list
.Append(q
.second
->m_sym_ctx
);
1216 // Rejoin the lists with the functions in front.
1217 sc_func_list
.Append(sc_sym_list
);
1218 return sc_func_list
;
1221 void ClangExpressionDeclMap::LookupFunction(
1222 NameSearchContext
&context
, lldb::ModuleSP module_sp
, ConstString name
,
1223 const CompilerDeclContext
&namespace_decl
) {
1227 Target
*target
= m_parser_vars
->m_exe_ctx
.GetTargetPtr();
1229 std::vector
<clang::NamedDecl
*> decls_from_modules
;
1232 if (std::shared_ptr
<ClangModulesDeclVendor
> decl_vendor
=
1233 GetClangModulesDeclVendor()) {
1234 decl_vendor
->FindDecls(name
, false, UINT32_MAX
, decls_from_modules
);
1238 SymbolContextList sc_list
;
1239 if (namespace_decl
&& module_sp
) {
1240 ModuleFunctionSearchOptions function_options
;
1241 function_options
.include_inlines
= false;
1242 function_options
.include_symbols
= false;
1244 module_sp
->FindFunctions(name
, namespace_decl
, eFunctionNameTypeBase
,
1245 function_options
, sc_list
);
1246 } else if (target
&& !namespace_decl
) {
1247 ModuleFunctionSearchOptions function_options
;
1248 function_options
.include_inlines
= false;
1249 function_options
.include_symbols
= true;
1251 // TODO Fix FindFunctions so that it doesn't return
1252 // instance methods for eFunctionNameTypeBase.
1254 target
->GetImages().FindFunctions(
1255 name
, eFunctionNameTypeFull
| eFunctionNameTypeBase
, function_options
,
1259 // If we found more than one function, see if we can use the frame's decl
1260 // context to remove functions that are shadowed by other functions which
1261 // match in type but are nearer in scope.
1263 // AddOneFunction will not add a function whose type has already been
1264 // added, so if there's another function in the list with a matching type,
1265 // check to see if their decl context is a parent of the current frame's or
1266 // was imported via a and using statement, and pick the best match
1267 // according to lookup rules.
1268 if (sc_list
.GetSize() > 1) {
1269 // Collect some info about our frame's context.
1270 StackFrame
*frame
= m_parser_vars
->m_exe_ctx
.GetFramePtr();
1271 SymbolContext frame_sym_ctx
;
1272 if (frame
!= nullptr)
1273 frame_sym_ctx
= frame
->GetSymbolContext(lldb::eSymbolContextFunction
|
1274 lldb::eSymbolContextBlock
);
1275 CompilerDeclContext frame_decl_context
=
1276 frame_sym_ctx
.block
!= nullptr ? frame_sym_ctx
.block
->GetDeclContext()
1277 : CompilerDeclContext();
1279 // We can't do this without a compiler decl context for our frame.
1280 if (frame_decl_context
) {
1281 sc_list
= SearchFunctionsInSymbolContexts(sc_list
, frame_decl_context
);
1285 if (sc_list
.GetSize()) {
1286 Symbol
*extern_symbol
= nullptr;
1287 Symbol
*non_extern_symbol
= nullptr;
1289 for (const SymbolContext
&sym_ctx
: sc_list
) {
1290 if (sym_ctx
.function
) {
1291 CompilerDeclContext decl_ctx
= sym_ctx
.function
->GetDeclContext();
1296 // Filter out class/instance methods.
1297 if (decl_ctx
.IsClassMethod())
1300 AddOneFunction(context
, sym_ctx
.function
, nullptr);
1301 context
.m_found_function_with_type_info
= true;
1302 context
.m_found_function
= true;
1303 } else if (sym_ctx
.symbol
) {
1304 Symbol
*symbol
= sym_ctx
.symbol
;
1305 if (target
&& symbol
->GetType() == eSymbolTypeReExported
) {
1306 symbol
= symbol
->ResolveReExportedSymbol(*target
);
1307 if (symbol
== nullptr)
1311 if (symbol
->IsExternal())
1312 extern_symbol
= symbol
;
1314 non_extern_symbol
= symbol
;
1318 if (!context
.m_found_function_with_type_info
) {
1319 for (clang::NamedDecl
*decl
: decls_from_modules
) {
1320 if (llvm::isa
<clang::FunctionDecl
>(decl
)) {
1321 clang::NamedDecl
*copied_decl
=
1322 llvm::cast_or_null
<FunctionDecl
>(CopyDecl(decl
));
1324 context
.AddNamedDecl(copied_decl
);
1325 context
.m_found_function_with_type_info
= true;
1331 if (!context
.m_found_function_with_type_info
) {
1332 if (extern_symbol
) {
1333 AddOneFunction(context
, nullptr, extern_symbol
);
1334 context
.m_found_function
= true;
1335 } else if (non_extern_symbol
) {
1336 AddOneFunction(context
, nullptr, non_extern_symbol
);
1337 context
.m_found_function
= true;
1343 void ClangExpressionDeclMap::FindExternalVisibleDecls(
1344 NameSearchContext
&context
, lldb::ModuleSP module_sp
,
1345 const CompilerDeclContext
&namespace_decl
) {
1346 assert(m_ast_context
);
1348 Log
*log
= GetLog(LLDBLog::Expressions
);
1350 const ConstString
name(context
.m_decl_name
.getAsString().c_str());
1351 if (IgnoreName(name
, false))
1354 // Only look for functions by name out in our symbols if the function doesn't
1355 // start with our phony prefix of '$'
1357 Target
*target
= nullptr;
1358 StackFrame
*frame
= nullptr;
1359 SymbolContext sym_ctx
;
1360 if (m_parser_vars
) {
1361 target
= m_parser_vars
->m_exe_ctx
.GetTargetPtr();
1362 frame
= m_parser_vars
->m_exe_ctx
.GetFramePtr();
1364 if (frame
!= nullptr)
1365 sym_ctx
= frame
->GetSymbolContext(lldb::eSymbolContextFunction
|
1366 lldb::eSymbolContextBlock
);
1368 // Try the persistent decls, which take precedence over all else.
1369 if (!namespace_decl
)
1370 SearchPersistenDecls(context
, name
);
1372 if (name
.GetStringRef().startswith("$") && !namespace_decl
) {
1373 if (name
== "$__lldb_class") {
1374 LookUpLldbClass(context
);
1378 if (name
== "$__lldb_objc_class") {
1379 LookUpLldbObjCClass(context
);
1382 if (name
== g_lldb_local_vars_namespace_cstr
) {
1383 LookupLocalVarNamespace(sym_ctx
, context
);
1387 // any other $__lldb names should be weeded out now
1388 if (name
.GetStringRef().startswith("$__lldb"))
1391 // No ParserVars means we can't do register or variable lookup.
1392 if (!m_parser_vars
|| !m_parser_vars
->m_persistent_vars
)
1395 ExpressionVariableSP
pvar_sp(
1396 m_parser_vars
->m_persistent_vars
->GetVariable(name
));
1399 AddOneVariable(context
, pvar_sp
);
1403 assert(name
.GetStringRef().startswith("$"));
1404 llvm::StringRef reg_name
= name
.GetStringRef().substr(1);
1406 if (m_parser_vars
->m_exe_ctx
.GetRegisterContext()) {
1407 const RegisterInfo
*reg_info(
1408 m_parser_vars
->m_exe_ctx
.GetRegisterContext()->GetRegisterInfoByName(
1412 LLDB_LOG(log
, " CEDM::FEVD Found register {0}", reg_info
->name
);
1414 AddOneRegister(context
, reg_info
);
1420 bool local_var_lookup
= !namespace_decl
|| (namespace_decl
.GetName() ==
1421 g_lldb_local_vars_namespace_cstr
);
1422 if (frame
&& local_var_lookup
)
1423 if (LookupLocalVariable(context
, name
, sym_ctx
, namespace_decl
))
1427 ValueObjectSP valobj
;
1429 var
= FindGlobalVariable(*target
, module_sp
, name
, namespace_decl
);
1432 valobj
= ValueObjectVariable::Create(target
, var
);
1433 AddOneVariable(context
, var
, valobj
);
1434 context
.m_found_variable
= true;
1439 LookupFunction(context
, module_sp
, name
, namespace_decl
);
1441 // Try the modules next.
1442 if (!context
.m_found_function_with_type_info
)
1443 LookupInModulesDeclVendor(context
, name
);
1445 if (target
&& !context
.m_found_variable
&& !namespace_decl
) {
1446 // We couldn't find a non-symbol variable for this. Now we'll hunt for a
1447 // generic data symbol, and -- if it is found -- treat it as a variable.
1450 const Symbol
*data_symbol
=
1451 m_parser_vars
->m_sym_ctx
.FindBestGlobalDataSymbol(name
, error
);
1453 if (!error
.Success()) {
1454 const unsigned diag_id
=
1455 m_ast_context
->getDiagnostics().getCustomDiagID(
1456 clang::DiagnosticsEngine::Level::Error
, "%0");
1457 m_ast_context
->getDiagnostics().Report(diag_id
) << error
.AsCString();
1461 std::string
warning("got name from symbols: ");
1462 warning
.append(name
.AsCString());
1463 const unsigned diag_id
=
1464 m_ast_context
->getDiagnostics().getCustomDiagID(
1465 clang::DiagnosticsEngine::Level::Warning
, "%0");
1466 m_ast_context
->getDiagnostics().Report(diag_id
) << warning
.c_str();
1467 AddOneGenericVariable(context
, *data_symbol
);
1468 context
.m_found_variable
= true;
1473 bool ClangExpressionDeclMap::GetVariableValue(VariableSP
&var
,
1474 lldb_private::Value
&var_location
,
1475 TypeFromUser
*user_type
,
1476 TypeFromParser
*parser_type
) {
1477 Log
*log
= GetLog(LLDBLog::Expressions
);
1479 Type
*var_type
= var
->GetType();
1482 LLDB_LOG(log
, "Skipped a definition because it has no type");
1486 CompilerType var_clang_type
= var_type
->GetFullCompilerType();
1488 if (!var_clang_type
) {
1489 LLDB_LOG(log
, "Skipped a definition because it has no Clang type");
1493 auto ts
= var_type
->GetForwardCompilerType().GetTypeSystem();
1494 auto clang_ast
= ts
.dyn_cast_or_null
<TypeSystemClang
>();
1497 LLDB_LOG(log
, "Skipped a definition because it has no Clang AST");
1501 DWARFExpressionList
&var_location_list
= var
->LocationExpressionList();
1503 Target
*target
= m_parser_vars
->m_exe_ctx
.GetTargetPtr();
1506 if (var
->GetLocationIsConstantValueData()) {
1507 DataExtractor const_value_extractor
;
1508 if (var_location_list
.GetExpressionData(const_value_extractor
)) {
1509 var_location
= Value(const_value_extractor
.GetDataStart(),
1510 const_value_extractor
.GetByteSize());
1511 var_location
.SetValueType(Value::ValueType::HostAddress
);
1513 LLDB_LOG(log
, "Error evaluating constant variable: {0}", err
.AsCString());
1518 CompilerType type_to_use
= GuardedCopyType(var_clang_type
);
1522 "Couldn't copy a variable's type into the parser's AST context");
1528 *parser_type
= TypeFromParser(type_to_use
);
1530 if (var_location
.GetContextType() == Value::ContextType::Invalid
)
1531 var_location
.SetCompilerType(type_to_use
);
1533 if (var_location
.GetValueType() == Value::ValueType::FileAddress
) {
1534 SymbolContext var_sc
;
1535 var
->CalculateSymbolContext(&var_sc
);
1537 if (!var_sc
.module_sp
)
1540 Address
so_addr(var_location
.GetScalar().ULongLong(),
1541 var_sc
.module_sp
->GetSectionList());
1543 lldb::addr_t load_addr
= so_addr
.GetLoadAddress(target
);
1545 if (load_addr
!= LLDB_INVALID_ADDRESS
) {
1546 var_location
.GetScalar() = load_addr
;
1547 var_location
.SetValueType(Value::ValueType::LoadAddress
);
1552 *user_type
= TypeFromUser(var_clang_type
);
1557 ClangExpressionVariable::ParserVars
*
1558 ClangExpressionDeclMap::AddExpressionVariable(NameSearchContext
&context
,
1559 TypeFromParser
const &pt
,
1560 ValueObjectSP valobj
) {
1561 clang::QualType parser_opaque_type
=
1562 QualType::getFromOpaquePtr(pt
.GetOpaqueQualType());
1564 if (parser_opaque_type
.isNull())
1567 if (const clang::Type
*parser_type
= parser_opaque_type
.getTypePtr()) {
1568 if (const TagType
*tag_type
= dyn_cast
<TagType
>(parser_type
))
1569 CompleteType(tag_type
->getDecl());
1570 if (const ObjCObjectPointerType
*objc_object_ptr_type
=
1571 dyn_cast
<ObjCObjectPointerType
>(parser_type
))
1572 CompleteType(objc_object_ptr_type
->getInterfaceDecl());
1575 bool is_reference
= pt
.IsReferenceType();
1577 NamedDecl
*var_decl
= nullptr;
1579 var_decl
= context
.AddVarDecl(pt
);
1581 var_decl
= context
.AddVarDecl(pt
.GetLValueReferenceType());
1583 std::string
decl_name(context
.m_decl_name
.getAsString());
1584 ConstString
entity_name(decl_name
.c_str());
1585 ClangExpressionVariable
*entity(new ClangExpressionVariable(valobj
));
1586 m_found_entities
.AddNewlyConstructedVariable(entity
);
1589 entity
->EnableParserVars(GetParserID());
1590 ClangExpressionVariable::ParserVars
*parser_vars
=
1591 entity
->GetParserVars(GetParserID());
1593 parser_vars
->m_named_decl
= var_decl
;
1596 entity
->m_flags
|= ClangExpressionVariable::EVTypeIsReference
;
1601 void ClangExpressionDeclMap::AddOneVariable(
1602 NameSearchContext
&context
, ValueObjectSP valobj
,
1603 ValueObjectProviderTy valobj_provider
) {
1604 assert(m_parser_vars
.get());
1607 Log
*log
= GetLog(LLDBLog::Expressions
);
1609 Value var_location
= valobj
->GetValue();
1611 TypeFromUser user_type
= valobj
->GetCompilerType();
1614 user_type
.GetTypeSystem().dyn_cast_or_null
<TypeSystemClang
>();
1617 LLDB_LOG(log
, "Skipped a definition because it has no Clang AST");
1621 TypeFromParser parser_type
= GuardedCopyType(user_type
);
1625 "Couldn't copy a variable's type into the parser's AST context");
1630 if (var_location
.GetContextType() == Value::ContextType::Invalid
)
1631 var_location
.SetCompilerType(parser_type
);
1633 ClangExpressionVariable::ParserVars
*parser_vars
=
1634 AddExpressionVariable(context
, parser_type
, valobj
);
1639 LLDB_LOG(log
, " CEDM::FEVD Found variable {0}, returned\n{1} (original {2})",
1640 context
.m_decl_name
, ClangUtil::DumpDecl(parser_vars
->m_named_decl
),
1641 ClangUtil::ToString(user_type
));
1643 parser_vars
->m_llvm_value
= nullptr;
1644 parser_vars
->m_lldb_value
= std::move(var_location
);
1645 parser_vars
->m_lldb_valobj_provider
= std::move(valobj_provider
);
1648 void ClangExpressionDeclMap::AddOneVariable(NameSearchContext
&context
,
1650 ValueObjectSP valobj
) {
1651 assert(m_parser_vars
.get());
1653 Log
*log
= GetLog(LLDBLog::Expressions
);
1659 if (!GetVariableValue(var
, var_location
, &ut
, &pt
))
1662 ClangExpressionVariable::ParserVars
*parser_vars
=
1663 AddExpressionVariable(context
, pt
, std::move(valobj
));
1668 LLDB_LOG(log
, " CEDM::FEVD Found variable {0}, returned\n{1} (original {2})",
1669 context
.m_decl_name
, ClangUtil::DumpDecl(parser_vars
->m_named_decl
),
1670 ClangUtil::ToString(ut
));
1672 parser_vars
->m_llvm_value
= nullptr;
1673 parser_vars
->m_lldb_value
= var_location
;
1674 parser_vars
->m_lldb_var
= var
;
1677 void ClangExpressionDeclMap::AddOneVariable(NameSearchContext
&context
,
1678 ExpressionVariableSP
&pvar_sp
) {
1679 Log
*log
= GetLog(LLDBLog::Expressions
);
1681 TypeFromUser
user_type(
1682 llvm::cast
<ClangExpressionVariable
>(pvar_sp
.get())->GetTypeFromUser());
1684 TypeFromParser
parser_type(GuardedCopyType(user_type
));
1686 if (!parser_type
.GetOpaqueQualType()) {
1687 LLDB_LOG(log
, " CEDM::FEVD Couldn't import type for pvar {0}",
1688 pvar_sp
->GetName());
1692 NamedDecl
*var_decl
=
1693 context
.AddVarDecl(parser_type
.GetLValueReferenceType());
1695 llvm::cast
<ClangExpressionVariable
>(pvar_sp
.get())
1696 ->EnableParserVars(GetParserID());
1697 ClangExpressionVariable::ParserVars
*parser_vars
=
1698 llvm::cast
<ClangExpressionVariable
>(pvar_sp
.get())
1699 ->GetParserVars(GetParserID());
1700 parser_vars
->m_named_decl
= var_decl
;
1701 parser_vars
->m_llvm_value
= nullptr;
1702 parser_vars
->m_lldb_value
.Clear();
1704 LLDB_LOG(log
, " CEDM::FEVD Added pvar {0}, returned\n{1}",
1705 pvar_sp
->GetName(), ClangUtil::DumpDecl(var_decl
));
1708 void ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext
&context
,
1709 const Symbol
&symbol
) {
1710 assert(m_parser_vars
.get());
1712 Log
*log
= GetLog(LLDBLog::Expressions
);
1714 Target
*target
= m_parser_vars
->m_exe_ctx
.GetTargetPtr();
1716 if (target
== nullptr)
1719 auto scratch_ast_context
= GetScratchContext(*target
);
1720 if (!scratch_ast_context
)
1723 TypeFromUser
user_type(scratch_ast_context
->GetBasicType(eBasicTypeVoid
)
1725 .GetLValueReferenceType());
1726 TypeFromParser
parser_type(m_clang_ast_context
->GetBasicType(eBasicTypeVoid
)
1728 .GetLValueReferenceType());
1729 NamedDecl
*var_decl
= context
.AddVarDecl(parser_type
);
1731 std::string
decl_name(context
.m_decl_name
.getAsString());
1732 ConstString
entity_name(decl_name
.c_str());
1733 ClangExpressionVariable
*entity(new ClangExpressionVariable(
1734 m_parser_vars
->m_exe_ctx
.GetBestExecutionContextScope(), entity_name
,
1735 user_type
, m_parser_vars
->m_target_info
.byte_order
,
1736 m_parser_vars
->m_target_info
.address_byte_size
));
1737 m_found_entities
.AddNewlyConstructedVariable(entity
);
1739 entity
->EnableParserVars(GetParserID());
1740 ClangExpressionVariable::ParserVars
*parser_vars
=
1741 entity
->GetParserVars(GetParserID());
1743 const Address symbol_address
= symbol
.GetAddress();
1744 lldb::addr_t symbol_load_addr
= symbol_address
.GetLoadAddress(target
);
1746 // parser_vars->m_lldb_value.SetContext(Value::ContextType::ClangType,
1747 // user_type.GetOpaqueQualType());
1748 parser_vars
->m_lldb_value
.SetCompilerType(user_type
);
1749 parser_vars
->m_lldb_value
.GetScalar() = symbol_load_addr
;
1750 parser_vars
->m_lldb_value
.SetValueType(Value::ValueType::LoadAddress
);
1752 parser_vars
->m_named_decl
= var_decl
;
1753 parser_vars
->m_llvm_value
= nullptr;
1754 parser_vars
->m_lldb_sym
= &symbol
;
1756 LLDB_LOG(log
, " CEDM::FEVD Found variable {0}, returned\n{1}", decl_name
,
1757 ClangUtil::DumpDecl(var_decl
));
1760 void ClangExpressionDeclMap::AddOneRegister(NameSearchContext
&context
,
1761 const RegisterInfo
*reg_info
) {
1762 Log
*log
= GetLog(LLDBLog::Expressions
);
1764 CompilerType clang_type
=
1765 m_clang_ast_context
->GetBuiltinTypeForEncodingAndBitSize(
1766 reg_info
->encoding
, reg_info
->byte_size
* 8);
1769 LLDB_LOG(log
, " Tried to add a type for {0}, but couldn't get one",
1770 context
.m_decl_name
.getAsString());
1774 TypeFromParser
parser_clang_type(clang_type
);
1776 NamedDecl
*var_decl
= context
.AddVarDecl(parser_clang_type
);
1778 ClangExpressionVariable
*entity(new ClangExpressionVariable(
1779 m_parser_vars
->m_exe_ctx
.GetBestExecutionContextScope(),
1780 m_parser_vars
->m_target_info
.byte_order
,
1781 m_parser_vars
->m_target_info
.address_byte_size
));
1782 m_found_entities
.AddNewlyConstructedVariable(entity
);
1784 std::string
decl_name(context
.m_decl_name
.getAsString());
1785 entity
->SetName(ConstString(decl_name
.c_str()));
1786 entity
->SetRegisterInfo(reg_info
);
1787 entity
->EnableParserVars(GetParserID());
1788 ClangExpressionVariable::ParserVars
*parser_vars
=
1789 entity
->GetParserVars(GetParserID());
1790 parser_vars
->m_named_decl
= var_decl
;
1791 parser_vars
->m_llvm_value
= nullptr;
1792 parser_vars
->m_lldb_value
.Clear();
1793 entity
->m_flags
|= ClangExpressionVariable::EVBareRegister
;
1795 LLDB_LOG(log
, " CEDM::FEVD Added register {0}, returned\n{1}",
1796 context
.m_decl_name
.getAsString(), ClangUtil::DumpDecl(var_decl
));
1799 void ClangExpressionDeclMap::AddOneFunction(NameSearchContext
&context
,
1802 assert(m_parser_vars
.get());
1804 Log
*log
= GetLog(LLDBLog::Expressions
);
1806 NamedDecl
*function_decl
= nullptr;
1807 Address fun_address
;
1808 CompilerType function_clang_type
;
1810 bool is_indirect_function
= false;
1813 Type
*function_type
= function
->GetType();
1815 const auto lang
= function
->GetCompileUnit()->GetLanguage();
1816 const auto name
= function
->GetMangled().GetMangledName().AsCString();
1817 const bool extern_c
= (Language::LanguageIsC(lang
) &&
1818 !CPlusPlusLanguage::IsCPPMangledName(name
)) ||
1819 (Language::LanguageIsObjC(lang
) &&
1820 !Language::LanguageIsCPlusPlus(lang
));
1823 TypeSystem
*type_system
= function
->GetDeclContext().GetTypeSystem();
1824 if (llvm::isa
<TypeSystemClang
>(type_system
)) {
1825 clang::DeclContext
*src_decl_context
=
1826 (clang::DeclContext
*)function
->GetDeclContext()
1827 .GetOpaqueDeclContext();
1828 clang::FunctionDecl
*src_function_decl
=
1829 llvm::dyn_cast_or_null
<clang::FunctionDecl
>(src_decl_context
);
1830 if (src_function_decl
&&
1831 src_function_decl
->getTemplateSpecializationInfo()) {
1832 clang::FunctionTemplateDecl
*function_template
=
1833 src_function_decl
->getTemplateSpecializationInfo()->getTemplate();
1834 clang::FunctionTemplateDecl
*copied_function_template
=
1835 llvm::dyn_cast_or_null
<clang::FunctionTemplateDecl
>(
1836 CopyDecl(function_template
));
1837 if (copied_function_template
) {
1841 function
->DumpSymbolContext(&ss
);
1844 " CEDM::FEVD Imported decl for function template"
1845 " {0} (description {1}), returned\n{2}",
1846 copied_function_template
->getNameAsString(),
1848 ClangUtil::DumpDecl(copied_function_template
));
1851 context
.AddNamedDecl(copied_function_template
);
1853 } else if (src_function_decl
) {
1854 if (clang::FunctionDecl
*copied_function_decl
=
1855 llvm::dyn_cast_or_null
<clang::FunctionDecl
>(
1856 CopyDecl(src_function_decl
))) {
1860 function
->DumpSymbolContext(&ss
);
1863 " CEDM::FEVD Imported decl for function {0} "
1864 "(description {1}), returned\n{2}",
1865 copied_function_decl
->getNameAsString(), ss
.GetData(),
1866 ClangUtil::DumpDecl(copied_function_decl
));
1869 context
.AddNamedDecl(copied_function_decl
);
1872 LLDB_LOG(log
, " Failed to import the function decl for '{0}'",
1873 src_function_decl
->getName());
1879 if (!function_type
) {
1880 LLDB_LOG(log
, " Skipped a function because it has no type");
1884 function_clang_type
= function_type
->GetFullCompilerType();
1886 if (!function_clang_type
) {
1887 LLDB_LOG(log
, " Skipped a function because it has no Clang type");
1891 fun_address
= function
->GetAddressRange().GetBaseAddress();
1893 CompilerType copied_function_type
= GuardedCopyType(function_clang_type
);
1894 if (copied_function_type
) {
1895 function_decl
= context
.AddFunDecl(copied_function_type
, extern_c
);
1897 if (!function_decl
) {
1898 LLDB_LOG(log
, " Failed to create a function decl for '{0}' ({1:x})",
1899 function_type
->GetName(), function_type
->GetID());
1904 // We failed to copy the type we found
1906 " Failed to import the function type '{0}' ({1:x})"
1907 " into the expression parser AST context",
1908 function_type
->GetName(), function_type
->GetID());
1912 } else if (symbol
) {
1913 fun_address
= symbol
->GetAddress();
1914 function_decl
= context
.AddGenericFunDecl();
1915 is_indirect_function
= symbol
->IsIndirect();
1917 LLDB_LOG(log
, " AddOneFunction called with no function and no symbol");
1921 Target
*target
= m_parser_vars
->m_exe_ctx
.GetTargetPtr();
1923 lldb::addr_t load_addr
=
1924 fun_address
.GetCallableLoadAddress(target
, is_indirect_function
);
1926 ClangExpressionVariable
*entity(new ClangExpressionVariable(
1927 m_parser_vars
->m_exe_ctx
.GetBestExecutionContextScope(),
1928 m_parser_vars
->m_target_info
.byte_order
,
1929 m_parser_vars
->m_target_info
.address_byte_size
));
1930 m_found_entities
.AddNewlyConstructedVariable(entity
);
1932 std::string
decl_name(context
.m_decl_name
.getAsString());
1933 entity
->SetName(ConstString(decl_name
.c_str()));
1934 entity
->SetCompilerType(function_clang_type
);
1935 entity
->EnableParserVars(GetParserID());
1937 ClangExpressionVariable::ParserVars
*parser_vars
=
1938 entity
->GetParserVars(GetParserID());
1940 if (load_addr
!= LLDB_INVALID_ADDRESS
) {
1941 parser_vars
->m_lldb_value
.SetValueType(Value::ValueType::LoadAddress
);
1942 parser_vars
->m_lldb_value
.GetScalar() = load_addr
;
1944 // We have to try finding a file address.
1946 lldb::addr_t file_addr
= fun_address
.GetFileAddress();
1948 parser_vars
->m_lldb_value
.SetValueType(Value::ValueType::FileAddress
);
1949 parser_vars
->m_lldb_value
.GetScalar() = file_addr
;
1952 parser_vars
->m_named_decl
= function_decl
;
1953 parser_vars
->m_llvm_value
= nullptr;
1958 fun_address
.Dump(&ss
,
1959 m_parser_vars
->m_exe_ctx
.GetBestExecutionContextScope(),
1960 Address::DumpStyleResolvedDescription
);
1963 " CEDM::FEVD Found {0} function {1} (description {2}), "
1965 (function
? "specific" : "generic"), decl_name
, ss
.GetData(),
1966 ClangUtil::DumpDecl(function_decl
));
1970 void ClangExpressionDeclMap::AddContextClassType(NameSearchContext
&context
,
1971 const TypeFromUser
&ut
) {
1972 CompilerType copied_clang_type
= GuardedCopyType(ut
);
1974 Log
*log
= GetLog(LLDBLog::Expressions
);
1976 if (!copied_clang_type
) {
1978 "ClangExpressionDeclMap::AddThisType - Couldn't import the type");
1983 if (copied_clang_type
.IsAggregateType() &&
1984 copied_clang_type
.GetCompleteType()) {
1985 CompilerType void_clang_type
=
1986 m_clang_ast_context
->GetBasicType(eBasicTypeVoid
);
1987 CompilerType void_ptr_clang_type
= void_clang_type
.GetPointerType();
1989 CompilerType method_type
= m_clang_ast_context
->CreateFunctionType(
1990 void_clang_type
, &void_ptr_clang_type
, 1, false, 0);
1992 const bool is_virtual
= false;
1993 const bool is_static
= false;
1994 const bool is_inline
= false;
1995 const bool is_explicit
= false;
1996 const bool is_attr_used
= true;
1997 const bool is_artificial
= false;
1999 CXXMethodDecl
*method_decl
= m_clang_ast_context
->AddMethodToCXXRecordType(
2000 copied_clang_type
.GetOpaqueQualType(), "$__lldb_expr", nullptr,
2001 method_type
, lldb::eAccessPublic
, is_virtual
, is_static
, is_inline
,
2002 is_explicit
, is_attr_used
, is_artificial
);
2005 " CEDM::AddThisType Added function $__lldb_expr "
2006 "(description {0}) for this type\n{1}",
2007 ClangUtil::ToString(copied_clang_type
),
2008 ClangUtil::DumpDecl(method_decl
));
2011 if (!copied_clang_type
.IsValid())
2014 TypeSourceInfo
*type_source_info
= m_ast_context
->getTrivialTypeSourceInfo(
2015 QualType::getFromOpaquePtr(copied_clang_type
.GetOpaqueQualType()));
2017 if (!type_source_info
)
2020 // Construct a typedef type because if "*this" is a templated type we can't
2021 // just return ClassTemplateSpecializationDecls in response to name queries.
2022 // Using a typedef makes this much more robust.
2024 TypedefDecl
*typedef_decl
= TypedefDecl::Create(
2025 *m_ast_context
, m_ast_context
->getTranslationUnitDecl(), SourceLocation(),
2026 SourceLocation(), context
.m_decl_name
.getAsIdentifierInfo(),
2032 context
.AddNamedDecl(typedef_decl
);
2035 void ClangExpressionDeclMap::AddOneType(NameSearchContext
&context
,
2036 const TypeFromUser
&ut
) {
2037 CompilerType copied_clang_type
= GuardedCopyType(ut
);
2039 if (!copied_clang_type
) {
2040 Log
*log
= GetLog(LLDBLog::Expressions
);
2043 "ClangExpressionDeclMap::AddOneType - Couldn't import the type");
2048 context
.AddTypeDecl(copied_clang_type
);