LLDB mainline
ClangExpressionDeclMap.cpp
Go to the documentation of this file.
1//===-- ClangExpressionDeclMap.cpp ----------------------------------------===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8
10
11#include "ClangASTSource.h"
12#include "ClangExpressionUtil.h"
16#include "ClangUtil.h"
17
18#include "NameSearchContext.h"
20#include "lldb/Core/Address.h"
21#include "lldb/Core/Mangled.h"
22#include "lldb/Core/Module.h"
34#include "lldb/Symbol/Type.h"
40#include "lldb/Target/Process.h"
43#include "lldb/Target/Target.h"
44#include "lldb/Target/Thread.h"
45#include "lldb/Utility/Endian.h"
47#include "lldb/Utility/Log.h"
49#include "lldb/Utility/Status.h"
53#include "lldb/lldb-private.h"
54#include "clang/AST/ASTConsumer.h"
55#include "clang/AST/ASTContext.h"
56#include "clang/AST/ASTImporter.h"
57#include "clang/AST/Decl.h"
58#include "clang/AST/DeclarationName.h"
59#include "clang/AST/RecursiveASTVisitor.h"
60
62
63using namespace lldb;
64using namespace lldb_private;
65using namespace clang;
66
67static const char *g_lldb_local_vars_namespace_cstr = "$__lldb_local_vars";
68
69namespace {
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.
75lldb::ValueObjectSP GetCapturedThisValueObject(StackFrame *frame) {
76 assert(frame);
77
78 if (auto thisValSP = frame->FindVariable(ConstString("this")))
79 if (auto thisThisValSP = thisValSP->GetChildMemberWithName("this"))
80 return thisThisValSP;
81
82 return nullptr;
83}
84} // namespace
85
87 bool keep_result_in_memory,
89 const lldb::TargetSP &target,
90 const std::shared_ptr<ClangASTImporter> &importer, ValueObject *ctx_obj,
91 bool ignore_context_qualifiers)
92 : ClangASTSource(target, importer), m_found_entities(), m_struct_members(),
93 m_keep_result_in_memory(keep_result_in_memory),
94 m_result_delegate(result_delegate), m_ctx_obj(ctx_obj),
95 m_ignore_context_qualifiers(ignore_context_qualifiers), m_parser_vars(),
98}
99
101 // Note: The model is now that the parser's AST context and all associated
102 // data does not vanish until the expression has been executed. This means
103 // that valuable lookup data (like namespaces) doesn't vanish, but
104
105 DidParse();
107}
108
110 Materializer *materializer) {
112 m_parser_vars->m_exe_ctx = exe_ctx;
113
114 Target *target = exe_ctx.GetTargetPtr();
115 if (exe_ctx.GetFramePtr())
116 m_parser_vars->m_sym_ctx =
117 exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
118 else if (exe_ctx.GetThreadPtr() &&
120 m_parser_vars->m_sym_ctx =
121 exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(
122 lldb::eSymbolContextEverything);
123 else if (exe_ctx.GetProcessPtr()) {
124 m_parser_vars->m_sym_ctx.Clear(true);
125 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
126 } else if (target) {
127 m_parser_vars->m_sym_ctx.Clear(true);
128 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
129 }
130
131 if (target) {
132 m_parser_vars->m_persistent_vars = llvm::cast<ClangPersistentVariables>(
134
136 return false;
137 }
138
139 m_parser_vars->m_target_info = GetTargetInfo();
140 m_parser_vars->m_materializer = materializer;
141
142 return true;
143}
144
146 clang::ASTConsumer *code_gen) {
147 assert(m_parser_vars);
148 m_parser_vars->m_code_gen = code_gen;
149}
150
152 DiagnosticManager &diag_manager) {
153 assert(m_parser_vars);
154 m_parser_vars->m_diagnostics = &diag_manager;
155}
156
158 if (m_parser_vars && m_parser_vars->m_persistent_vars) {
159 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
160 entity_index < num_entities; ++entity_index) {
162 m_found_entities.GetVariableAtIndex(entity_index));
163 if (var_sp)
164 llvm::cast<ClangExpressionVariable>(var_sp.get())
165 ->DisableParserVars(GetParserID());
166 }
167
168 for (size_t pvar_index = 0,
169 num_pvars = m_parser_vars->m_persistent_vars->GetSize();
170 pvar_index < num_pvars; ++pvar_index) {
171 ExpressionVariableSP pvar_sp(
172 m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
173 if (ClangExpressionVariable *clang_var =
174 llvm::dyn_cast<ClangExpressionVariable>(pvar_sp.get()))
175 clang_var->DisableParserVars(GetParserID());
176 }
177
179 }
180}
181
182// Interface for IRForTarget
183
185 assert(m_parser_vars.get());
186
187 TargetInfo ret;
188
189 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
190
191 Process *process = exe_ctx.GetProcessPtr();
192 if (process) {
193 ret.byte_order = process->GetByteOrder();
194 ret.address_byte_size = process->GetAddressByteSize();
195 } else {
196 Target *target = exe_ctx.GetTargetPtr();
197 if (target) {
198 ret.byte_order = target->GetArchitecture().GetByteOrder();
200 }
201 }
202
203 return ret;
204}
205
207 TypeSystemClang &source,
208 TypeFromParser parser_type) {
209 assert(&target == GetScratchContext(*m_target).get());
210 assert((TypeSystem *)&source ==
211 parser_type.GetTypeSystem().GetSharedPointer().get());
212 assert(&source.getASTContext() == m_ast_context);
213
214 return TypeFromUser(m_ast_importer_sp->DeportType(target, parser_type));
215}
216
218 ConstString name,
219 TypeFromParser parser_type,
220 bool is_result,
221 bool is_lvalue) {
222 assert(m_parser_vars.get());
223 auto ast = parser_type.GetTypeSystem<TypeSystemClang>();
224 if (ast == nullptr)
225 return false;
226
227 // Check if we already declared a persistent variable with the same name.
228 if (lldb::ExpressionVariableSP conflicting_var =
229 m_parser_vars->m_persistent_vars->GetVariable(name)) {
230 std::string msg = llvm::formatv("redefinition of persistent variable '{0}'",
231 name).str();
232 m_parser_vars->m_diagnostics->AddDiagnostic(
234 return false;
235 }
236
237 if (m_parser_vars->m_materializer && is_result) {
238 Status err;
239
240 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
241 Target *target = exe_ctx.GetTargetPtr();
242 if (target == nullptr)
243 return false;
244
245 auto clang_ast_context = GetScratchContext(*target);
246 if (!clang_ast_context)
247 return false;
248
249 TypeFromUser user_type = DeportType(*clang_ast_context, *ast, parser_type);
250
251 uint32_t offset = m_parser_vars->m_materializer->AddResultVariable(
252 user_type, is_lvalue, m_keep_result_in_memory, m_result_delegate, err);
253
255 exe_ctx.GetBestExecutionContextScope(), name, user_type,
256 m_parser_vars->m_target_info.byte_order,
257 m_parser_vars->m_target_info.address_byte_size);
258
259 m_found_entities.AddNewlyConstructedVariable(var);
260
262
265
266 parser_vars->m_named_decl = decl;
267
269
271
272 jit_vars->m_offset = offset;
273
274 return true;
275 }
276
278 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
279 Target *target = exe_ctx.GetTargetPtr();
280 if (target == nullptr)
281 return false;
282
283 auto context = GetScratchContext(*target);
284 if (!context)
285 return false;
286
287 TypeFromUser user_type = DeportType(*context, *ast, parser_type);
288
289 if (!user_type.GetOpaqueQualType()) {
290 LLDB_LOG(log, "Persistent variable's type wasn't copied successfully");
291 return false;
292 }
293
294 if (!m_parser_vars->m_target_info.IsValid())
295 return false;
296
297 if (!m_parser_vars->m_persistent_vars)
298 return false;
299
300 ClangExpressionVariable *var = llvm::cast<ClangExpressionVariable>(
301 m_parser_vars->m_persistent_vars
302 ->CreatePersistentVariable(
303 exe_ctx.GetBestExecutionContextScope(), name, user_type,
304 m_parser_vars->m_target_info.byte_order,
305 m_parser_vars->m_target_info.address_byte_size)
306 .get());
307
308 if (!var)
309 return false;
310
311 var->m_frozen_sp->SetHasCompleteType();
312
313 if (is_result)
314 var->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
315 else
316 var->m_flags |=
317 ClangExpressionVariable::EVKeepInTarget; // explicitly-declared
318 // persistent variables should
319 // persist
320
321 if (is_lvalue) {
322 var->m_flags |= ClangExpressionVariable::EVIsProgramReference;
323 } else {
324 var->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
325 var->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
326 }
327
329 var->m_flags |= ClangExpressionVariable::EVKeepInTarget;
330 }
331
332 LLDB_LOG(log, "Created persistent variable with flags {0:x}", var->m_flags);
333
335
338
339 parser_vars->m_named_decl = decl;
340
341 return true;
342}
343
345 ConstString name,
346 llvm::Value *value, size_t size,
347 lldb::offset_t alignment) {
348 assert(m_struct_vars.get());
349 assert(m_parser_vars.get());
350
351 bool is_persistent_variable = false;
352
354
355 m_struct_vars->m_struct_laid_out = false;
356
358 GetParserID()))
359 return true;
360
362 m_found_entities, decl, GetParserID()));
363
364 if (!var && m_parser_vars->m_persistent_vars) {
366 *m_parser_vars->m_persistent_vars, decl, GetParserID());
367 is_persistent_variable = true;
368 }
369
370 if (!var)
371 return false;
372
373 LLDB_LOG(log, "Adding value for (NamedDecl*){0} [{1} - {2}] to the structure",
374 decl, name, var->GetName());
375
376 // We know entity->m_parser_vars is valid because we used a parser variable
377 // to find it
378
380 llvm::cast<ClangExpressionVariable>(var)->GetParserVars(GetParserID());
381
382 parser_vars->m_llvm_value = value;
383
385 llvm::cast<ClangExpressionVariable>(var)->GetJITVars(GetParserID())) {
386 // We already laid this out; do not touch
387
388 LLDB_LOG(log, "Already placed at {0:x}", jit_vars->m_offset);
389 }
390
391 llvm::cast<ClangExpressionVariable>(var)->EnableJITVars(GetParserID());
392
394 llvm::cast<ClangExpressionVariable>(var)->GetJITVars(GetParserID());
395
396 jit_vars->m_alignment = alignment;
397 jit_vars->m_size = size;
398
399 m_struct_members.AddVariable(var->shared_from_this());
400
401 if (m_parser_vars->m_materializer) {
402 uint32_t offset = 0;
403
404 Status err;
405
406 if (is_persistent_variable) {
407 ExpressionVariableSP var_sp(var->shared_from_this());
408 offset = m_parser_vars->m_materializer->AddPersistentVariable(
409 var_sp, nullptr, err);
410 } else {
411 if (const lldb_private::Symbol *sym = parser_vars->m_lldb_sym)
412 offset = m_parser_vars->m_materializer->AddSymbol(*sym, err);
413 else if (const RegisterInfo *reg_info = var->GetRegisterInfo())
414 offset = m_parser_vars->m_materializer->AddRegister(*reg_info, err);
415 else if (parser_vars->m_lldb_var)
416 offset = m_parser_vars->m_materializer->AddVariable(
417 parser_vars->m_lldb_var, err);
418 else if (parser_vars->m_lldb_valobj_provider) {
419 offset = m_parser_vars->m_materializer->AddValueObject(
420 name, parser_vars->m_lldb_valobj_provider, err);
421 }
422 }
423
424 if (!err.Success())
425 return false;
426
427 LLDB_LOG(log, "Placed at {0:x}", offset);
428
429 jit_vars->m_offset =
430 offset; // TODO DoStructLayout() should not change this.
431 }
432
433 return true;
434}
435
437 assert(m_struct_vars.get());
438
439 if (m_struct_vars->m_struct_laid_out)
440 return true;
441
442 if (!m_parser_vars->m_materializer)
443 return false;
444
445 m_struct_vars->m_struct_alignment =
446 m_parser_vars->m_materializer->GetStructAlignment();
447 m_struct_vars->m_struct_size =
448 m_parser_vars->m_materializer->GetStructByteSize();
449 m_struct_vars->m_struct_laid_out = true;
450 return true;
451}
452
453bool ClangExpressionDeclMap::GetStructInfo(uint32_t &num_elements, size_t &size,
454 lldb::offset_t &alignment) {
455 assert(m_struct_vars.get());
456
457 if (!m_struct_vars->m_struct_laid_out)
458 return false;
459
460 num_elements = m_struct_members.GetSize();
461 size = m_struct_vars->m_struct_size;
462 alignment = m_struct_vars->m_struct_alignment;
463
464 return true;
465}
466
468 llvm::Value *&value,
469 lldb::offset_t &offset,
470 ConstString &name,
471 uint32_t index) {
472 assert(m_struct_vars.get());
473
474 if (!m_struct_vars->m_struct_laid_out)
475 return false;
476
477 if (index >= m_struct_members.GetSize())
478 return false;
479
480 ExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
481
482 if (!member_sp)
483 return false;
484
486 llvm::cast<ClangExpressionVariable>(member_sp.get())
487 ->GetParserVars(GetParserID());
489 llvm::cast<ClangExpressionVariable>(member_sp.get())
490 ->GetJITVars(GetParserID());
491
492 if (!parser_vars || !jit_vars || !member_sp->GetValueObject())
493 return false;
494
495 decl = parser_vars->m_named_decl;
496 value = parser_vars->m_llvm_value;
497 offset = jit_vars->m_offset;
498 name = member_sp->GetName();
499
500 return true;
501}
502
504 uint64_t &ptr) {
506 m_found_entities, decl, GetParserID()));
507
508 if (!entity)
509 return false;
510
511 // We know m_parser_vars is valid since we searched for the variable by its
512 // NamedDecl
513
515 entity->GetParserVars(GetParserID());
516
517 ptr = parser_vars->m_lldb_value.GetScalar().ULongLong();
518
519 return true;
520}
521
523 Process *process,
524 ConstString name,
525 lldb::SymbolType symbol_type,
526 lldb_private::Module *module) {
527 SymbolContextList sc_list;
528
529 if (module)
530 module->FindSymbolsWithNameAndType(name, symbol_type, sc_list);
531 else
532 target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
533
534 addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
535
536 for (const SymbolContext &sym_ctx : sc_list) {
537 if (symbol_load_addr != 0 && symbol_load_addr != LLDB_INVALID_ADDRESS)
538 break;
539
540 const Address sym_address = sym_ctx.symbol->GetAddress();
541
542 if (!sym_address.IsValid())
543 continue;
544
545 switch (sym_ctx.symbol->GetType()) {
546 case eSymbolTypeCode:
548 symbol_load_addr = sym_address.GetCallableLoadAddress(&target);
549 break;
550
552 symbol_load_addr = sym_address.GetCallableLoadAddress(&target, true);
553 break;
554
556 ConstString reexport_name = sym_ctx.symbol->GetReExportedSymbolName();
557 if (reexport_name) {
558 ModuleSP reexport_module_sp;
559 ModuleSpec reexport_module_spec;
560 reexport_module_spec.GetPlatformFileSpec() =
561 sym_ctx.symbol->GetReExportedSymbolSharedLibrary();
562 if (reexport_module_spec.GetPlatformFileSpec()) {
563 reexport_module_sp =
564 target.GetImages().FindFirstModule(reexport_module_spec);
565 if (!reexport_module_sp) {
566 reexport_module_spec.GetPlatformFileSpec().ClearDirectory();
567 reexport_module_sp =
568 target.GetImages().FindFirstModule(reexport_module_spec);
569 }
570 }
571 symbol_load_addr = GetSymbolAddress(
572 target, process, sym_ctx.symbol->GetReExportedSymbolName(),
573 symbol_type, reexport_module_sp.get());
574 }
575 } break;
576
577 case eSymbolTypeData:
580 case eSymbolTypeLocal:
581 case eSymbolTypeParam:
589 case eSymbolTypeBlock:
602 symbol_load_addr = sym_address.GetLoadAddress(&target);
603 break;
604 }
605 }
606
607 if (symbol_load_addr == LLDB_INVALID_ADDRESS && process) {
609
610 if (runtime) {
611 symbol_load_addr = runtime->LookupRuntimeSymbol(name);
612 }
613 }
614
615 return symbol_load_addr;
616}
617
619 lldb::SymbolType symbol_type) {
620 assert(m_parser_vars.get());
621
622 if (!m_parser_vars->m_exe_ctx.GetTargetPtr())
623 return false;
624
625 return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(),
626 m_parser_vars->m_exe_ctx.GetProcessPtr(), name,
627 symbol_type);
628}
629
631 Target &target, ModuleSP &module, ConstString name,
632 const CompilerDeclContext &namespace_decl) {
633 VariableList vars;
634
635 if (module && namespace_decl)
636 module->FindGlobalVariables(name, namespace_decl, -1, vars);
637 else
638 target.GetImages().FindGlobalVariables(name, -1, vars);
639
640 if (vars.GetSize() == 0)
641 return VariableSP();
642 return vars.GetVariableAtIndex(0);
643}
644
646 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
647 if (frame == nullptr)
648 return nullptr;
649
650 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction |
651 lldb::eSymbolContextBlock);
652 if (sym_ctx.block == nullptr)
653 return nullptr;
654
655 CompilerDeclContext frame_decl_context = sym_ctx.block->GetDeclContext();
656 if (!frame_decl_context)
657 return nullptr;
658
659 return llvm::dyn_cast_or_null<TypeSystemClang>(
660 frame_decl_context.GetTypeSystem());
661}
662
663// Interface for ClangASTSource
664
666 NameSearchContext &context) {
667 assert(m_ast_context);
668
669 const ConstString name(context.m_decl_name.getAsString().c_str());
670
672
673 if (log) {
674 if (!context.m_decl_context)
675 LLDB_LOG(log,
676 "ClangExpressionDeclMap::FindExternalVisibleDecls for "
677 "'{0}' in a NULL DeclContext",
678 name);
679 else if (const NamedDecl *context_named_decl =
680 dyn_cast<NamedDecl>(context.m_decl_context))
681 LLDB_LOG(log,
682 "ClangExpressionDeclMap::FindExternalVisibleDecls for "
683 "'{0}' in '{1}'",
684 name, context_named_decl->getNameAsString());
685 else
686 LLDB_LOG(log,
687 "ClangExpressionDeclMap::FindExternalVisibleDecls for "
688 "'{0}' in a '{1}'",
689 name, context.m_decl_context->getDeclKindName());
690 }
691
692 if (const NamespaceDecl *namespace_context =
693 dyn_cast<NamespaceDecl>(context.m_decl_context)) {
694 if (namespace_context->getName() == 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);
699 return;
700 }
701
703 m_ast_importer_sp->GetNamespaceMap(namespace_context);
704
705 if (!namespace_map)
706 return;
707
709 log, " CEDM::FEVD Inspecting (NamespaceMap*){0:x} ({1} entries)",
710 namespace_map.get(), namespace_map->size());
711
712 for (ClangASTImporter::NamespaceMapItem &n : *namespace_map) {
713 LLDB_LOG(log, " CEDM::FEVD Searching namespace {0} in module {1}",
714 n.second.GetName(), n.first->GetFileSpec().GetFilename());
715
716 FindExternalVisibleDecls(context, n.first, n.second);
717 }
718 } else if (isa<TranslationUnitDecl>(context.m_decl_context)) {
719 CompilerDeclContext namespace_decl;
720
721 LLDB_LOG(log, " CEDM::FEVD Searching the root namespace");
722
723 FindExternalVisibleDecls(context, lldb::ModuleSP(), namespace_decl);
724 }
725
727}
728
730 FunctionDecl *copied_function_decl) {
731 if (copied_function_decl->getBody() && m_parser_vars->m_code_gen) {
732 clang::DeclGroupRef decl_group_ref(copied_function_decl);
733 m_parser_vars->m_code_gen->HandleTopLevelDecl(decl_group_ref);
734 }
735}
736
738 if (!m_parser_vars)
739 return nullptr;
740 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
741 if (!target)
742 return nullptr;
743
745
746 if (!m_parser_vars->m_persistent_vars)
747 return nullptr;
748 return m_parser_vars->m_persistent_vars->GetPersistentDecl(name);
749}
750
752 const ConstString name) {
754
755 NamedDecl *persistent_decl = GetPersistentDecl(name);
756
757 if (!persistent_decl)
758 return;
759
760 Decl *parser_persistent_decl = CopyDecl(persistent_decl);
761
762 if (!parser_persistent_decl)
763 return;
764
765 NamedDecl *parser_named_decl = dyn_cast<NamedDecl>(parser_persistent_decl);
766
767 if (!parser_named_decl)
768 return;
769
770 if (clang::FunctionDecl *parser_function_decl =
771 llvm::dyn_cast<clang::FunctionDecl>(parser_named_decl)) {
772 MaybeRegisterFunctionBody(parser_function_decl);
773 }
774
775 LLDB_LOG(log, " CEDM::FEVD Found persistent decl {0}", name);
776
777 context.AddNamedDecl(parser_named_decl);
778}
779
782
783 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
784 SymbolContext sym_ctx;
785 if (frame != nullptr)
786 sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction |
787 lldb::eSymbolContextBlock);
788
789 // FIXME: Currently m_ctx_obj is only used through
790 // SBValue::EvaluateExpression. Can we instead *always* use m_ctx_obj
791 // regardless of which EvaluateExpression path we go through? Then we wouldn't
792 // need two separate code-paths here.
793 if (m_ctx_obj) {
794 Status status;
795 lldb::ValueObjectSP ctx_obj_ptr = m_ctx_obj->AddressOf(status);
796 if (!ctx_obj_ptr || status.Fail())
797 return;
798
799 AddContextClassType(context, TypeFromUser(m_ctx_obj->GetCompilerType()));
800 return;
801 }
802
803 // Clang is looking for the type of "this"
804
805 if (frame == nullptr)
806 return;
807
808 // Find the block that defines the function represented by "sym_ctx"
809 Block *function_block = sym_ctx.GetFunctionBlock();
810
811 if (!function_block)
812 return;
813
814 CompilerDeclContext function_decl_ctx = function_block->GetDeclContext();
815
816 if (!function_decl_ctx)
817 return;
818
819 clang::CXXMethodDecl *method_decl =
821
822 if (method_decl) {
823 if (auto capturedThis = GetCapturedThisValueObject(frame)) {
824 // We're inside a lambda and we captured a 'this'.
825 // Import the outer class's AST instead of the
826 // (unnamed) lambda structure AST so unqualified
827 // member lookups are understood by the Clang parser.
828 //
829 // If we're in a lambda which didn't capture 'this',
830 // $__lldb_class will correspond to the lambda closure
831 // AST and references to captures will resolve like
832 // regular member varaiable accesses do.
833 TypeFromUser pointee_type =
834 capturedThis->GetCompilerType().GetPointeeType();
835
836 LLDB_LOG(log,
837 " CEDM::FEVD Adding captured type ({0} for"
838 " $__lldb_class: {1}",
839 capturedThis->GetTypeName(), capturedThis->GetName());
840
841 AddContextClassType(context, pointee_type);
842 return;
843 }
844
845 clang::CXXRecordDecl *class_decl = method_decl->getParent();
846
847 QualType class_qual_type = m_ast_context->getCanonicalTagType(class_decl);
848
849 // The synthesized __lldb_expr will adopt the qualifiers from this class
850 // type. Make sure we use the qualifiers of the method that we're currently
851 // stopped in.
852 class_qual_type.addFastQualifiers(
853 method_decl->getMethodQualifiers().getFastQualifiers());
854
855 TypeFromUser class_user_type(
856 class_qual_type.getAsOpaquePtr(),
857 function_decl_ctx.GetTypeSystem()->weak_from_this());
858
859 LLDB_LOG(log, " CEDM::FEVD Adding type for $__lldb_class: {0}",
860 class_qual_type.getAsString());
861
862 AddContextClassType(context, class_user_type);
863 return;
864 }
865
866 // FIXME: this code is supposed to handl cases where a function decl
867 // was not attached to a class scope but its DIE had a `DW_AT_object_pointer`
868 // (and thus has a local `this` variable). This isn't a tested flow and
869 // even -flimit-debug-info doesn't seem to generate DWARF like that, so
870 // we should get rid of this code-path. An alternative fix if we ever
871 // encounter such DWARF is for the TypeSystem to attach the function
872 // to some valid class context (we can derive the type of the context
873 // through the `this` pointer anyway.
874 //
875 // The actual reason we can't remove this code is that LLDB currently
876 // creates decls for function templates by attaching them to the TU instead
877 // of a class context. So we can actually have template methods scoped
878 // outside of a class. Once we fix that, we can remove this code-path.
879
880 VariableList *vars = frame->GetVariableList(false, nullptr);
881
882 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
883
884 if (this_var && this_var->IsInScope(frame) &&
885 this_var->LocationIsValidForFrame(frame)) {
886 Type *this_type = this_var->GetType();
887
888 if (!this_type)
889 return;
890
891 TypeFromUser pointee_type =
893
894 LLDB_LOG(log, " FEVD Adding type for $__lldb_class: {0}",
895 ClangUtil::GetQualType(pointee_type).getAsString());
896
897 AddContextClassType(context, pointee_type);
898 }
899}
900
903
904 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
905
906 if (m_ctx_obj) {
907 Status status;
908 lldb::ValueObjectSP ctx_obj_ptr = m_ctx_obj->AddressOf(status);
909 if (!ctx_obj_ptr || status.Fail())
910 return;
911
912 AddOneType(context, TypeFromUser(m_ctx_obj->GetCompilerType()));
913 return;
914 }
915
916 // Clang is looking for the type of "*self"
917
918 if (!frame)
919 return;
920
921 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction |
922 lldb::eSymbolContextBlock);
923
924 // Find the block that defines the function represented by "sym_ctx"
925 Block *function_block = sym_ctx.GetFunctionBlock();
926
927 if (!function_block)
928 return;
929
930 CompilerDeclContext function_decl_ctx = function_block->GetDeclContext();
931
932 if (!function_decl_ctx)
933 return;
934
935 clang::ObjCMethodDecl *method_decl =
937
938 if (method_decl) {
939 ObjCInterfaceDecl *self_interface = method_decl->getClassInterface();
940
941 if (!self_interface)
942 return;
943
944 const clang::Type *interface_type = self_interface->getTypeForDecl();
945
946 if (!interface_type)
947 return; // This is unlikely, but we have seen crashes where this
948 // occurred
949
950 TypeFromUser class_user_type(
951 QualType(interface_type, 0).getAsOpaquePtr(),
952 function_decl_ctx.GetTypeSystem()->weak_from_this());
953
954 LLDB_LOG(log, " FEVD Adding type for $__lldb_objc_class: {0}",
955 ClangUtil::ToString(interface_type));
956
957 AddOneType(context, class_user_type);
958 return;
959 }
960 // This branch will get hit if we are executing code in the context of
961 // a function that claims to have an object pointer (through
962 // DW_AT_object_pointer?) but is not formally a method of the class.
963 // In that case, just look up the "self" variable in the current scope
964 // and use its type.
965
966 VariableList *vars = frame->GetVariableList(false, nullptr);
967
968 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
969
970 if (!self_var)
971 return;
972 if (!self_var->IsInScope(frame))
973 return;
974 if (!self_var->LocationIsValidForFrame(frame))
975 return;
976
977 Type *self_type = self_var->GetType();
978
979 if (!self_type)
980 return;
981
982 CompilerType self_clang_type = self_type->GetFullCompilerType();
983
984 if (TypeSystemClang::IsObjCClassType(self_clang_type)) {
985 return;
986 }
987 if (!TypeSystemClang::IsObjCObjectPointerType(self_clang_type))
988 return;
989 self_clang_type = self_clang_type.GetPointeeType();
990
991 if (!self_clang_type)
992 return;
993
994 LLDB_LOG(log, " FEVD Adding type for $__lldb_objc_class: {0}",
996
997 TypeFromUser class_user_type(self_clang_type);
998
999 AddOneType(context, class_user_type);
1000}
1001
1003 SymbolContext &sym_ctx, NameSearchContext &name_context) {
1004 if (sym_ctx.block == nullptr)
1005 return;
1006
1007 CompilerDeclContext frame_decl_context = sym_ctx.block->GetDeclContext();
1008 if (!frame_decl_context)
1009 return;
1010
1011 TypeSystemClang *frame_ast = llvm::dyn_cast_or_null<TypeSystemClang>(
1012 frame_decl_context.GetTypeSystem());
1013 if (!frame_ast)
1014 return;
1015
1016 clang::NamespaceDecl *namespace_decl =
1017 m_clang_ast_context->GetUniqueNamespaceDeclaration(
1019 if (!namespace_decl)
1020 return;
1021
1022 name_context.AddNamedDecl(namespace_decl);
1023 clang::DeclContext *ctxt = clang::Decl::castToDeclContext(namespace_decl);
1024 ctxt->setHasExternalVisibleStorage(true);
1025 name_context.m_found_local_vars_nsp = true;
1026}
1027
1029 NameSearchContext &context, ConstString name) {
1031
1032 if (!m_target)
1033 return;
1034
1035 std::shared_ptr<ClangModulesDeclVendor> modules_decl_vendor =
1037 if (!modules_decl_vendor)
1038 return;
1039
1040 bool append = false;
1041 uint32_t max_matches = 1;
1042 std::vector<CompilerDecl> decls;
1043
1044 if (!modules_decl_vendor->FindDecls(name, append, max_matches, decls))
1045 return;
1046
1047 assert(!decls.empty() && "FindDecls returned true but no decls?");
1048 auto *const decl_from_modules =
1049 llvm::cast<NamedDecl>(ClangUtil::GetDecl(decls[0]));
1050
1051 LLDB_LOG(log,
1052 " CAS::FEVD Matching decl found for "
1053 "\"{0}\" in the modules",
1054 name);
1055
1056 clang::Decl *copied_decl = CopyDecl(decl_from_modules);
1057 if (!copied_decl) {
1058 LLDB_LOG(log, " CAS::FEVD - Couldn't export a "
1059 "declaration from the modules");
1060 return;
1061 }
1062
1063 if (auto copied_function = dyn_cast<clang::FunctionDecl>(copied_decl)) {
1064 MaybeRegisterFunctionBody(copied_function);
1065
1066 context.AddNamedDecl(copied_function);
1067 } else if (auto copied_var = dyn_cast<clang::VarDecl>(copied_decl)) {
1068 context.AddNamedDecl(copied_var);
1069 context.m_found_variable = true;
1070 }
1071}
1072
1074 NameSearchContext &context, ConstString name, SymbolContext &sym_ctx,
1075 const CompilerDeclContext &namespace_decl) {
1076 if (sym_ctx.block == nullptr)
1077 return false;
1078
1079 CompilerDeclContext decl_context = sym_ctx.block->GetDeclContext();
1080 if (!decl_context)
1081 return false;
1082
1083 // Make sure that the variables are parsed so that we have the
1084 // declarations.
1085 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1086 VariableListSP vars = frame->GetInScopeVariableList(true);
1087 for (size_t i = 0; i < vars->GetSize(); i++)
1088 vars->GetVariableAtIndex(i)->GetDecl();
1089
1090 // Search for declarations matching the name. Do not include imported
1091 // decls in the search if we are looking for decls in the artificial
1092 // namespace $__lldb_local_vars.
1093 std::vector<CompilerDecl> found_decls =
1094 decl_context.FindDeclByName(name, namespace_decl.IsValid());
1095
1096 VariableSP var;
1097 bool variable_found = false;
1098 for (CompilerDecl decl : found_decls) {
1099 for (size_t vi = 0, ve = vars->GetSize(); vi != ve; ++vi) {
1100 VariableSP candidate_var = vars->GetVariableAtIndex(vi);
1101 if (candidate_var->GetDecl() == decl) {
1102 var = candidate_var;
1103 break;
1104 }
1105 }
1106
1107 if (var && !variable_found) {
1108 variable_found = true;
1109 ValueObjectSP valobj = ValueObjectVariable::Create(frame, var);
1110 AddOneVariable(context, var, valobj);
1111 context.m_found_variable = true;
1112 }
1113 }
1114
1115 // We're in a local_var_lookup but haven't found any local variables
1116 // so far. When performing a variable lookup from within the context of
1117 // a lambda, we count the lambda captures as local variables. Thus,
1118 // see if we captured any variables with the requested 'name'.
1119 if (!variable_found) {
1120 auto find_capture = [](ConstString varname,
1121 StackFrame *frame) -> ValueObjectSP {
1122 if (auto lambda = ClangExpressionUtil::GetLambdaValueObject(frame)) {
1123 if (auto capture = lambda->GetChildMemberWithName(varname)) {
1124 return capture;
1125 }
1126 }
1127
1128 return nullptr;
1129 };
1130
1131 if (auto capture = find_capture(name, frame)) {
1132 variable_found = true;
1133 context.m_found_variable = true;
1134 AddOneVariable(context, std::move(capture), std::move(find_capture));
1135 }
1136 }
1137
1138 return variable_found;
1139}
1140
1141/// Structure to hold the info needed when comparing function
1142/// declarations.
1143namespace {
1144struct FuncDeclInfo {
1145 ConstString m_name;
1146 CompilerType m_copied_type;
1147 uint32_t m_decl_lvl;
1148 SymbolContext m_sym_ctx;
1149};
1150} // namespace
1151
1153 const SymbolContextList &sc_list,
1154 const CompilerDeclContext &frame_decl_context) {
1155 // First, symplify things by looping through the symbol contexts to
1156 // remove unwanted functions and separate out the functions we want to
1157 // compare and prune into a separate list. Cache the info needed about
1158 // the function declarations in a vector for efficiency.
1159 SymbolContextList sc_sym_list;
1160 std::vector<FuncDeclInfo> decl_infos;
1161 decl_infos.reserve(sc_list.GetSize());
1162 clang::DeclContext *frame_decl_ctx =
1163 (clang::DeclContext *)frame_decl_context.GetOpaqueDeclContext();
1164 TypeSystemClang *ast = llvm::dyn_cast_or_null<TypeSystemClang>(
1165 frame_decl_context.GetTypeSystem());
1166
1167 for (const SymbolContext &sym_ctx : sc_list) {
1168 FuncDeclInfo fdi;
1169
1170 // We don't know enough about symbols to compare them, but we should
1171 // keep them in the list.
1172 Function *function = sym_ctx.function;
1173 if (!function) {
1174 sc_sym_list.Append(sym_ctx);
1175 continue;
1176 }
1177 // Filter out functions without declaration contexts, as well as
1178 // class/instance methods, since they'll be skipped in the code that
1179 // follows anyway.
1180 CompilerDeclContext func_decl_context = function->GetDeclContext();
1181 if (!func_decl_context || func_decl_context.IsClassMethod())
1182 continue;
1183 // We can only prune functions for which we can copy the type.
1184 CompilerType func_clang_type = function->GetType()->GetFullCompilerType();
1185 CompilerType copied_func_type = GuardedCopyType(func_clang_type);
1186 if (!copied_func_type) {
1187 sc_sym_list.Append(sym_ctx);
1188 continue;
1189 }
1190
1191 fdi.m_sym_ctx = sym_ctx;
1192 fdi.m_name = function->GetName();
1193 fdi.m_copied_type = copied_func_type;
1194 fdi.m_decl_lvl = LLDB_INVALID_DECL_LEVEL;
1195 if (fdi.m_copied_type && func_decl_context) {
1196 // Call CountDeclLevels to get the number of parent scopes we have
1197 // to look through before we find the function declaration. When
1198 // comparing functions of the same type, the one with a lower count
1199 // will be closer to us in the lookup scope and shadows the other.
1200 clang::DeclContext *func_decl_ctx =
1201 (clang::DeclContext *)func_decl_context.GetOpaqueDeclContext();
1202 fdi.m_decl_lvl = ast->CountDeclLevels(frame_decl_ctx, func_decl_ctx,
1203 &fdi.m_name, &fdi.m_copied_type);
1204 }
1205 decl_infos.emplace_back(fdi);
1206 }
1207
1208 // Loop through the functions in our cache looking for matching types,
1209 // then compare their scope levels to see which is closer.
1210 std::multimap<CompilerType, const FuncDeclInfo *> matches;
1211 for (const FuncDeclInfo &fdi : decl_infos) {
1212 const CompilerType t = fdi.m_copied_type;
1213 auto q = matches.find(t);
1214 if (q != matches.end()) {
1215 if (q->second->m_decl_lvl > fdi.m_decl_lvl)
1216 // This function is closer; remove the old set.
1217 matches.erase(t);
1218 else if (q->second->m_decl_lvl < fdi.m_decl_lvl)
1219 // The functions in our set are closer - skip this one.
1220 continue;
1221 }
1222 matches.insert(std::make_pair(t, &fdi));
1223 }
1224
1225 // Loop through our matches and add their symbol contexts to our list.
1226 SymbolContextList sc_func_list;
1227 for (const auto &q : matches)
1228 sc_func_list.Append(q.second->m_sym_ctx);
1229
1230 // Rejoin the lists with the functions in front.
1231 sc_func_list.Append(sc_sym_list);
1232 return sc_func_list;
1233}
1234
1236 NameSearchContext &context, lldb::ModuleSP module_sp, ConstString name,
1237 const CompilerDeclContext &namespace_decl) {
1238 if (!m_parser_vars)
1239 return false;
1240
1241 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1242
1243 std::vector<CompilerDecl> decls_from_modules;
1244
1245 if (target) {
1246 if (std::shared_ptr<ClangModulesDeclVendor> decl_vendor =
1248 decl_vendor->FindDecls(name, false, UINT32_MAX, decls_from_modules);
1249 }
1250 }
1251
1252 SymbolContextList sc_list;
1253 if (namespace_decl && module_sp) {
1254 ModuleFunctionSearchOptions function_options;
1255 function_options.include_inlines = false;
1256 function_options.include_symbols = false;
1257
1258 module_sp->FindFunctions(name, namespace_decl, eFunctionNameTypeBase,
1259 function_options, sc_list);
1260 } else if (target && !namespace_decl) {
1261 ModuleFunctionSearchOptions function_options;
1262 function_options.include_inlines = false;
1263 function_options.include_symbols = true;
1264
1265 // TODO Fix FindFunctions so that it doesn't return
1266 // instance methods for eFunctionNameTypeBase.
1267
1268 target->GetImages().FindFunctions(
1269 name, eFunctionNameTypeFull | eFunctionNameTypeBase, function_options,
1270 sc_list);
1271 }
1272
1273 // If we found more than one function, see if we can use the frame's decl
1274 // context to remove functions that are shadowed by other functions which
1275 // match in type but are nearer in scope.
1276 //
1277 // AddOneFunction will not add a function whose type has already been
1278 // added, so if there's another function in the list with a matching type,
1279 // check to see if their decl context is a parent of the current frame's or
1280 // was imported via a and using statement, and pick the best match
1281 // according to lookup rules.
1282 if (sc_list.GetSize() > 1) {
1283 // Collect some info about our frame's context.
1284 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1285 SymbolContext frame_sym_ctx;
1286 if (frame != nullptr)
1287 frame_sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction |
1288 lldb::eSymbolContextBlock);
1289 CompilerDeclContext frame_decl_context =
1290 frame_sym_ctx.block != nullptr ? frame_sym_ctx.block->GetDeclContext()
1292
1293 // We can't do this without a compiler decl context for our frame.
1294 if (frame_decl_context) {
1295 sc_list = SearchFunctionsInSymbolContexts(sc_list, frame_decl_context);
1296 }
1297 }
1298
1299 bool found_function_with_type_info = false;
1300
1301 if (sc_list.GetSize()) {
1302 const Symbol *extern_symbol = nullptr;
1303 const Symbol *non_extern_symbol = nullptr;
1304
1305 for (const SymbolContext &sym_ctx : sc_list) {
1306 if (sym_ctx.function) {
1307 CompilerDeclContext decl_ctx = sym_ctx.function->GetDeclContext();
1308
1309 if (!decl_ctx)
1310 continue;
1311
1312 // Filter out class/instance methods.
1313 if (decl_ctx.IsClassMethod())
1314 continue;
1315
1316 AddOneFunction(context, sym_ctx.function, nullptr);
1317 found_function_with_type_info = true;
1318 } else if (sym_ctx.symbol) {
1319 const Symbol *symbol = sym_ctx.symbol;
1320 if (target && symbol->GetType() == eSymbolTypeReExported) {
1321 symbol = symbol->ResolveReExportedSymbol(*target);
1322 if (symbol == nullptr)
1323 continue;
1324 }
1325
1326 if (symbol->IsExternal())
1327 extern_symbol = symbol;
1328 else
1329 non_extern_symbol = symbol;
1330 }
1331 }
1332
1333 if (!found_function_with_type_info) {
1334 for (const CompilerDecl &compiler_decl : decls_from_modules) {
1335 clang::Decl *decl = ClangUtil::GetDecl(compiler_decl);
1336 if (llvm::isa<clang::FunctionDecl>(decl)) {
1337 clang::NamedDecl *copied_decl =
1338 llvm::cast_or_null<FunctionDecl>(CopyDecl(decl));
1339 if (copied_decl) {
1340 context.AddNamedDecl(copied_decl);
1341 found_function_with_type_info = true;
1342 }
1343 }
1344 }
1345 }
1346
1347 if (!found_function_with_type_info) {
1348 if (extern_symbol) {
1349 AddOneFunction(context, nullptr, extern_symbol);
1350 } else if (non_extern_symbol) {
1351 AddOneFunction(context, nullptr, non_extern_symbol);
1352 }
1353 }
1354 }
1355
1356 return found_function_with_type_info;
1357}
1358
1360 NameSearchContext &context, lldb::ModuleSP module_sp,
1361 const CompilerDeclContext &namespace_decl) {
1362 assert(m_ast_context);
1363
1365
1366 const ConstString name(context.m_decl_name.getAsString().c_str());
1367 if (IgnoreName(name, false))
1368 return;
1369
1370 // Only look for functions by name out in our symbols if the function doesn't
1371 // start with our phony prefix of '$'
1372
1373 Target *target = nullptr;
1374 StackFrame *frame = nullptr;
1375 SymbolContext sym_ctx;
1376 if (m_parser_vars) {
1377 target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1378 frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1379 }
1380 if (frame != nullptr)
1381 sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction |
1382 lldb::eSymbolContextBlock);
1383
1384 // Try the persistent decls, which take precedence over all else.
1385 if (!namespace_decl)
1386 SearchPersistenDecls(context, name);
1387
1388 if (name.GetStringRef().starts_with("$") && !namespace_decl) {
1389 if (name == "$__lldb_class") {
1390 LookUpLldbClass(context);
1391 return;
1392 }
1393
1394 if (name == "$__lldb_objc_class") {
1395 LookUpLldbObjCClass(context);
1396 return;
1397 }
1399 LookupLocalVarNamespace(sym_ctx, context);
1400 return;
1401 }
1402
1403 // any other $__lldb names should be weeded out now
1404 if (name.GetStringRef().starts_with("$__lldb"))
1405 return;
1406
1407 // No ParserVars means we can't do register or variable lookup.
1408 if (!m_parser_vars || !m_parser_vars->m_persistent_vars)
1409 return;
1410
1411 ExpressionVariableSP pvar_sp(
1412 m_parser_vars->m_persistent_vars->GetVariable(name));
1413
1414 if (pvar_sp) {
1415 AddOneVariable(context, pvar_sp);
1416 return;
1417 }
1418
1419 assert(name.GetStringRef().starts_with("$"));
1420 llvm::StringRef reg_name = name.GetStringRef().substr(1);
1421
1422 if (m_parser_vars->m_exe_ctx.GetRegisterContext()) {
1423 const RegisterInfo *reg_info(
1424 m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(
1425 reg_name));
1426
1427 if (reg_info) {
1428 LLDB_LOG(log, " CEDM::FEVD Found register {0}", reg_info->name);
1429
1430 AddOneRegister(context, reg_info);
1431 }
1432 }
1433 return;
1434 }
1435
1436 bool local_var_lookup = !namespace_decl || (namespace_decl.GetName() ==
1438 if (frame && local_var_lookup)
1439 if (LookupLocalVariable(context, name, sym_ctx, namespace_decl))
1440 return;
1441
1442 if (target) {
1443 ValueObjectSP valobj;
1444 VariableSP var;
1445 var = FindGlobalVariable(*target, module_sp, name, namespace_decl);
1446
1447 if (var) {
1448 valobj = ValueObjectVariable::Create(target, var);
1449 AddOneVariable(context, var, valobj);
1450 context.m_found_variable = true;
1451 return;
1452 }
1453 }
1454
1455 if (!LookupFunction(context, module_sp, name, namespace_decl))
1456 LookupInModulesDeclVendor(context, name);
1457
1458 if (target && !context.m_found_variable && !namespace_decl) {
1459 // We couldn't find a non-symbol variable for this. Now we'll hunt for a
1460 // generic data symbol, and -- if it is found -- treat it as a variable.
1461 Status error;
1462
1463 const Symbol *data_symbol =
1464 m_parser_vars->m_sym_ctx.FindBestGlobalDataSymbol(name, error);
1465
1466 if (!error.Success()) {
1467 const unsigned diag_id =
1468 m_ast_context->getDiagnostics().getCustomDiagID(
1469 clang::DiagnosticsEngine::Level::Error, "%0");
1470 m_ast_context->getDiagnostics().Report(diag_id) << error.AsCString();
1471 }
1472
1473 if (data_symbol) {
1474 std::string warning("got name from symbols: ");
1475 warning.append(name.AsCString());
1476 const unsigned diag_id =
1477 m_ast_context->getDiagnostics().getCustomDiagID(
1478 clang::DiagnosticsEngine::Level::Warning, "%0");
1479 m_ast_context->getDiagnostics().Report(diag_id) << warning.c_str();
1480 AddOneGenericVariable(context, *data_symbol);
1481 context.m_found_variable = true;
1482 }
1483 }
1484}
1485
1487 lldb_private::Value &var_location,
1488 TypeFromUser *user_type,
1489 TypeFromParser *parser_type) {
1491
1492 Type *var_type = var->GetType();
1493
1494 if (!var_type) {
1495 LLDB_LOG(log, "Skipped a definition because it has no type");
1496 return false;
1497 }
1498
1499 CompilerType var_clang_type = var_type->GetFullCompilerType();
1500
1501 if (!var_clang_type) {
1502 LLDB_LOG(log, "Skipped a definition because it has no Clang type");
1503 return false;
1504 }
1505
1506 auto clang_ast =
1508
1509 if (!clang_ast) {
1510 LLDB_LOG(log, "Skipped a definition because it has no Clang AST");
1511 return false;
1512 }
1513
1514 DWARFExpressionList &var_location_list = var->LocationExpressionList();
1515
1516 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1517 Status err;
1518
1519 if (var->GetLocationIsConstantValueData()) {
1520 DataExtractor const_value_extractor;
1521 if (var_location_list.GetExpressionData(const_value_extractor)) {
1522 var_location = Value(const_value_extractor.GetDataStart(),
1523 const_value_extractor.GetByteSize());
1525 } else {
1526 LLDB_LOG(log, "Error evaluating constant variable: {0}", err.AsCString());
1527 return false;
1528 }
1529 }
1530
1531 CompilerType type_to_use = GuardedCopyType(var_clang_type);
1532
1533 if (!type_to_use) {
1534 LLDB_LOG(log,
1535 "Couldn't copy a variable's type into the parser's AST context");
1536
1537 return false;
1538 }
1539
1540 if (parser_type)
1541 *parser_type = TypeFromParser(type_to_use);
1542
1543 if (var_location.GetContextType() == Value::ContextType::Invalid)
1544 var_location.SetCompilerType(type_to_use);
1545
1546 if (var_location.GetValueType() == Value::ValueType::FileAddress) {
1547 SymbolContext var_sc;
1548 var->CalculateSymbolContext(&var_sc);
1549
1550 if (!var_sc.module_sp)
1551 return false;
1552
1553 Address so_addr(var_location.GetScalar().ULongLong(),
1554 var_sc.module_sp->GetSectionList());
1555
1556 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
1557
1558 if (load_addr != LLDB_INVALID_ADDRESS) {
1559 var_location.GetScalar() = load_addr;
1561 }
1562 }
1563
1564 if (user_type)
1565 *user_type = TypeFromUser(var_clang_type);
1566
1567 return true;
1568}
1569
1572 TypeFromParser const &pt,
1573 ValueObjectSP valobj) {
1574 clang::QualType parser_opaque_type =
1575 QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
1576
1577 if (parser_opaque_type.isNull())
1578 return nullptr;
1579
1580 if (const clang::Type *parser_type = parser_opaque_type.getTypePtr()) {
1581 if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
1582 CompleteType(tag_type->getDecl()->getDefinitionOrSelf());
1583 if (const ObjCObjectPointerType *objc_object_ptr_type =
1584 dyn_cast<ObjCObjectPointerType>(parser_type))
1585 CompleteType(objc_object_ptr_type->getInterfaceDecl());
1586 }
1587
1588 bool is_reference = pt.IsReferenceType();
1589
1590 NamedDecl *var_decl = nullptr;
1591 if (is_reference)
1592 var_decl = context.AddVarDecl(pt);
1593 else
1594 var_decl = context.AddVarDecl(pt.GetLValueReferenceType());
1595
1596 std::string decl_name(context.m_decl_name.getAsString());
1597 ConstString entity_name(decl_name.c_str());
1599 m_found_entities.AddNewlyConstructedVariable(entity);
1600
1601 assert(entity);
1602 entity->EnableParserVars(GetParserID());
1604 entity->GetParserVars(GetParserID());
1605
1606 parser_vars->m_named_decl = var_decl;
1607
1608 if (is_reference)
1609 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
1610
1611 return parser_vars;
1612}
1613
1615 NameSearchContext &context, ValueObjectSP valobj,
1616 ValueObjectProviderTy valobj_provider) {
1617 assert(m_parser_vars.get());
1618 assert(valobj);
1619
1621
1622 Value var_location = valobj->GetValue();
1623
1624 TypeFromUser user_type = valobj->GetCompilerType();
1625
1626 auto clang_ast = user_type.GetTypeSystem<TypeSystemClang>();
1627
1628 if (!clang_ast) {
1629 LLDB_LOG(log, "Skipped a definition because it has no Clang AST");
1630 return;
1631 }
1632
1633 TypeFromParser parser_type = GuardedCopyType(user_type);
1634
1635 if (!parser_type) {
1636 LLDB_LOG(log,
1637 "Couldn't copy a variable's type into the parser's AST context");
1638
1639 return;
1640 }
1641
1642 if (var_location.GetContextType() == Value::ContextType::Invalid)
1643 var_location.SetCompilerType(parser_type);
1644
1646 AddExpressionVariable(context, parser_type, valobj);
1647
1648 if (!parser_vars)
1649 return;
1650
1651 LLDB_LOG(log, " CEDM::FEVD Found variable {0}, returned\n{1} (original {2})",
1652 context.m_decl_name, ClangUtil::DumpDecl(parser_vars->m_named_decl),
1653 ClangUtil::ToString(user_type));
1654
1655 parser_vars->m_llvm_value = nullptr;
1656 parser_vars->m_lldb_value = std::move(var_location);
1657 parser_vars->m_lldb_valobj_provider = std::move(valobj_provider);
1658}
1659
1661 VariableSP var,
1662 ValueObjectSP valobj) {
1663 assert(m_parser_vars.get());
1664
1666
1667 TypeFromUser ut;
1668 TypeFromParser pt;
1669 Value var_location;
1670
1671 if (!GetVariableValue(var, var_location, &ut, &pt))
1672 return;
1673
1675 AddExpressionVariable(context, pt, std::move(valobj));
1676
1677 if (!parser_vars)
1678 return;
1679
1680 LLDB_LOG(log, " CEDM::FEVD Found variable {0}, returned\n{1} (original {2})",
1681 context.m_decl_name, ClangUtil::DumpDecl(parser_vars->m_named_decl),
1683
1684 parser_vars->m_llvm_value = nullptr;
1685 parser_vars->m_lldb_value = var_location;
1686 parser_vars->m_lldb_var = var;
1687}
1688
1690 ExpressionVariableSP &pvar_sp) {
1692
1693 TypeFromUser user_type(
1694 llvm::cast<ClangExpressionVariable>(pvar_sp.get())->GetTypeFromUser());
1695
1696 TypeFromParser parser_type(GuardedCopyType(user_type));
1697
1698 if (!parser_type.GetOpaqueQualType()) {
1699 LLDB_LOG(log, " CEDM::FEVD Couldn't import type for pvar {0}",
1700 pvar_sp->GetName());
1701 return;
1702 }
1703
1704 NamedDecl *var_decl =
1705 context.AddVarDecl(parser_type.GetLValueReferenceType());
1706
1707 llvm::cast<ClangExpressionVariable>(pvar_sp.get())
1708 ->EnableParserVars(GetParserID());
1710 llvm::cast<ClangExpressionVariable>(pvar_sp.get())
1711 ->GetParserVars(GetParserID());
1712 parser_vars->m_named_decl = var_decl;
1713 parser_vars->m_llvm_value = nullptr;
1714 parser_vars->m_lldb_value.Clear();
1715
1716 LLDB_LOG(log, " CEDM::FEVD Added pvar {0}, returned\n{1}",
1717 pvar_sp->GetName(), ClangUtil::DumpDecl(var_decl));
1718}
1719
1721 const Symbol &symbol) {
1722 assert(m_parser_vars.get());
1723
1725
1726 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1727
1728 if (target == nullptr)
1729 return;
1730
1731 auto scratch_ast_context = GetScratchContext(*target);
1732 if (!scratch_ast_context)
1733 return;
1734
1735 TypeFromUser user_type(scratch_ast_context->GetBasicType(eBasicTypeVoid)
1736 .GetPointerType()
1737 .GetLValueReferenceType());
1738 TypeFromParser parser_type(m_clang_ast_context->GetBasicType(eBasicTypeVoid)
1739 .GetPointerType()
1740 .GetLValueReferenceType());
1741 NamedDecl *var_decl = context.AddVarDecl(parser_type);
1742
1743 std::string decl_name(context.m_decl_name.getAsString());
1744 ConstString entity_name(decl_name.c_str());
1746 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), entity_name,
1747 user_type, m_parser_vars->m_target_info.byte_order,
1748 m_parser_vars->m_target_info.address_byte_size));
1749 m_found_entities.AddNewlyConstructedVariable(entity);
1750
1751 entity->EnableParserVars(GetParserID());
1753 entity->GetParserVars(GetParserID());
1754
1755 const Address symbol_address = symbol.GetAddress();
1756 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
1757
1758 // parser_vars->m_lldb_value.SetContext(Value::ContextType::ClangType,
1759 // user_type.GetOpaqueQualType());
1760 parser_vars->m_lldb_value.SetCompilerType(user_type);
1761 parser_vars->m_lldb_value.GetScalar() = symbol_load_addr;
1763
1764 parser_vars->m_named_decl = var_decl;
1765 parser_vars->m_llvm_value = nullptr;
1766 parser_vars->m_lldb_sym = &symbol;
1767
1768 LLDB_LOG(log, " CEDM::FEVD Found variable {0}, returned\n{1}", decl_name,
1769 ClangUtil::DumpDecl(var_decl));
1770}
1771
1773 const RegisterInfo *reg_info) {
1775
1776 CompilerType clang_type =
1777 m_clang_ast_context->GetBuiltinTypeForEncodingAndBitSize(
1778 reg_info->encoding, reg_info->byte_size * 8);
1779
1780 if (!clang_type) {
1781 LLDB_LOG(log, " Tried to add a type for {0}, but couldn't get one",
1782 context.m_decl_name.getAsString());
1783 return;
1784 }
1785
1786 TypeFromParser parser_clang_type(clang_type);
1787
1788 NamedDecl *var_decl = context.AddVarDecl(parser_clang_type);
1789
1791 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
1792 m_parser_vars->m_target_info.byte_order,
1793 m_parser_vars->m_target_info.address_byte_size));
1794 m_found_entities.AddNewlyConstructedVariable(entity);
1795
1796 std::string decl_name(context.m_decl_name.getAsString());
1797 entity->SetName(ConstString(decl_name.c_str()));
1798 entity->SetRegisterInfo(reg_info);
1799 entity->EnableParserVars(GetParserID());
1801 entity->GetParserVars(GetParserID());
1802 parser_vars->m_named_decl = var_decl;
1803 parser_vars->m_llvm_value = nullptr;
1804 parser_vars->m_lldb_value.Clear();
1805 entity->m_flags |= ClangExpressionVariable::EVBareRegister;
1806
1807 LLDB_LOG(log, " CEDM::FEVD Added register {0}, returned\n{1}",
1808 context.m_decl_name.getAsString(), ClangUtil::DumpDecl(var_decl));
1809}
1810
1812 Function *function,
1813 const Symbol *symbol) {
1814 assert(m_parser_vars.get());
1815
1817
1818 NamedDecl *function_decl = nullptr;
1819 Address fun_address;
1820 CompilerType function_clang_type;
1821
1822 bool is_indirect_function = false;
1823
1824 if (function) {
1825 Type *function_type = function->GetType();
1826
1827 const auto lang = function->GetCompileUnit()->GetLanguage();
1828 const auto name = function->GetMangled().GetMangledName().AsCString();
1829 const bool extern_c =
1831 (Language::LanguageIsObjC(lang) &&
1833
1834 if (!extern_c) {
1835 TypeSystem *type_system = function->GetDeclContext().GetTypeSystem();
1836 if (llvm::isa<TypeSystemClang>(type_system)) {
1837 clang::DeclContext *src_decl_context =
1838 (clang::DeclContext *)function->GetDeclContext()
1840 clang::FunctionDecl *src_function_decl =
1841 llvm::dyn_cast_or_null<clang::FunctionDecl>(src_decl_context);
1842 if (src_function_decl &&
1843 src_function_decl->getTemplateSpecializationInfo()) {
1844 clang::FunctionTemplateDecl *function_template =
1845 src_function_decl->getTemplateSpecializationInfo()->getTemplate();
1846 clang::FunctionTemplateDecl *copied_function_template =
1847 llvm::dyn_cast_or_null<clang::FunctionTemplateDecl>(
1848 CopyDecl(function_template));
1849 if (copied_function_template) {
1850 if (log) {
1851 StreamString ss;
1852
1853 function->DumpSymbolContext(&ss);
1854
1855 LLDB_LOG(log,
1856 " CEDM::FEVD Imported decl for function template"
1857 " {0} (description {1}), returned\n{2}",
1858 copied_function_template->getNameAsString(),
1859 ss.GetData(),
1860 ClangUtil::DumpDecl(copied_function_template));
1861 }
1862
1863 context.AddNamedDecl(copied_function_template);
1864 }
1865 } else if (src_function_decl) {
1866 if (clang::FunctionDecl *copied_function_decl =
1867 llvm::dyn_cast_or_null<clang::FunctionDecl>(
1868 CopyDecl(src_function_decl))) {
1869 if (log) {
1870 StreamString ss;
1871
1872 function->DumpSymbolContext(&ss);
1873
1874 LLDB_LOG(log,
1875 " CEDM::FEVD Imported decl for function {0} "
1876 "(description {1}), returned\n{2}",
1877 copied_function_decl->getNameAsString(), ss.GetData(),
1878 ClangUtil::DumpDecl(copied_function_decl));
1879 }
1880
1881 context.AddNamedDecl(copied_function_decl);
1882 return;
1883 } else {
1884 LLDB_LOG(log, " Failed to import the function decl for '{0}'",
1885 src_function_decl->getName());
1886 }
1887 }
1888 }
1889 }
1890
1891 if (!function_type) {
1892 LLDB_LOG(log, " Skipped a function because it has no type");
1893 return;
1894 }
1895
1896 function_clang_type = function_type->GetFullCompilerType();
1897
1898 if (!function_clang_type) {
1899 LLDB_LOG(log, " Skipped a function because it has no Clang type");
1900 return;
1901 }
1902
1903 fun_address = function->GetAddress();
1904
1905 CompilerType copied_function_type = GuardedCopyType(function_clang_type);
1906 if (copied_function_type) {
1907 function_decl = context.AddFunDecl(copied_function_type, extern_c);
1908
1909 if (!function_decl) {
1910 LLDB_LOG(log, " Failed to create a function decl for '{0}' ({1:x})",
1911 function_type->GetName(), function_type->GetID());
1912
1913 return;
1914 }
1915 } else {
1916 // We failed to copy the type we found
1917 LLDB_LOG(log,
1918 " Failed to import the function type '{0}' ({1:x})"
1919 " into the expression parser AST context",
1920 function_type->GetName(), function_type->GetID());
1921
1922 return;
1923 }
1924 } else if (symbol) {
1925 fun_address = symbol->GetAddress();
1926 function_decl = context.AddGenericFunDecl();
1927 is_indirect_function = symbol->IsIndirect();
1928 } else {
1929 LLDB_LOG(log, " AddOneFunction called with no function and no symbol");
1930 return;
1931 }
1932
1933 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1934
1935 lldb::addr_t load_addr =
1936 fun_address.GetCallableLoadAddress(target, is_indirect_function);
1937
1939 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
1940 m_parser_vars->m_target_info.byte_order,
1941 m_parser_vars->m_target_info.address_byte_size));
1942 m_found_entities.AddNewlyConstructedVariable(entity);
1943
1944 std::string decl_name(context.m_decl_name.getAsString());
1945 entity->SetName(ConstString(decl_name.c_str()));
1946 entity->SetCompilerType(function_clang_type);
1947 entity->EnableParserVars(GetParserID());
1948
1950 entity->GetParserVars(GetParserID());
1951
1952 if (load_addr != LLDB_INVALID_ADDRESS) {
1954 parser_vars->m_lldb_value.GetScalar() = load_addr;
1955 } else {
1956 // We have to try finding a file address.
1957
1958 lldb::addr_t file_addr = fun_address.GetFileAddress();
1959
1961 parser_vars->m_lldb_value.GetScalar() = file_addr;
1962 }
1963
1964 parser_vars->m_named_decl = function_decl;
1965 parser_vars->m_llvm_value = nullptr;
1966
1967 if (log) {
1968 StreamString ss;
1969
1970 fun_address.Dump(&ss,
1971 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
1973
1974 LLDB_LOG(log,
1975 " CEDM::FEVD Found {0} function {1} (description {2}), "
1976 "returned\n{3}",
1977 (function ? "specific" : "generic"), decl_name, ss.GetData(),
1978 ClangUtil::DumpDecl(function_decl));
1979 }
1980}
1981
1983 const TypeFromUser &ut) {
1984 CompilerType copied_clang_type = GuardedCopyType(ut);
1985
1987
1988 if (!copied_clang_type) {
1989 LLDB_LOG(log,
1990 "ClangExpressionDeclMap::AddThisType - Couldn't import the type");
1991
1992 return;
1993 }
1994
1995 if (copied_clang_type.IsAggregateType() &&
1996 copied_clang_type.GetCompleteType()) {
1997 CompilerType void_clang_type =
1998 m_clang_ast_context->GetBasicType(eBasicTypeVoid);
1999 std::array<CompilerType, 1> args{void_clang_type.GetPointerType()};
2000
2001 CompilerType method_type = m_clang_ast_context->CreateFunctionType(
2002 void_clang_type, args, false,
2004
2005 const bool is_virtual = false;
2006 const bool is_static = false;
2007 const bool is_inline = false;
2008 const bool is_explicit = false;
2009 const bool is_attr_used = true;
2010 const bool is_artificial = false;
2011
2012 CXXMethodDecl *method_decl = m_clang_ast_context->AddMethodToCXXRecordType(
2013 copied_clang_type.GetOpaqueQualType(), "$__lldb_expr", /*asm_label=*/{},
2014 method_type, is_virtual, is_static, is_inline, is_explicit,
2015 is_attr_used, is_artificial);
2016
2017 LLDB_LOG(log,
2018 " CEDM::AddThisType Added function $__lldb_expr "
2019 "(description {0}) for this type\n{1}",
2020 ClangUtil::ToString(copied_clang_type),
2021 ClangUtil::DumpDecl(method_decl));
2022 }
2023
2024 if (!copied_clang_type.IsValid())
2025 return;
2026
2027 TypeSourceInfo *type_source_info = m_ast_context->getTrivialTypeSourceInfo(
2028 QualType::getFromOpaquePtr(copied_clang_type.GetOpaqueQualType()));
2029
2030 if (!type_source_info)
2031 return;
2032
2033 // Construct a typedef type because if "*this" is a templated type we can't
2034 // just return ClassTemplateSpecializationDecls in response to name queries.
2035 // Using a typedef makes this much more robust.
2036
2037 TypedefDecl *typedef_decl = TypedefDecl::Create(
2038 *m_ast_context, m_ast_context->getTranslationUnitDecl(), SourceLocation(),
2039 SourceLocation(), context.m_decl_name.getAsIdentifierInfo(),
2040 type_source_info);
2041
2042 if (!typedef_decl)
2043 return;
2044
2045 context.AddNamedDecl(typedef_decl);
2046}
2047
2049 const TypeFromUser &ut) {
2050 CompilerType copied_clang_type = GuardedCopyType(ut);
2051
2052 if (!copied_clang_type) {
2054
2055 LLDB_LOG(log,
2056 "ClangExpressionDeclMap::AddOneType - Couldn't import the type");
2057
2058 return;
2059 }
2060
2061 context.AddTypeDecl(copied_clang_type);
2062}
static const char * g_lldb_local_vars_namespace_cstr
static llvm::raw_ostream & error(Stream &strm)
static llvm::raw_ostream & warning(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
Definition Log.h:369
#define LLDB_LOG_VERBOSE(log,...)
Definition Log.h:376
#define LLDB_INVALID_DECL_LEVEL
A section + offset based address class.
Definition Address.h:62
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
Definition Address.cpp:301
lldb::addr_t GetCallableLoadAddress(Target *target, bool is_indirect=false) const
Get the load address as a callable code load address.
Definition Address.cpp:326
@ DumpStyleResolvedDescription
Display the details about what an address resolves to.
Definition Address.h:104
bool Dump(Stream *s, ExecutionContextScope *exe_scope, DumpStyle style, DumpStyle fallback_style=DumpStyleInvalid, uint32_t addr_byte_size=UINT32_MAX, bool all_ranges=false, std::optional< Stream::HighlightSettings > settings=std::nullopt) const
Dump a description of this object to a Stream.
Definition Address.cpp:396
lldb::addr_t GetFileAddress() const
Get the file address.
Definition Address.cpp:281
bool IsValid() const
Check if the object state is valid.
Definition Address.h:355
uint32_t GetAddressByteSize() const
Returns the size in bytes of an address of the current architecture.
Definition ArchSpec.cpp:681
lldb::ByteOrder GetByteOrder() const
Returns the byte order for the architecture specification.
Definition ArchSpec.cpp:730
A class that describes a single lexical block.
Definition Block.h:41
CompilerDeclContext GetDeclContext()
Definition Block.cpp:473
std::shared_ptr< NamespaceMap > NamespaceMapSP
std::pair< lldb::ModuleSP, CompilerDeclContext > NamespaceMapItem
clang::ASTContext * m_ast_context
The AST context requests are coming in for.
ClangASTSource(const lldb::TargetSP &target, const std::shared_ptr< ClangASTImporter > &importer)
Constructor.
clang::Decl * CopyDecl(clang::Decl *src_decl)
Copies a single Decl into the parser's AST context.
bool IgnoreName(const ConstString name, bool ignore_all_dollar_names)
Returns true if a name should be ignored by name lookup.
virtual void FindExternalVisibleDecls(NameSearchContext &context)
The worker function for FindExternalVisibleDeclsByName.
std::shared_ptr< ClangModulesDeclVendor > GetClangModulesDeclVendor()
void CompleteType(clang::TagDecl *Tag) override
Complete a TagDecl.
CompilerType GuardedCopyType(const CompilerType &src_type)
A wrapper for TypeSystemClang::CopyType that sets a flag that indicates that we should not respond to...
std::shared_ptr< ClangASTImporter > m_ast_importer_sp
The target's AST importer.
TypeSystemClang * m_clang_ast_context
The TypeSystemClang for m_ast_context.
const lldb::TargetSP m_target
The target to use in finding variables and types.
bool GetVariableValue(lldb::VariableSP &var, lldb_private::Value &var_location, TypeFromUser *found_type=nullptr, TypeFromParser *parser_type=nullptr)
Get the value of a variable in a given execution context and return the associated Types if needed.
ClangExpressionVariable::ParserVars * AddExpressionVariable(NameSearchContext &context, TypeFromParser const &pt, lldb::ValueObjectSP valobj)
Use the NameSearchContext to generate a Decl for the given LLDB ValueObject, and put it in the list o...
std::unique_ptr< StructVars > m_struct_vars
void EnableParserVars()
Activate parser-specific variables.
uint64_t GetParserID()
Get this parser's ID for use in extracting parser- and JIT-specific data from persistent variables.
bool AddPersistentVariable(const clang::NamedDecl *decl, ConstString name, TypeFromParser type, bool is_result, bool is_lvalue)
[Used by IRForTarget] Add a variable to the list of persistent variables for the process.
bool LookupLocalVariable(NameSearchContext &context, ConstString name, SymbolContext &sym_ctx, const CompilerDeclContext &namespace_decl)
Looks up a local variable.
void DisableStructVars()
Deallocate struct variables.
void AddOneVariable(NameSearchContext &context, lldb::VariableSP var, lldb::ValueObjectSP valobj)
Use the NameSearchContext to generate a Decl for the given LLDB Variable, and put it in the Tuple lis...
void FindExternalVisibleDecls(NameSearchContext &context) override
[Used by ClangASTSource] Find all entities matching a given name, using a NameSearchContext to make D...
bool LookupFunction(NameSearchContext &context, lldb::ModuleSP module_sp, ConstString name, const CompilerDeclContext &namespace_decl)
Looks up a function.
bool GetStructElement(const clang::NamedDecl *&decl, llvm::Value *&value, lldb::offset_t &offset, ConstString &name, uint32_t index)
[Used by IRForTarget] Get specific information about one field of the laid-out struct after DoStructL...
bool DoStructLayout()
[Used by IRForTarget] Finalize the struct, laying out the position of each object in it.
void MaybeRegisterFunctionBody(clang::FunctionDecl *copied_function_decl)
Should be called on all copied functions.
void EnableStructVars()
Activate struct variables.
void AddOneGenericVariable(NameSearchContext &context, const Symbol &symbol)
Use the NameSearchContext to generate a Decl for the given LLDB symbol (treated as a variable),...
void DidParse()
Disable the state needed for parsing and IR transformation.
void AddOneRegister(NameSearchContext &context, const RegisterInfo *reg_info)
Use the NameSearchContext to generate a Decl for the given register.
bool WillParse(ExecutionContext &exe_ctx, Materializer *materializer)
Enable the state needed for parsing and IR transformation.
void LookUpLldbObjCClass(NameSearchContext &context)
Handles looking up $__lldb_objc_class which requires special treatment.
void DisableParserVars()
Deallocate parser-specific variables.
void LookupLocalVarNamespace(SymbolContext &sym_ctx, NameSearchContext &name_context)
Handles looking up the synthetic namespace that contains our local variables for the current frame.
bool AddValueToStruct(const clang::NamedDecl *decl, ConstString name, llvm::Value *value, size_t size, lldb::offset_t alignment)
[Used by IRForTarget] Add a variable to the struct that needs to be materialized each time the expres...
lldb::addr_t GetSymbolAddress(Target &target, Process *process, ConstString name, lldb::SymbolType symbol_type, Module *module=nullptr)
[Used by IRForTarget] Get the address of a symbol given nothing but its name.
void InstallDiagnosticManager(DiagnosticManager &diag_manager)
void LookUpLldbClass(NameSearchContext &context)
Handles looking up $__lldb_class which requires special treatment.
bool m_keep_result_in_memory
True if result persistent variables generated by this expression should stay in memory.
bool GetFunctionInfo(const clang::NamedDecl *decl, uint64_t &ptr)
[Used by IRForTarget] Get information about a function given its Decl.
lldb::TypeSystemClangSP GetScratchContext(Target &target)
void AddContextClassType(NameSearchContext &context, const TypeFromUser &type)
Adds the class in which the expression is evaluated to the lookup and prepares the class to be used a...
bool GetStructInfo(uint32_t &num_elements, size_t &size, lldb::offset_t &alignment)
[Used by IRForTarget] Get general information about the laid-out struct after DoStructLayout() has be...
void AddOneFunction(NameSearchContext &context, Function *fun, const Symbol *sym)
Use the NameSearchContext to generate a Decl for the given function.
SymbolContextList SearchFunctionsInSymbolContexts(const SymbolContextList &sc_list, const CompilerDeclContext &frame_decl_context)
Searches for functions in the given SymbolContextList.
ExpressionVariableList m_struct_members
All entities that need to be placed in the struct.
ExpressionVariableList m_found_entities
All entities that were looked up for the parser.
void SearchPersistenDecls(NameSearchContext &context, const ConstString name)
Searches the persistent decls of the target for entities with the given name.
TypeFromUser DeportType(TypeSystemClang &target, TypeSystemClang &source, TypeFromParser parser_type)
Move a type out of the current ASTContext into another, but make sure to export all components of the...
Materializer::PersistentVariableDelegate * m_result_delegate
If non-NULL, used to report expression results to ClangUserExpression.
void LookupInModulesDeclVendor(NameSearchContext &context, ConstString name)
Lookup entities in the ClangModulesDeclVendor.
void AddOneType(NameSearchContext &context, const TypeFromUser &type)
Use the NameSearchContext to generate a Decl for the given type.
ValueObject * m_ctx_obj
If not empty, then expression is evaluated in context of this object.
lldb::VariableSP FindGlobalVariable(Target &target, lldb::ModuleSP &module, ConstString name, const CompilerDeclContext &namespace_decl)
Given a target, find a variable that matches the given name and type.
ClangExpressionDeclMap(bool keep_result_in_memory, Materializer::PersistentVariableDelegate *result_delegate, const lldb::TargetSP &target, const std::shared_ptr< ClangASTImporter > &importer, ValueObject *ctx_obj, bool ignore_context_qualifiers)
Constructor.
std::unique_ptr< ParserVars > m_parser_vars
void InstallCodeGenerator(clang::ASTConsumer *code_gen)
bool m_ignore_context_qualifiers
If true, evaluates the expression without taking into account the CV-qualifiers of the scope.
virtual clang::NamedDecl * GetPersistentDecl(ConstString name)
Retrieves the declaration with the given name from the storage of persistent declarations.
The following values should not live beyond parsing.
ValueObjectProviderTy m_lldb_valobj_provider
Callback that provides a ValueObject for the specified frame.
const lldb_private::Symbol * m_lldb_sym
The original symbol for this variable, if it was a symbol.
lldb_private::Value m_lldb_value
The value found in LLDB for this variable.
lldb::VariableSP m_lldb_var
The original variable for this variable.
llvm::Value * m_llvm_value
The IR value corresponding to this variable; usually a GlobalValue.
const clang::NamedDecl * m_named_decl
The Decl corresponding to this variable.
"lldb/Expression/ClangExpressionVariable.h" Encapsulates one variable for the expression parser.
static ClangExpressionVariable * FindVariableInList(ExpressionVariableList &list, const clang::NamedDecl *decl, uint64_t parser_id)
Utility functions for dealing with ExpressionVariableLists in Clang- specific ways.
ParserVars * GetParserVars(uint64_t parser_id)
Access parser-specific variables.
void EnableJITVars(uint64_t parser_id)
Make this variable usable for materializing for the JIT by allocating space for JIT-specific variable...
void EnableParserVars(uint64_t parser_id)
Make this variable usable by the parser by allocating space for parser- specific variables.
lldb::LanguageType GetLanguage()
Represents a generic declaration context in a program.
std::vector< CompilerDecl > FindDeclByName(ConstString name, const bool ignore_using_decls)
bool IsClassMethod()
Checks if this decl context represents a method of a class.
Represents a generic declaration such as a function declaration.
Generic representation of a type in a programming language.
TypeSystemSPWrapper GetTypeSystem() const
Accessors.
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
lldb::opaque_compiler_type_t GetOpaqueQualType() const
CompilerType GetLValueReferenceType() const
Return a new CompilerType that is a L value reference to this type if this type is valid and the type...
bool IsReferenceType(CompilerType *pointee_type=nullptr, bool *is_rvalue=nullptr) const
unsigned GetTypeQualifiers() const
CompilerType GetPointeeType() const
If this type is a pointer type, return the type that the pointer points to, else return an invalid ty...
bool GetCompleteType() const
Type Completion.
A uniqued constant string class.
Definition ConstString.h:40
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
"lldb/Expression/DWARFExpressionList.h" Encapsulates a range map from file address range to a single ...
bool GetExpressionData(DataExtractor &data, lldb::addr_t func_load_addr=LLDB_INVALID_ADDRESS, lldb::addr_t file_addr=0) const
Get the expression data at the file address.
An data extractor class.
virtual uint64_t GetByteSize() const
Get the number of bytes contained in this object.
const uint8_t * GetDataStart() const
Get the data start pointer.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
ExecutionContextScope * GetBestExecutionContextScope() const
const lldb::TargetSP & GetTargetSP() const
Get accessor to get the target shared pointer.
StackFrame * GetFramePtr() const
Returns a pointer to the frame object.
Target * GetTargetPtr() const
Returns a pointer to the target object.
Process * GetProcessPtr() const
Returns a pointer to the process object.
Thread * GetThreadPtr() const
Returns a pointer to the thread object.
void ClearDirectory()
Clear the directory in this object.
Definition FileSpec.cpp:367
A class that describes a function.
Definition Function.h:400
const Address & GetAddress() const
Return the address of the function (its entry point).
Definition Function.h:453
ConstString GetName() const
Definition Function.cpp:709
const Mangled & GetMangled() const
Definition Function.h:534
void DumpSymbolContext(Stream *s) override
Dump the object's symbol context to the stream s.
Definition Function.cpp:503
Type * GetType()
Get accessor for the type that describes the function return value type, and parameter types.
Definition Function.cpp:551
CompilerDeclContext GetDeclContext()
Get the DeclContext for this function, if available.
Definition Function.cpp:537
CompileUnit * GetCompileUnit()
Get accessor for the compile unit that owns this function.
Definition Function.cpp:398
virtual lldb::addr_t LookupRuntimeSymbol(ConstString name)
static bool LanguageIsC(lldb::LanguageType language)
Definition Language.cpp:367
static bool LanguageIsCPlusPlus(lldb::LanguageType language)
Definition Language.cpp:342
static bool LanguageIsObjC(lldb::LanguageType language)
Definition Language.cpp:357
static bool IsMangledName(llvm::StringRef name)
Definition Mangled.cpp:39
ConstString GetMangledName() const
Mangled name get accessor.
Definition Mangled.h:152
void FindFunctions(ConstString name, lldb::FunctionNameType name_type_mask, const ModuleFunctionSearchOptions &options, SymbolContextList &sc_list) const
void FindGlobalVariables(ConstString name, size_t max_matches, VariableList &variable_list) const
Find global and static variables by name.
lldb::ModuleSP FindFirstModule(const ModuleSpec &module_spec) const
Finds the first module whose file specification matches module_spec.
void FindSymbolsWithNameAndType(ConstString name, lldb::SymbolType symbol_type, SymbolContextList &sc_list) const
FileSpec & GetPlatformFileSpec()
Definition ModuleSpec.h:69
A class that describes an executable image and its associated object and symbol files.
Definition Module.h:90
static ObjCLanguageRuntime * Get(Process &process)
A plug-in interface definition class for debugging a process.
Definition Process.h:354
lldb::ByteOrder GetByteOrder() const
Definition Process.cpp:3716
uint32_t GetAddressByteSize() const
Definition Process.cpp:3720
unsigned long long ULongLong(unsigned long long fail_value=0) const
Definition Scalar.cpp:365
static lldb::TypeSystemClangSP GetForTarget(Target &target, std::optional< IsolatedASTKind > ast_kind=DefaultAST, bool create_on_demand=true)
Returns the scratch TypeSystemClang for the given target.
This base class provides an interface to stack frames.
Definition StackFrame.h:44
virtual VariableList * GetVariableList(bool get_file_globals, Status *error_ptr)
Retrieve the list of variables whose scope either:
virtual lldb::VariableListSP GetInScopeVariableList(bool get_file_globals, bool must_have_valid_location=false)
Retrieve the list of variables that are in scope at this StackFrame's pc.
virtual const SymbolContext & GetSymbolContext(lldb::SymbolContextItem resolve_scope)
Provide a SymbolContext for this StackFrame's current pc value.
virtual lldb::ValueObjectSP FindVariable(ConstString name)
Attempt to reconstruct the ValueObject for a variable with a given name from within the current Stack...
An error handling class.
Definition Status.h:118
bool Fail() const
Test for error condition.
Definition Status.cpp:293
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
Definition Status.cpp:194
bool Success() const
Test for success condition.
Definition Status.cpp:303
const char * GetData() const
Defines a list of symbol context objects.
uint32_t GetSize() const
Get accessor for a symbol context list size.
void Append(const SymbolContext &sc)
Append a new symbol context to the list.
Defines a symbol context baton that can be handed other debug core functions.
Block * GetFunctionBlock()
Find a block that defines the function represented by this symbol context.
Block * block
The Block for a given query.
lldb::ModuleSP module_sp
The Module for a given query.
bool IsExternal() const
Definition Symbol.h:197
bool IsIndirect() const
Definition Symbol.cpp:223
lldb::SymbolType GetType() const
Definition Symbol.h:169
Address GetAddress() const
Definition Symbol.h:89
Symbol * ResolveReExportedSymbol(Target &target) const
Definition Symbol.cpp:483
PersistentExpressionState * GetPersistentExpressionStateForLanguage(lldb::LanguageType language)
Definition Target.cpp:2681
const ModuleList & GetImages() const
Get accessor for the images for this process.
Definition Target.h:1140
const ArchSpec & GetArchitecture() const
Definition Target.h:1182
virtual lldb::StackFrameSP GetStackFrameAtIndex(uint32_t idx)
Definition Thread.h:434
A TypeSystem implementation based on Clang.
static clang::CXXMethodDecl * DeclContextGetAsCXXMethodDecl(const CompilerDeclContext &dc)
uint32_t CountDeclLevels(clang::DeclContext *frame_decl_ctx, clang::DeclContext *child_decl_ctx, ConstString *child_name=nullptr, CompilerType *child_type=nullptr)
static clang::ObjCMethodDecl * DeclContextGetAsObjCMethodDecl(const CompilerDeclContext &dc)
static bool IsObjCClassType(const CompilerType &type)
clang::ASTContext & getASTContext() const
Returns the clang::ASTContext instance managed by this TypeSystemClang.
static bool IsObjCObjectPointerType(const CompilerType &type, CompilerType *target_type=nullptr)
Interface for representing a type system.
Definition TypeSystem.h:70
CompilerType GetForwardCompilerType()
Definition Type.cpp:782
ConstString GetName()
Definition Type.cpp:441
CompilerType GetFullCompilerType()
Definition Type.cpp:772
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, const lldb::VariableSP &var_sp)
const Scalar & GetScalar() const
See comment on m_scalar to understand what GetScalar returns.
Definition Value.h:113
@ HostAddress
A host address value (for memory in the process that < A is using liblldb).
Definition Value.h:52
@ FileAddress
A file address value.
Definition Value.h:47
@ LoadAddress
A load address value.
Definition Value.h:49
ValueType GetValueType() const
Definition Value.cpp:111
void SetCompilerType(const CompilerType &compiler_type)
Definition Value.cpp:276
void SetValueType(ValueType value_type)
Definition Value.h:89
ContextType GetContextType() const
Definition Value.h:87
lldb::VariableSP GetVariableAtIndex(size_t idx) const
lldb::VariableSP FindVariable(ConstString name, bool include_static_members=true)
#define LLDB_INVALID_ADDRESS
#define UINT32_MAX
lldb::ValueObjectSP GetLambdaValueObject(StackFrame *frame)
Returns a ValueObject for the lambda class in the current frame.
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
Definition Log.h:332
std::function< lldb::ValueObjectSP(ConstString, StackFrame *)> ValueObjectProviderTy
Functor that returns a ValueObjectSP for a variable given its name and the StackFrame of interest.
TaggedASTType< 0 > TypeFromParser
TaggedASTType< 1 > TypeFromUser
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::ExpressionVariable > ExpressionVariableSP
uint64_t offset_t
Definition lldb-types.h:85
@ eLanguageTypeC
Non-standardized C, such as K&R.
SymbolType
Symbol types.
@ eSymbolTypeUndefined
@ eSymbolTypeVariableType
@ eSymbolTypeObjCMetaClass
@ eSymbolTypeReExported
@ eSymbolTypeObjCClass
@ eSymbolTypeObjectFile
@ eSymbolTypeTrampoline
@ eSymbolTypeResolver
@ eSymbolTypeSourceFile
@ eSymbolTypeException
@ eSymbolTypeVariable
@ eSymbolTypeAbsolute
@ eSymbolTypeAdditional
When symbols take more than one entry, the extra entries get this type.
@ eSymbolTypeInstrumentation
@ eSymbolTypeHeaderFile
@ eSymbolTypeCommonBlock
@ eSymbolTypeCompiler
@ eSymbolTypeLineHeader
@ eSymbolTypeObjCIVar
@ eSymbolTypeLineEntry
@ eSymbolTypeScopeBegin
@ eSymbolTypeScopeEnd
std::shared_ptr< lldb_private::VariableList > VariableListSP
std::shared_ptr< lldb_private::Variable > VariableSP
uint64_t addr_t
Definition lldb-types.h:80
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::Module > ModuleSP
The following values are valid if the variable is used by JIT code.
size_t m_size
The space required for the variable, in bytes.
lldb::offset_t m_alignment
The required alignment of the variable, in bytes.
lldb::offset_t m_offset
The offset of the variable in the struct, in bytes.
static clang::QualType GetQualType(const CompilerType &ct)
Definition ClangUtil.cpp:36
static std::string ToString(const clang::Type *t)
Returns a textual representation of the given type.
Definition ClangUtil.cpp:80
static std::string DumpDecl(const clang::Decl *d)
Returns a textual representation of the given Decl's AST.
Definition ClangUtil.cpp:68
static clang::Decl * GetDecl(const CompilerDecl &decl)
Returns the clang::Decl of the given CompilerDecl.
Definition ClangUtil.cpp:31
Options used by Module::FindFunctions.
Definition Module.h:66
bool include_inlines
Include inlined functions.
Definition Module.h:70
bool include_symbols
Include the symbol table.
Definition Module.h:68
clang::NamedDecl * AddTypeDecl(const CompilerType &compiler_type)
Create a TypeDecl with the name being searched for and the provided type and register it in the right...
const clang::DeclarationName m_decl_name
The name being looked for.
clang::NamedDecl * AddFunDecl(const CompilerType &type, bool extern_c=false)
Create a FunDecl with the name being searched for and the provided type and register it in the right ...
clang::NamedDecl * AddGenericFunDecl()
Create a FunDecl with the name being searched for and generic type (i.e.
const clang::DeclContext * m_decl_context
The DeclContext to put declarations into.
void AddNamedDecl(clang::NamedDecl *decl)
Add a NamedDecl to the list of results.
clang::NamedDecl * AddVarDecl(const CompilerType &type)
Create a VarDecl with the name being searched for and the provided type and register it in the right ...
Every register is described in detail including its name, alternate name (optional),...
lldb::Encoding encoding
Encoding of the register bits.
uint32_t byte_size
Size in bytes of the register.
const char * name
Name of this register, can't be NULL.
lldb::user_id_t GetID() const
Get accessor for the user ID.
Definition UserID.h:47