mirror of
https://github.com/intel/llvm.git
synced 2026-01-19 01:15:50 +08:00
Added a fix that allows newly-constructed objects
to returned by expressions, by removing the __cxa_atexit call that would normally cause these objects to be destroyed. This also prevents many errors of the form Couldn't rewrite one of the arguments of a function call error: Couldn't materialize struct: Structure hasn't been laid out yet <rdar://problem/11309402> llvm-svn: 160596
This commit is contained in:
@@ -1817,6 +1817,51 @@ IRForTarget::HandleObjCClass(Value *classlist_reference)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
IRForTarget::RemoveCXAAtExit (BasicBlock &basic_block)
|
||||
{
|
||||
BasicBlock::iterator ii;
|
||||
|
||||
std::vector<CallInst *> calls_to_remove;
|
||||
|
||||
for (ii = basic_block.begin();
|
||||
ii != basic_block.end();
|
||||
++ii)
|
||||
{
|
||||
Instruction &inst = *ii;
|
||||
|
||||
CallInst *call = dyn_cast<CallInst>(&inst);
|
||||
|
||||
// MaybeHandleCallArguments handles error reporting; we are silent here
|
||||
if (!call)
|
||||
continue;
|
||||
|
||||
bool remove = false;
|
||||
|
||||
llvm::Function *func = call->getCalledFunction();
|
||||
|
||||
if (func && func->getName() == "__cxa_atexit")
|
||||
remove = true;
|
||||
|
||||
llvm::Value *val = call->getCalledValue();
|
||||
|
||||
if (val && val->getName() == "__cxa_atexit")
|
||||
remove = true;
|
||||
|
||||
if (remove)
|
||||
calls_to_remove.push_back(call);
|
||||
}
|
||||
|
||||
for (std::vector<CallInst *>::iterator ci = calls_to_remove.begin(), ce = calls_to_remove.end();
|
||||
ci != ce;
|
||||
++ci)
|
||||
{
|
||||
(*ci)->eraseFromParent();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
IRForTarget::ResolveCalls(BasicBlock &basic_block)
|
||||
{
|
||||
@@ -2684,6 +2729,16 @@ IRForTarget::runOnModule (Module &llvm_module)
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!RemoveCXAAtExit(*bbi))
|
||||
{
|
||||
if (log)
|
||||
log->Printf("RemoveCXAAtExit() failed");
|
||||
|
||||
// RemoveCXAAtExit() reports its own errors, so we don't do so here
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_decl_map && m_execution_policy != lldb_private::eExecutionPolicyAlways)
|
||||
|
||||
Reference in New Issue
Block a user