From 8640c6a5227b75666e02424e2181289692138348 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Wed, 20 Mar 2013 21:13:59 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177579 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Instrumentation/GCOVProfiling.cpp | 37 +++++-------------- 1 file changed, 9 insertions(+), 28 deletions(-) diff --git a/lib/Transforms/Instrumentation/GCOVProfiling.cpp b/lib/Transforms/Instrumentation/GCOVProfiling.cpp index 093984cac69..3310ed5e2b0 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);