diff options
author | Bill Wendling <isanbard@gmail.com> | 2012-06-01 23:14:32 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2012-06-01 23:14:32 +0000 |
commit | 4a8fefaf8303f30514bc2a40d840a1709dae65cf (patch) | |
tree | c6063be70b9aeedb966fba17cf002cfd554151b9 | |
parent | 0984461dfb329c8e43ca70e264f56cd39bbae573 (diff) | |
download | llvm-4a8fefaf8303f30514bc2a40d840a1709dae65cf.tar.gz llvm-4a8fefaf8303f30514bc2a40d840a1709dae65cf.tar.bz2 llvm-4a8fefaf8303f30514bc2a40d840a1709dae65cf.tar.xz |
Register the gcov "writeout" at init time. Don't list this as a d'tor. Instead,
inject some code in that will run via the "__mod_init_func" method that
registers the gcov "writeout" function to execute at exit time.
The problem is that the "__mod_term_func" method of specifying d'tors is
deprecated on Darwin. And it can lead to some ambiguities when dealing with
multiple libraries.
<rdar://problem/11110106>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157852 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Instrumentation/GCOVProfiling.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/lib/Transforms/Instrumentation/GCOVProfiling.cpp b/lib/Transforms/Instrumentation/GCOVProfiling.cpp index 4cbdb9f192..6c42137b3d 100644 --- a/lib/Transforms/Instrumentation/GCOVProfiling.cpp +++ b/lib/Transforms/Instrumentation/GCOVProfiling.cpp @@ -22,6 +22,7 @@ #include "llvm/Module.h" #include "llvm/Pass.h" #include "llvm/Instructions.h" +#include "llvm/Transforms/Utils/ModuleUtils.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/Debug.h" #include "llvm/Support/DebugLoc.h" @@ -57,7 +58,6 @@ namespace { virtual const char *getPassName() const { return "GCOV Profiler"; } - private: bool runOnModule(Module &M); @@ -517,6 +517,7 @@ bool GCOVProfiler::emitProfileArcs() { } } } + insertCounterWriteout(CountersBySP); } @@ -672,7 +673,26 @@ void GCOVProfiler::insertCounterWriteout( } Builder.CreateRetVoid(); - InsertProfilingShutdownCall(WriteoutF, M); + // Create a small bit of code that registers the "__llvm_gcov_writeout" + // function to be executed at exit. + FunctionType *FTy = FunctionType::get(Type::getVoidTy(*Ctx), false); + Function *F = Function::Create(FTy, GlobalValue::InternalLinkage, + "__llvm_gcov_init", M); + F->setUnnamedAddr(true); + F->setLinkage(GlobalValue::InternalLinkage); + F->addFnAttr(Attribute::NoInline); + + BB = BasicBlock::Create(*Ctx, "entry", F); + Builder.SetInsertPoint(BB); + + FTy = FunctionType::get(Type::getInt32Ty(*Ctx), + PointerType::get(FTy, 0), false); + Function *AtExitFn = + Function::Create(FTy, GlobalValue::ExternalLinkage, "atexit", M); + Builder.CreateCall(AtExitFn, WriteoutF); + Builder.CreateRetVoid(); + + appendToGlobalCtors(*M, F, 0); } void GCOVProfiler::insertIndirectCounterIncrement() { |