[llvm] r200515 - Fix a bug in gcov instrumentation introduced by r195513. <rdar://15930350>

Bob Wilson bob.wilson at apple.com
Thu Jan 30 21:24:02 PST 2014


Author: bwilson
Date: Thu Jan 30 23:24:01 2014
New Revision: 200515

URL: http://llvm.org/viewvc/llvm-project?rev=200515&view=rev
Log:
Fix a bug in gcov instrumentation introduced by r195513. <rdar://15930350>

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.

Modified:
    llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp

Modified: llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp?rev=200515&r1=200514&r2=200515&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp Thu Jan 30 23:24:01 2014
@@ -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);





More information about the llvm-commits mailing list