[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.

llvm-svn: 306883
This commit is contained in:
Vedant Kumar 2017-06-30 21:02:14 +00:00
parent c4ad413853
commit 33d0a1ccd3
3 changed files with 33 additions and 0 deletions

View File

@ -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)

View File

@ -0,0 +1,9 @@
??_GA@@UAEPAXI@Z
1
1
1
??_DA@@QAEXXZ
1
1
1

View File

@ -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;
}