Improved function lookup to avoid conflicts between

symbols with the same name and no debug information.
Also improved the way functions are called so we
don't automatically define them as variadic functions
in the IR.

llvm-svn: 113290
This commit is contained in:
Sean Callanan 2010-09-07 21:49:41 +00:00
parent 9877af3b46
commit 3883b5ae4e
2 changed files with 28 additions and 10 deletions

View File

@ -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

View File

@ -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);