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