On Mar 30, 2010, at 7:51 PM, John Criswell wrote:
> I'm too lazy to convert your .dot file into a graph file
What format should I have posted? (I'm not sure what you mean by
"graph file".) I had thought that .dot was the preferred format here,
since that's what LLVM generates (e.g., "opt -dot-cfg ...").
> First, LLVM does not guarantee that a function has a single exit
> block.
> Multiple basic blocks can have a return instruction as their
> terminator
> instruction.
Any suggestions on what kind of source code pattern would cause this
to happen? I've tried feeding C++ code with multiple return statements
to LLVM, but it always spits out a CFG with a single return block. All
of the blocks for the return statements simply branch to this final
return block.
> There is a pass (Unify Function Exit nodes i.e.,
> -mergereturn <http://llvm.org/docs/Passes.html#mergereturn>) that
> transform a function to have only 1 return instruction.
That sounds like a good approach, except that this pass does not
appear to produce a CFG with exactly one return block, but rather one
or zero return blocks. The distinction is important because if the
pass's getReturnBlock function returns null (see
UnifyFunctionExitNodes.h), I'm back to square one of not having a
single exit block.
I'm wondering what would cause a CFG not to have a return block. The
comments in UnifyFunctionExitNodes.cpp say: "If there are no return
stmts in the Function, a null pointer is returned." But this doesn't
make sense; even an empty void function has a return block with a ret
instruction inside it. Is there some other kind of source code pattern
that would cause an absence of a return block?
Thanks,
Trevor