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

Reply via email to