1 //===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===// 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 9 #include "ClangExpressionDeclMap.h" 10 11 #include "ClangASTSource.h" 12 #include "ClangModulesDeclVendor.h" 13 #include "ClangPersistentVariables.h" 14 15 #include "lldb/Core/Address.h" 16 #include "lldb/Core/Module.h" 17 #include "lldb/Core/ModuleSpec.h" 18 #include "lldb/Core/ValueObjectConstResult.h" 19 #include "lldb/Core/ValueObjectVariable.h" 20 #include "lldb/Expression/Materializer.h" 21 #include "lldb/Symbol/ClangASTContext.h" 22 #include "lldb/Symbol/ClangUtil.h" 23 #include "lldb/Symbol/CompileUnit.h" 24 #include "lldb/Symbol/CompilerDecl.h" 25 #include "lldb/Symbol/CompilerDeclContext.h" 26 #include "lldb/Symbol/Function.h" 27 #include "lldb/Symbol/ObjectFile.h" 28 #include "lldb/Symbol/SymbolContext.h" 29 #include "lldb/Symbol/SymbolFile.h" 30 #include "lldb/Symbol/SymbolVendor.h" 31 #include "lldb/Symbol/Type.h" 32 #include "lldb/Symbol/TypeList.h" 33 #include "lldb/Symbol/Variable.h" 34 #include "lldb/Symbol/VariableList.h" 35 #include "lldb/Target/ExecutionContext.h" 36 #include "lldb/Target/Process.h" 37 #include "lldb/Target/RegisterContext.h" 38 #include "lldb/Target/StackFrame.h" 39 #include "lldb/Target/Target.h" 40 #include "lldb/Target/Thread.h" 41 #include "lldb/Utility/Endian.h" 42 #include "lldb/Utility/Log.h" 43 #include "lldb/Utility/RegisterValue.h" 44 #include "lldb/Utility/Status.h" 45 #include "lldb/lldb-private.h" 46 #include "clang/AST/ASTConsumer.h" 47 #include "clang/AST/ASTContext.h" 48 #include "clang/AST/ASTImporter.h" 49 #include "clang/AST/Decl.h" 50 #include "clang/AST/DeclarationName.h" 51 #include "clang/AST/RecursiveASTVisitor.h" 52 53 #include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h" 54 #include "Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.h" 55 #include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h" 56 57 using namespace lldb; 58 using namespace lldb_private; 59 using namespace clang; 60 61 namespace { 62 const char *g_lldb_local_vars_namespace_cstr = "$__lldb_local_vars"; 63 } // anonymous namespace 64 65 ClangExpressionDeclMap::ClangExpressionDeclMap( 66 bool keep_result_in_memory, 67 Materializer::PersistentVariableDelegate *result_delegate, 68 ExecutionContext &exe_ctx, ValueObject *ctx_obj) 69 : ClangASTSource(exe_ctx.GetTargetSP()), m_found_entities(), 70 m_struct_members(), m_keep_result_in_memory(keep_result_in_memory), 71 m_result_delegate(result_delegate), m_ctx_obj(ctx_obj), m_parser_vars(), 72 m_struct_vars() { 73 EnableStructVars(); 74 } 75 76 ClangExpressionDeclMap::~ClangExpressionDeclMap() { 77 // Note: The model is now that the parser's AST context and all associated 78 // data does not vanish until the expression has been executed. This means 79 // that valuable lookup data (like namespaces) doesn't vanish, but 80 81 DidParse(); 82 DisableStructVars(); 83 } 84 85 bool ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx, 86 Materializer *materializer) { 87 ClangASTMetrics::ClearLocalCounters(); 88 89 EnableParserVars(); 90 m_parser_vars->m_exe_ctx = exe_ctx; 91 92 Target *target = exe_ctx.GetTargetPtr(); 93 if (exe_ctx.GetFramePtr()) 94 m_parser_vars->m_sym_ctx = 95 exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything); 96 else if (exe_ctx.GetThreadPtr() && 97 exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)) 98 m_parser_vars->m_sym_ctx = 99 exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext( 100 lldb::eSymbolContextEverything); 101 else if (exe_ctx.GetProcessPtr()) { 102 m_parser_vars->m_sym_ctx.Clear(true); 103 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 104 } else if (target) { 105 m_parser_vars->m_sym_ctx.Clear(true); 106 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 107 } 108 109 if (target) { 110 m_parser_vars->m_persistent_vars = llvm::cast<ClangPersistentVariables>( 111 target->GetPersistentExpressionStateForLanguage(eLanguageTypeC)); 112 113 if (!target->GetScratchClangASTContext()) 114 return false; 115 } 116 117 m_parser_vars->m_target_info = GetTargetInfo(); 118 m_parser_vars->m_materializer = materializer; 119 120 return true; 121 } 122 123 void ClangExpressionDeclMap::InstallCodeGenerator( 124 clang::ASTConsumer *code_gen) { 125 assert(m_parser_vars); 126 m_parser_vars->m_code_gen = code_gen; 127 } 128 129 void ClangExpressionDeclMap::DidParse() { 130 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 131 132 if (log) 133 ClangASTMetrics::DumpCounters(log); 134 135 if (m_parser_vars) { 136 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize(); 137 entity_index < num_entities; ++entity_index) { 138 ExpressionVariableSP var_sp( 139 m_found_entities.GetVariableAtIndex(entity_index)); 140 if (var_sp) 141 llvm::cast<ClangExpressionVariable>(var_sp.get()) 142 ->DisableParserVars(GetParserID()); 143 } 144 145 for (size_t pvar_index = 0, 146 num_pvars = m_parser_vars->m_persistent_vars->GetSize(); 147 pvar_index < num_pvars; ++pvar_index) { 148 ExpressionVariableSP pvar_sp( 149 m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index)); 150 if (ClangExpressionVariable *clang_var = 151 llvm::dyn_cast<ClangExpressionVariable>(pvar_sp.get())) 152 clang_var->DisableParserVars(GetParserID()); 153 } 154 155 DisableParserVars(); 156 } 157 } 158 159 // Interface for IRForTarget 160 161 ClangExpressionDeclMap::TargetInfo ClangExpressionDeclMap::GetTargetInfo() { 162 assert(m_parser_vars.get()); 163 164 TargetInfo ret; 165 166 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 167 168 Process *process = exe_ctx.GetProcessPtr(); 169 if (process) { 170 ret.byte_order = process->GetByteOrder(); 171 ret.address_byte_size = process->GetAddressByteSize(); 172 } else { 173 Target *target = exe_ctx.GetTargetPtr(); 174 if (target) { 175 ret.byte_order = target->GetArchitecture().GetByteOrder(); 176 ret.address_byte_size = target->GetArchitecture().GetAddressByteSize(); 177 } 178 } 179 180 return ret; 181 } 182 183 static clang::QualType ExportAllDeclaredTypes( 184 clang::ExternalASTMerger &parent_merger, clang::ExternalASTMerger &merger, 185 clang::ASTContext &source, clang::FileManager &source_file_manager, 186 const clang::ExternalASTMerger::OriginMap &source_origin_map, 187 clang::FileID file, clang::QualType root) { 188 // Mark the source as temporary to make sure all declarations from the 189 // AST are exported. Also add the parent_merger as the merger into the 190 // source AST so that the merger can track back any declarations from 191 // the persistent ASTs we used as sources. 192 clang::ExternalASTMerger::ImporterSource importer_source( 193 source, source_file_manager, source_origin_map, /*Temporary*/ true, 194 &parent_merger); 195 merger.AddSources(importer_source); 196 clang::ASTImporter &exporter = merger.ImporterForOrigin(source); 197 llvm::Expected<clang::QualType> ret_or_error = exporter.Import(root); 198 merger.RemoveSources(importer_source); 199 if (ret_or_error) { 200 return *ret_or_error; 201 } else { 202 Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS); 203 LLDB_LOG_ERROR(log, ret_or_error.takeError(), "Couldn't import type: {0}"); 204 return clang::QualType(); 205 } 206 } 207 208 TypeFromUser ClangExpressionDeclMap::DeportType(ClangASTContext &target, 209 ClangASTContext &source, 210 TypeFromParser parser_type) { 211 assert(&target == m_target->GetScratchClangASTContext()); 212 assert((TypeSystem *)&source == parser_type.GetTypeSystem()); 213 assert(source.getASTContext() == m_ast_context); 214 215 if (m_ast_importer_sp) { 216 return TypeFromUser(m_ast_importer_sp->DeportType( 217 target.getASTContext(), source.getASTContext(), 218 parser_type.GetOpaqueQualType()), 219 &target); 220 } else if (m_merger_up) { 221 clang::FileID source_file = 222 source.getASTContext()->getSourceManager().getFileID( 223 source.getASTContext()->getTranslationUnitDecl()->getLocation()); 224 auto scratch_ast_context = static_cast<ClangASTContextForExpressions *>( 225 m_target->GetScratchClangASTContext()); 226 clang::QualType exported_type = ExportAllDeclaredTypes( 227 *m_merger_up.get(), scratch_ast_context->GetMergerUnchecked(), 228 *source.getASTContext(), *source.getFileManager(), 229 m_merger_up->GetOrigins(), source_file, 230 clang::QualType::getFromOpaquePtr(parser_type.GetOpaqueQualType())); 231 return TypeFromUser(exported_type.getAsOpaquePtr(), &target); 232 } else { 233 lldbassert(0 && "No mechanism for deporting a type!"); 234 return TypeFromUser(); 235 } 236 } 237 238 bool ClangExpressionDeclMap::AddPersistentVariable(const NamedDecl *decl, 239 ConstString name, 240 TypeFromParser parser_type, 241 bool is_result, 242 bool is_lvalue) { 243 assert(m_parser_vars.get()); 244 245 ClangASTContext *ast = 246 llvm::dyn_cast_or_null<ClangASTContext>(parser_type.GetTypeSystem()); 247 if (ast == nullptr) 248 return false; 249 250 if (m_parser_vars->m_materializer && is_result) { 251 Status err; 252 253 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 254 Target *target = exe_ctx.GetTargetPtr(); 255 if (target == nullptr) 256 return false; 257 258 TypeFromUser user_type = 259 DeportType(*target->GetScratchClangASTContext(), *ast, parser_type); 260 261 uint32_t offset = m_parser_vars->m_materializer->AddResultVariable( 262 user_type, is_lvalue, m_keep_result_in_memory, m_result_delegate, err); 263 264 ClangExpressionVariable *var = new ClangExpressionVariable( 265 exe_ctx.GetBestExecutionContextScope(), name, user_type, 266 m_parser_vars->m_target_info.byte_order, 267 m_parser_vars->m_target_info.address_byte_size); 268 269 m_found_entities.AddNewlyConstructedVariable(var); 270 271 var->EnableParserVars(GetParserID()); 272 273 ClangExpressionVariable::ParserVars *parser_vars = 274 var->GetParserVars(GetParserID()); 275 276 parser_vars->m_named_decl = decl; 277 parser_vars->m_parser_type = parser_type; 278 279 var->EnableJITVars(GetParserID()); 280 281 ClangExpressionVariable::JITVars *jit_vars = var->GetJITVars(GetParserID()); 282 283 jit_vars->m_offset = offset; 284 285 return true; 286 } 287 288 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 289 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 290 Target *target = exe_ctx.GetTargetPtr(); 291 if (target == nullptr) 292 return false; 293 294 ClangASTContext *context(target->GetScratchClangASTContext()); 295 296 TypeFromUser user_type = DeportType(*context, *ast, parser_type); 297 298 if (!user_type.GetOpaqueQualType()) { 299 LLDB_LOGF(log, "Persistent variable's type wasn't copied successfully"); 300 return false; 301 } 302 303 if (!m_parser_vars->m_target_info.IsValid()) 304 return false; 305 306 ClangExpressionVariable *var = llvm::cast<ClangExpressionVariable>( 307 m_parser_vars->m_persistent_vars 308 ->CreatePersistentVariable( 309 exe_ctx.GetBestExecutionContextScope(), name, user_type, 310 m_parser_vars->m_target_info.byte_order, 311 m_parser_vars->m_target_info.address_byte_size) 312 .get()); 313 314 if (!var) 315 return false; 316 317 var->m_frozen_sp->SetHasCompleteType(); 318 319 if (is_result) 320 var->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry; 321 else 322 var->m_flags |= 323 ClangExpressionVariable::EVKeepInTarget; // explicitly-declared 324 // persistent variables should 325 // persist 326 327 if (is_lvalue) { 328 var->m_flags |= ClangExpressionVariable::EVIsProgramReference; 329 } else { 330 var->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 331 var->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 332 } 333 334 if (m_keep_result_in_memory) { 335 var->m_flags |= ClangExpressionVariable::EVKeepInTarget; 336 } 337 338 LLDB_LOGF(log, "Created persistent variable with flags 0x%hx", var->m_flags); 339 340 var->EnableParserVars(GetParserID()); 341 342 ClangExpressionVariable::ParserVars *parser_vars = 343 var->GetParserVars(GetParserID()); 344 345 parser_vars->m_named_decl = decl; 346 parser_vars->m_parser_type = parser_type; 347 348 return true; 349 } 350 351 bool ClangExpressionDeclMap::AddValueToStruct(const NamedDecl *decl, 352 ConstString name, 353 llvm::Value *value, size_t size, 354 lldb::offset_t alignment) { 355 assert(m_struct_vars.get()); 356 assert(m_parser_vars.get()); 357 358 bool is_persistent_variable = false; 359 360 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 361 362 m_struct_vars->m_struct_laid_out = false; 363 364 if (ClangExpressionVariable::FindVariableInList(m_struct_members, decl, 365 GetParserID())) 366 return true; 367 368 ClangExpressionVariable *var(ClangExpressionVariable::FindVariableInList( 369 m_found_entities, decl, GetParserID())); 370 371 if (!var) { 372 var = ClangExpressionVariable::FindVariableInList( 373 *m_parser_vars->m_persistent_vars, decl, GetParserID()); 374 is_persistent_variable = true; 375 } 376 377 if (!var) 378 return false; 379 380 LLDB_LOGF(log, "Adding value for (NamedDecl*)%p [%s - %s] to the structure", 381 static_cast<const void *>(decl), name.GetCString(), 382 var->GetName().GetCString()); 383 384 // We know entity->m_parser_vars is valid because we used a parser variable 385 // to find it 386 387 ClangExpressionVariable::ParserVars *parser_vars = 388 llvm::cast<ClangExpressionVariable>(var)->GetParserVars(GetParserID()); 389 390 parser_vars->m_llvm_value = value; 391 392 if (ClangExpressionVariable::JITVars *jit_vars = 393 llvm::cast<ClangExpressionVariable>(var)->GetJITVars(GetParserID())) { 394 // We already laid this out; do not touch 395 396 LLDB_LOGF(log, "Already placed at 0x%llx", 397 (unsigned long long)jit_vars->m_offset); 398 } 399 400 llvm::cast<ClangExpressionVariable>(var)->EnableJITVars(GetParserID()); 401 402 ClangExpressionVariable::JITVars *jit_vars = 403 llvm::cast<ClangExpressionVariable>(var)->GetJITVars(GetParserID()); 404 405 jit_vars->m_alignment = alignment; 406 jit_vars->m_size = size; 407 408 m_struct_members.AddVariable(var->shared_from_this()); 409 410 if (m_parser_vars->m_materializer) { 411 uint32_t offset = 0; 412 413 Status err; 414 415 if (is_persistent_variable) { 416 ExpressionVariableSP var_sp(var->shared_from_this()); 417 offset = m_parser_vars->m_materializer->AddPersistentVariable( 418 var_sp, nullptr, err); 419 } else { 420 if (const lldb_private::Symbol *sym = parser_vars->m_lldb_sym) 421 offset = m_parser_vars->m_materializer->AddSymbol(*sym, err); 422 else if (const RegisterInfo *reg_info = var->GetRegisterInfo()) 423 offset = m_parser_vars->m_materializer->AddRegister(*reg_info, err); 424 else if (parser_vars->m_lldb_var) 425 offset = m_parser_vars->m_materializer->AddVariable( 426 parser_vars->m_lldb_var, err); 427 } 428 429 if (!err.Success()) 430 return false; 431 432 LLDB_LOGF(log, "Placed at 0x%llx", (unsigned long long)offset); 433 434 jit_vars->m_offset = 435 offset; // TODO DoStructLayout() should not change this. 436 } 437 438 return true; 439 } 440 441 bool ClangExpressionDeclMap::DoStructLayout() { 442 assert(m_struct_vars.get()); 443 444 if (m_struct_vars->m_struct_laid_out) 445 return true; 446 447 if (!m_parser_vars->m_materializer) 448 return false; 449 450 m_struct_vars->m_struct_alignment = 451 m_parser_vars->m_materializer->GetStructAlignment(); 452 m_struct_vars->m_struct_size = 453 m_parser_vars->m_materializer->GetStructByteSize(); 454 m_struct_vars->m_struct_laid_out = true; 455 return true; 456 } 457 458 bool ClangExpressionDeclMap::GetStructInfo(uint32_t &num_elements, size_t &size, 459 lldb::offset_t &alignment) { 460 assert(m_struct_vars.get()); 461 462 if (!m_struct_vars->m_struct_laid_out) 463 return false; 464 465 num_elements = m_struct_members.GetSize(); 466 size = m_struct_vars->m_struct_size; 467 alignment = m_struct_vars->m_struct_alignment; 468 469 return true; 470 } 471 472 bool ClangExpressionDeclMap::GetStructElement(const NamedDecl *&decl, 473 llvm::Value *&value, 474 lldb::offset_t &offset, 475 ConstString &name, 476 uint32_t index) { 477 assert(m_struct_vars.get()); 478 479 if (!m_struct_vars->m_struct_laid_out) 480 return false; 481 482 if (index >= m_struct_members.GetSize()) 483 return false; 484 485 ExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index)); 486 487 if (!member_sp) 488 return false; 489 490 ClangExpressionVariable::ParserVars *parser_vars = 491 llvm::cast<ClangExpressionVariable>(member_sp.get()) 492 ->GetParserVars(GetParserID()); 493 ClangExpressionVariable::JITVars *jit_vars = 494 llvm::cast<ClangExpressionVariable>(member_sp.get()) 495 ->GetJITVars(GetParserID()); 496 497 if (!parser_vars || !jit_vars || !member_sp->GetValueObject()) 498 return false; 499 500 decl = parser_vars->m_named_decl; 501 value = parser_vars->m_llvm_value; 502 offset = jit_vars->m_offset; 503 name = member_sp->GetName(); 504 505 return true; 506 } 507 508 bool ClangExpressionDeclMap::GetFunctionInfo(const NamedDecl *decl, 509 uint64_t &ptr) { 510 ClangExpressionVariable *entity(ClangExpressionVariable::FindVariableInList( 511 m_found_entities, decl, GetParserID())); 512 513 if (!entity) 514 return false; 515 516 // We know m_parser_vars is valid since we searched for the variable by its 517 // NamedDecl 518 519 ClangExpressionVariable::ParserVars *parser_vars = 520 entity->GetParserVars(GetParserID()); 521 522 ptr = parser_vars->m_lldb_value.GetScalar().ULongLong(); 523 524 return true; 525 } 526 527 addr_t ClangExpressionDeclMap::GetSymbolAddress(Target &target, 528 Process *process, 529 ConstString name, 530 lldb::SymbolType symbol_type, 531 lldb_private::Module *module) { 532 SymbolContextList sc_list; 533 534 if (module) 535 module->FindSymbolsWithNameAndType(name, symbol_type, sc_list); 536 else 537 target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list); 538 539 const uint32_t num_matches = sc_list.GetSize(); 540 addr_t symbol_load_addr = LLDB_INVALID_ADDRESS; 541 542 for (uint32_t i = 0; 543 i < num_matches && 544 (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); 545 i++) { 546 SymbolContext sym_ctx; 547 sc_list.GetContextAtIndex(i, sym_ctx); 548 549 const Address sym_address = sym_ctx.symbol->GetAddress(); 550 551 if (!sym_address.IsValid()) 552 continue; 553 554 switch (sym_ctx.symbol->GetType()) { 555 case eSymbolTypeCode: 556 case eSymbolTypeTrampoline: 557 symbol_load_addr = sym_address.GetCallableLoadAddress(&target); 558 break; 559 560 case eSymbolTypeResolver: 561 symbol_load_addr = sym_address.GetCallableLoadAddress(&target, true); 562 break; 563 564 case eSymbolTypeReExported: { 565 ConstString reexport_name = sym_ctx.symbol->GetReExportedSymbolName(); 566 if (reexport_name) { 567 ModuleSP reexport_module_sp; 568 ModuleSpec reexport_module_spec; 569 reexport_module_spec.GetPlatformFileSpec() = 570 sym_ctx.symbol->GetReExportedSymbolSharedLibrary(); 571 if (reexport_module_spec.GetPlatformFileSpec()) { 572 reexport_module_sp = 573 target.GetImages().FindFirstModule(reexport_module_spec); 574 if (!reexport_module_sp) { 575 reexport_module_spec.GetPlatformFileSpec().GetDirectory().Clear(); 576 reexport_module_sp = 577 target.GetImages().FindFirstModule(reexport_module_spec); 578 } 579 } 580 symbol_load_addr = GetSymbolAddress( 581 target, process, sym_ctx.symbol->GetReExportedSymbolName(), 582 symbol_type, reexport_module_sp.get()); 583 } 584 } break; 585 586 case eSymbolTypeData: 587 case eSymbolTypeRuntime: 588 case eSymbolTypeVariable: 589 case eSymbolTypeLocal: 590 case eSymbolTypeParam: 591 case eSymbolTypeInvalid: 592 case eSymbolTypeAbsolute: 593 case eSymbolTypeException: 594 case eSymbolTypeSourceFile: 595 case eSymbolTypeHeaderFile: 596 case eSymbolTypeObjectFile: 597 case eSymbolTypeCommonBlock: 598 case eSymbolTypeBlock: 599 case eSymbolTypeVariableType: 600 case eSymbolTypeLineEntry: 601 case eSymbolTypeLineHeader: 602 case eSymbolTypeScopeBegin: 603 case eSymbolTypeScopeEnd: 604 case eSymbolTypeAdditional: 605 case eSymbolTypeCompiler: 606 case eSymbolTypeInstrumentation: 607 case eSymbolTypeUndefined: 608 case eSymbolTypeObjCClass: 609 case eSymbolTypeObjCMetaClass: 610 case eSymbolTypeObjCIVar: 611 symbol_load_addr = sym_address.GetLoadAddress(&target); 612 break; 613 } 614 } 615 616 if (symbol_load_addr == LLDB_INVALID_ADDRESS && process) { 617 ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process); 618 619 if (runtime) { 620 symbol_load_addr = runtime->LookupRuntimeSymbol(name); 621 } 622 } 623 624 return symbol_load_addr; 625 } 626 627 addr_t ClangExpressionDeclMap::GetSymbolAddress(ConstString name, 628 lldb::SymbolType symbol_type) { 629 assert(m_parser_vars.get()); 630 631 if (!m_parser_vars->m_exe_ctx.GetTargetPtr()) 632 return false; 633 634 return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(), 635 m_parser_vars->m_exe_ctx.GetProcessPtr(), name, 636 symbol_type); 637 } 638 639 lldb::VariableSP ClangExpressionDeclMap::FindGlobalVariable( 640 Target &target, ModuleSP &module, ConstString name, 641 CompilerDeclContext *namespace_decl, TypeFromUser *type) { 642 VariableList vars; 643 644 if (module && namespace_decl) 645 module->FindGlobalVariables(name, namespace_decl, -1, vars); 646 else 647 target.GetImages().FindGlobalVariables(name, -1, vars); 648 649 if (vars.GetSize()) { 650 if (type) { 651 for (VariableSP var_sp : vars) { 652 if (ClangASTContext::AreTypesSame( 653 *type, var_sp->GetType()->GetFullCompilerType())) 654 return var_sp; 655 } 656 } else { 657 return vars.GetVariableAtIndex(0); 658 } 659 } 660 661 return VariableSP(); 662 } 663 664 ClangASTContext *ClangExpressionDeclMap::GetClangASTContext() { 665 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 666 if (frame == nullptr) 667 return nullptr; 668 669 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction | 670 lldb::eSymbolContextBlock); 671 if (sym_ctx.block == nullptr) 672 return nullptr; 673 674 CompilerDeclContext frame_decl_context = sym_ctx.block->GetDeclContext(); 675 if (!frame_decl_context) 676 return nullptr; 677 678 return llvm::dyn_cast_or_null<ClangASTContext>( 679 frame_decl_context.GetTypeSystem()); 680 } 681 682 // Interface for ClangASTSource 683 684 void ClangExpressionDeclMap::FindExternalVisibleDecls( 685 NameSearchContext &context) { 686 assert(m_ast_context); 687 688 ClangASTMetrics::RegisterVisibleQuery(); 689 690 const ConstString name(context.m_decl_name.getAsString().c_str()); 691 692 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 693 694 if (GetImportInProgress()) { 695 if (log && log->GetVerbose()) 696 LLDB_LOGF(log, "Ignoring a query during an import"); 697 return; 698 } 699 700 static unsigned int invocation_id = 0; 701 unsigned int current_id = invocation_id++; 702 703 if (log) { 704 if (!context.m_decl_context) 705 LLDB_LOGF(log, 706 "ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for " 707 "'%s' in a NULL DeclContext", 708 current_id, name.GetCString()); 709 else if (const NamedDecl *context_named_decl = 710 dyn_cast<NamedDecl>(context.m_decl_context)) 711 LLDB_LOGF(log, 712 "ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for " 713 "'%s' in '%s'", 714 current_id, name.GetCString(), 715 context_named_decl->getNameAsString().c_str()); 716 else 717 LLDB_LOGF(log, 718 "ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for " 719 "'%s' in a '%s'", 720 current_id, name.GetCString(), 721 context.m_decl_context->getDeclKindName()); 722 } 723 724 if (const NamespaceDecl *namespace_context = 725 dyn_cast<NamespaceDecl>(context.m_decl_context)) { 726 if (namespace_context->getName().str() == 727 std::string(g_lldb_local_vars_namespace_cstr)) { 728 CompilerDeclContext compiler_decl_ctx( 729 GetClangASTContext(), const_cast<void *>(static_cast<const void *>( 730 context.m_decl_context))); 731 FindExternalVisibleDecls(context, lldb::ModuleSP(), compiler_decl_ctx, 732 current_id); 733 return; 734 } 735 736 ClangASTImporter::NamespaceMapSP namespace_map = 737 m_ast_importer_sp 738 ? m_ast_importer_sp->GetNamespaceMap(namespace_context) 739 : ClangASTImporter::NamespaceMapSP(); 740 741 if (!namespace_map) 742 return; 743 744 if (log && log->GetVerbose()) 745 log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)", 746 current_id, static_cast<void *>(namespace_map.get()), 747 (int)namespace_map->size()); 748 749 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), 750 e = namespace_map->end(); 751 i != e; ++i) { 752 if (log) 753 log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s", 754 current_id, i->second.GetName().AsCString(), 755 i->first->GetFileSpec().GetFilename().GetCString()); 756 757 FindExternalVisibleDecls(context, i->first, i->second, current_id); 758 } 759 } else if (isa<TranslationUnitDecl>(context.m_decl_context)) { 760 CompilerDeclContext namespace_decl; 761 762 if (log) 763 log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id); 764 765 FindExternalVisibleDecls(context, lldb::ModuleSP(), namespace_decl, 766 current_id); 767 } 768 769 ClangASTSource::FindExternalVisibleDecls(context); 770 } 771 772 void ClangExpressionDeclMap::MaybeRegisterFunctionBody( 773 FunctionDecl *copied_function_decl) { 774 if (copied_function_decl->getBody() && m_parser_vars->m_code_gen) { 775 clang::DeclGroupRef decl_group_ref(copied_function_decl); 776 m_parser_vars->m_code_gen->HandleTopLevelDecl(decl_group_ref); 777 } 778 } 779 780 void ClangExpressionDeclMap::SearchPersistenDecls(NameSearchContext &context, 781 const ConstString name, 782 unsigned int current_id) { 783 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 784 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 785 if (!target) 786 return; 787 788 ClangASTContext *scratch_clang_ast_context = 789 target->GetScratchClangASTContext(); 790 791 if (!scratch_clang_ast_context) 792 return; 793 794 ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext(); 795 796 if (!scratch_ast_context) 797 return; 798 799 NamedDecl *persistent_decl = 800 m_parser_vars->m_persistent_vars->GetPersistentDecl(name); 801 802 if (!persistent_decl) 803 return; 804 805 Decl *parser_persistent_decl = CopyDecl(persistent_decl); 806 807 if (!parser_persistent_decl) 808 return; 809 810 NamedDecl *parser_named_decl = dyn_cast<NamedDecl>(parser_persistent_decl); 811 812 if (!parser_named_decl) 813 return; 814 815 if (clang::FunctionDecl *parser_function_decl = 816 llvm::dyn_cast<clang::FunctionDecl>(parser_named_decl)) { 817 MaybeRegisterFunctionBody(parser_function_decl); 818 } 819 820 LLDB_LOGF(log, " CEDM::FEVD[%u] Found persistent decl %s", current_id, 821 name.GetCString()); 822 823 context.AddNamedDecl(parser_named_decl); 824 } 825 826 void ClangExpressionDeclMap::LookUpLldbClass(NameSearchContext &context, 827 unsigned int current_id) { 828 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 829 830 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 831 SymbolContext sym_ctx; 832 if (frame != nullptr) 833 sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction | 834 lldb::eSymbolContextBlock); 835 836 if (m_ctx_obj) { 837 Status status; 838 lldb::ValueObjectSP ctx_obj_ptr = m_ctx_obj->AddressOf(status); 839 if (!ctx_obj_ptr || status.Fail()) 840 return; 841 842 AddThisType(context, TypeFromUser(m_ctx_obj->GetCompilerType()), 843 current_id); 844 845 m_struct_vars->m_object_pointer_type = 846 TypeFromUser(ctx_obj_ptr->GetCompilerType()); 847 848 return; 849 } 850 851 // Clang is looking for the type of "this" 852 853 if (frame == nullptr) 854 return; 855 856 // Find the block that defines the function represented by "sym_ctx" 857 Block *function_block = sym_ctx.GetFunctionBlock(); 858 859 if (!function_block) 860 return; 861 862 CompilerDeclContext function_decl_ctx = function_block->GetDeclContext(); 863 864 if (!function_decl_ctx) 865 return; 866 867 clang::CXXMethodDecl *method_decl = 868 ClangASTContext::DeclContextGetAsCXXMethodDecl(function_decl_ctx); 869 870 if (method_decl) { 871 clang::CXXRecordDecl *class_decl = method_decl->getParent(); 872 873 QualType class_qual_type(class_decl->getTypeForDecl(), 0); 874 875 TypeFromUser class_user_type( 876 class_qual_type.getAsOpaquePtr(), 877 ClangASTContext::GetASTContext(&class_decl->getASTContext())); 878 879 LLDB_LOG(log, " CEDM::FEVD[{0}] Adding type for $__lldb_class: {1}", 880 current_id, class_qual_type.getAsString()); 881 882 AddThisType(context, class_user_type, current_id); 883 884 if (method_decl->isInstance()) { 885 // self is a pointer to the object 886 887 QualType class_pointer_type = 888 method_decl->getASTContext().getPointerType(class_qual_type); 889 890 TypeFromUser self_user_type( 891 class_pointer_type.getAsOpaquePtr(), 892 ClangASTContext::GetASTContext(&method_decl->getASTContext())); 893 894 m_struct_vars->m_object_pointer_type = self_user_type; 895 } 896 return; 897 } 898 899 // This branch will get hit if we are executing code in the context of 900 // a function that claims to have an object pointer (through 901 // DW_AT_object_pointer?) but is not formally a method of the class. 902 // In that case, just look up the "this" variable in the current scope 903 // and use its type. 904 // FIXME: This code is formally correct, but clang doesn't currently 905 // emit DW_AT_object_pointer 906 // for C++ so it hasn't actually been tested. 907 908 VariableList *vars = frame->GetVariableList(false); 909 910 lldb::VariableSP this_var = vars->FindVariable(ConstString("this")); 911 912 if (this_var && this_var->IsInScope(frame) && 913 this_var->LocationIsValidForFrame(frame)) { 914 Type *this_type = this_var->GetType(); 915 916 if (!this_type) 917 return; 918 919 TypeFromUser pointee_type = 920 this_type->GetForwardCompilerType().GetPointeeType(); 921 922 LLDB_LOG(log, " FEVD[{0}] Adding type for $__lldb_class: {1}", current_id, 923 ClangUtil::GetQualType(pointee_type).getAsString()); 924 925 AddThisType(context, pointee_type, current_id); 926 TypeFromUser this_user_type(this_type->GetFullCompilerType()); 927 m_struct_vars->m_object_pointer_type = this_user_type; 928 } 929 } 930 931 void ClangExpressionDeclMap::LookUpLldbObjCClass(NameSearchContext &context, 932 unsigned int current_id) { 933 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 934 935 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 936 937 if (m_ctx_obj) { 938 Status status; 939 lldb::ValueObjectSP ctx_obj_ptr = m_ctx_obj->AddressOf(status); 940 if (!ctx_obj_ptr || status.Fail()) 941 return; 942 943 AddOneType(context, TypeFromUser(m_ctx_obj->GetCompilerType()), current_id); 944 945 m_struct_vars->m_object_pointer_type = 946 TypeFromUser(ctx_obj_ptr->GetCompilerType()); 947 948 return; 949 } 950 951 // Clang is looking for the type of "*self" 952 953 if (!frame) 954 return; 955 956 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction | 957 lldb::eSymbolContextBlock); 958 959 // Find the block that defines the function represented by "sym_ctx" 960 Block *function_block = sym_ctx.GetFunctionBlock(); 961 962 if (!function_block) 963 return; 964 965 CompilerDeclContext function_decl_ctx = function_block->GetDeclContext(); 966 967 if (!function_decl_ctx) 968 return; 969 970 clang::ObjCMethodDecl *method_decl = 971 ClangASTContext::DeclContextGetAsObjCMethodDecl(function_decl_ctx); 972 973 if (method_decl) { 974 ObjCInterfaceDecl *self_interface = method_decl->getClassInterface(); 975 976 if (!self_interface) 977 return; 978 979 const clang::Type *interface_type = self_interface->getTypeForDecl(); 980 981 if (!interface_type) 982 return; // This is unlikely, but we have seen crashes where this 983 // occurred 984 985 TypeFromUser class_user_type( 986 QualType(interface_type, 0).getAsOpaquePtr(), 987 ClangASTContext::GetASTContext(&method_decl->getASTContext())); 988 989 LLDB_LOG(log, " FEVD[{0}] Adding type for $__lldb_objc_class: {1}", 990 current_id, ClangUtil::ToString(interface_type)); 991 992 AddOneType(context, class_user_type, current_id); 993 994 if (method_decl->isInstanceMethod()) { 995 // self is a pointer to the object 996 997 QualType class_pointer_type = 998 method_decl->getASTContext().getObjCObjectPointerType( 999 QualType(interface_type, 0)); 1000 1001 TypeFromUser self_user_type( 1002 class_pointer_type.getAsOpaquePtr(), 1003 ClangASTContext::GetASTContext(&method_decl->getASTContext())); 1004 1005 m_struct_vars->m_object_pointer_type = self_user_type; 1006 } else { 1007 // self is a Class pointer 1008 QualType class_type = method_decl->getASTContext().getObjCClassType(); 1009 1010 TypeFromUser self_user_type( 1011 class_type.getAsOpaquePtr(), 1012 ClangASTContext::GetASTContext(&method_decl->getASTContext())); 1013 1014 m_struct_vars->m_object_pointer_type = self_user_type; 1015 } 1016 1017 return; 1018 } 1019 // This branch will get hit if we are executing code in the context of 1020 // a function that claims to have an object pointer (through 1021 // DW_AT_object_pointer?) but is not formally a method of the class. 1022 // In that case, just look up the "self" variable in the current scope 1023 // and use its type. 1024 1025 VariableList *vars = frame->GetVariableList(false); 1026 1027 lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); 1028 1029 if (!self_var) 1030 return; 1031 if (!self_var->IsInScope(frame)) 1032 return; 1033 if (!self_var->LocationIsValidForFrame(frame)) 1034 return; 1035 1036 Type *self_type = self_var->GetType(); 1037 1038 if (!self_type) 1039 return; 1040 1041 CompilerType self_clang_type = self_type->GetFullCompilerType(); 1042 1043 if (ClangASTContext::IsObjCClassType(self_clang_type)) { 1044 return; 1045 } 1046 if (!ClangASTContext::IsObjCObjectPointerType(self_clang_type)) 1047 return; 1048 self_clang_type = self_clang_type.GetPointeeType(); 1049 1050 if (!self_clang_type) 1051 return; 1052 1053 LLDB_LOG(log, " FEVD[{0}] Adding type for $__lldb_objc_class: {1}", 1054 current_id, ClangUtil::ToString(self_type->GetFullCompilerType())); 1055 1056 TypeFromUser class_user_type(self_clang_type); 1057 1058 AddOneType(context, class_user_type, current_id); 1059 1060 TypeFromUser self_user_type(self_type->GetFullCompilerType()); 1061 1062 m_struct_vars->m_object_pointer_type = self_user_type; 1063 } 1064 1065 void ClangExpressionDeclMap::LookupLocalVarNamespace( 1066 SymbolContext &sym_ctx, NameSearchContext &name_context) { 1067 if (sym_ctx.block == nullptr) 1068 return; 1069 1070 CompilerDeclContext frame_decl_context = sym_ctx.block->GetDeclContext(); 1071 if (!frame_decl_context) 1072 return; 1073 1074 ClangASTContext *frame_ast = llvm::dyn_cast_or_null<ClangASTContext>( 1075 frame_decl_context.GetTypeSystem()); 1076 if (!frame_ast) 1077 return; 1078 1079 ClangASTContext *map_ast = ClangASTContext::GetASTContext(m_ast_context); 1080 if (!map_ast) 1081 return; 1082 1083 clang::NamespaceDecl *namespace_decl = map_ast->GetUniqueNamespaceDeclaration( 1084 g_lldb_local_vars_namespace_cstr, nullptr); 1085 if (!namespace_decl) 1086 return; 1087 1088 name_context.AddNamedDecl(namespace_decl); 1089 clang::DeclContext *ctxt = clang::Decl::castToDeclContext(namespace_decl); 1090 ctxt->setHasExternalVisibleStorage(true); 1091 name_context.m_found.local_vars_nsp = true; 1092 } 1093 1094 void ClangExpressionDeclMap::LookupInModulesDeclVendor( 1095 NameSearchContext &context, ConstString name, unsigned current_id) { 1096 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1097 1098 auto *modules_decl_vendor = m_target->GetClangModulesDeclVendor(); 1099 if (!modules_decl_vendor) 1100 return; 1101 1102 bool append = false; 1103 uint32_t max_matches = 1; 1104 std::vector<clang::NamedDecl *> decls; 1105 1106 if (!modules_decl_vendor->FindDecls(name, append, max_matches, decls)) 1107 return; 1108 1109 assert(!decls.empty() && "FindDecls returned true but no decls?"); 1110 clang::NamedDecl *const decl_from_modules = decls[0]; 1111 1112 LLDB_LOG(log, 1113 " CAS::FEVD[{0}] Matching decl found for " 1114 "\"{1}\" in the modules", 1115 current_id, name); 1116 1117 clang::Decl *copied_decl = CopyDecl(decl_from_modules); 1118 if (!copied_decl) { 1119 LLDB_LOG(log, 1120 " CAS::FEVD[{0}] - Couldn't export a " 1121 "declaration from the modules", 1122 current_id); 1123 return; 1124 } 1125 1126 if (auto copied_function = dyn_cast<clang::FunctionDecl>(copied_decl)) { 1127 MaybeRegisterFunctionBody(copied_function); 1128 1129 context.AddNamedDecl(copied_function); 1130 1131 context.m_found.function_with_type_info = true; 1132 context.m_found.function = true; 1133 } else if (auto copied_var = dyn_cast<clang::VarDecl>(copied_decl)) { 1134 context.AddNamedDecl(copied_var); 1135 context.m_found.variable = true; 1136 } 1137 } 1138 1139 bool ClangExpressionDeclMap::LookupLocalVariable( 1140 NameSearchContext &context, ConstString name, unsigned current_id, 1141 SymbolContext &sym_ctx, CompilerDeclContext &namespace_decl) { 1142 if (sym_ctx.block == nullptr) 1143 return false; 1144 1145 CompilerDeclContext decl_context = sym_ctx.block->GetDeclContext(); 1146 if (!decl_context) 1147 return false; 1148 1149 // Make sure that the variables are parsed so that we have the 1150 // declarations. 1151 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 1152 VariableListSP vars = frame->GetInScopeVariableList(true); 1153 for (size_t i = 0; i < vars->GetSize(); i++) 1154 vars->GetVariableAtIndex(i)->GetDecl(); 1155 1156 // Search for declarations matching the name. Do not include imported 1157 // decls in the search if we are looking for decls in the artificial 1158 // namespace $__lldb_local_vars. 1159 std::vector<CompilerDecl> found_decls = 1160 decl_context.FindDeclByName(name, namespace_decl.IsValid()); 1161 1162 VariableSP var; 1163 bool variable_found = false; 1164 for (CompilerDecl decl : found_decls) { 1165 for (size_t vi = 0, ve = vars->GetSize(); vi != ve; ++vi) { 1166 VariableSP candidate_var = vars->GetVariableAtIndex(vi); 1167 if (candidate_var->GetDecl() == decl) { 1168 var = candidate_var; 1169 break; 1170 } 1171 } 1172 1173 if (var && !variable_found) { 1174 variable_found = true; 1175 ValueObjectSP valobj = ValueObjectVariable::Create(frame, var); 1176 AddOneVariable(context, var, valobj, current_id); 1177 context.m_found.variable = true; 1178 } 1179 } 1180 return variable_found; 1181 } 1182 1183 void ClangExpressionDeclMap::LookupFunction(NameSearchContext &context, 1184 lldb::ModuleSP module_sp, 1185 ConstString name, 1186 CompilerDeclContext &namespace_decl, 1187 unsigned current_id) { 1188 1189 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1190 1191 std::vector<clang::NamedDecl *> decls_from_modules; 1192 1193 if (target) { 1194 if (ClangModulesDeclVendor *decl_vendor = 1195 target->GetClangModulesDeclVendor()) { 1196 decl_vendor->FindDecls(name, false, UINT32_MAX, decls_from_modules); 1197 } 1198 } 1199 1200 const bool include_inlines = false; 1201 SymbolContextList sc_list; 1202 if (namespace_decl && module_sp) { 1203 const bool include_symbols = false; 1204 1205 module_sp->FindFunctions(name, &namespace_decl, eFunctionNameTypeBase, 1206 include_symbols, include_inlines, sc_list); 1207 } else if (target && !namespace_decl) { 1208 const bool include_symbols = true; 1209 1210 // TODO Fix FindFunctions so that it doesn't return 1211 // instance methods for eFunctionNameTypeBase. 1212 1213 target->GetImages().FindFunctions(name, eFunctionNameTypeFull, 1214 include_symbols, include_inlines, 1215 sc_list); 1216 } 1217 1218 // If we found more than one function, see if we can use the frame's decl 1219 // context to remove functions that are shadowed by other functions which 1220 // match in type but are nearer in scope. 1221 // 1222 // AddOneFunction will not add a function whose type has already been 1223 // added, so if there's another function in the list with a matching type, 1224 // check to see if their decl context is a parent of the current frame's or 1225 // was imported via a and using statement, and pick the best match 1226 // according to lookup rules. 1227 if (sc_list.GetSize() > 1) { 1228 // Collect some info about our frame's context. 1229 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 1230 SymbolContext frame_sym_ctx; 1231 if (frame != nullptr) 1232 frame_sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction | 1233 lldb::eSymbolContextBlock); 1234 CompilerDeclContext frame_decl_context = 1235 frame_sym_ctx.block != nullptr ? frame_sym_ctx.block->GetDeclContext() 1236 : CompilerDeclContext(); 1237 1238 // We can't do this without a compiler decl context for our frame. 1239 if (frame_decl_context) { 1240 clang::DeclContext *frame_decl_ctx = 1241 (clang::DeclContext *)frame_decl_context.GetOpaqueDeclContext(); 1242 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>( 1243 frame_decl_context.GetTypeSystem()); 1244 1245 // Structure to hold the info needed when comparing function 1246 // declarations. 1247 struct FuncDeclInfo { 1248 ConstString m_name; 1249 CompilerType m_copied_type; 1250 uint32_t m_decl_lvl; 1251 SymbolContext m_sym_ctx; 1252 }; 1253 1254 // First, symplify things by looping through the symbol contexts to 1255 // remove unwanted functions and separate out the functions we want to 1256 // compare and prune into a separate list. Cache the info needed about 1257 // the function declarations in a vector for efficiency. 1258 SymbolContextList sc_sym_list; 1259 uint32_t num_indices = sc_list.GetSize(); 1260 std::vector<FuncDeclInfo> fdi_cache; 1261 fdi_cache.reserve(num_indices); 1262 for (uint32_t index = 0; index < num_indices; ++index) { 1263 FuncDeclInfo fdi; 1264 SymbolContext sym_ctx; 1265 sc_list.GetContextAtIndex(index, sym_ctx); 1266 1267 // We don't know enough about symbols to compare them, but we should 1268 // keep them in the list. 1269 Function *function = sym_ctx.function; 1270 if (!function) { 1271 sc_sym_list.Append(sym_ctx); 1272 continue; 1273 } 1274 // Filter out functions without declaration contexts, as well as 1275 // class/instance methods, since they'll be skipped in the code that 1276 // follows anyway. 1277 CompilerDeclContext func_decl_context = function->GetDeclContext(); 1278 if (!func_decl_context || 1279 func_decl_context.IsClassMethod(nullptr, nullptr, nullptr)) 1280 continue; 1281 // We can only prune functions for which we can copy the type. 1282 CompilerType func_clang_type = 1283 function->GetType()->GetFullCompilerType(); 1284 CompilerType copied_func_type = GuardedCopyType(func_clang_type); 1285 if (!copied_func_type) { 1286 sc_sym_list.Append(sym_ctx); 1287 continue; 1288 } 1289 1290 fdi.m_sym_ctx = sym_ctx; 1291 fdi.m_name = function->GetName(); 1292 fdi.m_copied_type = copied_func_type; 1293 fdi.m_decl_lvl = LLDB_INVALID_DECL_LEVEL; 1294 if (fdi.m_copied_type && func_decl_context) { 1295 // Call CountDeclLevels to get the number of parent scopes we have 1296 // to look through before we find the function declaration. When 1297 // comparing functions of the same type, the one with a lower count 1298 // will be closer to us in the lookup scope and shadows the other. 1299 clang::DeclContext *func_decl_ctx = 1300 (clang::DeclContext *)func_decl_context.GetOpaqueDeclContext(); 1301 fdi.m_decl_lvl = ast->CountDeclLevels( 1302 frame_decl_ctx, func_decl_ctx, &fdi.m_name, &fdi.m_copied_type); 1303 } 1304 fdi_cache.emplace_back(fdi); 1305 } 1306 1307 // Loop through the functions in our cache looking for matching types, 1308 // then compare their scope levels to see which is closer. 1309 std::multimap<CompilerType, const FuncDeclInfo *> matches; 1310 for (const FuncDeclInfo &fdi : fdi_cache) { 1311 const CompilerType t = fdi.m_copied_type; 1312 auto q = matches.find(t); 1313 if (q != matches.end()) { 1314 if (q->second->m_decl_lvl > fdi.m_decl_lvl) 1315 // This function is closer; remove the old set. 1316 matches.erase(t); 1317 else if (q->second->m_decl_lvl < fdi.m_decl_lvl) 1318 // The functions in our set are closer - skip this one. 1319 continue; 1320 } 1321 matches.insert(std::make_pair(t, &fdi)); 1322 } 1323 1324 // Loop through our matches and add their symbol contexts to our list. 1325 SymbolContextList sc_func_list; 1326 for (const auto &q : matches) 1327 sc_func_list.Append(q.second->m_sym_ctx); 1328 1329 // Rejoin the lists with the functions in front. 1330 sc_list = sc_func_list; 1331 sc_list.Append(sc_sym_list); 1332 } 1333 } 1334 1335 if (sc_list.GetSize()) { 1336 Symbol *extern_symbol = nullptr; 1337 Symbol *non_extern_symbol = nullptr; 1338 1339 for (uint32_t index = 0, num_indices = sc_list.GetSize(); 1340 index < num_indices; ++index) { 1341 SymbolContext sym_ctx; 1342 sc_list.GetContextAtIndex(index, sym_ctx); 1343 1344 if (sym_ctx.function) { 1345 CompilerDeclContext decl_ctx = sym_ctx.function->GetDeclContext(); 1346 1347 if (!decl_ctx) 1348 continue; 1349 1350 // Filter out class/instance methods. 1351 if (decl_ctx.IsClassMethod(nullptr, nullptr, nullptr)) 1352 continue; 1353 1354 AddOneFunction(context, sym_ctx.function, nullptr, current_id); 1355 context.m_found.function_with_type_info = true; 1356 context.m_found.function = true; 1357 } else if (sym_ctx.symbol) { 1358 if (sym_ctx.symbol->GetType() == eSymbolTypeReExported && target) { 1359 sym_ctx.symbol = sym_ctx.symbol->ResolveReExportedSymbol(*target); 1360 if (sym_ctx.symbol == nullptr) 1361 continue; 1362 } 1363 1364 if (sym_ctx.symbol->IsExternal()) 1365 extern_symbol = sym_ctx.symbol; 1366 else 1367 non_extern_symbol = sym_ctx.symbol; 1368 } 1369 } 1370 1371 if (!context.m_found.function_with_type_info) { 1372 for (clang::NamedDecl *decl : decls_from_modules) { 1373 if (llvm::isa<clang::FunctionDecl>(decl)) { 1374 clang::NamedDecl *copied_decl = 1375 llvm::cast_or_null<FunctionDecl>(CopyDecl(decl)); 1376 if (copied_decl) { 1377 context.AddNamedDecl(copied_decl); 1378 context.m_found.function_with_type_info = true; 1379 } 1380 } 1381 } 1382 } 1383 1384 if (!context.m_found.function_with_type_info) { 1385 if (extern_symbol) { 1386 AddOneFunction(context, nullptr, extern_symbol, current_id); 1387 context.m_found.function = true; 1388 } else if (non_extern_symbol) { 1389 AddOneFunction(context, nullptr, non_extern_symbol, current_id); 1390 context.m_found.function = true; 1391 } 1392 } 1393 } 1394 } 1395 1396 void ClangExpressionDeclMap::FindExternalVisibleDecls( 1397 NameSearchContext &context, lldb::ModuleSP module_sp, 1398 CompilerDeclContext &namespace_decl, unsigned int current_id) { 1399 assert(m_ast_context); 1400 1401 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1402 1403 const ConstString name(context.m_decl_name.getAsString().c_str()); 1404 if (IgnoreName(name, false)) 1405 return; 1406 1407 // Only look for functions by name out in our symbols if the function doesn't 1408 // start with our phony prefix of '$' 1409 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1410 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 1411 SymbolContext sym_ctx; 1412 if (frame != nullptr) 1413 sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction | 1414 lldb::eSymbolContextBlock); 1415 1416 // Try the persistent decls, which take precedence over all else. 1417 if (!namespace_decl) 1418 SearchPersistenDecls(context, name, current_id); 1419 1420 if (name.GetStringRef().startswith("$") && !namespace_decl) { 1421 if (name == "$__lldb_class") { 1422 LookUpLldbClass(context, current_id); 1423 return; 1424 } 1425 1426 if (name == "$__lldb_objc_class") { 1427 LookUpLldbObjCClass(context, current_id); 1428 return; 1429 } 1430 if (name == g_lldb_local_vars_namespace_cstr) { 1431 LookupLocalVarNamespace(sym_ctx, context); 1432 return; 1433 } 1434 1435 // any other $__lldb names should be weeded out now 1436 if (name.GetStringRef().startswith("$__lldb")) 1437 return; 1438 1439 ExpressionVariableSP pvar_sp( 1440 m_parser_vars->m_persistent_vars->GetVariable(name)); 1441 1442 if (pvar_sp) { 1443 AddOneVariable(context, pvar_sp, current_id); 1444 return; 1445 } 1446 1447 assert(name.GetStringRef().startswith("$")); 1448 llvm::StringRef reg_name = name.GetStringRef().substr(1); 1449 1450 if (m_parser_vars->m_exe_ctx.GetRegisterContext()) { 1451 const RegisterInfo *reg_info( 1452 m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName( 1453 reg_name)); 1454 1455 if (reg_info) { 1456 LLDB_LOGF(log, " CEDM::FEVD[%u] Found register %s", current_id, 1457 reg_info->name); 1458 1459 AddOneRegister(context, reg_info, current_id); 1460 } 1461 } 1462 return; 1463 } 1464 1465 bool local_var_lookup = !namespace_decl || (namespace_decl.GetName() == 1466 g_lldb_local_vars_namespace_cstr); 1467 if (frame && local_var_lookup) 1468 if (LookupLocalVariable(context, name, current_id, sym_ctx, namespace_decl)) 1469 return; 1470 1471 if (target) { 1472 ValueObjectSP valobj; 1473 VariableSP var; 1474 var = 1475 FindGlobalVariable(*target, module_sp, name, &namespace_decl, nullptr); 1476 1477 if (var) { 1478 valobj = ValueObjectVariable::Create(target, var); 1479 AddOneVariable(context, var, valobj, current_id); 1480 context.m_found.variable = true; 1481 return; 1482 } 1483 } 1484 1485 LookupFunction(context, module_sp, name, namespace_decl, current_id); 1486 1487 // Try the modules next. 1488 if (!context.m_found.function_with_type_info) 1489 LookupInModulesDeclVendor(context, name, current_id); 1490 1491 if (target && !context.m_found.variable && !namespace_decl) { 1492 // We couldn't find a non-symbol variable for this. Now we'll hunt for a 1493 // generic data symbol, and -- if it is found -- treat it as a variable. 1494 Status error; 1495 1496 const Symbol *data_symbol = 1497 m_parser_vars->m_sym_ctx.FindBestGlobalDataSymbol(name, error); 1498 1499 if (!error.Success()) { 1500 const unsigned diag_id = 1501 m_ast_context->getDiagnostics().getCustomDiagID( 1502 clang::DiagnosticsEngine::Level::Error, "%0"); 1503 m_ast_context->getDiagnostics().Report(diag_id) << error.AsCString(); 1504 } 1505 1506 if (data_symbol) { 1507 std::string warning("got name from symbols: "); 1508 warning.append(name.AsCString()); 1509 const unsigned diag_id = 1510 m_ast_context->getDiagnostics().getCustomDiagID( 1511 clang::DiagnosticsEngine::Level::Warning, "%0"); 1512 m_ast_context->getDiagnostics().Report(diag_id) << warning.c_str(); 1513 AddOneGenericVariable(context, *data_symbol, current_id); 1514 context.m_found.variable = true; 1515 } 1516 } 1517 } 1518 1519 bool ClangExpressionDeclMap::GetVariableValue(VariableSP &var, 1520 lldb_private::Value &var_location, 1521 TypeFromUser *user_type, 1522 TypeFromParser *parser_type) { 1523 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1524 1525 Type *var_type = var->GetType(); 1526 1527 if (!var_type) { 1528 if (log) 1529 log->PutCString("Skipped a definition because it has no type"); 1530 return false; 1531 } 1532 1533 CompilerType var_clang_type = var_type->GetFullCompilerType(); 1534 1535 if (!var_clang_type) { 1536 if (log) 1537 log->PutCString("Skipped a definition because it has no Clang type"); 1538 return false; 1539 } 1540 1541 ClangASTContext *clang_ast = llvm::dyn_cast_or_null<ClangASTContext>( 1542 var_type->GetForwardCompilerType().GetTypeSystem()); 1543 1544 if (!clang_ast) { 1545 if (log) 1546 log->PutCString("Skipped a definition because it has no Clang AST"); 1547 return false; 1548 } 1549 1550 ASTContext *ast = clang_ast->getASTContext(); 1551 1552 if (!ast) { 1553 if (log) 1554 log->PutCString( 1555 "There is no AST context for the current execution context"); 1556 return false; 1557 } 1558 1559 DWARFExpression &var_location_expr = var->LocationExpression(); 1560 1561 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1562 Status err; 1563 1564 if (var->GetLocationIsConstantValueData()) { 1565 DataExtractor const_value_extractor; 1566 1567 if (var_location_expr.GetExpressionData(const_value_extractor)) { 1568 var_location = Value(const_value_extractor.GetDataStart(), 1569 const_value_extractor.GetByteSize()); 1570 var_location.SetValueType(Value::eValueTypeHostAddress); 1571 } else { 1572 LLDB_LOGF(log, "Error evaluating constant variable: %s", err.AsCString()); 1573 return false; 1574 } 1575 } 1576 1577 CompilerType type_to_use = GuardedCopyType(var_clang_type); 1578 1579 if (!type_to_use) { 1580 LLDB_LOGF(log, 1581 "Couldn't copy a variable's type into the parser's AST context"); 1582 1583 return false; 1584 } 1585 1586 if (parser_type) 1587 *parser_type = TypeFromParser(type_to_use); 1588 1589 if (var_location.GetContextType() == Value::eContextTypeInvalid) 1590 var_location.SetCompilerType(type_to_use); 1591 1592 if (var_location.GetValueType() == Value::eValueTypeFileAddress) { 1593 SymbolContext var_sc; 1594 var->CalculateSymbolContext(&var_sc); 1595 1596 if (!var_sc.module_sp) 1597 return false; 1598 1599 Address so_addr(var_location.GetScalar().ULongLong(), 1600 var_sc.module_sp->GetSectionList()); 1601 1602 lldb::addr_t load_addr = so_addr.GetLoadAddress(target); 1603 1604 if (load_addr != LLDB_INVALID_ADDRESS) { 1605 var_location.GetScalar() = load_addr; 1606 var_location.SetValueType(Value::eValueTypeLoadAddress); 1607 } 1608 } 1609 1610 if (user_type) 1611 *user_type = TypeFromUser(var_clang_type); 1612 1613 return true; 1614 } 1615 1616 void ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 1617 VariableSP var, 1618 ValueObjectSP valobj, 1619 unsigned int current_id) { 1620 assert(m_parser_vars.get()); 1621 1622 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1623 1624 TypeFromUser ut; 1625 TypeFromParser pt; 1626 Value var_location; 1627 1628 if (!GetVariableValue(var, var_location, &ut, &pt)) 1629 return; 1630 1631 clang::QualType parser_opaque_type = 1632 QualType::getFromOpaquePtr(pt.GetOpaqueQualType()); 1633 1634 if (parser_opaque_type.isNull()) 1635 return; 1636 1637 if (const clang::Type *parser_type = parser_opaque_type.getTypePtr()) { 1638 if (const TagType *tag_type = dyn_cast<TagType>(parser_type)) 1639 CompleteType(tag_type->getDecl()); 1640 if (const ObjCObjectPointerType *objc_object_ptr_type = 1641 dyn_cast<ObjCObjectPointerType>(parser_type)) 1642 CompleteType(objc_object_ptr_type->getInterfaceDecl()); 1643 } 1644 1645 bool is_reference = pt.IsReferenceType(); 1646 1647 NamedDecl *var_decl = nullptr; 1648 if (is_reference) 1649 var_decl = context.AddVarDecl(pt); 1650 else 1651 var_decl = context.AddVarDecl(pt.GetLValueReferenceType()); 1652 1653 std::string decl_name(context.m_decl_name.getAsString()); 1654 ConstString entity_name(decl_name.c_str()); 1655 ClangExpressionVariable *entity(new ClangExpressionVariable(valobj)); 1656 m_found_entities.AddNewlyConstructedVariable(entity); 1657 1658 assert(entity); 1659 entity->EnableParserVars(GetParserID()); 1660 ClangExpressionVariable::ParserVars *parser_vars = 1661 entity->GetParserVars(GetParserID()); 1662 parser_vars->m_parser_type = pt; 1663 parser_vars->m_named_decl = var_decl; 1664 parser_vars->m_llvm_value = nullptr; 1665 parser_vars->m_lldb_value = var_location; 1666 parser_vars->m_lldb_var = var; 1667 1668 if (is_reference) 1669 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference; 1670 1671 LLDB_LOG(log, 1672 " CEDM::FEVD[{0}] Found variable {1}, returned\n{2} (original {3})", 1673 current_id, decl_name, ClangUtil::DumpDecl(var_decl), 1674 ClangUtil::ToString(ut)); 1675 } 1676 1677 void ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 1678 ExpressionVariableSP &pvar_sp, 1679 unsigned int current_id) { 1680 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1681 1682 TypeFromUser user_type( 1683 llvm::cast<ClangExpressionVariable>(pvar_sp.get())->GetTypeFromUser()); 1684 1685 TypeFromParser parser_type(GuardedCopyType(user_type)); 1686 1687 if (!parser_type.GetOpaqueQualType()) { 1688 LLDB_LOGF(log, " CEDM::FEVD[%u] Couldn't import type for pvar %s", 1689 current_id, pvar_sp->GetName().GetCString()); 1690 return; 1691 } 1692 1693 NamedDecl *var_decl = 1694 context.AddVarDecl(parser_type.GetLValueReferenceType()); 1695 1696 llvm::cast<ClangExpressionVariable>(pvar_sp.get()) 1697 ->EnableParserVars(GetParserID()); 1698 ClangExpressionVariable::ParserVars *parser_vars = 1699 llvm::cast<ClangExpressionVariable>(pvar_sp.get()) 1700 ->GetParserVars(GetParserID()); 1701 parser_vars->m_parser_type = parser_type; 1702 parser_vars->m_named_decl = var_decl; 1703 parser_vars->m_llvm_value = nullptr; 1704 parser_vars->m_lldb_value.Clear(); 1705 1706 LLDB_LOG(log, " CEDM::FEVD[{0}] Added pvar {1}, returned\n{2}", current_id, 1707 pvar_sp->GetName(), ClangUtil::DumpDecl(var_decl)); 1708 } 1709 1710 void ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context, 1711 const Symbol &symbol, 1712 unsigned int current_id) { 1713 assert(m_parser_vars.get()); 1714 1715 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1716 1717 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1718 1719 if (target == nullptr) 1720 return; 1721 1722 ClangASTContext *scratch_ast_context = target->GetScratchClangASTContext(); 1723 1724 TypeFromUser user_type(scratch_ast_context->GetBasicType(eBasicTypeVoid) 1725 .GetPointerType() 1726 .GetLValueReferenceType()); 1727 ClangASTContext *own_context = ClangASTContext::GetASTContext(m_ast_context); 1728 TypeFromParser parser_type(own_context->GetBasicType(eBasicTypeVoid) 1729 .GetPointerType() 1730 .GetLValueReferenceType()); 1731 NamedDecl *var_decl = context.AddVarDecl(parser_type); 1732 1733 std::string decl_name(context.m_decl_name.getAsString()); 1734 ConstString entity_name(decl_name.c_str()); 1735 ClangExpressionVariable *entity(new ClangExpressionVariable( 1736 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), entity_name, 1737 user_type, m_parser_vars->m_target_info.byte_order, 1738 m_parser_vars->m_target_info.address_byte_size)); 1739 m_found_entities.AddNewlyConstructedVariable(entity); 1740 1741 entity->EnableParserVars(GetParserID()); 1742 ClangExpressionVariable::ParserVars *parser_vars = 1743 entity->GetParserVars(GetParserID()); 1744 1745 const Address symbol_address = symbol.GetAddress(); 1746 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target); 1747 1748 // parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, 1749 // user_type.GetOpaqueQualType()); 1750 parser_vars->m_lldb_value.SetCompilerType(user_type); 1751 parser_vars->m_lldb_value.GetScalar() = symbol_load_addr; 1752 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress); 1753 1754 parser_vars->m_parser_type = parser_type; 1755 parser_vars->m_named_decl = var_decl; 1756 parser_vars->m_llvm_value = nullptr; 1757 parser_vars->m_lldb_sym = &symbol; 1758 1759 LLDB_LOG(log, " CEDM::FEVD[{0}] Found variable {1}, returned\n{2}", 1760 current_id, decl_name, ClangUtil::DumpDecl(var_decl)); 1761 } 1762 1763 void ClangExpressionDeclMap::AddOneRegister(NameSearchContext &context, 1764 const RegisterInfo *reg_info, 1765 unsigned int current_id) { 1766 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1767 1768 CompilerType clang_type = 1769 ClangASTContext::GetBuiltinTypeForEncodingAndBitSize( 1770 m_ast_context, reg_info->encoding, reg_info->byte_size * 8); 1771 1772 if (!clang_type) { 1773 LLDB_LOGF(log, " Tried to add a type for %s, but couldn't get one", 1774 context.m_decl_name.getAsString().c_str()); 1775 return; 1776 } 1777 1778 TypeFromParser parser_clang_type(clang_type); 1779 1780 NamedDecl *var_decl = context.AddVarDecl(parser_clang_type); 1781 1782 ClangExpressionVariable *entity(new ClangExpressionVariable( 1783 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 1784 m_parser_vars->m_target_info.byte_order, 1785 m_parser_vars->m_target_info.address_byte_size)); 1786 m_found_entities.AddNewlyConstructedVariable(entity); 1787 1788 std::string decl_name(context.m_decl_name.getAsString()); 1789 entity->SetName(ConstString(decl_name.c_str())); 1790 entity->SetRegisterInfo(reg_info); 1791 entity->EnableParserVars(GetParserID()); 1792 ClangExpressionVariable::ParserVars *parser_vars = 1793 entity->GetParserVars(GetParserID()); 1794 parser_vars->m_parser_type = parser_clang_type; 1795 parser_vars->m_named_decl = var_decl; 1796 parser_vars->m_llvm_value = nullptr; 1797 parser_vars->m_lldb_value.Clear(); 1798 entity->m_flags |= ClangExpressionVariable::EVBareRegister; 1799 1800 LLDB_LOG(log, " CEDM::FEVD[{0}] Added register {1}, returned\n{2}", 1801 current_id, context.m_decl_name.getAsString(), 1802 ClangUtil::DumpDecl(var_decl)); 1803 } 1804 1805 void ClangExpressionDeclMap::AddOneFunction(NameSearchContext &context, 1806 Function *function, Symbol *symbol, 1807 unsigned int current_id) { 1808 assert(m_parser_vars.get()); 1809 1810 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1811 1812 NamedDecl *function_decl = nullptr; 1813 Address fun_address; 1814 CompilerType function_clang_type; 1815 1816 bool is_indirect_function = false; 1817 1818 if (function) { 1819 Type *function_type = function->GetType(); 1820 1821 const auto lang = function->GetCompileUnit()->GetLanguage(); 1822 const auto name = function->GetMangled().GetMangledName().AsCString(); 1823 const bool extern_c = (Language::LanguageIsC(lang) && 1824 !CPlusPlusLanguage::IsCPPMangledName(name)) || 1825 (Language::LanguageIsObjC(lang) && 1826 !Language::LanguageIsCPlusPlus(lang)); 1827 1828 if (!extern_c) { 1829 TypeSystem *type_system = function->GetDeclContext().GetTypeSystem(); 1830 if (llvm::isa<ClangASTContext>(type_system)) { 1831 clang::DeclContext *src_decl_context = 1832 (clang::DeclContext *)function->GetDeclContext() 1833 .GetOpaqueDeclContext(); 1834 clang::FunctionDecl *src_function_decl = 1835 llvm::dyn_cast_or_null<clang::FunctionDecl>(src_decl_context); 1836 if (src_function_decl && 1837 src_function_decl->getTemplateSpecializationInfo()) { 1838 clang::FunctionTemplateDecl *function_template = 1839 src_function_decl->getTemplateSpecializationInfo()->getTemplate(); 1840 clang::FunctionTemplateDecl *copied_function_template = 1841 llvm::dyn_cast_or_null<clang::FunctionTemplateDecl>( 1842 CopyDecl(function_template)); 1843 if (copied_function_template) { 1844 if (log) { 1845 StreamString ss; 1846 1847 function->DumpSymbolContext(&ss); 1848 1849 LLDB_LOG(log, 1850 " CEDM::FEVD[{0}] Imported decl for function template" 1851 " {1} (description {2}), returned\n{3}", 1852 current_id, copied_function_template->getNameAsString(), 1853 ss.GetData(), 1854 ClangUtil::DumpDecl(copied_function_template)); 1855 } 1856 1857 context.AddNamedDecl(copied_function_template); 1858 } 1859 } else if (src_function_decl) { 1860 if (clang::FunctionDecl *copied_function_decl = 1861 llvm::dyn_cast_or_null<clang::FunctionDecl>( 1862 CopyDecl(src_function_decl))) { 1863 if (log) { 1864 StreamString ss; 1865 1866 function->DumpSymbolContext(&ss); 1867 1868 LLDB_LOG(log, 1869 " CEDM::FEVD[{0}]] Imported decl for function {1} " 1870 "(description {2}), returned\n{3}", 1871 current_id, copied_function_decl->getNameAsString(), 1872 ss.GetData(), ClangUtil::DumpDecl(copied_function_decl)); 1873 } 1874 1875 context.AddNamedDecl(copied_function_decl); 1876 return; 1877 } else { 1878 if (log) { 1879 LLDB_LOGF(log, " Failed to import the function decl for '%s'", 1880 src_function_decl->getName().str().c_str()); 1881 } 1882 } 1883 } 1884 } 1885 } 1886 1887 if (!function_type) { 1888 if (log) 1889 log->PutCString(" Skipped a function because it has no type"); 1890 return; 1891 } 1892 1893 function_clang_type = function_type->GetFullCompilerType(); 1894 1895 if (!function_clang_type) { 1896 if (log) 1897 log->PutCString(" Skipped a function because it has no Clang type"); 1898 return; 1899 } 1900 1901 fun_address = function->GetAddressRange().GetBaseAddress(); 1902 1903 CompilerType copied_function_type = GuardedCopyType(function_clang_type); 1904 if (copied_function_type) { 1905 function_decl = context.AddFunDecl(copied_function_type, extern_c); 1906 1907 if (!function_decl) { 1908 if (log) { 1909 LLDB_LOGF( 1910 log, 1911 " Failed to create a function decl for '%s' {0x%8.8" PRIx64 "}", 1912 function_type->GetName().GetCString(), function_type->GetID()); 1913 } 1914 1915 return; 1916 } 1917 } else { 1918 // We failed to copy the type we found 1919 if (log) { 1920 LLDB_LOGF(log, 1921 " Failed to import the function type '%s' {0x%8.8" PRIx64 1922 "} into the expression parser AST contenxt", 1923 function_type->GetName().GetCString(), 1924 function_type->GetID()); 1925 } 1926 1927 return; 1928 } 1929 } else if (symbol) { 1930 fun_address = symbol->GetAddress(); 1931 function_decl = context.AddGenericFunDecl(); 1932 is_indirect_function = symbol->IsIndirect(); 1933 } else { 1934 if (log) 1935 log->PutCString(" AddOneFunction called with no function and no symbol"); 1936 return; 1937 } 1938 1939 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1940 1941 lldb::addr_t load_addr = 1942 fun_address.GetCallableLoadAddress(target, is_indirect_function); 1943 1944 ClangExpressionVariable *entity(new ClangExpressionVariable( 1945 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 1946 m_parser_vars->m_target_info.byte_order, 1947 m_parser_vars->m_target_info.address_byte_size)); 1948 m_found_entities.AddNewlyConstructedVariable(entity); 1949 1950 std::string decl_name(context.m_decl_name.getAsString()); 1951 entity->SetName(ConstString(decl_name.c_str())); 1952 entity->SetCompilerType(function_clang_type); 1953 entity->EnableParserVars(GetParserID()); 1954 1955 ClangExpressionVariable::ParserVars *parser_vars = 1956 entity->GetParserVars(GetParserID()); 1957 1958 if (load_addr != LLDB_INVALID_ADDRESS) { 1959 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress); 1960 parser_vars->m_lldb_value.GetScalar() = load_addr; 1961 } else { 1962 // We have to try finding a file address. 1963 1964 lldb::addr_t file_addr = fun_address.GetFileAddress(); 1965 1966 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeFileAddress); 1967 parser_vars->m_lldb_value.GetScalar() = file_addr; 1968 } 1969 1970 parser_vars->m_named_decl = function_decl; 1971 parser_vars->m_llvm_value = nullptr; 1972 1973 if (log) { 1974 StreamString ss; 1975 1976 fun_address.Dump(&ss, 1977 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 1978 Address::DumpStyleResolvedDescription); 1979 1980 LLDB_LOG(log, 1981 " CEDM::FEVD[{0}] Found {1} function {2} (description {3}), " 1982 "returned\n{4}", 1983 current_id, (function ? "specific" : "generic"), decl_name, 1984 ss.GetData(), ClangUtil::DumpDecl(function_decl)); 1985 } 1986 } 1987 1988 void ClangExpressionDeclMap::AddThisType(NameSearchContext &context, 1989 const TypeFromUser &ut, 1990 unsigned int current_id) { 1991 CompilerType copied_clang_type = GuardedCopyType(ut); 1992 1993 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1994 1995 if (!copied_clang_type) { 1996 if (log) 1997 LLDB_LOGF( 1998 log, 1999 "ClangExpressionDeclMap::AddThisType - Couldn't import the type"); 2000 2001 return; 2002 } 2003 2004 if (copied_clang_type.IsAggregateType() && 2005 copied_clang_type.GetCompleteType()) { 2006 ClangASTContext *own_context = 2007 ClangASTContext::GetASTContext(m_ast_context); 2008 CompilerType void_clang_type = own_context->GetBasicType(eBasicTypeVoid); 2009 CompilerType void_ptr_clang_type = void_clang_type.GetPointerType(); 2010 2011 CompilerType method_type = ClangASTContext::CreateFunctionType( 2012 m_ast_context, void_clang_type, &void_ptr_clang_type, 1, false, 0); 2013 2014 const bool is_virtual = false; 2015 const bool is_static = false; 2016 const bool is_inline = false; 2017 const bool is_explicit = false; 2018 const bool is_attr_used = true; 2019 const bool is_artificial = false; 2020 2021 CXXMethodDecl *method_decl = 2022 ClangASTContext::GetASTContext(m_ast_context) 2023 ->AddMethodToCXXRecordType( 2024 copied_clang_type.GetOpaqueQualType(), "$__lldb_expr", nullptr, 2025 method_type, lldb::eAccessPublic, is_virtual, is_static, 2026 is_inline, is_explicit, is_attr_used, is_artificial); 2027 2028 LLDB_LOG(log, 2029 " CEDM::AddThisType Added function $__lldb_expr " 2030 "(description {0}) for this type\n{1}", 2031 ClangUtil::ToString(copied_clang_type), 2032 ClangUtil::DumpDecl(method_decl)); 2033 } 2034 2035 if (!copied_clang_type.IsValid()) 2036 return; 2037 2038 TypeSourceInfo *type_source_info = m_ast_context->getTrivialTypeSourceInfo( 2039 QualType::getFromOpaquePtr(copied_clang_type.GetOpaqueQualType())); 2040 2041 if (!type_source_info) 2042 return; 2043 2044 // Construct a typedef type because if "*this" is a templated type we can't 2045 // just return ClassTemplateSpecializationDecls in response to name queries. 2046 // Using a typedef makes this much more robust. 2047 2048 TypedefDecl *typedef_decl = TypedefDecl::Create( 2049 *m_ast_context, m_ast_context->getTranslationUnitDecl(), SourceLocation(), 2050 SourceLocation(), context.m_decl_name.getAsIdentifierInfo(), 2051 type_source_info); 2052 2053 if (!typedef_decl) 2054 return; 2055 2056 context.AddNamedDecl(typedef_decl); 2057 2058 return; 2059 } 2060 2061 void ClangExpressionDeclMap::AddOneType(NameSearchContext &context, 2062 const TypeFromUser &ut, 2063 unsigned int current_id) { 2064 CompilerType copied_clang_type = GuardedCopyType(ut); 2065 2066 if (!copied_clang_type) { 2067 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 2068 2069 if (log) 2070 LLDB_LOGF( 2071 log, "ClangExpressionDeclMap::AddOneType - Couldn't import the type"); 2072 2073 return; 2074 } 2075 2076 context.AddTypeDecl(copied_clang_type); 2077 } 2078