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 "ASTDumper.h" 12 #include "ClangASTSource.h" 13 #include "ClangModulesDeclVendor.h" 14 #include "ClangPersistentVariables.h" 15 16 #include "lldb/Core/Address.h" 17 #include "lldb/Core/Module.h" 18 #include "lldb/Core/ModuleSpec.h" 19 #include "lldb/Core/ValueObjectConstResult.h" 20 #include "lldb/Core/ValueObjectVariable.h" 21 #include "lldb/Expression/Materializer.h" 22 #include "lldb/Symbol/ClangASTContext.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 (size_t i = 0; i < vars.GetSize(); ++i) { 652 VariableSP var_sp = vars.GetVariableAtIndex(i); 653 654 if (ClangASTContext::AreTypesSame( 655 *type, var_sp->GetType()->GetFullCompilerType())) 656 return var_sp; 657 } 658 } else { 659 return vars.GetVariableAtIndex(0); 660 } 661 } 662 663 return VariableSP(); 664 } 665 666 ClangASTContext *ClangExpressionDeclMap::GetClangASTContext() { 667 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 668 if (frame == nullptr) 669 return nullptr; 670 671 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction | 672 lldb::eSymbolContextBlock); 673 if (sym_ctx.block == nullptr) 674 return nullptr; 675 676 CompilerDeclContext frame_decl_context = sym_ctx.block->GetDeclContext(); 677 if (!frame_decl_context) 678 return nullptr; 679 680 return llvm::dyn_cast_or_null<ClangASTContext>( 681 frame_decl_context.GetTypeSystem()); 682 } 683 684 // Interface for ClangASTSource 685 686 void ClangExpressionDeclMap::FindExternalVisibleDecls( 687 NameSearchContext &context) { 688 assert(m_ast_context); 689 690 ClangASTMetrics::RegisterVisibleQuery(); 691 692 const ConstString name(context.m_decl_name.getAsString().c_str()); 693 694 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 695 696 if (GetImportInProgress()) { 697 if (log && log->GetVerbose()) 698 LLDB_LOGF(log, "Ignoring a query during an import"); 699 return; 700 } 701 702 static unsigned int invocation_id = 0; 703 unsigned int current_id = invocation_id++; 704 705 if (log) { 706 if (!context.m_decl_context) 707 LLDB_LOGF(log, 708 "ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for " 709 "'%s' in a NULL DeclContext", 710 current_id, name.GetCString()); 711 else if (const NamedDecl *context_named_decl = 712 dyn_cast<NamedDecl>(context.m_decl_context)) 713 LLDB_LOGF(log, 714 "ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for " 715 "'%s' in '%s'", 716 current_id, name.GetCString(), 717 context_named_decl->getNameAsString().c_str()); 718 else 719 LLDB_LOGF(log, 720 "ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for " 721 "'%s' in a '%s'", 722 current_id, name.GetCString(), 723 context.m_decl_context->getDeclKindName()); 724 } 725 726 if (const NamespaceDecl *namespace_context = 727 dyn_cast<NamespaceDecl>(context.m_decl_context)) { 728 if (namespace_context->getName().str() == 729 std::string(g_lldb_local_vars_namespace_cstr)) { 730 CompilerDeclContext compiler_decl_ctx( 731 GetClangASTContext(), const_cast<void *>(static_cast<const void *>( 732 context.m_decl_context))); 733 FindExternalVisibleDecls(context, lldb::ModuleSP(), compiler_decl_ctx, 734 current_id); 735 return; 736 } 737 738 ClangASTImporter::NamespaceMapSP namespace_map = 739 m_ast_importer_sp 740 ? m_ast_importer_sp->GetNamespaceMap(namespace_context) 741 : ClangASTImporter::NamespaceMapSP(); 742 743 if (!namespace_map) 744 return; 745 746 if (log && log->GetVerbose()) 747 log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)", 748 current_id, static_cast<void *>(namespace_map.get()), 749 (int)namespace_map->size()); 750 751 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), 752 e = namespace_map->end(); 753 i != e; ++i) { 754 if (log) 755 log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s", 756 current_id, i->second.GetName().AsCString(), 757 i->first->GetFileSpec().GetFilename().GetCString()); 758 759 FindExternalVisibleDecls(context, i->first, i->second, current_id); 760 } 761 } else if (isa<TranslationUnitDecl>(context.m_decl_context)) { 762 CompilerDeclContext namespace_decl; 763 764 if (log) 765 log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id); 766 767 FindExternalVisibleDecls(context, lldb::ModuleSP(), namespace_decl, 768 current_id); 769 } 770 771 ClangASTSource::FindExternalVisibleDecls(context); 772 } 773 774 void ClangExpressionDeclMap::FindExternalVisibleDecls( 775 NameSearchContext &context, lldb::ModuleSP module_sp, 776 CompilerDeclContext &namespace_decl, unsigned int current_id) { 777 assert(m_ast_context); 778 779 std::function<void(clang::FunctionDecl *)> MaybeRegisterFunctionBody = 780 [this](clang::FunctionDecl *copied_function_decl) { 781 if (copied_function_decl->getBody() && m_parser_vars->m_code_gen) { 782 DeclGroupRef decl_group_ref(copied_function_decl); 783 m_parser_vars->m_code_gen->HandleTopLevelDecl(decl_group_ref); 784 } 785 }; 786 787 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 788 789 SymbolContextList sc_list; 790 791 const ConstString name(context.m_decl_name.getAsString().c_str()); 792 if (IgnoreName(name, false)) 793 return; 794 795 // Only look for functions by name out in our symbols if the function doesn't 796 // start with our phony prefix of '$' 797 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 798 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 799 SymbolContext sym_ctx; 800 if (frame != nullptr) 801 sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction | 802 lldb::eSymbolContextBlock); 803 804 // Try the persistent decls, which take precedence over all else. 805 if (!namespace_decl) { 806 do { 807 if (!target) 808 break; 809 810 ClangASTContext *scratch_clang_ast_context = 811 target->GetScratchClangASTContext(); 812 813 if (!scratch_clang_ast_context) 814 break; 815 816 ASTContext *scratch_ast_context = 817 scratch_clang_ast_context->getASTContext(); 818 819 if (!scratch_ast_context) 820 break; 821 822 NamedDecl *persistent_decl = 823 m_parser_vars->m_persistent_vars->GetPersistentDecl(name); 824 825 if (!persistent_decl) 826 break; 827 828 Decl *parser_persistent_decl = CopyDecl(persistent_decl); 829 830 if (!parser_persistent_decl) 831 break; 832 833 NamedDecl *parser_named_decl = 834 dyn_cast<NamedDecl>(parser_persistent_decl); 835 836 if (!parser_named_decl) 837 break; 838 839 if (clang::FunctionDecl *parser_function_decl = 840 llvm::dyn_cast<clang::FunctionDecl>(parser_named_decl)) { 841 MaybeRegisterFunctionBody(parser_function_decl); 842 } 843 844 LLDB_LOGF(log, " CEDM::FEVD[%u] Found persistent decl %s", current_id, 845 name.GetCString()); 846 847 context.AddNamedDecl(parser_named_decl); 848 } while (false); 849 } 850 851 if (name.GetCString()[0] == '$' && !namespace_decl) { 852 static ConstString g_lldb_class_name("$__lldb_class"); 853 854 if (name == g_lldb_class_name) { 855 if (m_ctx_obj) { 856 Status status; 857 lldb::ValueObjectSP ctx_obj_ptr = m_ctx_obj->AddressOf(status); 858 if (!ctx_obj_ptr || status.Fail()) 859 return; 860 861 AddThisType(context, TypeFromUser(m_ctx_obj->GetCompilerType()), 862 current_id); 863 864 m_struct_vars->m_object_pointer_type = 865 TypeFromUser(ctx_obj_ptr->GetCompilerType()); 866 867 return; 868 } 869 870 // Clang is looking for the type of "this" 871 872 if (frame == nullptr) 873 return; 874 875 // Find the block that defines the function represented by "sym_ctx" 876 Block *function_block = sym_ctx.GetFunctionBlock(); 877 878 if (!function_block) 879 return; 880 881 CompilerDeclContext function_decl_ctx = function_block->GetDeclContext(); 882 883 if (!function_decl_ctx) 884 return; 885 886 clang::CXXMethodDecl *method_decl = 887 ClangASTContext::DeclContextGetAsCXXMethodDecl(function_decl_ctx); 888 889 if (method_decl) { 890 clang::CXXRecordDecl *class_decl = method_decl->getParent(); 891 892 QualType class_qual_type(class_decl->getTypeForDecl(), 0); 893 894 TypeFromUser class_user_type( 895 class_qual_type.getAsOpaquePtr(), 896 ClangASTContext::GetASTContext(&class_decl->getASTContext())); 897 898 if (log) { 899 ASTDumper ast_dumper(class_qual_type); 900 LLDB_LOGF(log, " CEDM::FEVD[%u] Adding type for $__lldb_class: %s", 901 current_id, ast_dumper.GetCString()); 902 } 903 904 AddThisType(context, class_user_type, current_id); 905 906 if (method_decl->isInstance()) { 907 // self is a pointer to the object 908 909 QualType class_pointer_type = 910 method_decl->getASTContext().getPointerType(class_qual_type); 911 912 TypeFromUser self_user_type( 913 class_pointer_type.getAsOpaquePtr(), 914 ClangASTContext::GetASTContext(&method_decl->getASTContext())); 915 916 m_struct_vars->m_object_pointer_type = self_user_type; 917 } 918 } else { 919 // This branch will get hit if we are executing code in the context of 920 // a function that claims to have an object pointer (through 921 // DW_AT_object_pointer?) but is not formally a method of the class. 922 // In that case, just look up the "this" variable in the current scope 923 // and use its type. 924 // FIXME: This code is formally correct, but clang doesn't currently 925 // emit DW_AT_object_pointer 926 // for C++ so it hasn't actually been tested. 927 928 VariableList *vars = frame->GetVariableList(false); 929 930 lldb::VariableSP this_var = vars->FindVariable(ConstString("this")); 931 932 if (this_var && this_var->IsInScope(frame) && 933 this_var->LocationIsValidForFrame(frame)) { 934 Type *this_type = this_var->GetType(); 935 936 if (!this_type) 937 return; 938 939 TypeFromUser pointee_type = 940 this_type->GetForwardCompilerType().GetPointeeType(); 941 942 if (pointee_type.IsValid()) { 943 if (log) { 944 ASTDumper ast_dumper(pointee_type); 945 LLDB_LOGF(log, " FEVD[%u] Adding type for $__lldb_class: %s", 946 current_id, ast_dumper.GetCString()); 947 } 948 949 AddThisType(context, pointee_type, current_id); 950 TypeFromUser this_user_type(this_type->GetFullCompilerType()); 951 m_struct_vars->m_object_pointer_type = this_user_type; 952 return; 953 } 954 } 955 } 956 957 return; 958 } 959 960 static ConstString g_lldb_objc_class_name("$__lldb_objc_class"); 961 if (name == g_lldb_objc_class_name) { 962 if (m_ctx_obj) { 963 Status status; 964 lldb::ValueObjectSP ctx_obj_ptr = m_ctx_obj->AddressOf(status); 965 if (!ctx_obj_ptr || status.Fail()) 966 return; 967 968 AddOneType(context, TypeFromUser(m_ctx_obj->GetCompilerType()), 969 current_id); 970 971 m_struct_vars->m_object_pointer_type = 972 TypeFromUser(ctx_obj_ptr->GetCompilerType()); 973 974 return; 975 } 976 977 // Clang is looking for the type of "*self" 978 979 if (!frame) 980 return; 981 982 SymbolContext sym_ctx = frame->GetSymbolContext( 983 lldb::eSymbolContextFunction | lldb::eSymbolContextBlock); 984 985 // Find the block that defines the function represented by "sym_ctx" 986 Block *function_block = sym_ctx.GetFunctionBlock(); 987 988 if (!function_block) 989 return; 990 991 CompilerDeclContext function_decl_ctx = function_block->GetDeclContext(); 992 993 if (!function_decl_ctx) 994 return; 995 996 clang::ObjCMethodDecl *method_decl = 997 ClangASTContext::DeclContextGetAsObjCMethodDecl(function_decl_ctx); 998 999 if (method_decl) { 1000 ObjCInterfaceDecl *self_interface = method_decl->getClassInterface(); 1001 1002 if (!self_interface) 1003 return; 1004 1005 const clang::Type *interface_type = self_interface->getTypeForDecl(); 1006 1007 if (!interface_type) 1008 return; // This is unlikely, but we have seen crashes where this 1009 // occurred 1010 1011 TypeFromUser class_user_type( 1012 QualType(interface_type, 0).getAsOpaquePtr(), 1013 ClangASTContext::GetASTContext(&method_decl->getASTContext())); 1014 1015 if (log) { 1016 ASTDumper ast_dumper(interface_type); 1017 LLDB_LOGF(log, " FEVD[%u] Adding type for $__lldb_objc_class: %s", 1018 current_id, ast_dumper.GetCString()); 1019 } 1020 1021 AddOneType(context, class_user_type, current_id); 1022 1023 if (method_decl->isInstanceMethod()) { 1024 // self is a pointer to the object 1025 1026 QualType class_pointer_type = 1027 method_decl->getASTContext().getObjCObjectPointerType( 1028 QualType(interface_type, 0)); 1029 1030 TypeFromUser self_user_type( 1031 class_pointer_type.getAsOpaquePtr(), 1032 ClangASTContext::GetASTContext(&method_decl->getASTContext())); 1033 1034 m_struct_vars->m_object_pointer_type = self_user_type; 1035 } else { 1036 // self is a Class pointer 1037 QualType class_type = method_decl->getASTContext().getObjCClassType(); 1038 1039 TypeFromUser self_user_type( 1040 class_type.getAsOpaquePtr(), 1041 ClangASTContext::GetASTContext(&method_decl->getASTContext())); 1042 1043 m_struct_vars->m_object_pointer_type = self_user_type; 1044 } 1045 1046 return; 1047 } else { 1048 // This branch will get hit if we are executing code in the context of 1049 // a function that claims to have an object pointer (through 1050 // DW_AT_object_pointer?) but is not formally a method of the class. 1051 // In that case, just look up the "self" variable in the current scope 1052 // and use its type. 1053 1054 VariableList *vars = frame->GetVariableList(false); 1055 1056 lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); 1057 1058 if (self_var && self_var->IsInScope(frame) && 1059 self_var->LocationIsValidForFrame(frame)) { 1060 Type *self_type = self_var->GetType(); 1061 1062 if (!self_type) 1063 return; 1064 1065 CompilerType self_clang_type = self_type->GetFullCompilerType(); 1066 1067 if (ClangASTContext::IsObjCClassType(self_clang_type)) { 1068 return; 1069 } else if (ClangASTContext::IsObjCObjectPointerType( 1070 self_clang_type)) { 1071 self_clang_type = self_clang_type.GetPointeeType(); 1072 1073 if (!self_clang_type) 1074 return; 1075 1076 if (log) { 1077 ASTDumper ast_dumper(self_type->GetFullCompilerType()); 1078 LLDB_LOGF(log, 1079 " FEVD[%u] Adding type for $__lldb_objc_class: %s", 1080 current_id, ast_dumper.GetCString()); 1081 } 1082 1083 TypeFromUser class_user_type(self_clang_type); 1084 1085 AddOneType(context, class_user_type, current_id); 1086 1087 TypeFromUser self_user_type(self_type->GetFullCompilerType()); 1088 1089 m_struct_vars->m_object_pointer_type = self_user_type; 1090 return; 1091 } 1092 } 1093 } 1094 1095 return; 1096 } 1097 1098 if (name == ConstString(g_lldb_local_vars_namespace_cstr)) { 1099 CompilerDeclContext frame_decl_context = 1100 sym_ctx.block != nullptr ? sym_ctx.block->GetDeclContext() 1101 : CompilerDeclContext(); 1102 1103 if (frame_decl_context) { 1104 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>( 1105 frame_decl_context.GetTypeSystem()); 1106 1107 if (ast) { 1108 clang::NamespaceDecl *namespace_decl = 1109 ClangASTContext::GetUniqueNamespaceDeclaration( 1110 m_ast_context, name.GetCString(), nullptr); 1111 if (namespace_decl) { 1112 context.AddNamedDecl(namespace_decl); 1113 clang::DeclContext *clang_decl_ctx = 1114 clang::Decl::castToDeclContext(namespace_decl); 1115 clang_decl_ctx->setHasExternalVisibleStorage(true); 1116 context.m_found.local_vars_nsp = true; 1117 } 1118 } 1119 } 1120 1121 return; 1122 } 1123 1124 // any other $__lldb names should be weeded out now 1125 if (name.GetStringRef().startswith("$__lldb")) 1126 return; 1127 1128 ExpressionVariableSP pvar_sp( 1129 m_parser_vars->m_persistent_vars->GetVariable(name)); 1130 1131 if (pvar_sp) { 1132 AddOneVariable(context, pvar_sp, current_id); 1133 return; 1134 } 1135 1136 const char *reg_name(&name.GetCString()[1]); 1137 1138 if (m_parser_vars->m_exe_ctx.GetRegisterContext()) { 1139 const RegisterInfo *reg_info( 1140 m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName( 1141 reg_name)); 1142 1143 if (reg_info) { 1144 LLDB_LOGF(log, " CEDM::FEVD[%u] Found register %s", current_id, 1145 reg_info->name); 1146 1147 AddOneRegister(context, reg_info, current_id); 1148 } 1149 } 1150 } else { 1151 ValueObjectSP valobj; 1152 VariableSP var; 1153 1154 bool local_var_lookup = 1155 !namespace_decl || (namespace_decl.GetName() == 1156 ConstString(g_lldb_local_vars_namespace_cstr)); 1157 if (frame && local_var_lookup) { 1158 CompilerDeclContext compiler_decl_context = 1159 sym_ctx.block != nullptr ? sym_ctx.block->GetDeclContext() 1160 : CompilerDeclContext(); 1161 1162 if (compiler_decl_context) { 1163 // Make sure that the variables are parsed so that we have the 1164 // declarations. 1165 VariableListSP vars = frame->GetInScopeVariableList(true); 1166 for (size_t i = 0; i < vars->GetSize(); i++) 1167 vars->GetVariableAtIndex(i)->GetDecl(); 1168 1169 // Search for declarations matching the name. Do not include imported 1170 // decls in the search if we are looking for decls in the artificial 1171 // namespace $__lldb_local_vars. 1172 std::vector<CompilerDecl> found_decls = 1173 compiler_decl_context.FindDeclByName(name, 1174 namespace_decl.IsValid()); 1175 1176 bool variable_found = false; 1177 for (CompilerDecl decl : found_decls) { 1178 for (size_t vi = 0, ve = vars->GetSize(); vi != ve; ++vi) { 1179 VariableSP candidate_var = vars->GetVariableAtIndex(vi); 1180 if (candidate_var->GetDecl() == decl) { 1181 var = candidate_var; 1182 break; 1183 } 1184 } 1185 1186 if (var && !variable_found) { 1187 variable_found = true; 1188 valobj = ValueObjectVariable::Create(frame, var); 1189 AddOneVariable(context, var, valobj, current_id); 1190 context.m_found.variable = true; 1191 } 1192 } 1193 if (variable_found) 1194 return; 1195 } 1196 } 1197 if (target) { 1198 var = FindGlobalVariable(*target, module_sp, name, &namespace_decl, 1199 nullptr); 1200 1201 if (var) { 1202 valobj = ValueObjectVariable::Create(target, var); 1203 AddOneVariable(context, var, valobj, current_id); 1204 context.m_found.variable = true; 1205 return; 1206 } 1207 } 1208 1209 std::vector<clang::NamedDecl *> decls_from_modules; 1210 1211 if (target) { 1212 if (ClangModulesDeclVendor *decl_vendor = 1213 target->GetClangModulesDeclVendor()) { 1214 decl_vendor->FindDecls(name, false, UINT32_MAX, decls_from_modules); 1215 } 1216 } 1217 1218 const bool include_inlines = false; 1219 sc_list.Clear(); 1220 if (namespace_decl && module_sp) { 1221 const bool include_symbols = false; 1222 1223 module_sp->FindFunctions(name, &namespace_decl, eFunctionNameTypeBase, 1224 include_symbols, include_inlines, sc_list); 1225 } else if (target && !namespace_decl) { 1226 const bool include_symbols = true; 1227 1228 // TODO Fix FindFunctions so that it doesn't return 1229 // instance methods for eFunctionNameTypeBase. 1230 1231 target->GetImages().FindFunctions(name, eFunctionNameTypeFull, 1232 include_symbols, include_inlines, 1233 sc_list); 1234 } 1235 1236 // If we found more than one function, see if we can use the frame's decl 1237 // context to remove functions that are shadowed by other functions which 1238 // match in type but are nearer in scope. 1239 // 1240 // AddOneFunction will not add a function whose type has already been 1241 // added, so if there's another function in the list with a matching type, 1242 // check to see if their decl context is a parent of the current frame's or 1243 // was imported via a and using statement, and pick the best match 1244 // according to lookup rules. 1245 if (sc_list.GetSize() > 1) { 1246 // Collect some info about our frame's context. 1247 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 1248 SymbolContext frame_sym_ctx; 1249 if (frame != nullptr) 1250 frame_sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction | 1251 lldb::eSymbolContextBlock); 1252 CompilerDeclContext frame_decl_context = 1253 frame_sym_ctx.block != nullptr ? frame_sym_ctx.block->GetDeclContext() 1254 : CompilerDeclContext(); 1255 1256 // We can't do this without a compiler decl context for our frame. 1257 if (frame_decl_context) { 1258 clang::DeclContext *frame_decl_ctx = 1259 (clang::DeclContext *)frame_decl_context.GetOpaqueDeclContext(); 1260 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>( 1261 frame_decl_context.GetTypeSystem()); 1262 1263 // Structure to hold the info needed when comparing function 1264 // declarations. 1265 struct FuncDeclInfo { 1266 ConstString m_name; 1267 CompilerType m_copied_type; 1268 uint32_t m_decl_lvl; 1269 SymbolContext m_sym_ctx; 1270 }; 1271 1272 // First, symplify things by looping through the symbol contexts to 1273 // remove unwanted functions and separate out the functions we want to 1274 // compare and prune into a separate list. Cache the info needed about 1275 // the function declarations in a vector for efficiency. 1276 SymbolContextList sc_sym_list; 1277 uint32_t num_indices = sc_list.GetSize(); 1278 std::vector<FuncDeclInfo> fdi_cache; 1279 fdi_cache.reserve(num_indices); 1280 for (uint32_t index = 0; index < num_indices; ++index) { 1281 FuncDeclInfo fdi; 1282 SymbolContext sym_ctx; 1283 sc_list.GetContextAtIndex(index, sym_ctx); 1284 1285 // We don't know enough about symbols to compare them, but we should 1286 // keep them in the list. 1287 Function *function = sym_ctx.function; 1288 if (!function) { 1289 sc_sym_list.Append(sym_ctx); 1290 continue; 1291 } 1292 // Filter out functions without declaration contexts, as well as 1293 // class/instance methods, since they'll be skipped in the code that 1294 // follows anyway. 1295 CompilerDeclContext func_decl_context = function->GetDeclContext(); 1296 if (!func_decl_context || 1297 func_decl_context.IsClassMethod(nullptr, nullptr, nullptr)) 1298 continue; 1299 // We can only prune functions for which we can copy the type. 1300 CompilerType func_clang_type = 1301 function->GetType()->GetFullCompilerType(); 1302 CompilerType copied_func_type = GuardedCopyType(func_clang_type); 1303 if (!copied_func_type) { 1304 sc_sym_list.Append(sym_ctx); 1305 continue; 1306 } 1307 1308 fdi.m_sym_ctx = sym_ctx; 1309 fdi.m_name = function->GetName(); 1310 fdi.m_copied_type = copied_func_type; 1311 fdi.m_decl_lvl = LLDB_INVALID_DECL_LEVEL; 1312 if (fdi.m_copied_type && func_decl_context) { 1313 // Call CountDeclLevels to get the number of parent scopes we have 1314 // to look through before we find the function declaration. When 1315 // comparing functions of the same type, the one with a lower count 1316 // will be closer to us in the lookup scope and shadows the other. 1317 clang::DeclContext *func_decl_ctx = 1318 (clang::DeclContext *)func_decl_context.GetOpaqueDeclContext(); 1319 fdi.m_decl_lvl = ast->CountDeclLevels( 1320 frame_decl_ctx, func_decl_ctx, &fdi.m_name, &fdi.m_copied_type); 1321 } 1322 fdi_cache.emplace_back(fdi); 1323 } 1324 1325 // Loop through the functions in our cache looking for matching types, 1326 // then compare their scope levels to see which is closer. 1327 std::multimap<CompilerType, const FuncDeclInfo *> matches; 1328 for (const FuncDeclInfo &fdi : fdi_cache) { 1329 const CompilerType t = fdi.m_copied_type; 1330 auto q = matches.find(t); 1331 if (q != matches.end()) { 1332 if (q->second->m_decl_lvl > fdi.m_decl_lvl) 1333 // This function is closer; remove the old set. 1334 matches.erase(t); 1335 else if (q->second->m_decl_lvl < fdi.m_decl_lvl) 1336 // The functions in our set are closer - skip this one. 1337 continue; 1338 } 1339 matches.insert(std::make_pair(t, &fdi)); 1340 } 1341 1342 // Loop through our matches and add their symbol contexts to our list. 1343 SymbolContextList sc_func_list; 1344 for (const auto &q : matches) 1345 sc_func_list.Append(q.second->m_sym_ctx); 1346 1347 // Rejoin the lists with the functions in front. 1348 sc_list = sc_func_list; 1349 sc_list.Append(sc_sym_list); 1350 } 1351 } 1352 1353 if (sc_list.GetSize()) { 1354 Symbol *extern_symbol = nullptr; 1355 Symbol *non_extern_symbol = nullptr; 1356 1357 for (uint32_t index = 0, num_indices = sc_list.GetSize(); 1358 index < num_indices; ++index) { 1359 SymbolContext sym_ctx; 1360 sc_list.GetContextAtIndex(index, sym_ctx); 1361 1362 if (sym_ctx.function) { 1363 CompilerDeclContext decl_ctx = sym_ctx.function->GetDeclContext(); 1364 1365 if (!decl_ctx) 1366 continue; 1367 1368 // Filter out class/instance methods. 1369 if (decl_ctx.IsClassMethod(nullptr, nullptr, nullptr)) 1370 continue; 1371 1372 AddOneFunction(context, sym_ctx.function, nullptr, current_id); 1373 context.m_found.function_with_type_info = true; 1374 context.m_found.function = true; 1375 } else if (sym_ctx.symbol) { 1376 if (sym_ctx.symbol->GetType() == eSymbolTypeReExported && target) { 1377 sym_ctx.symbol = sym_ctx.symbol->ResolveReExportedSymbol(*target); 1378 if (sym_ctx.symbol == nullptr) 1379 continue; 1380 } 1381 1382 if (sym_ctx.symbol->IsExternal()) 1383 extern_symbol = sym_ctx.symbol; 1384 else 1385 non_extern_symbol = sym_ctx.symbol; 1386 } 1387 } 1388 1389 if (!context.m_found.function_with_type_info) { 1390 for (clang::NamedDecl *decl : decls_from_modules) { 1391 if (llvm::isa<clang::FunctionDecl>(decl)) { 1392 clang::NamedDecl *copied_decl = 1393 llvm::cast_or_null<FunctionDecl>(CopyDecl(decl)); 1394 if (copied_decl) { 1395 context.AddNamedDecl(copied_decl); 1396 context.m_found.function_with_type_info = true; 1397 } 1398 } 1399 } 1400 } 1401 1402 if (!context.m_found.function_with_type_info) { 1403 if (extern_symbol) { 1404 AddOneFunction(context, nullptr, extern_symbol, current_id); 1405 context.m_found.function = true; 1406 } else if (non_extern_symbol) { 1407 AddOneFunction(context, nullptr, non_extern_symbol, current_id); 1408 context.m_found.function = true; 1409 } 1410 } 1411 } 1412 1413 if (!context.m_found.function_with_type_info) { 1414 // Try the modules next. 1415 1416 do { 1417 if (ClangModulesDeclVendor *modules_decl_vendor = 1418 m_target->GetClangModulesDeclVendor()) { 1419 bool append = false; 1420 uint32_t max_matches = 1; 1421 std::vector<clang::NamedDecl *> decls; 1422 1423 if (!modules_decl_vendor->FindDecls(name, append, max_matches, decls)) 1424 break; 1425 1426 clang::NamedDecl *const decl_from_modules = decls[0]; 1427 1428 if (llvm::isa<clang::FunctionDecl>(decl_from_modules)) { 1429 if (log) { 1430 LLDB_LOGF(log, 1431 " CAS::FEVD[%u] Matching function found for " 1432 "\"%s\" in the modules", 1433 current_id, name.GetCString()); 1434 } 1435 1436 clang::Decl *copied_decl = CopyDecl(decl_from_modules); 1437 clang::FunctionDecl *copied_function_decl = 1438 copied_decl ? dyn_cast<clang::FunctionDecl>(copied_decl) 1439 : nullptr; 1440 1441 if (!copied_function_decl) { 1442 LLDB_LOGF(log, 1443 " CAS::FEVD[%u] - Couldn't export a function " 1444 "declaration from the modules", 1445 current_id); 1446 1447 break; 1448 } 1449 1450 MaybeRegisterFunctionBody(copied_function_decl); 1451 1452 context.AddNamedDecl(copied_function_decl); 1453 1454 context.m_found.function_with_type_info = true; 1455 context.m_found.function = true; 1456 } else if (llvm::isa<clang::VarDecl>(decl_from_modules)) { 1457 if (log) { 1458 LLDB_LOGF(log, 1459 " CAS::FEVD[%u] Matching variable found for " 1460 "\"%s\" in the modules", 1461 current_id, name.GetCString()); 1462 } 1463 1464 clang::Decl *copied_decl = CopyDecl(decl_from_modules); 1465 clang::VarDecl *copied_var_decl = 1466 copied_decl ? dyn_cast_or_null<clang::VarDecl>(copied_decl) 1467 : nullptr; 1468 1469 if (!copied_var_decl) { 1470 LLDB_LOGF(log, 1471 " CAS::FEVD[%u] - Couldn't export a variable " 1472 "declaration from the modules", 1473 current_id); 1474 1475 break; 1476 } 1477 1478 context.AddNamedDecl(copied_var_decl); 1479 1480 context.m_found.variable = true; 1481 } 1482 } 1483 } while (false); 1484 } 1485 1486 if (target && !context.m_found.variable && !namespace_decl) { 1487 // We couldn't find a non-symbol variable for this. Now we'll hunt for a 1488 // generic data symbol, and -- if it is found -- treat it as a variable. 1489 Status error; 1490 1491 const Symbol *data_symbol = 1492 m_parser_vars->m_sym_ctx.FindBestGlobalDataSymbol(name, error); 1493 1494 if (!error.Success()) { 1495 const unsigned diag_id = 1496 m_ast_context->getDiagnostics().getCustomDiagID( 1497 clang::DiagnosticsEngine::Level::Error, "%0"); 1498 m_ast_context->getDiagnostics().Report(diag_id) << error.AsCString(); 1499 } 1500 1501 if (data_symbol) { 1502 std::string warning("got name from symbols: "); 1503 warning.append(name.AsCString()); 1504 const unsigned diag_id = 1505 m_ast_context->getDiagnostics().getCustomDiagID( 1506 clang::DiagnosticsEngine::Level::Warning, "%0"); 1507 m_ast_context->getDiagnostics().Report(diag_id) << warning.c_str(); 1508 AddOneGenericVariable(context, *data_symbol, current_id); 1509 context.m_found.variable = true; 1510 } 1511 } 1512 } 1513 } 1514 1515 bool ClangExpressionDeclMap::GetVariableValue(VariableSP &var, 1516 lldb_private::Value &var_location, 1517 TypeFromUser *user_type, 1518 TypeFromParser *parser_type) { 1519 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1520 1521 Type *var_type = var->GetType(); 1522 1523 if (!var_type) { 1524 if (log) 1525 log->PutCString("Skipped a definition because it has no type"); 1526 return false; 1527 } 1528 1529 CompilerType var_clang_type = var_type->GetFullCompilerType(); 1530 1531 if (!var_clang_type) { 1532 if (log) 1533 log->PutCString("Skipped a definition because it has no Clang type"); 1534 return false; 1535 } 1536 1537 ClangASTContext *clang_ast = llvm::dyn_cast_or_null<ClangASTContext>( 1538 var_type->GetForwardCompilerType().GetTypeSystem()); 1539 1540 if (!clang_ast) { 1541 if (log) 1542 log->PutCString("Skipped a definition because it has no Clang AST"); 1543 return false; 1544 } 1545 1546 ASTContext *ast = clang_ast->getASTContext(); 1547 1548 if (!ast) { 1549 if (log) 1550 log->PutCString( 1551 "There is no AST context for the current execution context"); 1552 return false; 1553 } 1554 1555 DWARFExpression &var_location_expr = var->LocationExpression(); 1556 1557 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1558 Status err; 1559 1560 if (var->GetLocationIsConstantValueData()) { 1561 DataExtractor const_value_extractor; 1562 1563 if (var_location_expr.GetExpressionData(const_value_extractor)) { 1564 var_location = Value(const_value_extractor.GetDataStart(), 1565 const_value_extractor.GetByteSize()); 1566 var_location.SetValueType(Value::eValueTypeHostAddress); 1567 } else { 1568 LLDB_LOGF(log, "Error evaluating constant variable: %s", err.AsCString()); 1569 return false; 1570 } 1571 } 1572 1573 CompilerType type_to_use = GuardedCopyType(var_clang_type); 1574 1575 if (!type_to_use) { 1576 LLDB_LOGF(log, 1577 "Couldn't copy a variable's type into the parser's AST context"); 1578 1579 return false; 1580 } 1581 1582 if (parser_type) 1583 *parser_type = TypeFromParser(type_to_use); 1584 1585 if (var_location.GetContextType() == Value::eContextTypeInvalid) 1586 var_location.SetCompilerType(type_to_use); 1587 1588 if (var_location.GetValueType() == Value::eValueTypeFileAddress) { 1589 SymbolContext var_sc; 1590 var->CalculateSymbolContext(&var_sc); 1591 1592 if (!var_sc.module_sp) 1593 return false; 1594 1595 Address so_addr(var_location.GetScalar().ULongLong(), 1596 var_sc.module_sp->GetSectionList()); 1597 1598 lldb::addr_t load_addr = so_addr.GetLoadAddress(target); 1599 1600 if (load_addr != LLDB_INVALID_ADDRESS) { 1601 var_location.GetScalar() = load_addr; 1602 var_location.SetValueType(Value::eValueTypeLoadAddress); 1603 } 1604 } 1605 1606 if (user_type) 1607 *user_type = TypeFromUser(var_clang_type); 1608 1609 return true; 1610 } 1611 1612 void ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 1613 VariableSP var, 1614 ValueObjectSP valobj, 1615 unsigned int current_id) { 1616 assert(m_parser_vars.get()); 1617 1618 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1619 1620 TypeFromUser ut; 1621 TypeFromParser pt; 1622 Value var_location; 1623 1624 if (!GetVariableValue(var, var_location, &ut, &pt)) 1625 return; 1626 1627 clang::QualType parser_opaque_type = 1628 QualType::getFromOpaquePtr(pt.GetOpaqueQualType()); 1629 1630 if (parser_opaque_type.isNull()) 1631 return; 1632 1633 if (const clang::Type *parser_type = parser_opaque_type.getTypePtr()) { 1634 if (const TagType *tag_type = dyn_cast<TagType>(parser_type)) 1635 CompleteType(tag_type->getDecl()); 1636 if (const ObjCObjectPointerType *objc_object_ptr_type = 1637 dyn_cast<ObjCObjectPointerType>(parser_type)) 1638 CompleteType(objc_object_ptr_type->getInterfaceDecl()); 1639 } 1640 1641 bool is_reference = pt.IsReferenceType(); 1642 1643 NamedDecl *var_decl = nullptr; 1644 if (is_reference) 1645 var_decl = context.AddVarDecl(pt); 1646 else 1647 var_decl = context.AddVarDecl(pt.GetLValueReferenceType()); 1648 1649 std::string decl_name(context.m_decl_name.getAsString()); 1650 ConstString entity_name(decl_name.c_str()); 1651 ClangExpressionVariable *entity(new ClangExpressionVariable(valobj)); 1652 m_found_entities.AddNewlyConstructedVariable(entity); 1653 1654 assert(entity); 1655 entity->EnableParserVars(GetParserID()); 1656 ClangExpressionVariable::ParserVars *parser_vars = 1657 entity->GetParserVars(GetParserID()); 1658 parser_vars->m_parser_type = pt; 1659 parser_vars->m_named_decl = var_decl; 1660 parser_vars->m_llvm_value = nullptr; 1661 parser_vars->m_lldb_value = var_location; 1662 parser_vars->m_lldb_var = var; 1663 1664 if (is_reference) 1665 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference; 1666 1667 if (log) { 1668 ASTDumper orig_dumper(ut.GetOpaqueQualType()); 1669 ASTDumper ast_dumper(var_decl); 1670 LLDB_LOGF(log, 1671 " CEDM::FEVD[%u] Found variable %s, returned %s (original %s)", 1672 current_id, decl_name.c_str(), ast_dumper.GetCString(), 1673 orig_dumper.GetCString()); 1674 } 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 if (log) { 1707 ASTDumper ast_dumper(var_decl); 1708 LLDB_LOGF(log, " CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, 1709 pvar_sp->GetName().GetCString(), ast_dumper.GetCString()); 1710 } 1711 } 1712 1713 void ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context, 1714 const Symbol &symbol, 1715 unsigned int current_id) { 1716 assert(m_parser_vars.get()); 1717 1718 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1719 1720 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1721 1722 if (target == nullptr) 1723 return; 1724 1725 ASTContext *scratch_ast_context = 1726 target->GetScratchClangASTContext()->getASTContext(); 1727 1728 TypeFromUser user_type( 1729 ClangASTContext::GetBasicType(scratch_ast_context, eBasicTypeVoid) 1730 .GetPointerType() 1731 .GetLValueReferenceType()); 1732 TypeFromParser parser_type( 1733 ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid) 1734 .GetPointerType() 1735 .GetLValueReferenceType()); 1736 NamedDecl *var_decl = context.AddVarDecl(parser_type); 1737 1738 std::string decl_name(context.m_decl_name.getAsString()); 1739 ConstString entity_name(decl_name.c_str()); 1740 ClangExpressionVariable *entity(new ClangExpressionVariable( 1741 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), entity_name, 1742 user_type, m_parser_vars->m_target_info.byte_order, 1743 m_parser_vars->m_target_info.address_byte_size)); 1744 m_found_entities.AddNewlyConstructedVariable(entity); 1745 1746 entity->EnableParserVars(GetParserID()); 1747 ClangExpressionVariable::ParserVars *parser_vars = 1748 entity->GetParserVars(GetParserID()); 1749 1750 const Address symbol_address = symbol.GetAddress(); 1751 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target); 1752 1753 // parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, 1754 // user_type.GetOpaqueQualType()); 1755 parser_vars->m_lldb_value.SetCompilerType(user_type); 1756 parser_vars->m_lldb_value.GetScalar() = symbol_load_addr; 1757 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress); 1758 1759 parser_vars->m_parser_type = parser_type; 1760 parser_vars->m_named_decl = var_decl; 1761 parser_vars->m_llvm_value = nullptr; 1762 parser_vars->m_lldb_sym = &symbol; 1763 1764 if (log) { 1765 ASTDumper ast_dumper(var_decl); 1766 1767 LLDB_LOGF(log, " CEDM::FEVD[%u] Found variable %s, returned %s", 1768 current_id, decl_name.c_str(), ast_dumper.GetCString()); 1769 } 1770 } 1771 1772 bool ClangExpressionDeclMap::ResolveUnknownTypes() { 1773 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1774 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1775 1776 ClangASTContextForExpressions *scratch_ast_context = 1777 static_cast<ClangASTContextForExpressions *>( 1778 target->GetScratchClangASTContext()); 1779 1780 for (size_t index = 0, num_entities = m_found_entities.GetSize(); 1781 index < num_entities; ++index) { 1782 ExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index); 1783 1784 ClangExpressionVariable::ParserVars *parser_vars = 1785 llvm::cast<ClangExpressionVariable>(entity.get()) 1786 ->GetParserVars(GetParserID()); 1787 1788 if (entity->m_flags & ClangExpressionVariable::EVUnknownType) { 1789 const NamedDecl *named_decl = parser_vars->m_named_decl; 1790 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl); 1791 1792 if (!var_decl) { 1793 LLDB_LOGF(log, "Entity of unknown type does not have a VarDecl"); 1794 return false; 1795 } 1796 1797 if (log) { 1798 ASTDumper ast_dumper(const_cast<VarDecl *>(var_decl)); 1799 LLDB_LOGF(log, "Variable of unknown type now has Decl %s", 1800 ast_dumper.GetCString()); 1801 } 1802 1803 QualType var_type = var_decl->getType(); 1804 TypeFromParser parser_type( 1805 var_type.getAsOpaquePtr(), 1806 ClangASTContext::GetASTContext(&var_decl->getASTContext())); 1807 1808 lldb::opaque_compiler_type_t copied_type = nullptr; 1809 if (m_ast_importer_sp) { 1810 copied_type = m_ast_importer_sp->CopyType( 1811 scratch_ast_context->getASTContext(), &var_decl->getASTContext(), 1812 var_type.getAsOpaquePtr()); 1813 } else if (HasMerger()) { 1814 copied_type = CopyTypeWithMerger( 1815 var_decl->getASTContext(), 1816 scratch_ast_context->GetMergerUnchecked(), var_type) 1817 .getAsOpaquePtr(); 1818 } else { 1819 lldbassert(0 && "No mechanism to copy a resolved unknown type!"); 1820 return false; 1821 } 1822 1823 if (!copied_type) { 1824 LLDB_LOGF(log, "ClangExpressionDeclMap::ResolveUnknownType - Couldn't " 1825 "import the type for a variable"); 1826 1827 return (bool)lldb::ExpressionVariableSP(); 1828 } 1829 1830 TypeFromUser user_type(copied_type, scratch_ast_context); 1831 1832 // parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, 1833 // user_type.GetOpaqueQualType()); 1834 parser_vars->m_lldb_value.SetCompilerType(user_type); 1835 parser_vars->m_parser_type = parser_type; 1836 1837 entity->SetCompilerType(user_type); 1838 1839 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType); 1840 } 1841 } 1842 1843 return true; 1844 } 1845 1846 void ClangExpressionDeclMap::AddOneRegister(NameSearchContext &context, 1847 const RegisterInfo *reg_info, 1848 unsigned int current_id) { 1849 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1850 1851 CompilerType clang_type = 1852 ClangASTContext::GetBuiltinTypeForEncodingAndBitSize( 1853 m_ast_context, reg_info->encoding, reg_info->byte_size * 8); 1854 1855 if (!clang_type) { 1856 LLDB_LOGF(log, " Tried to add a type for %s, but couldn't get one", 1857 context.m_decl_name.getAsString().c_str()); 1858 return; 1859 } 1860 1861 TypeFromParser parser_clang_type(clang_type); 1862 1863 NamedDecl *var_decl = context.AddVarDecl(parser_clang_type); 1864 1865 ClangExpressionVariable *entity(new ClangExpressionVariable( 1866 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 1867 m_parser_vars->m_target_info.byte_order, 1868 m_parser_vars->m_target_info.address_byte_size)); 1869 m_found_entities.AddNewlyConstructedVariable(entity); 1870 1871 std::string decl_name(context.m_decl_name.getAsString()); 1872 entity->SetName(ConstString(decl_name.c_str())); 1873 entity->SetRegisterInfo(reg_info); 1874 entity->EnableParserVars(GetParserID()); 1875 ClangExpressionVariable::ParserVars *parser_vars = 1876 entity->GetParserVars(GetParserID()); 1877 parser_vars->m_parser_type = parser_clang_type; 1878 parser_vars->m_named_decl = var_decl; 1879 parser_vars->m_llvm_value = nullptr; 1880 parser_vars->m_lldb_value.Clear(); 1881 entity->m_flags |= ClangExpressionVariable::EVBareRegister; 1882 1883 if (log) { 1884 ASTDumper ast_dumper(var_decl); 1885 LLDB_LOGF(log, " CEDM::FEVD[%d] Added register %s, returned %s", 1886 current_id, context.m_decl_name.getAsString().c_str(), 1887 ast_dumper.GetCString()); 1888 } 1889 } 1890 1891 void ClangExpressionDeclMap::AddOneFunction(NameSearchContext &context, 1892 Function *function, Symbol *symbol, 1893 unsigned int current_id) { 1894 assert(m_parser_vars.get()); 1895 1896 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1897 1898 NamedDecl *function_decl = nullptr; 1899 Address fun_address; 1900 CompilerType function_clang_type; 1901 1902 bool is_indirect_function = false; 1903 1904 if (function) { 1905 Type *function_type = function->GetType(); 1906 1907 const auto lang = function->GetCompileUnit()->GetLanguage(); 1908 const auto name = function->GetMangled().GetMangledName().AsCString(); 1909 const bool extern_c = (Language::LanguageIsC(lang) && 1910 !CPlusPlusLanguage::IsCPPMangledName(name)) || 1911 (Language::LanguageIsObjC(lang) && 1912 !Language::LanguageIsCPlusPlus(lang)); 1913 1914 if (!extern_c) { 1915 TypeSystem *type_system = function->GetDeclContext().GetTypeSystem(); 1916 if (llvm::isa<ClangASTContext>(type_system)) { 1917 clang::DeclContext *src_decl_context = 1918 (clang::DeclContext *)function->GetDeclContext() 1919 .GetOpaqueDeclContext(); 1920 clang::FunctionDecl *src_function_decl = 1921 llvm::dyn_cast_or_null<clang::FunctionDecl>(src_decl_context); 1922 if (src_function_decl && 1923 src_function_decl->getTemplateSpecializationInfo()) { 1924 clang::FunctionTemplateDecl *function_template = 1925 src_function_decl->getTemplateSpecializationInfo()->getTemplate(); 1926 clang::FunctionTemplateDecl *copied_function_template = 1927 llvm::dyn_cast_or_null<clang::FunctionTemplateDecl>( 1928 CopyDecl(function_template)); 1929 if (copied_function_template) { 1930 if (log) { 1931 ASTDumper ast_dumper((clang::Decl *)copied_function_template); 1932 1933 StreamString ss; 1934 1935 function->DumpSymbolContext(&ss); 1936 1937 log->Printf(" CEDM::FEVD[%u] Imported decl for function template" 1938 " %s (description %s), returned %s", 1939 current_id, 1940 copied_function_template->getNameAsString().c_str(), 1941 ss.GetData(), ast_dumper.GetCString()); 1942 } 1943 1944 context.AddNamedDecl(copied_function_template); 1945 } 1946 } else if (src_function_decl) { 1947 if (clang::FunctionDecl *copied_function_decl = 1948 llvm::dyn_cast_or_null<clang::FunctionDecl>( 1949 CopyDecl(src_function_decl))) { 1950 if (log) { 1951 ASTDumper ast_dumper((clang::Decl *)copied_function_decl); 1952 1953 StreamString ss; 1954 1955 function->DumpSymbolContext(&ss); 1956 1957 LLDB_LOGF(log, 1958 " CEDM::FEVD[%u] Imported decl for function %s " 1959 "(description %s), returned %s", 1960 current_id, 1961 copied_function_decl->getNameAsString().c_str(), 1962 ss.GetData(), ast_dumper.GetCString()); 1963 } 1964 1965 context.AddNamedDecl(copied_function_decl); 1966 return; 1967 } else { 1968 if (log) { 1969 LLDB_LOGF(log, " Failed to import the function decl for '%s'", 1970 src_function_decl->getName().str().c_str()); 1971 } 1972 } 1973 } 1974 } 1975 } 1976 1977 if (!function_type) { 1978 if (log) 1979 log->PutCString(" Skipped a function because it has no type"); 1980 return; 1981 } 1982 1983 function_clang_type = function_type->GetFullCompilerType(); 1984 1985 if (!function_clang_type) { 1986 if (log) 1987 log->PutCString(" Skipped a function because it has no Clang type"); 1988 return; 1989 } 1990 1991 fun_address = function->GetAddressRange().GetBaseAddress(); 1992 1993 CompilerType copied_function_type = GuardedCopyType(function_clang_type); 1994 if (copied_function_type) { 1995 function_decl = context.AddFunDecl(copied_function_type, extern_c); 1996 1997 if (!function_decl) { 1998 if (log) { 1999 LLDB_LOGF( 2000 log, 2001 " Failed to create a function decl for '%s' {0x%8.8" PRIx64 "}", 2002 function_type->GetName().GetCString(), function_type->GetID()); 2003 } 2004 2005 return; 2006 } 2007 } else { 2008 // We failed to copy the type we found 2009 if (log) { 2010 LLDB_LOGF(log, 2011 " Failed to import the function type '%s' {0x%8.8" PRIx64 2012 "} into the expression parser AST contenxt", 2013 function_type->GetName().GetCString(), 2014 function_type->GetID()); 2015 } 2016 2017 return; 2018 } 2019 } else if (symbol) { 2020 fun_address = symbol->GetAddress(); 2021 function_decl = context.AddGenericFunDecl(); 2022 is_indirect_function = symbol->IsIndirect(); 2023 } else { 2024 if (log) 2025 log->PutCString(" AddOneFunction called with no function and no symbol"); 2026 return; 2027 } 2028 2029 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 2030 2031 lldb::addr_t load_addr = 2032 fun_address.GetCallableLoadAddress(target, is_indirect_function); 2033 2034 ClangExpressionVariable *entity(new ClangExpressionVariable( 2035 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 2036 m_parser_vars->m_target_info.byte_order, 2037 m_parser_vars->m_target_info.address_byte_size)); 2038 m_found_entities.AddNewlyConstructedVariable(entity); 2039 2040 std::string decl_name(context.m_decl_name.getAsString()); 2041 entity->SetName(ConstString(decl_name.c_str())); 2042 entity->SetCompilerType(function_clang_type); 2043 entity->EnableParserVars(GetParserID()); 2044 2045 ClangExpressionVariable::ParserVars *parser_vars = 2046 entity->GetParserVars(GetParserID()); 2047 2048 if (load_addr != LLDB_INVALID_ADDRESS) { 2049 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress); 2050 parser_vars->m_lldb_value.GetScalar() = load_addr; 2051 } else { 2052 // We have to try finding a file address. 2053 2054 lldb::addr_t file_addr = fun_address.GetFileAddress(); 2055 2056 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeFileAddress); 2057 parser_vars->m_lldb_value.GetScalar() = file_addr; 2058 } 2059 2060 parser_vars->m_named_decl = function_decl; 2061 parser_vars->m_llvm_value = nullptr; 2062 2063 if (log) { 2064 std::string function_str = 2065 function_decl ? ASTDumper(function_decl).GetCString() : "nullptr"; 2066 2067 StreamString ss; 2068 2069 fun_address.Dump(&ss, 2070 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 2071 Address::DumpStyleResolvedDescription); 2072 2073 LLDB_LOGF( 2074 log, 2075 " CEDM::FEVD[%u] Found %s function %s (description %s), returned %s", 2076 current_id, (function ? "specific" : "generic"), decl_name.c_str(), 2077 ss.GetData(), function_str.c_str()); 2078 } 2079 } 2080 2081 void ClangExpressionDeclMap::AddThisType(NameSearchContext &context, 2082 const TypeFromUser &ut, 2083 unsigned int current_id) { 2084 CompilerType copied_clang_type = GuardedCopyType(ut); 2085 2086 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 2087 2088 if (!copied_clang_type) { 2089 if (log) 2090 LLDB_LOGF( 2091 log, 2092 "ClangExpressionDeclMap::AddThisType - Couldn't import the type"); 2093 2094 return; 2095 } 2096 2097 if (copied_clang_type.IsAggregateType() && 2098 copied_clang_type.GetCompleteType()) { 2099 CompilerType void_clang_type = 2100 ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid); 2101 CompilerType void_ptr_clang_type = void_clang_type.GetPointerType(); 2102 2103 CompilerType method_type = ClangASTContext::CreateFunctionType( 2104 m_ast_context, void_clang_type, &void_ptr_clang_type, 1, false, 0); 2105 2106 const bool is_virtual = false; 2107 const bool is_static = false; 2108 const bool is_inline = false; 2109 const bool is_explicit = false; 2110 const bool is_attr_used = true; 2111 const bool is_artificial = false; 2112 2113 CXXMethodDecl *method_decl = 2114 ClangASTContext::GetASTContext(m_ast_context) 2115 ->AddMethodToCXXRecordType( 2116 copied_clang_type.GetOpaqueQualType(), "$__lldb_expr", nullptr, 2117 method_type, lldb::eAccessPublic, is_virtual, is_static, 2118 is_inline, is_explicit, is_attr_used, is_artificial); 2119 2120 if (log) { 2121 ASTDumper method_ast_dumper((clang::Decl *)method_decl); 2122 ASTDumper type_ast_dumper(copied_clang_type); 2123 2124 LLDB_LOGF(log, 2125 " CEDM::AddThisType Added function $__lldb_expr " 2126 "(description %s) for this type %s", 2127 method_ast_dumper.GetCString(), type_ast_dumper.GetCString()); 2128 } 2129 } 2130 2131 if (!copied_clang_type.IsValid()) 2132 return; 2133 2134 TypeSourceInfo *type_source_info = m_ast_context->getTrivialTypeSourceInfo( 2135 QualType::getFromOpaquePtr(copied_clang_type.GetOpaqueQualType())); 2136 2137 if (!type_source_info) 2138 return; 2139 2140 // Construct a typedef type because if "*this" is a templated type we can't 2141 // just return ClassTemplateSpecializationDecls in response to name queries. 2142 // Using a typedef makes this much more robust. 2143 2144 TypedefDecl *typedef_decl = TypedefDecl::Create( 2145 *m_ast_context, m_ast_context->getTranslationUnitDecl(), SourceLocation(), 2146 SourceLocation(), context.m_decl_name.getAsIdentifierInfo(), 2147 type_source_info); 2148 2149 if (!typedef_decl) 2150 return; 2151 2152 context.AddNamedDecl(typedef_decl); 2153 2154 return; 2155 } 2156 2157 void ClangExpressionDeclMap::AddOneType(NameSearchContext &context, 2158 const TypeFromUser &ut, 2159 unsigned int current_id) { 2160 CompilerType copied_clang_type = GuardedCopyType(ut); 2161 2162 if (!copied_clang_type) { 2163 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 2164 2165 if (log) 2166 LLDB_LOGF( 2167 log, "ClangExpressionDeclMap::AddOneType - Couldn't import the type"); 2168 2169 return; 2170 } 2171 2172 context.AddTypeDecl(copied_clang_type); 2173 } 2174