llvm-cov: Split entry blocks in GCNOProfiling.cpp.
authorYuchen Wu <yuchenericwu@hotmail.com>
Fri, 22 Nov 2013 23:07:45 +0000 (23:07 +0000)
committerYuchen Wu <yuchenericwu@hotmail.com>
Fri, 22 Nov 2013 23:07:45 +0000 (23:07 +0000)
gcov expects every function to contain an entry block that
unconditionally branches into the next block. clang does not implement
basic blocks in this manner, so gcov did not output correct branch info
if the entry block branched to multiple blocks.

This change splits every function's entry block into an empty block and
a block with the rest of the instructions. The instrumentation code will
take care of the rest.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@195513 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Instrumentation/GCOVProfiling.cpp

index 13472f038d5c5ecde3faba7152c3d5cb6961a9b1..fb5bee2ede2d0814f6c5fef187579ad60ce464bf 100644 (file)
@@ -467,6 +467,9 @@ void GCOVProfiler::emitProfileNotes() {
 
       Function *F = SP.getFunction();
       if (!F) continue;
+      BasicBlock &EntryBlock = F->getEntryBlock();
+      EntryBlock.splitBasicBlock(EntryBlock.begin());
+
       GCOVFunction *Func =
         new GCOVFunction(SP, &out, i, Options.UseCfgChecksum);
       Funcs.push_back(Func);