summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/source/Expression/ClangExpressionDeclMap.cpp21
-rw-r--r--lldb/source/Expression/IRForTarget.cpp17
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);
OpenPOWER on IntegriCloud