Author: vedantk Date: Fri Jun 30 14:02:14 2017 New Revision: 306883 URL: http://llvm.org/viewvc/llvm-project?rev=306883&view=rev Log: [Profile] Do not assign counters to functions without bodies
The root cause of the issues reported in D32406 and D34680 is that clang instruments functions without bodies. Make it stop doing that, and also teach it how to use old (incorrectly generated) profiles without crashing. Added: cfe/trunk/test/Profile/Inputs/cxx-missing-bodies.proftext cfe/trunk/test/Profile/cxx-missing-bodies.cpp Modified: cfe/trunk/lib/CodeGen/CodeGenPGO.cpp Modified: cfe/trunk/lib/CodeGen/CodeGenPGO.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenPGO.cpp?rev=306883&r1=306882&r2=306883&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenPGO.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenPGO.cpp Fri Jun 30 14:02:14 2017 @@ -617,6 +617,9 @@ uint64_t PGOHash::finalize() { void CodeGenPGO::assignRegionCounters(GlobalDecl GD, llvm::Function *Fn) { const Decl *D = GD.getDecl(); + if (!D->hasBody()) + return; + bool InstrumentRegions = CGM.getCodeGenOpts().hasProfileClangInstr(); llvm::IndexedInstrProfReader *PGOReader = CGM.getPGOReader(); if (!InstrumentRegions && !PGOReader) Added: cfe/trunk/test/Profile/Inputs/cxx-missing-bodies.proftext URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Profile/Inputs/cxx-missing-bodies.proftext?rev=306883&view=auto ============================================================================== --- cfe/trunk/test/Profile/Inputs/cxx-missing-bodies.proftext (added) +++ cfe/trunk/test/Profile/Inputs/cxx-missing-bodies.proftext Fri Jun 30 14:02:14 2017 @@ -0,0 +1,9 @@ +??_GA@@UAEPAXI@Z +1 +1 +1 + +??_DA@@QAEXXZ +1 +1 +1 Added: cfe/trunk/test/Profile/cxx-missing-bodies.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Profile/cxx-missing-bodies.cpp?rev=306883&view=auto ============================================================================== --- cfe/trunk/test/Profile/cxx-missing-bodies.cpp (added) +++ cfe/trunk/test/Profile/cxx-missing-bodies.cpp Fri Jun 30 14:02:14 2017 @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -emit-llvm %s -std=c++11 -S -emit-llvm -o - -triple=i386-pc-win32 -fno-rtti -fprofile-instrument=clang | FileCheck %s --check-prefix=GEN +// +// Don't crash when presented profile data for functions without bodies: +// RUN: llvm-profdata merge %S/Inputs/cxx-missing-bodies.proftext -o %t.profdata +// RUN: %clang_cc1 -emit-llvm %s -std=c++11 -S -emit-llvm -o /dev/null -triple=i386-pc-win32 -fno-rtti -fprofile-instrument-use-path=%t.profdata -w + +// GEN-NOT: __profn{{.*}}??_GA@@UAEPAXI@Z +// GEN-NOT: __profn{{.*}}??_DA@@QAEXXZ + +struct A { + virtual ~A(); +}; +struct B : A { + virtual ~B(); +}; + +B::~B() {} + +void foo() { + B c; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits