[llvm-commits] [llvm] r130911 - in /llvm/trunk: lib/Transforms/Instrumentation/GCOVProfiling.cpp runtime/libprofile/GCDAProfiling.c

Nick Lewycky nicholas at mxc.ca
Wed May 4 19:46:38 PDT 2011


Author: nicholas
Date: Wed May  4 21:46:38 2011
New Revision: 130911

URL: http://llvm.org/viewvc/llvm-project?rev=130911&view=rev
Log:
Update the gcov version used slightly, to make it stop causing modern gcov's to
crash.

Modified:
    llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp
    llvm/trunk/runtime/libprofile/GCDAProfiling.c

Modified: llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp?rev=130911&r1=130910&r2=130911&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp Wed May  4 21:46:38 2011
@@ -87,7 +87,7 @@
     // list.
     void insertCounterWriteout(DebugInfoFinder &,
                                SmallVector<std::pair<GlobalVariable *,
-                                                     uint32_t>, 8> &);
+                                                     MDNode *>, 8> &);
 
     std::string mangleName(DICompileUnit CU, std::string NewStem);
 
@@ -261,12 +261,13 @@
       ReturnBlock = new GCOVBlock(i++, os);
 
       writeBytes(FunctionTag, 4);
-      uint32_t BlockLen = 1 + 1 + 1 + lengthOfGCOVString(SP.getName()) +
+      uint32_t BlockLen = 1 + 1 + 1 + 1 + lengthOfGCOVString(SP.getName()) +
           1 + lengthOfGCOVString(SP.getFilename()) + 1;
       write(BlockLen);
       uint32_t Ident = reinterpret_cast<intptr_t>((MDNode*)SP);
       write(Ident);
-      write(0);  // checksum
+      write(0);  // checksum #1
+      write(0);  // checksum #2
       writeGCOVString(SP.getName());
       writeGCOVString(SP.getFilename());
       write(SP.getLineNumber());
@@ -418,7 +419,7 @@
   if (DIF.subprogram_begin() == DIF.subprogram_end())
     return false;
 
-  SmallVector<std::pair<GlobalVariable *, uint32_t>, 8> CountersByIdent;
+  SmallVector<std::pair<GlobalVariable *, MDNode *>, 8> CountersBySP;
   for (DebugInfoFinder::iterator SPI = DIF.subprogram_begin(),
            SPE = DIF.subprogram_end(); SPI != SPE; ++SPI) {
     DISubprogram SP(*SPI);
@@ -441,8 +442,7 @@
                            GlobalValue::InternalLinkage,
                            Constant::getNullValue(CounterTy),
                            "__llvm_gcov_ctr", 0, false, 0);
-    CountersByIdent.push_back(
-        std::make_pair(Counters, reinterpret_cast<intptr_t>((MDNode*)SP)));
+    CountersBySP.push_back(std::make_pair(Counters, (MDNode*)SP));
 
     UniqueVector<BasicBlock *> ComplexEdgePreds;
     UniqueVector<BasicBlock *> ComplexEdgeSuccs;
@@ -509,7 +509,7 @@
     }
   }
 
-  insertCounterWriteout(DIF, CountersByIdent);
+  insertCounterWriteout(DIF, CountersBySP);
 
   return true;
 }
@@ -580,7 +580,10 @@
 }
 
 Constant *GCOVProfiler::getEmitFunctionFunc() {
-  const Type *Args[] = { Type::getInt32Ty(*Ctx) };
+  const Type *Args[2] = {
+    Type::getInt32Ty(*Ctx),    // uint32_t ident
+    Type::getInt8PtrTy(*Ctx),  // const char *function_name
+  };
   const FunctionType *FTy = FunctionType::get(Type::getVoidTy(*Ctx),
                                               Args, false);
   return M->getOrInsertFunction("llvm_gcda_emit_function", FTy);
@@ -616,7 +619,7 @@
 
 void GCOVProfiler::insertCounterWriteout(
     DebugInfoFinder &DIF,
-    SmallVector<std::pair<GlobalVariable *, uint32_t>, 8> &CountersByIdent) {
+    SmallVector<std::pair<GlobalVariable *, MDNode *>, 8> &CountersBySP) {
   const FunctionType *WriteoutFTy =
       FunctionType::get(Type::getVoidTy(*Ctx), false);
   Function *WriteoutF = Function::Create(WriteoutFTy,
@@ -637,11 +640,15 @@
     std::string FilenameGcda = mangleName(compile_unit, "gcda");
     Builder.CreateCall(StartFile,
                        Builder.CreateGlobalStringPtr(FilenameGcda));
-    for (SmallVector<std::pair<GlobalVariable *, uint32_t>, 8>::iterator
-             I = CountersByIdent.begin(), E = CountersByIdent.end();
+    for (SmallVector<std::pair<GlobalVariable *, MDNode *>, 8>::iterator
+             I = CountersBySP.begin(), E = CountersBySP.end();
          I != E; ++I) {
-      Builder.CreateCall(EmitFunction, ConstantInt::get(Type::getInt32Ty(*Ctx),
-                                                        I->second));
+      DISubprogram SP(I->second);
+      intptr_t ident = reinterpret_cast<intptr_t>(I->second);
+      Builder.CreateCall2(EmitFunction,
+                          ConstantInt::get(Type::getInt32Ty(*Ctx), ident),
+                          Builder.CreateGlobalStringPtr(SP.getName()));
+                                                        
       GlobalVariable *GV = I->first;
       unsigned Arcs =
           cast<ArrayType>(GV->getType()->getElementType())->getNumElements();

Modified: llvm/trunk/runtime/libprofile/GCDAProfiling.c
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/runtime/libprofile/GCDAProfiling.c?rev=130911&r1=130910&r2=130911&view=diff
==============================================================================
--- llvm/trunk/runtime/libprofile/GCDAProfiling.c (original)
+++ llvm/trunk/runtime/libprofile/GCDAProfiling.c Wed May  4 21:46:38 2011
@@ -48,6 +48,17 @@
   write_int32(hi);
 }
 
+static uint32_t length_of_string(const char *s) {
+  return (strlen(s) + 5) / 4;
+}
+
+static void write_string(const char *s) {
+  uint32_t len = length_of_string(s);
+  write_int32(len);
+  fwrite(s, strlen(s), 1, output_file);
+  fwrite("\0\0\0\0", 4 - (strlen(s) % 4), 1, output_file);
+}
+
 static char *mangle_filename(const char *orig_filename) {
   /* TODO: handle GCOV_PREFIX_STRIP */
   const char *prefix;
@@ -129,16 +140,18 @@
 #endif
 }
 
-void llvm_gcda_emit_function(uint32_t ident) {
+void llvm_gcda_emit_function(uint32_t ident, const char *function_name) {
 #ifdef DEBUG_GCDAPROFILING
   printf("llvmgcda: function id=%x\n", ident);
 #endif
 
   /* function tag */  
   fwrite("\0\0\0\1", 4, 1, output_file);
-  write_int32(2);
+  write_int32(3 + 1 + length_of_string(function_name));
   write_int32(ident);
   write_int32(0);
+  write_int32(0);
+  write_string(function_name);
 }
 
 void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) {





More information about the llvm-commits mailing list