From 2196195a2a825cf60a455337133969c9870672c1 Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Fri, 25 Apr 2014 07:20:05 +0000 Subject: [PATCH] CodeGen: Avoid instrumenting implicit Decls more effectively We don't assign counters for implicit Decls, but we were emitting code to increment the (non-existent) counters and adding empty counter lists in the output. This fixes the checks in assignRegionCounters and emitInstrumentationData to do the right thing, and adds an assert for the pathological case of emitting zero counters. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@207203 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenPGO.cpp | 6 ++++-- test/Profile/cxx-implicit.cpp | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 test/Profile/cxx-implicit.cpp diff --git a/lib/CodeGen/CodeGenPGO.cpp b/lib/CodeGen/CodeGenPGO.cpp index 6991e40f97..9d4aaff888 100644 --- a/lib/CodeGen/CodeGenPGO.cpp +++ b/lib/CodeGen/CodeGenPGO.cpp @@ -146,7 +146,7 @@ llvm::GlobalVariable *CodeGenPGO::buildDataVar() { } void CodeGenPGO::emitInstrumentationData() { - if (!CGM.getCodeGenOpts().ProfileInstrGenerate) + if (!RegionCounters) return; // Build the data. @@ -803,7 +803,7 @@ void CodeGenPGO::assignRegionCounters(const Decl *D, llvm::Function *Fn) { llvm::IndexedInstrProfReader *PGOReader = CGM.getPGOReader(); if (!InstrumentRegions && !PGOReader) return; - if (!D) + if (D->isImplicit()) return; setFuncName(Fn); @@ -845,6 +845,7 @@ void CodeGenPGO::mapRegionCounters(const Decl *D) { Walker.TraverseDecl(const_cast(BD)); else if (const CapturedDecl *CD = dyn_cast_or_null(D)) Walker.TraverseDecl(const_cast(CD)); + assert(Walker.NextCounter > 0 && "no entry counter mapped for decl"); NumRegionCounters = Walker.NextCounter; FunctionHash = Walker.Hash.finalize(); } @@ -920,6 +921,7 @@ void CodeGenPGO::destroyRegionCounters() { RegionCounterMap.reset(); StmtCountMap.reset(); RegionCounts.reset(); + RegionCounters = nullptr; } /// \brief Calculate what to divide by to scale weights. diff --git a/test/Profile/cxx-implicit.cpp b/test/Profile/cxx-implicit.cpp new file mode 100644 index 0000000000..79840ad938 --- /dev/null +++ b/test/Profile/cxx-implicit.cpp @@ -0,0 +1,17 @@ +// Ensure that implicit methods aren't instrumented. + +// RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name cxx-implicit.cpp -o - -emit-llvm -fprofile-instr-generate | FileCheck %s + +// An implicit constructor is generated for Base. We should not emit counters +// for it. +// CHECK-NOT: @__llvm_profile_counters__ZN4BaseC2Ev = + +struct Base { + virtual void foo(); +}; + +struct Derived : public Base { + Derived(); +}; + +Derived::Derived() {} -- 2.40.0