Refactor PGO code in preparation for handling non-C/C++ code.

Move the PGO.assignRegionCounters() call out of StartFunction, because that
function is called from many places where it does not make sense to do PGO
instrumentation (e.g., compiler-generated helper functions). Change several
functions to take a StringRef argument for the unique name associated with
a function, so that the name can be set differently for things like Objective-C
methods and block literals.

llvm-svn: 203073
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index c550aad..d0f1cb6 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -589,7 +589,6 @@
   if (CGM.getCodeGenOpts().InstrumentForProfiling)
     EmitMCountInstrumentation();
 
-  PGO.assignRegionCounters(GD);
   if (CGM.getPGOData() && D) {
     // Turn on InlineHint attribute for hot functions.
     if (CGM.getPGOData()->isHotFunction(CGM.getMangledName(GD)))
@@ -771,6 +770,7 @@
   StartFunction(GD, ResTy, Fn, FnInfo, Args, BodyRange.getBegin());
 
   // Generate the body of the function.
+  PGO.assignRegionCounters(GD.getDecl(), CGM.getMangledName(GD));
   if (isa<CXXDestructorDecl>(FD))
     EmitDestructorBody(Args);
   else if (isa<CXXConstructorDecl>(FD))
@@ -831,7 +831,7 @@
   if (!CurFn->doesNotThrow())
     TryMarkNoThrow(CurFn);
 
-  PGO.emitWriteoutFunction(CurGD);
+  PGO.emitWriteoutFunction(CGM.getMangledName(CurGD));
   PGO.destroyRegionCounters();
 }
 
diff --git a/clang/lib/CodeGen/CodeGenPGO.cpp b/clang/lib/CodeGen/CodeGenPGO.cpp
index 38bb4c0..a918658 100644
--- a/clang/lib/CodeGen/CodeGenPGO.cpp
+++ b/clang/lib/CodeGen/CodeGenPGO.cpp
@@ -162,7 +162,7 @@
   return false;
 }
 
-void CodeGenPGO::emitWriteoutFunction(GlobalDecl &GD) {
+void CodeGenPGO::emitWriteoutFunction(StringRef Name) {
   if (!CGM.getCodeGenOpts().ProfileInstrGenerate)
     return;
 
@@ -207,7 +207,7 @@
     CGM.getModule().getOrInsertFunction("llvm_pgo_emit", FTy);
 
   llvm::Constant *MangledName =
-    CGM.GetAddrOfConstantCString(CGM.getMangledName(GD), "__llvm_pgo_name");
+    CGM.GetAddrOfConstantCString(Name, "__llvm_pgo_name");
   MangledName = llvm::ConstantExpr::getBitCast(MangledName, Int8PtrTy);
   PGOBuilder.CreateCall3(EmitFunc, MangledName,
                          PGOBuilder.getInt32(NumRegionCounters),
@@ -728,19 +728,18 @@
   };
 }
 
-void CodeGenPGO::assignRegionCounters(GlobalDecl &GD) {
+void CodeGenPGO::assignRegionCounters(const Decl *D, StringRef Name) {
   bool InstrumentRegions = CGM.getCodeGenOpts().ProfileInstrGenerate;
   PGOProfileData *PGOData = CGM.getPGOData();
   if (!InstrumentRegions && !PGOData)
     return;
-  const Decl *D = GD.getDecl();
   if (!D)
     return;
   mapRegionCounters(D);
   if (InstrumentRegions)
     emitCounterVariables();
   if (PGOData) {
-    loadRegionCounts(GD, PGOData);
+    loadRegionCounts(Name, PGOData);
     computeRegionCounts(D);
   }
 }
@@ -781,13 +780,13 @@
   Builder.CreateStore(Count, Addr);
 }
 
-void CodeGenPGO::loadRegionCounts(GlobalDecl &GD, PGOProfileData *PGOData) {
+void CodeGenPGO::loadRegionCounts(StringRef Name, PGOProfileData *PGOData) {
   // For now, ignore the counts from the PGO data file only if the number of
   // counters does not match. This could be tightened down in the future to
   // ignore counts when the input changes in various ways, e.g., by comparing a
   // hash value based on some characteristics of the input.
   RegionCounts = new std::vector<uint64_t>();
-  if (PGOData->getFunctionCounts(CGM.getMangledName(GD), *RegionCounts) ||
+  if (PGOData->getFunctionCounts(Name, *RegionCounts) ||
       RegionCounts->size() != NumRegionCounters) {
     delete RegionCounts;
     RegionCounts = 0;
diff --git a/clang/lib/CodeGen/CodeGenPGO.h b/clang/lib/CodeGen/CodeGenPGO.h
index 5f7da4c..6af25b42 100644
--- a/clang/lib/CodeGen/CodeGenPGO.h
+++ b/clang/lib/CodeGen/CodeGenPGO.h
@@ -118,9 +118,9 @@
   /// function. Does nothing if instrumentation is not enabled and either
   /// generates global variables or associates PGO data with each of the
   /// counters depending on whether we are generating or using instrumentation.
-  void assignRegionCounters(GlobalDecl &GD);
+  void assignRegionCounters(const Decl *D, StringRef Name);
   /// Emit code to write counts for a given function to disk, if necessary.
-  void emitWriteoutFunction(GlobalDecl &GD);
+  void emitWriteoutFunction(StringRef Name);
   /// Clean up region counter state. Must be called if assignRegionCounters is
   /// used.
   void destroyRegionCounters();
@@ -131,7 +131,7 @@
 private:
   void mapRegionCounters(const Decl *D);
   void computeRegionCounts(const Decl *D);
-  void loadRegionCounts(GlobalDecl &GD, PGOProfileData *PGOData);
+  void loadRegionCounts(StringRef Name, PGOProfileData *PGOData);
   void emitCounterVariables();
 
   /// Emit code to increment the counter at the given index