mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-01 04:29:57 +00:00
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
This commit is contained in:
parent
1ac186e009
commit
8640c6a522
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user