diff options
| author | Bob Wilson <bob.wilson@apple.com> | 2014-03-06 04:55:35 +0000 |
|---|---|---|
| committer | Bob Wilson <bob.wilson@apple.com> | 2014-03-06 04:55:35 +0000 |
| commit | 68f475faf747c537591aa8a29bd9cdaf12da820b (patch) | |
| tree | debdf32c8bad742bf989c0588f30b9c2b262b1d8 /clang/lib/CodeGen | |
| parent | 749ebc7f33de3ea3f3212daa3bdcd958b1ca0ff6 (diff) | |
| download | bcm5719-llvm-68f475faf747c537591aa8a29bd9cdaf12da820b.tar.gz bcm5719-llvm-68f475faf747c537591aa8a29bd9cdaf12da820b.zip | |
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
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CodeGenPGO.cpp | 13 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CodeGenPGO.h | 6 |
3 files changed, 11 insertions, 12 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index c550aaded72..d0f1cb6b258 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -589,7 +589,6 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, 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 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn, 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 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn, 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 38bb4c00aa3..a918658b47e 100644 --- a/clang/lib/CodeGen/CodeGenPGO.cpp +++ b/clang/lib/CodeGen/CodeGenPGO.cpp @@ -162,7 +162,7 @@ bool PGOProfileData::getFunctionCounts(StringRef MangledName, return false; } -void CodeGenPGO::emitWriteoutFunction(GlobalDecl &GD) { +void CodeGenPGO::emitWriteoutFunction(StringRef Name) { if (!CGM.getCodeGenOpts().ProfileInstrGenerate) return; @@ -207,7 +207,7 @@ void CodeGenPGO::emitWriteoutFunction(GlobalDecl &GD) { 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 @@ namespace { }; } -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 @@ void CodeGenPGO::emitCounterIncrement(CGBuilderTy &Builder, unsigned Counter) { 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 5f7da4c79a0..6af25b42052 100644 --- a/clang/lib/CodeGen/CodeGenPGO.h +++ b/clang/lib/CodeGen/CodeGenPGO.h @@ -118,9 +118,9 @@ public: /// 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 @@ public: 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 |

