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>

llvm-svn: 177579
This commit is contained in:
Bill Wendling 2013-03-20 21:13:59 +00:00
parent 51a6ff5799
commit c77e9440cf
1 changed files with 9 additions and 28 deletions

View File

@ -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);