Fixed an expression parser bug that prevented

certain functions from being resolved correctly.

Some functions (particularly varargs functions)
are BitCast before being called, and the problem
was that a CallInst where getCalledValue()
returned a BitCast ConstantExpr was not being
relocated at all.

This problem should now be resolved for the case
of BitCast.

llvm-svn: 113396
This commit is contained in:
Sean Callanan 2010-09-08 20:04:08 +00:00
parent 22658bc0b7
commit afa4237d9b
3 changed files with 35 additions and 1 deletions

View File

@ -460,8 +460,14 @@ ClangFunction::ExecuteFunction (
if (call_plan_sp == NULL)
return eExecutionSetupError;
//#define SINGLE_STEP_EXPRESSIONS
#ifdef SINGLE_STEP_EXPRESSIONS
return eExecutionInterrupted;
#else
call_plan_sp->SetPrivate(true);
exe_ctx.thread->QueueThreadPlan(call_plan_sp, true);
#endif
// We need to call the function synchronously, so spin waiting for it to return.
// If we get interrupted while executing, we're going to lose our context, and

View File

@ -343,6 +343,18 @@ IRDynamicChecks::runOnModule(llvm::Module &M)
if (!vpc.Instrument())
return false;
if (log)
{
std::string s;
raw_string_ostream oss(s);
M.print(oss, NULL);
oss.flush();
log->Printf("Module after dynamic checks: \n%s", s.c_str());
}
return true;
}

View File

@ -579,7 +579,23 @@ IRForTarget::MaybeHandleCall(Module &M,
Function *fun = C->getCalledFunction();
if (fun == NULL)
return true;
{
Value *val = C->getCalledValue();
ConstantExpr *const_expr = dyn_cast<ConstantExpr>(val);
if (const_expr && const_expr->getOpcode() == Instruction::BitCast)
{
fun = dyn_cast<Function>(const_expr->getOperand(0));
if (!fun)
return true;
}
else
{
return true;
}
}
clang::NamedDecl *fun_decl = DeclForGlobalValue(M, fun);
uint64_t fun_addr;