diff options
-rw-r--r-- | lldb/source/Expression/ClangExpressionDeclMap.cpp | 21 | ||||
-rw-r--r-- | lldb/source/Expression/IRForTarget.cpp | 17 |
2 files changed, 28 insertions, 10 deletions
diff --git a/lldb/source/Expression/ClangExpressionDeclMap.cpp b/lldb/source/Expression/ClangExpressionDeclMap.cpp index 3c2913a7fc9..2f4440c1c6f 100644 --- a/lldb/source/Expression/ClangExpressionDeclMap.cpp +++ b/lldb/source/Expression/ClangExpressionDeclMap.cpp @@ -734,6 +734,9 @@ ClangExpressionDeclMap::GetDecls(NameSearchContext &context, m_sym_ctx->FindFunctionsByName(name_cs, false, sym_ctxs); + bool found_generic = false; + bool found_specific = false; + for (uint32_t index = 0, num_indices = sym_ctxs.GetSize(); index < num_indices; ++index) @@ -742,9 +745,21 @@ ClangExpressionDeclMap::GetDecls(NameSearchContext &context, sym_ctxs.GetContextAtIndex(index, sym_ctx); if (sym_ctx.function) - AddOneFunction(context, sym_ctx.function, NULL); + { + // TODO only do this if it's a C function; C++ functions may be + // overloaded + if (!found_specific) + AddOneFunction(context, sym_ctx.function, NULL); + found_specific = true; + } else if(sym_ctx.symbol) - AddOneFunction(context, NULL, sym_ctx.symbol); + { + if (!found_generic && !found_specific) + { + AddOneFunction(context, NULL, sym_ctx.symbol); + found_generic = true; + } + } } Variable *var = FindVariableInScope(*m_sym_ctx, name); @@ -993,7 +1008,7 @@ ClangExpressionDeclMap::AddOneFunction(NameSearchContext &context, entity.m_parser_vars->m_lldb_value = fun_location.release(); if (log) - log->Printf("Found function %s, returned (NamedDecl)%p", context.Name.getAsString().c_str(), fun_decl); + log->Printf("Found %s function %s, returned (NamedDecl)%p", (fun ? "specific" : "generic"), context.Name.getAsString().c_str(), fun_decl); } void diff --git a/lldb/source/Expression/IRForTarget.cpp b/lldb/source/Expression/IRForTarget.cpp index b76dd2c5776..6ffc7b977d8 100644 --- a/lldb/source/Expression/IRForTarget.cpp +++ b/lldb/source/Expression/IRForTarget.cpp @@ -558,9 +558,15 @@ IRForTarget::MaybeHandleCall(Module &M, { if (!m_decl_map->GetFunctionInfo(fun_decl, fun_value_ptr, fun_addr)) { - if (log) - log->Printf("Function %s had no address", fun_decl->getNameAsCString()); - return false; + fun_value_ptr = NULL; + + if (!m_decl_map->GetFunctionAddress(fun->getName().str().c_str(), fun_addr)) + { + if (log) + log->Printf("Function %s had no address", fun->getName().str().c_str()); + + return false; + } } } else @@ -580,12 +586,9 @@ IRForTarget::MaybeHandleCall(Module &M, if (!fun_value_ptr || !*fun_value_ptr) { - std::vector<const Type*> params; - const IntegerType *intptr_ty = Type::getIntNTy(M.getContext(), (M.getPointerSize() == Module::Pointer64) ? 64 : 32); - - FunctionType *fun_ty = FunctionType::get(intptr_ty, params, true); + const FunctionType *fun_ty = fun->getFunctionType(); PointerType *fun_ptr_ty = PointerType::getUnqual(fun_ty); Constant *fun_addr_int = ConstantInt::get(intptr_ty, fun_addr, false); fun_addr_ptr = ConstantExpr::getIntToPtr(fun_addr_int, fun_ptr_ty); |