[llvm] r176173 - In GCC 4.7, function names are now forbidden from .gcda files. Support this by

Nick Lewycky nicholas at mxc.ca
Tue Feb 26 22:22:56 PST 2013


Author: nicholas
Date: Wed Feb 27 00:22:56 2013
New Revision: 176173

URL: http://llvm.org/viewvc/llvm-project?rev=176173&view=rev
Log:
In GCC 4.7, function names are now forbidden from .gcda files. Support this by
passing a null pointer to the function name in to GCDAProfiling, and add another
switch onto GCOVProfiling.

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

Modified: llvm/trunk/include/llvm/Transforms/Instrumentation.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Instrumentation.h?rev=176173&r1=176172&r2=176173&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Transforms/Instrumentation.h (original)
+++ llvm/trunk/include/llvm/Transforms/Instrumentation.h Wed Feb 27 00:22:56 2013
@@ -34,7 +34,8 @@ ModulePass *createPathProfilerPass();
 ModulePass *createGCOVProfilerPass(bool EmitNotes = true, bool EmitData = true,
                                    bool Use402Format = false,
                                    bool UseExtraChecksum = false,
-                                   bool NoRedZone = false);
+                                   bool NoRedZone = false,
+                                   bool NoFunctionNamesInData = false);
 
 // Insert AddressSanitizer (address sanity checking) instrumentation
 FunctionPass *createAddressSanitizerFunctionPass(

Modified: llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp?rev=176173&r1=176172&r2=176173&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp Wed Feb 27 00:22:56 2013
@@ -45,14 +45,16 @@ namespace {
     static char ID;
     GCOVProfiler()
         : ModulePass(ID), EmitNotes(true), EmitData(true), Use402Format(false),
-          UseExtraChecksum(false), NoRedZone(false) {
+          UseExtraChecksum(false), NoRedZone(false),
+          NoFunctionNamesInData(false) {
       initializeGCOVProfilerPass(*PassRegistry::getPassRegistry());
     }
-    GCOVProfiler(bool EmitNotes, bool EmitData, bool use402Format,
-                 bool useExtraChecksum, bool NoRedZone_)
+    GCOVProfiler(bool EmitNotes, bool EmitData, bool Use402Format,
+                 bool UseExtraChecksum, bool NoRedZone,
+                 bool NoFunctionNamesInData)
         : ModulePass(ID), EmitNotes(EmitNotes), EmitData(EmitData),
-          Use402Format(use402Format), UseExtraChecksum(useExtraChecksum),
-          NoRedZone(NoRedZone_) {
+          Use402Format(Use402Format), UseExtraChecksum(UseExtraChecksum),
+          NoRedZone(NoRedZone), NoFunctionNamesInData(NoFunctionNamesInData) {
       assert((EmitNotes || EmitData) && "GCOVProfiler asked to do nothing?");
       initializeGCOVProfilerPass(*PassRegistry::getPassRegistry());
     }
@@ -100,6 +102,7 @@ namespace {
     bool Use402Format;
     bool UseExtraChecksum;
     bool NoRedZone;
+    bool NoFunctionNamesInData;
 
     Module *M;
     LLVMContext *Ctx;
@@ -113,9 +116,10 @@ INITIALIZE_PASS(GCOVProfiler, "insert-gc
 ModulePass *llvm::createGCOVProfilerPass(bool EmitNotes, bool EmitData,
                                          bool Use402Format,
                                          bool UseExtraChecksum,
-                                         bool NoRedZone) {
+                                         bool NoRedZone,
+                                         bool NoFunctionNamesInData) {
   return new GCOVProfiler(EmitNotes, EmitData, Use402Format, UseExtraChecksum,
-                          NoRedZone);
+                          NoRedZone, NoFunctionNamesInData);
 }
 
 namespace {
@@ -664,7 +668,9 @@ void GCOVProfiler::insertCounterWriteout
         intptr_t ident = reinterpret_cast<intptr_t>(I->second);
         Builder.CreateCall2(EmitFunction,
                             Builder.getInt32(ident),
-                            Builder.CreateGlobalStringPtr(SP.getName()));
+                            NoFunctionNamesInData ?
+                              Constant::getNullValue(Builder.getInt8PtrTy()) :
+                              Builder.CreateGlobalStringPtr(SP.getName()));
         
         GlobalVariable *GV = I->first;
         unsigned Arcs =

Modified: llvm/trunk/runtime/libprofile/GCDAProfiling.c
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/runtime/libprofile/GCDAProfiling.c?rev=176173&r1=176172&r2=176173&view=diff
==============================================================================
--- llvm/trunk/runtime/libprofile/GCDAProfiling.c (original)
+++ llvm/trunk/runtime/libprofile/GCDAProfiling.c Wed Feb 27 00:22:56 2013
@@ -162,17 +162,22 @@ void llvm_gcda_increment_indirect_counte
 
 void llvm_gcda_emit_function(uint32_t ident, const char *function_name) {
 #ifdef DEBUG_GCDAPROFILING
-  printf("llvmgcda: function id=%x\n", ident);
+  printf("llvmgcda: function id=%x name=%s\n", ident,
+         function_name ? function_name : "NULL");
 #endif
   if (!output_file) return;
 
   /* function tag */  
   fwrite("\0\0\0\1", 4, 1, output_file);
-  write_int32(3 + 1 + length_of_string(function_name));
+  uint32_t len = 3;
+  if (function_name)
+    len += 1 + length_of_string(function_name);
+  write_int32(len);
   write_int32(ident);
   write_int32(0);
   write_int32(0);
-  write_string(function_name);
+  if (function_name)
+    write_string(function_name);
 }
 
 void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) {





More information about the llvm-commits mailing list