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:
Sean Callanan
2012-07-21 02:02:15 +00:00
parent 4c6d7a2ed2
commit 6e6d4a6223
2 changed files with 69 additions and 0 deletions

View File

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