Fix a bug in gcov instrumentation introduced by r195513. <rdar://15930350>
authorBob Wilson <bob.wilson@apple.com>
Fri, 31 Jan 2014 05:24:01 +0000 (05:24 +0000)
committerBob Wilson <bob.wilson@apple.com>
Fri, 31 Jan 2014 05:24:01 +0000 (05:24 +0000)
The entry block of a function starts with all the static allocas. The change
in r195513 splits the block before those allocas, which has the effect of
turning them into dynamic allocas. That breaks all sorts of things. Change to
split after the initial allocas, and also add a comment explaining why the
block is split.

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

lib/Transforms/Instrumentation/GCOVProfiling.cpp

index 8d5a83ca23afad40ad642aa3c9a85fc6969172a5..0929142108a7dc21f5a3e565866cbf3fd16e2489 100644 (file)
@@ -27,6 +27,7 @@
 #include "llvm/DebugInfo.h"
 #include "llvm/IR/IRBuilder.h"
 #include "llvm/IR/Instructions.h"
+#include "llvm/IR/IntrinsicInst.h"
 #include "llvm/IR/Module.h"
 #include "llvm/Pass.h"
 #include "llvm/Support/CommandLine.h"
@@ -478,8 +479,14 @@ void GCOVProfiler::emitProfileNotes() {
 
       Function *F = SP.getFunction();
       if (!F) continue;
+
+      // gcov expects every function to start with an entry block that has a
+      // single successor, so split the entry block to make sure of that.
       BasicBlock &EntryBlock = F->getEntryBlock();
-      EntryBlock.splitBasicBlock(EntryBlock.begin());
+      BasicBlock::iterator It = EntryBlock.begin();
+      while (isa<AllocaInst>(*It) || isa<DbgInfoIntrinsic>(*It))
+        ++It;
+      EntryBlock.splitBasicBlock(It);
 
       GCOVFunction *Func =
         new GCOVFunction(SP, &out, i, Options.UseCfgChecksum);