[llvm-commits] [llvm] r163757 - /llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp

Nick Lewycky nicholas at mxc.ca
Wed Sep 12 22:10:51 PDT 2012


Bill Wendling wrote:
> Author: void
> Date: Wed Sep 12 19:09:55 2012
> New Revision: 163757
>
> URL: http://llvm.org/viewvc/llvm-project?rev=163757&view=rev
> Log:
> Introduce the __llvm_gcov_flush function.
>
> This function writes out the current values of the counters and then resets
> them. This can be used similarly to the __gcov_flush function to sync the
> counters when need be. For instance, in a situation where the application
> doesn't exit.
> <rdar://problem/12185886>
>
> 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=163757&r1=163756&r2=163757&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp Wed Sep 12 19:09:55 2012
> @@ -34,6 +34,7 @@
>   #include "llvm/Support/InstIterator.h"
>   #include "llvm/Support/PathV2.h"
>   #include "llvm/Support/raw_ostream.h"
> +#include "llvm/Target/TargetData.h"
>   #include "llvm/Transforms/Utils/ModuleUtils.h"
>   #include<string>
>   #include<utility>
> @@ -90,6 +91,7 @@
>       // list.
>       void insertCounterWriteout(ArrayRef<std::pair<GlobalVariable*, MDNode*>  >);
>       void insertIndirectCounterIncrement();
> +    void insertFlush(ArrayRef<std::pair<GlobalVariable*, MDNode*>  >);
>
>       std::string mangleName(DICompileUnit CU, const char *NewStem);
>
> @@ -100,6 +102,7 @@
>
>       Module *M;
>       LLVMContext *Ctx;
> +    const TargetData *TD;
>     };
>   }
>
> @@ -351,6 +354,7 @@
>
>   bool GCOVProfiler::runOnModule(Module&M) {
>     this->M =&M;
> +  TD = getAnalysisIfAvailable<TargetData>();
>     Ctx =&M.getContext();
>
>     if (EmitNotes) emitGCNO();
> @@ -518,6 +522,7 @@
>       }
>
>       insertCounterWriteout(CountersBySP);
> +    insertFlush(CountersBySP);
>     }
>
>     if (InsertIndCounterIncrCode)
> @@ -630,13 +635,14 @@
>
>   void GCOVProfiler::insertCounterWriteout(
>       ArrayRef<std::pair<GlobalVariable *, MDNode *>  >  CountersBySP) {
> -  FunctionType *WriteoutFTy =
> -      FunctionType::get(Type::getVoidTy(*Ctx), false);
> -  Function *WriteoutF = Function::Create(WriteoutFTy,
> -                                         GlobalValue::InternalLinkage,
> -                                         "__llvm_gcov_writeout", M);
> +  FunctionType *WriteoutFTy = FunctionType::get(Type::getVoidTy(*Ctx), false);
> +  Function *WriteoutF = M->getFunction("__llvm_gcov_writeout");
> +  if (!WriteoutF)
> +    WriteoutF = Function::Create(WriteoutFTy, GlobalValue::InternalLinkage,
> +                                 "__llvm_gcov_writeout", M);
>     WriteoutF->setUnnamedAddr(true);
> -  BasicBlock *BB = BasicBlock::Create(*Ctx, "", WriteoutF);
> +
> +  BasicBlock *BB = BasicBlock::Create(*Ctx, "entry", WriteoutF);
>     IRBuilder<>  Builder(BB);
>
>     Constant *StartFile = getStartFileFunc();
> @@ -744,3 +750,47 @@
>     Builder.SetInsertPoint(Exit);
>     Builder.CreateRetVoid();
>   }
> +
> +void GCOVProfiler::
> +insertFlush(ArrayRef<std::pair<GlobalVariable*, MDNode*>  >  CountersBySP) {
> +  FunctionType *FTy = FunctionType::get(Type::getVoidTy(*Ctx), false);
> +  Function *FlushF = M->getFunction("__llvm_gcov_flush");
> +  if (!FlushF)
> +    FlushF = Function::Create(FTy, GlobalValue::InternalLinkage,
> +                              "__llvm_gcov_flush", M);
> +  else
> +    FlushF->setLinkage(GlobalValue::InternalLinkage);
> +  FlushF->setUnnamedAddr(true);
> +
> +  Type *Int8Ty = Type::getInt8Ty(*Ctx);
> +  Type *Int64Ty = Type::getInt64Ty(*Ctx);
> +  BasicBlock *Entry = BasicBlock::Create(*Ctx, "entry", FlushF);
> +
> +  // Write out the current counters.
> +  Constant *WriteoutF = M->getFunction("__llvm_gcov_writeout");
> +  assert(WriteoutF&&  "Need to create the writeout function first!");
> +
> +  IRBuilder<>  Builder(Entry);
> +  Builder.CreateCall(WriteoutF);
> +
> +  if (TD)
> +    // Zero out the counters.
> +    for (ArrayRef<std::pair<GlobalVariable *, MDNode *>  >::iterator
> +           I = CountersBySP.begin(), E = CountersBySP.end();
> +         I != E; ++I) {
> +      GlobalVariable *GV = I->first;
> +      uint64_t NumBytes = TD->getTypeAllocSize(GV->getType()->getElementType());
> +      Builder.CreateMemSet(Builder.CreateConstGEP2_64(GV, 0, 0),
> +                           ConstantInt::get(Int8Ty, 0),
> +                           ConstantInt::get(Int64Ty, NumBytes), false);
> +    }

So we only zero them out if TD is known when compiling?

How about Builder.CreateStore'ing a big honkin' 
Constant::getNullValue(GV->getType()->getElementType()) for each of them?

Nick

> +
> +  Type *RetTy = FlushF->getReturnType();
> +  if (RetTy == Type::getVoidTy(*Ctx))
> +    Builder.CreateRetVoid();
> +  else if (RetTy->isIntegerTy())
> +    // Used if __llvm_gcov_flush was implicitly declared.
> +    Builder.CreateRet(ConstantInt::get(RetTy, 0));
> +  else
> +    report_fatal_error("invalid return type for __llvm_gcov_flush");
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list