mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-23 17:29:19 +00:00
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
This commit is contained in:
parent
0984461dfb
commit
4a8fefaf83
@ -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() {
|
||||
|
Loading…
Reference in New Issue
Block a user