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