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
708 LLDB_LOGV(log, " CEDM::FEVD Inspecting (NamespaceMap*){0:x} ({1} entries)",
709 namespace_map.get(), namespace_map->size());
710
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());
714
715 FindExternalVisibleDecls(context, n.first, n.second);
716 }
717 } else if (isa<TranslationUnitDecl>(context.m_decl_context)) {
718 CompilerDeclContext namespace_decl;
719
720 LLDB_LOG(log, " CEDM::FEVD Searching the root namespace");
721
722 FindExternalVisibleDecls(context, lldb::ModuleSP(), namespace_decl);
723 }
724
726}
727
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);
733 }
734}
735
737 if (!m_parser_vars)
738 return nullptr;
739 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
740 if (!target)
741 return nullptr;
742
744
745 if (!m_parser_vars->m_persistent_vars)
746 return nullptr;
747 return m_parser_vars->m_persistent_vars->GetPersistentDecl(name);
748}
749
751 const ConstString name) {
753
754 NamedDecl *persistent_decl = GetPersistentDecl(name);
755
756 if (!persistent_decl)
757 return;
758
759 Decl *parser_persistent_decl = CopyDecl(persistent_decl);
760
761 if (!parser_persistent_decl)
762 return;
763
764 NamedDecl *parser_named_decl = dyn_cast<NamedDecl>(parser_persistent_decl);
765
766 if (!parser_named_decl)
767 return;
768
769 if (clang::FunctionDecl *parser_function_decl =
770 llvm::dyn_cast<clang::FunctionDecl>(parser_named_decl)) {
771 MaybeRegisterFunctionBody(parser_function_decl);
772 }
773
774 LLDB_LOG(log, " CEDM::FEVD Found persistent decl {0}", name);
775
776 context.AddNamedDecl(parser_named_decl);
777}
778
781
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);
787
788 // FIXME: Currently m_ctx_obj is only used through
789 // SBValue::EvaluateExpression. Can we instead *always* use m_ctx_obj
790 // regardless of which EvaluateExpression path we go through? Then we wouldn't
791 // need two separate code-paths here.
792 if (m_ctx_obj) {
793 Status status;
794 lldb::ValueObjectSP ctx_obj_ptr = m_ctx_obj->AddressOf(status);
795 if (!ctx_obj_ptr || status.Fail())
796 return;
797
798 AddContextClassType(context, TypeFromUser(m_ctx_obj->GetCompilerType()));
799 return;
800 }
801
802 // Clang is looking for the type of "this"
803
804 if (frame == nullptr)
805 return;
806
807 // Find the block that defines the function represented by "sym_ctx"
808 Block *function_block = sym_ctx.GetFunctionBlock();
809
810 if (!function_block)
811 return;
812
813 CompilerDeclContext function_decl_ctx = function_block->GetDeclContext();
814
815 if (!function_decl_ctx)
816 return;
817
818 clang::CXXMethodDecl *method_decl =
820
821 if (method_decl) {
822 if (auto capturedThis = GetCapturedThisValueObject(frame)) {
823 // We're inside a lambda and we captured a 'this'.
824 // Import the outer class's AST instead of the
825 // (unnamed) lambda structure AST so unqualified
826 // member lookups are understood by the Clang parser.
827 //
828 // If we're in a lambda which didn't capture 'this',
829 // $__lldb_class will correspond to the lambda closure
830 // AST and references to captures will resolve like
831 // regular member varaiable accesses do.
832 TypeFromUser pointee_type =
833 capturedThis->GetCompilerType().GetPointeeType();
834
835 LLDB_LOG(log,
836 " CEDM::FEVD Adding captured type ({0} for"
837 " $__lldb_class: {1}",
838 capturedThis->GetTypeName(), capturedThis->GetName());
839
840 AddContextClassType(context, pointee_type);
841 return;
842 }
843
844 clang::CXXRecordDecl *class_decl = method_decl->getParent();
845
846 QualType class_qual_type = m_ast_context->getCanonicalTagType(class_decl);
847
848 // The synthesized __lldb_expr will adopt the qualifiers from this class
849 // type. Make sure we use the qualifiers of the method that we're currently
850 // stopped in.
851 class_qual_type.addFastQualifiers(
852 method_decl->getMethodQualifiers().getFastQualifiers());
853
854 TypeFromUser class_user_type(
855 class_qual_type.getAsOpaquePtr(),
856 function_decl_ctx.GetTypeSystem()->weak_from_this());
857
858 LLDB_LOG(log, " CEDM::FEVD Adding type for $__lldb_class: {0}",
859 class_qual_type.getAsString());
860
861 AddContextClassType(context, class_user_type);
862 return;
863 }
864
865 // FIXME: this code is supposed to handl cases where a function decl
866 // was not attached to a class scope but its DIE had a `DW_AT_object_pointer`
867 // (and thus has a local `this` variable). This isn't a tested flow and
868 // even -flimit-debug-info doesn't seem to generate DWARF like that, so
869 // we should get rid of this code-path. An alternative fix if we ever
870 // encounter such DWARF is for the TypeSystem to attach the function
871 // to some valid class context (we can derive the type of the context
872 // through the `this` pointer anyway.
873 //
874 // The actual reason we can't remove this code is that LLDB currently
875 // creates decls for function templates by attaching them to the TU instead
876 // of a class context. So we can actually have template methods scoped
877 // outside of a class. Once we fix that, we can remove this code-path.
878
879 VariableList *vars = frame->GetVariableList(false, nullptr);
880
881 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
882
883 if (this_var && this_var->IsInScope(frame) &&
884 this_var->LocationIsValidForFrame(frame)) {
885 Type *this_type = this_var->GetType();
886
887 if (!this_type)
888 return;
889
890 TypeFromUser pointee_type =
892
893 LLDB_LOG(log, " FEVD Adding type for $__lldb_class: {0}",
894 ClangUtil::GetQualType(pointee_type).getAsString());
895
896 AddContextClassType(context, pointee_type);
897 }
898}
899
902
903 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
904
905 if (m_ctx_obj) {
906 Status status;
907 lldb::ValueObjectSP ctx_obj_ptr = m_ctx_obj->AddressOf(status);
908 if (!ctx_obj_ptr || status.Fail())
909 return;
910
911 AddOneType(context, TypeFromUser(m_ctx_obj->GetCompilerType()));
912 return;
913 }
914
915 // Clang is looking for the type of "*self"
916
917 if (!frame)
918 return;
919
920 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction |
921 lldb::eSymbolContextBlock);
922
923 // Find the block that defines the function represented by "sym_ctx"
924 Block *function_block = sym_ctx.GetFunctionBlock();
925
926 if (!function_block)
927 return;
928
929 CompilerDeclContext function_decl_ctx = function_block->GetDeclContext();
930
931 if (!function_decl_ctx)
932 return;
933
934 clang::ObjCMethodDecl *method_decl =
936
937 if (method_decl) {
938 ObjCInterfaceDecl *self_interface = method_decl->getClassInterface();
939
940 if (!self_interface)
941 return;
942
943 const clang::Type *interface_type = self_interface->getTypeForDecl();
944
945 if (!interface_type)
946 return; // This is unlikely, but we have seen crashes where this
947 // occurred
948
949 TypeFromUser class_user_type(
950 QualType(interface_type, 0).getAsOpaquePtr(),
951 function_decl_ctx.GetTypeSystem()->weak_from_this());
952
953 LLDB_LOG(log, " FEVD Adding type for $__lldb_objc_class: {0}",
954 ClangUtil::ToString(interface_type));
955
956 AddOneType(context, class_user_type);
957 return;
958 }
959 // This branch will get hit if we are executing code in the context of
960 // a function that claims to have an object pointer (through
961 // DW_AT_object_pointer?) but is not formally a method of the class.
962 // In that case, just look up the "self" variable in the current scope
963 // and use its type.
964
965 VariableList *vars = frame->GetVariableList(false, nullptr);
966
967 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
968
969 if (!self_var)
970 return;
971 if (!self_var->IsInScope(frame))
972 return;
973 if (!self_var->LocationIsValidForFrame(frame))
974 return;
975
976 Type *self_type = self_var->GetType();
977
978 if (!self_type)
979 return;
980
981 CompilerType self_clang_type = self_type->GetFullCompilerType();
982
983 if (TypeSystemClang::IsObjCClassType(self_clang_type)) {
984 return;
985 }
986 if (!TypeSystemClang::IsObjCObjectPointerType(self_clang_type))
987 return;
988 self_clang_type = self_clang_type.GetPointeeType();
989
990 if (!self_clang_type)
991 return;
992
993 LLDB_LOG(log, " FEVD Adding type for $__lldb_objc_class: {0}",
995
996 TypeFromUser class_user_type(self_clang_type);
997
998 AddOneType(context, class_user_type);
999}
1000
1002 SymbolContext &sym_ctx, NameSearchContext &name_context) {
1003 if (sym_ctx.block == nullptr)
1004 return;
1005
1006 CompilerDeclContext frame_decl_context = sym_ctx.block->GetDeclContext();
1007 if (!frame_decl_context)
1008 return;
1009
1010 TypeSystemClang *frame_ast = llvm::dyn_cast_or_null<TypeSystemClang>(
1011 frame_decl_context.GetTypeSystem());
1012 if (!frame_ast)
1013 return;
1014
1015 clang::NamespaceDecl *namespace_decl =
1016 m_clang_ast_context->GetUniqueNamespaceDeclaration(
1018 if (!namespace_decl)
1019 return;
1020
1021 name_context.AddNamedDecl(namespace_decl);
1022 clang::DeclContext *ctxt = clang::Decl::castToDeclContext(namespace_decl);
1023 ctxt->setHasExternalVisibleStorage(true);
1024 name_context.m_found_local_vars_nsp = true;
1025}
1026
1028 NameSearchContext &context, ConstString name) {
1030
1031 if (!m_target)
1032 return;
1033
1034 std::shared_ptr<ClangModulesDeclVendor> modules_decl_vendor =
1036 if (!modules_decl_vendor)
1037 return;
1038
1039 bool append = false;
1040 uint32_t max_matches = 1;
1041 std::vector<CompilerDecl> decls;
1042
1043 if (!modules_decl_vendor->FindDecls(name, append, max_matches, decls))
1044 return;
1045
1046 assert(!decls.empty() && "FindDecls returned true but no decls?");
1047 auto *const decl_from_modules =
1048 llvm::cast<NamedDecl>(ClangUtil::GetDecl(decls[0]));
1049
1050 LLDB_LOG(log,
1051 " CAS::FEVD Matching decl found for "
1052 "\"{0}\" in the modules",
1053 name);
1054
1055 clang::Decl *copied_decl = CopyDecl(decl_from_modules);
1056 if (!copied_decl) {
1057 LLDB_LOG(log, " CAS::FEVD - Couldn't export a "
1058 "declaration from the modules");
1059 return;
1060 }
1061
1062 if (auto copied_function = dyn_cast<clang::FunctionDecl>(copied_decl)) {
1063 MaybeRegisterFunctionBody(copied_function);
1064
1065 context.AddNamedDecl(copied_function);
1066 } else if (auto copied_var = dyn_cast<clang::VarDecl>(copied_decl)) {
1067 context.AddNamedDecl(copied_var);
1068 context.m_found_variable = true;
1069 }
1070}
1071
1073 NameSearchContext &context, ConstString name, SymbolContext &sym_ctx,
1074 const CompilerDeclContext &namespace_decl) {
1075 if (sym_ctx.block == nullptr)
1076 return false;
1077
1078 CompilerDeclContext decl_context = sym_ctx.block->GetDeclContext();
1079 if (!decl_context)
1080 return false;
1081
1082 // Make sure that the variables are parsed so that we have the
1083 // declarations.
1084 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1085 VariableListSP vars = frame->GetInScopeVariableList(true);
1086 for (size_t i = 0; i < vars->GetSize(); i++)
1087 vars->GetVariableAtIndex(i)->GetDecl();
1088
1089 // Search for declarations matching the name. Do not include imported
1090 // decls in the search if we are looking for decls in the artificial
1091 // namespace $__lldb_local_vars.
1092 std::vector<CompilerDecl> found_decls =
1093 decl_context.FindDeclByName(name, namespace_decl.IsValid());
1094
1095 VariableSP var;
1096 bool variable_found = false;
1097 for (CompilerDecl decl : found_decls) {
1098 for (size_t vi = 0, ve = vars->GetSize(); vi != ve; ++vi) {
1099 VariableSP candidate_var = vars->GetVariableAtIndex(vi);
1100 if (candidate_var->GetDecl() == decl) {
1101 var = candidate_var;
1102 break;
1103 }
1104 }
1105
1106 if (var && !variable_found) {
1107 variable_found = true;
1108 ValueObjectSP valobj = ValueObjectVariable::Create(frame, var);
1109 AddOneVariable(context, var, valobj);
1110 context.m_found_variable = true;
1111 }
1112 }
1113
1114 // We're in a local_var_lookup but haven't found any local variables
1115 // so far. When performing a variable lookup from within the context of
1116 // a lambda, we count the lambda captures as local variables. Thus,
1117 // see if we captured any variables with the requested 'name'.
1118 if (!variable_found) {
1119 auto find_capture = [](ConstString varname,
1120 StackFrame *frame) -> ValueObjectSP {
1121 if (auto lambda = ClangExpressionUtil::GetLambdaValueObject(frame)) {
1122 if (auto capture = lambda->GetChildMemberWithName(varname)) {
1123 return capture;
1124 }
1125 }
1126
1127 return nullptr;
1128 };
1129
1130 if (auto capture = find_capture(name, frame)) {
1131 variable_found = true;
1132 context.m_found_variable = true;
1133 AddOneVariable(context, std::move(capture), std::move(find_capture));
1134 }
1135 }
1136
1137 return variable_found;
1138}
1139
1140/// Structure to hold the info needed when comparing function
1141/// declarations.
1142namespace {
1143struct FuncDeclInfo {
1144 ConstString m_name;
1145 CompilerType m_copied_type;
1146 uint32_t m_decl_lvl;
1147 SymbolContext m_sym_ctx;
1148};
1149} // namespace
1150
1152 const SymbolContextList &sc_list,
1153 const CompilerDeclContext &frame_decl_context) {
1154 // First, symplify things by looping through the symbol contexts to
1155 // remove unwanted functions and separate out the functions we want to
1156 // compare and prune into a separate list. Cache the info needed about
1157 // the function declarations in a vector for efficiency.
1158 SymbolContextList sc_sym_list;
1159 std::vector<FuncDeclInfo> decl_infos;
1160 decl_infos.reserve(sc_list.GetSize());
1161 clang::DeclContext *frame_decl_ctx =
1162 (clang::DeclContext *)frame_decl_context.GetOpaqueDeclContext();
1163 TypeSystemClang *ast = llvm::dyn_cast_or_null<TypeSystemClang>(
1164 frame_decl_context.GetTypeSystem());
1165
1166 for (const SymbolContext &sym_ctx : sc_list) {
1167 FuncDeclInfo fdi;
1168
1169 // We don't know enough about symbols to compare them, but we should
1170 // keep them in the list.
1171 Function *function = sym_ctx.function;
1172 if (!function) {
1173 sc_sym_list.Append(sym_ctx);
1174 continue;
1175 }
1176 // Filter out functions without declaration contexts, as well as
1177 // class/instance methods, since they'll be skipped in the code that
1178 // follows anyway.
1179 CompilerDeclContext func_decl_context = function->GetDeclContext();
1180 if (!func_decl_context || func_decl_context.IsClassMethod())
1181 continue;
1182 // We can only prune functions for which we can copy the type.
1183 CompilerType func_clang_type = function->GetType()->GetFullCompilerType();
1184 CompilerType copied_func_type = GuardedCopyType(func_clang_type);
1185 if (!copied_func_type) {
1186 sc_sym_list.Append(sym_ctx);
1187 continue;
1188 }
1189
1190 fdi.m_sym_ctx = sym_ctx;
1191 fdi.m_name = function->GetName();
1192 fdi.m_copied_type = copied_func_type;
1193 fdi.m_decl_lvl = LLDB_INVALID_DECL_LEVEL;
1194 if (fdi.m_copied_type && func_decl_context) {
1195 // Call CountDeclLevels to get the number of parent scopes we have
1196 // to look through before we find the function declaration. When
1197 // comparing functions of the same type, the one with a lower count
1198 // will be closer to us in the lookup scope and shadows the other.
1199 clang::DeclContext *func_decl_ctx =
1200 (clang::DeclContext *)func_decl_context.GetOpaqueDeclContext();
1201 fdi.m_decl_lvl = ast->CountDeclLevels(frame_decl_ctx, func_decl_ctx,
1202 &fdi.m_name, &fdi.m_copied_type);
1203 }
1204 decl_infos.emplace_back(fdi);
1205 }
1206
1207 // Loop through the functions in our cache looking for matching types,
1208 // then compare their scope levels to see which is closer.
1209 std::multimap<CompilerType, const FuncDeclInfo *> matches;
1210 for (const FuncDeclInfo &fdi : decl_infos) {
1211 const CompilerType t = fdi.m_copied_type;
1212 auto q = matches.find(t);
1213 if (q != matches.end()) {
1214 if (q->second->m_decl_lvl > fdi.m_decl_lvl)
1215 // This function is closer; remove the old set.
1216 matches.erase(t);
1217 else if (q->second->m_decl_lvl < fdi.m_decl_lvl)
1218 // The functions in our set are closer - skip this one.
1219 continue;
1220 }
1221 matches.insert(std::make_pair(t, &fdi));
1222 }
1223
1224 // Loop through our matches and add their symbol contexts to our list.
1225 SymbolContextList sc_func_list;
1226 for (const auto &q : matches)
1227 sc_func_list.Append(q.second->m_sym_ctx);
1228
1229 // Rejoin the lists with the functions in front.
1230 sc_func_list.Append(sc_sym_list);
1231 return sc_func_list;
1232}
1233
1235 NameSearchContext &context, lldb::ModuleSP module_sp, ConstString name,
1236 const CompilerDeclContext &namespace_decl) {
1237 if (!m_parser_vars)
1238 return false;
1239
1240 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1241
1242 std::vector<CompilerDecl> decls_from_modules;
1243
1244 if (target) {
1245 if (std::shared_ptr<ClangModulesDeclVendor> decl_vendor =
1247 decl_vendor->FindDecls(name, false, UINT32_MAX, decls_from_modules);
1248 }
1249 }
1250
1251 SymbolContextList sc_list;
1252 if (namespace_decl && module_sp) {
1253 ModuleFunctionSearchOptions function_options;
1254 function_options.include_inlines = false;
1255 function_options.include_symbols = false;
1256
1257 module_sp->FindFunctions(name, namespace_decl, eFunctionNameTypeBase,
1258 function_options, sc_list);
1259 } else if (target && !namespace_decl) {
1260 ModuleFunctionSearchOptions function_options;
1261 function_options.include_inlines = false;
1262 function_options.include_symbols = true;
1263
1264 // TODO Fix FindFunctions so that it doesn't return
1265 // instance methods for eFunctionNameTypeBase.
1266
1267 target->GetImages().FindFunctions(
1268 name, eFunctionNameTypeFull | eFunctionNameTypeBase, function_options,
1269 sc_list);
1270 }
1271
1272 // If we found more than one function, see if we can use the frame's decl
1273 // context to remove functions that are shadowed by other functions which
1274 // match in type but are nearer in scope.
1275 //
1276 // AddOneFunction will not add a function whose type has already been
1277 // added, so if there's another function in the list with a matching type,
1278 // check to see if their decl context is a parent of the current frame's or
1279 // was imported via a and using statement, and pick the best match
1280 // according to lookup rules.
1281 if (sc_list.GetSize() > 1) {
1282 // Collect some info about our frame's context.
1283 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1284 SymbolContext frame_sym_ctx;
1285 if (frame != nullptr)
1286 frame_sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction |
1287 lldb::eSymbolContextBlock);
1288 CompilerDeclContext frame_decl_context =
1289 frame_sym_ctx.block != nullptr ? frame_sym_ctx.block->GetDeclContext()
1291
1292 // We can't do this without a compiler decl context for our frame.
1293 if (frame_decl_context) {
1294 sc_list = SearchFunctionsInSymbolContexts(sc_list, frame_decl_context);
1295 }
1296 }
1297
1298 bool found_function_with_type_info = false;
1299
1300 if (sc_list.GetSize()) {
1301 const Symbol *extern_symbol = nullptr;
1302 const Symbol *non_extern_symbol = nullptr;
1303
1304 for (const SymbolContext &sym_ctx : sc_list) {
1305 if (sym_ctx.function) {
1306 CompilerDeclContext decl_ctx = sym_ctx.function->GetDeclContext();
1307
1308 if (!decl_ctx)
1309 continue;
1310
1311 // Filter out class/instance methods.
1312 if (decl_ctx.IsClassMethod())
1313 continue;
1314
1315 AddOneFunction(context, sym_ctx.function, nullptr);
1316 found_function_with_type_info = true;
1317 } else if (sym_ctx.symbol) {
1318 const Symbol *symbol = sym_ctx.symbol;
1319 if (target && symbol->GetType() == eSymbolTypeReExported) {
1320 symbol = symbol->ResolveReExportedSymbol(*target);
1321 if (symbol == nullptr)
1322 continue;
1323 }
1324
1325 if (symbol->IsExternal())
1326 extern_symbol = symbol;
1327 else
1328 non_extern_symbol = symbol;
1329 }
1330 }
1331
1332 if (!found_function_with_type_info) {
1333 for (const CompilerDecl &compiler_decl : decls_from_modules) {
1334 clang::Decl *decl = ClangUtil::GetDecl(compiler_decl);
1335 if (llvm::isa<clang::FunctionDecl>(decl)) {
1336 clang::NamedDecl *copied_decl =
1337 llvm::cast_or_null<FunctionDecl>(CopyDecl(decl));
1338 if (copied_decl) {
1339 context.AddNamedDecl(copied_decl);
1340 found_function_with_type_info = true;
1341 }
1342 }
1343 }
1344 }
1345
1346 if (!found_function_with_type_info) {
1347 if (extern_symbol) {
1348 AddOneFunction(context, nullptr, extern_symbol);
1349 } else if (non_extern_symbol) {
1350 AddOneFunction(context, nullptr, non_extern_symbol);
1351 }
1352 }
1353 }
1354
1355 return found_function_with_type_info;
1356}
1357
1359 NameSearchContext &context, lldb::ModuleSP module_sp,
1360 const CompilerDeclContext &namespace_decl) {
1361 assert(m_ast_context);
1362
1364
1365 const ConstString name(context.m_decl_name.getAsString().c_str());
1366 if (IgnoreName(name, false))
1367 return;
1368
1369 // Only look for functions by name out in our symbols if the function doesn't
1370 // start with our phony prefix of '$'
1371
1372 Target *target = nullptr;
1373 StackFrame *frame = nullptr;
1374 SymbolContext sym_ctx;
1375 if (m_parser_vars) {
1376 target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1377 frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1378 }
1379 if (frame != nullptr)
1380 sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction |
1381 lldb::eSymbolContextBlock);
1382
1383 // Try the persistent decls, which take precedence over all else.
1384 if (!namespace_decl)
1385 SearchPersistenDecls(context, name);
1386
1387 if (name.GetStringRef().starts_with("$") && !namespace_decl) {
1388 if (name == "$__lldb_class") {
1389 LookUpLldbClass(context);
1390 return;
1391 }
1392
1393 if (name == "$__lldb_objc_class") {
1394 LookUpLldbObjCClass(context);
1395 return;
1396 }
1398 LookupLocalVarNamespace(sym_ctx, context);
1399 return;
1400 }
1401
1402 // any other $__lldb names should be weeded out now
1403 if (name.GetStringRef().starts_with("$__lldb"))
1404 return;
1405
1406 // No ParserVars means we can't do register or variable lookup.
1407 if (!m_parser_vars || !m_parser_vars->m_persistent_vars)
1408 return;
1409
1410 ExpressionVariableSP pvar_sp(
1411 m_parser_vars->m_persistent_vars->GetVariable(name));
1412
1413 if (pvar_sp) {
1414 AddOneVariable(context, pvar_sp);
1415 return;
1416 }
1417
1418 assert(name.GetStringRef().starts_with("$"));
1419 llvm::StringRef reg_name = name.GetStringRef().substr(1);
1420
1421 if (m_parser_vars->m_exe_ctx.GetRegisterContext()) {
1422 const RegisterInfo *reg_info(
1423 m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(
1424 reg_name));
1425
1426 if (reg_info) {
1427 LLDB_LOG(log, " CEDM::FEVD Found register {0}", reg_info->name);
1428
1429 AddOneRegister(context, reg_info);
1430 }
1431 }
1432 return;
1433 }
1434
1435 bool local_var_lookup = !namespace_decl || (namespace_decl.GetName() ==
1437 if (frame && local_var_lookup)
1438 if (LookupLocalVariable(context, name, sym_ctx, namespace_decl))
1439 return;
1440
1441 if (target) {
1442 ValueObjectSP valobj;
1443 VariableSP var;
1444 var = FindGlobalVariable(*target, module_sp, name, namespace_decl);
1445
1446 if (var) {
1447 valobj = ValueObjectVariable::Create(target, var);
1448 AddOneVariable(context, var, valobj);
1449 context.m_found_variable = true;
1450 return;
1451 }
1452 }
1453
1454 if (!LookupFunction(context, module_sp, name, namespace_decl))
1455 LookupInModulesDeclVendor(context, name);
1456
1457 if (target && !context.m_found_variable && !namespace_decl) {
1458 // We couldn't find a non-symbol variable for this. Now we'll hunt for a
1459 // generic data symbol, and -- if it is found -- treat it as a variable.
1460 Status error;
1461
1462 const Symbol *data_symbol =
1463 m_parser_vars->m_sym_ctx.FindBestGlobalDataSymbol(name, error);
1464
1465 if (!error.Success()) {
1466 const unsigned diag_id =
1467 m_ast_context->getDiagnostics().getCustomDiagID(
1468 clang::DiagnosticsEngine::Level::Error, "%0");
1469 m_ast_context->getDiagnostics().Report(diag_id) << error.AsCString();
1470 }
1471
1472 if (data_symbol) {
1473 std::string warning("got name from symbols: ");
1474 warning.append(name.AsCString());
1475 const unsigned diag_id =
1476 m_ast_context->getDiagnostics().getCustomDiagID(
1477 clang::DiagnosticsEngine::Level::Warning, "%0");
1478 m_ast_context->getDiagnostics().Report(diag_id) << warning.c_str();
1479 AddOneGenericVariable(context, *data_symbol);
1480 context.m_found_variable = true;
1481 }
1482 }
1483}
1484
1486 lldb_private::Value &var_location,
1487 TypeFromUser *user_type,
1488 TypeFromParser *parser_type) {
1490
1491 Type *var_type = var->GetType();
1492
1493 if (!var_type) {
1494 LLDB_LOG(log, "Skipped a definition because it has no type");
1495 return false;
1496 }
1497
1498 CompilerType var_clang_type = var_type->GetFullCompilerType();
1499
1500 if (!var_clang_type) {
1501 LLDB_LOG(log, "Skipped a definition because it has no Clang type");
1502 return false;
1503 }
1504
1505 auto clang_ast =
1507
1508 if (!clang_ast) {
1509 LLDB_LOG(log, "Skipped a definition because it has no Clang AST");
1510 return false;
1511 }
1512
1513 DWARFExpressionList &var_location_list = var->LocationExpressionList();
1514
1515 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1516 Status err;
1517
1518 if (var->GetLocationIsConstantValueData()) {
1519 DataExtractor const_value_extractor;
1520 if (var_location_list.GetExpressionData(const_value_extractor)) {
1521 var_location = Value(const_value_extractor.GetDataStart(),
1522 const_value_extractor.GetByteSize());
1524 } else {
1525 LLDB_LOG(log, "Error evaluating constant variable: {0}", err.AsCString());
1526 return false;
1527 }
1528 }
1529
1530 CompilerType type_to_use = GuardedCopyType(var_clang_type);
1531
1532 if (!type_to_use) {
1533 LLDB_LOG(log,
1534 "Couldn't copy a variable's type into the parser's AST context");
1535
1536 return false;
1537 }
1538
1539 if (parser_type)
1540 *parser_type = TypeFromParser(type_to_use);
1541
1542 if (var_location.GetContextType() == Value::ContextType::Invalid)
1543 var_location.SetCompilerType(type_to_use);
1544
1545 if (var_location.GetValueType() == Value::ValueType::FileAddress) {
1546 SymbolContext var_sc;
1547 var->CalculateSymbolContext(&var_sc);
1548
1549 if (!var_sc.module_sp)
1550 return false;
1551
1552 Address so_addr(var_location.GetScalar().ULongLong(),
1553 var_sc.module_sp->GetSectionList());
1554
1555 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
1556
1557 if (load_addr != LLDB_INVALID_ADDRESS) {
1558 var_location.GetScalar() = load_addr;
1560 }
1561 }
1562
1563 if (user_type)
1564 *user_type = TypeFromUser(var_clang_type);
1565
1566 return true;
1567}
1568
1571 TypeFromParser const &pt,
1572 ValueObjectSP valobj) {
1573 clang::QualType parser_opaque_type =
1574 QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
1575
1576 if (parser_opaque_type.isNull())
1577 return nullptr;
1578
1579 if (const clang::Type *parser_type = parser_opaque_type.getTypePtr()) {
1580 if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
1581 CompleteType(tag_type->getDecl()->getDefinitionOrSelf());
1582 if (const ObjCObjectPointerType *objc_object_ptr_type =
1583 dyn_cast<ObjCObjectPointerType>(parser_type))
1584 CompleteType(objc_object_ptr_type->getInterfaceDecl());
1585 }
1586
1587 bool is_reference = pt.IsReferenceType();
1588
1589 NamedDecl *var_decl = nullptr;
1590 if (is_reference)
1591 var_decl = context.AddVarDecl(pt);
1592 else
1593 var_decl = context.AddVarDecl(pt.GetLValueReferenceType());
1594
1595 std::string decl_name(context.m_decl_name.getAsString());
1596 ConstString entity_name(decl_name.c_str());
1598 m_found_entities.AddNewlyConstructedVariable(entity);
1599
1600 assert(entity);
1601 entity->EnableParserVars(GetParserID());
1603 entity->GetParserVars(GetParserID());
1604
1605 parser_vars->m_named_decl = var_decl;
1606
1607 if (is_reference)
1608 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
1609
1610 return parser_vars;
1611}
1612
1614 NameSearchContext &context, ValueObjectSP valobj,
1615 ValueObjectProviderTy valobj_provider) {
1616 assert(m_parser_vars.get());
1617 assert(valobj);
1618
1620
1621 Value var_location = valobj->GetValue();
1622
1623 TypeFromUser user_type = valobj->GetCompilerType();
1624
1625 auto clang_ast = user_type.GetTypeSystem<TypeSystemClang>();
1626
1627 if (!clang_ast) {
1628 LLDB_LOG(log, "Skipped a definition because it has no Clang AST");
1629 return;
1630 }
1631
1632 TypeFromParser parser_type = GuardedCopyType(user_type);
1633
1634 if (!parser_type) {
1635 LLDB_LOG(log,
1636 "Couldn't copy a variable's type into the parser's AST context");
1637
1638 return;
1639 }
1640
1641 if (var_location.GetContextType() == Value::ContextType::Invalid)
1642 var_location.SetCompilerType(parser_type);
1643
1645 AddExpressionVariable(context, parser_type, valobj);
1646
1647 if (!parser_vars)
1648 return;
1649
1650 LLDB_LOG(log, " CEDM::FEVD Found variable {0}, returned\n{1} (original {2})",
1651 context.m_decl_name, ClangUtil::DumpDecl(parser_vars->m_named_decl),
1652 ClangUtil::ToString(user_type));
1653
1654 parser_vars->m_llvm_value = nullptr;
1655 parser_vars->m_lldb_value = std::move(var_location);
1656 parser_vars->m_lldb_valobj_provider = std::move(valobj_provider);
1657}
1658
1660 VariableSP var,
1661 ValueObjectSP valobj) {
1662 assert(m_parser_vars.get());
1663
1665
1666 TypeFromUser ut;
1667 TypeFromParser pt;
1668 Value var_location;
1669
1670 if (!GetVariableValue(var, var_location, &ut, &pt))
1671 return;
1672
1674 AddExpressionVariable(context, pt, std::move(valobj));
1675
1676 if (!parser_vars)
1677 return;
1678
1679 LLDB_LOG(log, " CEDM::FEVD Found variable {0}, returned\n{1} (original {2})",
1680 context.m_decl_name, ClangUtil::DumpDecl(parser_vars->m_named_decl),
1682
1683 parser_vars->m_llvm_value = nullptr;
1684 parser_vars->m_lldb_value = var_location;
1685 parser_vars->m_lldb_var = var;
1686}
1687
1689 ExpressionVariableSP &pvar_sp) {
1691
1692 TypeFromUser user_type(
1693 llvm::cast<ClangExpressionVariable>(pvar_sp.get())->GetTypeFromUser());
1694
1695 TypeFromParser parser_type(GuardedCopyType(user_type));
1696
1697 if (!parser_type.GetOpaqueQualType()) {
1698 LLDB_LOG(log, " CEDM::FEVD Couldn't import type for pvar {0}",
1699 pvar_sp->GetName());
1700 return;
1701 }
1702
1703 NamedDecl *var_decl =
1704 context.AddVarDecl(parser_type.GetLValueReferenceType());
1705
1706 llvm::cast<ClangExpressionVariable>(pvar_sp.get())
1707 ->EnableParserVars(GetParserID());
1709 llvm::cast<ClangExpressionVariable>(pvar_sp.get())
1710 ->GetParserVars(GetParserID());
1711 parser_vars->m_named_decl = var_decl;
1712 parser_vars->m_llvm_value = nullptr;
1713 parser_vars->m_lldb_value.Clear();
1714
1715 LLDB_LOG(log, " CEDM::FEVD Added pvar {0}, returned\n{1}",
1716 pvar_sp->GetName(), ClangUtil::DumpDecl(var_decl));
1717}
1718
1720 const Symbol &symbol) {
1721 assert(m_parser_vars.get());
1722
1724
1725 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1726
1727 if (target == nullptr)
1728 return;
1729
1730 auto scratch_ast_context = GetScratchContext(*target);
1731 if (!scratch_ast_context)
1732 return;
1733
1734 TypeFromUser user_type(scratch_ast_context->GetBasicType(eBasicTypeVoid)
1735 .GetPointerType()
1736 .GetLValueReferenceType());
1737 TypeFromParser parser_type(m_clang_ast_context->GetBasicType(eBasicTypeVoid)
1738 .GetPointerType()
1739 .GetLValueReferenceType());
1740 NamedDecl *var_decl = context.AddVarDecl(parser_type);
1741
1742 std::string decl_name(context.m_decl_name.getAsString());
1743 ConstString entity_name(decl_name.c_str());
1745 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), entity_name,
1746 user_type, m_parser_vars->m_target_info.byte_order,
1747 m_parser_vars->m_target_info.address_byte_size));
1748 m_found_entities.AddNewlyConstructedVariable(entity);
1749
1750 entity->EnableParserVars(GetParserID());
1752 entity->GetParserVars(GetParserID());
1753
1754 const Address symbol_address = symbol.GetAddress();
1755 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
1756
1757 // parser_vars->m_lldb_value.SetContext(Value::ContextType::ClangType,
1758 // user_type.GetOpaqueQualType());
1759 parser_vars->m_lldb_value.SetCompilerType(user_type);
1760 parser_vars->m_lldb_value.GetScalar() = symbol_load_addr;
1762
1763 parser_vars->m_named_decl = var_decl;
1764 parser_vars->m_llvm_value = nullptr;
1765 parser_vars->m_lldb_sym = &symbol;
1766
1767 LLDB_LOG(log, " CEDM::FEVD Found variable {0}, returned\n{1}", decl_name,
1768 ClangUtil::DumpDecl(var_decl));
1769}
1770
1772 const RegisterInfo *reg_info) {
1774
1775 CompilerType clang_type =
1776 m_clang_ast_context->GetBuiltinTypeForEncodingAndBitSize(
1777 reg_info->encoding, reg_info->byte_size * 8);
1778
1779 if (!clang_type) {
1780 LLDB_LOG(log, " Tried to add a type for {0}, but couldn't get one",
1781 context.m_decl_name.getAsString());
1782 return;
1783 }
1784
1785 TypeFromParser parser_clang_type(clang_type);
1786
1787 NamedDecl *var_decl = context.AddVarDecl(parser_clang_type);
1788
1790 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
1791 m_parser_vars->m_target_info.byte_order,
1792 m_parser_vars->m_target_info.address_byte_size));
1793 m_found_entities.AddNewlyConstructedVariable(entity);
1794
1795 std::string decl_name(context.m_decl_name.getAsString());
1796 entity->SetName(ConstString(decl_name.c_str()));
1797 entity->SetRegisterInfo(reg_info);
1798 entity->EnableParserVars(GetParserID());
1800 entity->GetParserVars(GetParserID());
1801 parser_vars->m_named_decl = var_decl;
1802 parser_vars->m_llvm_value = nullptr;
1803 parser_vars->m_lldb_value.Clear();
1804 entity->m_flags |= ClangExpressionVariable::EVBareRegister;
1805
1806 LLDB_LOG(log, " CEDM::FEVD Added register {0}, returned\n{1}",
1807 context.m_decl_name.getAsString(), ClangUtil::DumpDecl(var_decl));
1808}
1809
1811 Function *function,
1812 const Symbol *symbol) {
1813 assert(m_parser_vars.get());
1814
1816
1817 NamedDecl *function_decl = nullptr;
1818 Address fun_address;
1819 CompilerType function_clang_type;
1820
1821 bool is_indirect_function = false;
1822
1823 if (function) {
1824 Type *function_type = function->GetType();
1825
1826 const auto lang = function->GetCompileUnit()->GetLanguage();
1827 const auto name = function->GetMangled().GetMangledName().AsCString();
1828 const bool extern_c =
1830 (Language::LanguageIsObjC(lang) &&
1832
1833 if (!extern_c) {
1834 TypeSystem *type_system = function->GetDeclContext().GetTypeSystem();
1835 if (llvm::isa<TypeSystemClang>(type_system)) {
1836 clang::DeclContext *src_decl_context =
1837 (clang::DeclContext *)function->GetDeclContext()
1839 clang::FunctionDecl *src_function_decl =
1840 llvm::dyn_cast_or_null<clang::FunctionDecl>(src_decl_context);
1841 if (src_function_decl &&
1842 src_function_decl->getTemplateSpecializationInfo()) {
1843 clang::FunctionTemplateDecl *function_template =
1844 src_function_decl->getTemplateSpecializationInfo()->getTemplate();
1845 clang::FunctionTemplateDecl *copied_function_template =
1846 llvm::dyn_cast_or_null<clang::FunctionTemplateDecl>(
1847 CopyDecl(function_template));
1848 if (copied_function_template) {
1849 if (log) {
1850 StreamString ss;
1851
1852 function->DumpSymbolContext(&ss);
1853
1854 LLDB_LOG(log,
1855 " CEDM::FEVD Imported decl for function template"
1856 " {0} (description {1}), returned\n{2}",
1857 copied_function_template->getNameAsString(),
1858 ss.GetData(),
1859 ClangUtil::DumpDecl(copied_function_template));
1860 }
1861
1862 context.AddNamedDecl(copied_function_template);
1863 }
1864 } else if (src_function_decl) {
1865 if (clang::FunctionDecl *copied_function_decl =
1866 llvm::dyn_cast_or_null<clang::FunctionDecl>(
1867 CopyDecl(src_function_decl))) {
1868 if (log) {
1869 StreamString ss;
1870
1871 function->DumpSymbolContext(&ss);
1872
1873 LLDB_LOG(log,
1874 " CEDM::FEVD Imported decl for function {0} "
1875 "(description {1}), returned\n{2}",
1876 copied_function_decl->getNameAsString(), ss.GetData(),
1877 ClangUtil::DumpDecl(copied_function_decl));
1878 }
1879
1880 context.AddNamedDecl(copied_function_decl);
1881 return;
1882 } else {
1883 LLDB_LOG(log, " Failed to import the function decl for '{0}'",
1884 src_function_decl->getName());
1885 }
1886 }
1887 }
1888 }
1889
1890 if (!function_type) {
1891 LLDB_LOG(log, " Skipped a function because it has no type");
1892 return;
1893 }
1894
1895 function_clang_type = function_type->GetFullCompilerType();
1896
1897 if (!function_clang_type) {
1898 LLDB_LOG(log, " Skipped a function because it has no Clang type");
1899 return;
1900 }
1901
1902 fun_address = function->GetAddress();
1903
1904 CompilerType copied_function_type = GuardedCopyType(function_clang_type);
1905 if (copied_function_type) {
1906 function_decl = context.AddFunDecl(copied_function_type, extern_c);
1907
1908 if (!function_decl) {
1909 LLDB_LOG(log, " Failed to create a function decl for '{0}' ({1:x})",
1910 function_type->GetName(), function_type->GetID());
1911
1912 return;
1913 }
1914 } else {
1915 // We failed to copy the type we found
1916 LLDB_LOG(log,
1917 " Failed to import the function type '{0}' ({1:x})"
1918 " into the expression parser AST context",
1919 function_type->GetName(), function_type->GetID());
1920
1921 return;
1922 }
1923 } else if (symbol) {
1924 fun_address = symbol->GetAddress();
1925 function_decl = context.AddGenericFunDecl();
1926 is_indirect_function = symbol->IsIndirect();
1927 } else {
1928 LLDB_LOG(log, " AddOneFunction called with no function and no symbol");
1929 return;
1930 }
1931
1932 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1933
1934 lldb::addr_t load_addr =
1935 fun_address.GetCallableLoadAddress(target, is_indirect_function);
1936
1938 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
1939 m_parser_vars->m_target_info.byte_order,
1940 m_parser_vars->m_target_info.address_byte_size));
1941 m_found_entities.AddNewlyConstructedVariable(entity);
1942
1943 std::string decl_name(context.m_decl_name.getAsString());
1944 entity->SetName(ConstString(decl_name.c_str()));
1945 entity->SetCompilerType(function_clang_type);
1946 entity->EnableParserVars(GetParserID());
1947
1949 entity->GetParserVars(GetParserID());
1950
1951 if (load_addr != LLDB_INVALID_ADDRESS) {
1953 parser_vars->m_lldb_value.GetScalar() = load_addr;
1954 } else {
1955 // We have to try finding a file address.
1956
1957 lldb::addr_t file_addr = fun_address.GetFileAddress();
1958
1960 parser_vars->m_lldb_value.GetScalar() = file_addr;
1961 }
1962
1963 parser_vars->m_named_decl = function_decl;
1964 parser_vars->m_llvm_value = nullptr;
1965
1966 if (log) {
1967 StreamString ss;
1968
1969 fun_address.Dump(&ss,
1970 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
1972
1973 LLDB_LOG(log,
1974 " CEDM::FEVD Found {0} function {1} (description {2}), "
1975 "returned\n{3}",
1976 (function ? "specific" : "generic"), decl_name, ss.GetData(),
1977 ClangUtil::DumpDecl(function_decl));
1978 }
1979}
1980
1982 const TypeFromUser &ut) {
1983 CompilerType copied_clang_type = GuardedCopyType(ut);
1984
1986
1987 if (!copied_clang_type) {
1988 LLDB_LOG(log,
1989 "ClangExpressionDeclMap::AddThisType - Couldn't import the type");
1990
1991 return;
1992 }
1993
1994 if (copied_clang_type.IsAggregateType() &&
1995 copied_clang_type.GetCompleteType()) {
1996 CompilerType void_clang_type =
1997 m_clang_ast_context->GetBasicType(eBasicTypeVoid);
1998 std::array<CompilerType, 1> args{void_clang_type.GetPointerType()};
1999
2000 CompilerType method_type = m_clang_ast_context->CreateFunctionType(
2001 void_clang_type, args, false,
2003
2004 const bool is_virtual = false;
2005 const bool is_static = false;
2006 const bool is_inline = false;
2007 const bool is_explicit = false;
2008 const bool is_attr_used = true;
2009 const bool is_artificial = false;
2010
2011 CXXMethodDecl *method_decl = m_clang_ast_context->AddMethodToCXXRecordType(
2012 copied_clang_type.GetOpaqueQualType(), "$__lldb_expr", /*asm_label=*/{},
2013 method_type, is_virtual, is_static, is_inline, is_explicit,
2014 is_attr_used, is_artificial);
2015
2016 LLDB_LOG(log,
2017 " CEDM::AddThisType Added function $__lldb_expr "
2018 "(description {0}) for this type\n{1}",
2019 ClangUtil::ToString(copied_clang_type),
2020 ClangUtil::DumpDecl(method_decl));
2021 }
2022
2023 if (!copied_clang_type.IsValid())
2024 return;
2025
2026 TypeSourceInfo *type_source_info = m_ast_context->getTrivialTypeSourceInfo(
2027 QualType::getFromOpaquePtr(copied_clang_type.GetOpaqueQualType()));
2028
2029 if (!type_source_info)
2030 return;
2031
2032 // Construct a typedef type because if "*this" is a templated type we can't
2033 // just return ClassTemplateSpecializationDecls in response to name queries.
2034 // Using a typedef makes this much more robust.
2035
2036 TypedefDecl *typedef_decl = TypedefDecl::Create(
2037 *m_ast_context, m_ast_context->getTranslationUnitDecl(), SourceLocation(),
2038 SourceLocation(), context.m_decl_name.getAsIdentifierInfo(),
2039 type_source_info);
2040
2041 if (!typedef_decl)
2042 return;
2043
2044 context.AddNamedDecl(typedef_decl);
2045}
2046
2048 const TypeFromUser &ut) {
2049 CompilerType copied_clang_type = GuardedCopyType(ut);
2050
2051 if (!copied_clang_type) {
2053
2054 LLDB_LOG(log,
2055 "ClangExpressionDeclMap::AddOneType - Couldn't import the type");
2056
2057 return;
2058 }
2059
2060 context.AddTypeDecl(copied_clang_type);
2061}
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_LOGV(log,...)
Definition Log.h:383
#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:3721
uint32_t GetAddressByteSize() const
Definition Process.cpp:3725
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:2685
const ModuleList & GetImages() const
Get accessor for the images for this process.
Definition Target.h:1141
const ArchSpec & GetArchitecture() const
Definition Target.h:1183
virtual lldb::StackFrameSP GetStackFrameAtIndex(uint32_t idx)
Definition Thread.h:433
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