diff options
author | Bill Wendling <isanbard@gmail.com> | 2013-03-20 21:13:59 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2013-03-20 21:13:59 +0000 |
commit | 8640c6a5227b75666e02424e2181289692138348 (patch) | |
tree | 2cab16184480653ad8640bfe954c6a917667e75e | |
parent | 1ac186e009af8496df3ecd2c5ad4918d5c53a0a3 (diff) |
Call the new llvm_gcov_init function to register the environment.
Use the new `llvm_gcov_init' function to register the writeout and flush
functions. The initialization function will also call `atexit' for some cleanups
and final writout calls. But it does this only once. This is better than
checking for the `main' function, because in a library that function may not
exist.
<rdar://problem/12439551>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177579 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Instrumentation/GCOVProfiling.cpp | 39 |
1 files changed, 10 insertions, 29 deletions
diff --git a/lib/Transforms/Instrumentation/GCOVProfiling.cpp b/lib/Transforms/Instrumentation/GCOVProfiling.cpp index 093984cac6..3310ed5e2b 100644 --- a/lib/Transforms/Instrumentation/GCOVProfiling.cpp +++ b/lib/Transforms/Instrumentation/GCOVProfiling.cpp @@ -566,35 +566,16 @@ bool GCOVProfiler::emitProfileArcs() { IRBuilder<> Builder(BB); FTy = FunctionType::get(Type::getVoidTy(*Ctx), false); - FTy = FunctionType::get(Builder.getVoidTy(), - PointerType::get(FTy, 0), false); - - // Register the local writeout function. - Constant *RegWriteout = - M->getOrInsertFunction("llvm_register_writeout_function", FTy); - Builder.CreateCall(RegWriteout, WriteoutF); - - // Register the local flush function. - Constant *RegFlush = - M->getOrInsertFunction("llvm_register_flush_function", FTy); - Builder.CreateCall(RegFlush, FlushF); - - if (M->getFunction("main")) { - Constant *AtExitFn = M->getOrInsertFunction("atexit", FTy); - - // In the module that has the 'main' function, make sure that the flush - // and writeout function lists are deleted. Also make sure that the - // writeout function list is deleted. - Builder.CreateCall(AtExitFn, getDeleteWriteoutFunctionListFunc()); - Builder.CreateCall(AtExitFn, getDeleteFlushFunctionListFunc()); - - // Make sure we write out all files when exiting. Note: This is called - // first from atexit(). - FTy = FunctionType::get(Type::getVoidTy(*Ctx), false); - Builder.CreateCall(AtExitFn, - M->getOrInsertFunction("__llvm_writeout_files", FTy)); - } - + Type *Params[] = { + PointerType::get(FTy, 0), + PointerType::get(FTy, 0) + }; + FTy = FunctionType::get(Builder.getVoidTy(), Params, false); + + // Inialize the environment and register the local writeout and flush + // functions. + Constant *GCOVInit = M->getOrInsertFunction("llvm_gcov_init", FTy); + Builder.CreateCall2(GCOVInit, WriteoutF, FlushF); Builder.CreateRetVoid(); appendToGlobalCtors(*M, F, 0); |