forked from OSchip/llvm-project
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:
parent
22658bc0b7
commit
afa4237d9b
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue