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:
parent
9877af3b46
commit
3883b5ae4e
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue