From 52b4edf6a1b5d3a9f8a94a63c702d55ed446ecdb Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Wed, 27 Feb 2013 06:22:56 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176173 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Transforms/Instrumentation.h | 3 ++- .../Instrumentation/GCOVProfiling.cpp | 22 ++++++++++++------- runtime/libprofile/GCDAProfiling.c | 11 +++++++--- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/include/llvm/Transforms/Instrumentation.h b/include/llvm/Transforms/Instrumentation.h index fed92c838be..a57e0f3e8ad 100644 --- a/include/llvm/Transforms/Instrumentation.h +++ b/include/llvm/Transforms/Instrumentation.h @@ -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( diff --git a/lib/Transforms/Instrumentation/GCOVProfiling.cpp b/lib/Transforms/Instrumentation/GCOVProfiling.cpp index 09dea48e398..095b852d938 100644 --- a/lib/Transforms/Instrumentation/GCOVProfiling.cpp +++ b/lib/Transforms/Instrumentation/GCOVProfiling.cpp @@ -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-gcov-profiling", 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(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 = diff --git a/runtime/libprofile/GCDAProfiling.c b/runtime/libprofile/GCDAProfiling.c index f2dc4f79881..d9f3b326389 100644 --- a/runtime/libprofile/GCDAProfiling.c +++ b/runtime/libprofile/GCDAProfiling.c @@ -162,17 +162,22 @@ void llvm_gcda_increment_indirect_counter(uint32_t *predecessor, 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) { -- 2.34.1