OSDN Git Service

Call the new llvm_gcov_init function to register the environment.
authorBill Wendling <isanbard@gmail.com>
Wed, 20 Mar 2013 21:13:59 +0000 (21:13 +0000)
committerBill Wendling <isanbard@gmail.com>
Wed, 20 Mar 2013 21:13:59 +0000 (21:13 +0000)
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

lib/Transforms/Instrumentation/GCOVProfiling.cpp

index 093984c..3310ed5 100644 (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);