diff options
Diffstat (limited to 'lldb/source/Expression/IRExecutionUnit.cpp')
| -rw-r--r-- | lldb/source/Expression/IRExecutionUnit.cpp | 69 |
1 files changed, 43 insertions, 26 deletions
diff --git a/lldb/source/Expression/IRExecutionUnit.cpp b/lldb/source/Expression/IRExecutionUnit.cpp index b10628e10cc5..e033b90cfd8b 100644 --- a/lldb/source/Expression/IRExecutionUnit.cpp +++ b/lldb/source/Expression/IRExecutionUnit.cpp @@ -348,7 +348,7 @@ void IRExecutionUnit::GetRunnableInfo(Status &error, lldb::addr_t &func_addr, return; } m_jitted_functions.push_back(JittedFunction( - function.getName().str().c_str(), external, (lldb::addr_t)fun_ptr)); + function.getName().str().c_str(), external, reinterpret_cast<uintptr_t>(fun_ptr))); } CommitAllocations(process_sp); @@ -728,8 +728,6 @@ void IRExecutionUnit::CollectCandidateCPlusPlusNames( if (best_alternate_mangled_name) { CPP_specs.push_back(best_alternate_mangled_name); } - - CPP_specs.push_back(SearchSpec(demangled, lldb::eFunctionNameTypeFull)); } } @@ -977,30 +975,49 @@ IRExecutionUnit::FindSymbol(lldb_private::ConstString name, bool &missing_weak) void IRExecutionUnit::GetStaticInitializers( std::vector<lldb::addr_t> &static_initializers) { - if (llvm::GlobalVariable *global_ctors = - m_module->getNamedGlobal("llvm.global_ctors")) { - if (llvm::ConstantArray *ctor_array = llvm::dyn_cast<llvm::ConstantArray>( - global_ctors->getInitializer())) { - for (llvm::Use &ctor_use : ctor_array->operands()) { - if (llvm::ConstantStruct *ctor_struct = - llvm::dyn_cast<llvm::ConstantStruct>(ctor_use)) { - lldbassert(ctor_struct->getNumOperands() == - 3); // this is standardized - if (llvm::Function *ctor_function = - llvm::dyn_cast<llvm::Function>(ctor_struct->getOperand(1))) { - ConstString ctor_function_name_cs(ctor_function->getName().str()); - - for (JittedFunction &jitted_function : m_jitted_functions) { - if (ctor_function_name_cs == jitted_function.m_name) { - if (jitted_function.m_remote_addr != LLDB_INVALID_ADDRESS) { - static_initializers.push_back(jitted_function.m_remote_addr); - } - break; - } - } - } - } + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); + + llvm::GlobalVariable *global_ctors = + m_module->getNamedGlobal("llvm.global_ctors"); + if (!global_ctors) { + LLDB_LOG(log, "Couldn't find llvm.global_ctors."); + return; + } + auto *ctor_array = + llvm::dyn_cast<llvm::ConstantArray>(global_ctors->getInitializer()); + if (!ctor_array) { + LLDB_LOG(log, "llvm.global_ctors not a ConstantArray."); + return; + } + + for (llvm::Use &ctor_use : ctor_array->operands()) { + auto *ctor_struct = llvm::dyn_cast<llvm::ConstantStruct>(ctor_use); + if (!ctor_struct) + continue; + // this is standardized + lldbassert(ctor_struct->getNumOperands() == 3); + auto *ctor_function = + llvm::dyn_cast<llvm::Function>(ctor_struct->getOperand(1)); + if (!ctor_function) { + LLDB_LOG(log, "global_ctor doesn't contain an llvm::Function"); + continue; + } + + ConstString ctor_function_name(ctor_function->getName().str()); + LLDB_LOG(log, "Looking for callable jitted function with name {0}.", + ctor_function_name); + + for (JittedFunction &jitted_function : m_jitted_functions) { + if (ctor_function_name != jitted_function.m_name) + continue; + if (jitted_function.m_remote_addr == LLDB_INVALID_ADDRESS) { + LLDB_LOG(log, "Found jitted function with invalid address."); + continue; } + static_initializers.push_back(jitted_function.m_remote_addr); + LLDB_LOG(log, "Calling function at address {0:x}.", + jitted_function.m_remote_addr); + break; } } } |
