diff options
author | Bob Wilson <bob.wilson@apple.com> | 2014-03-06 06:10:02 +0000 |
---|---|---|
committer | Bob Wilson <bob.wilson@apple.com> | 2014-03-06 06:10:02 +0000 |
commit | 5ec8fe19cf10d64f17ba24e066c7450ee95abecb (patch) | |
tree | 4e8863b01b86325e1b3174def88267f2ddaf875b /clang/lib/CodeGen | |
parent | 0a685a9a52e1471a9ee15fe6ed7a0b25b7915a3f (diff) | |
download | bcm5719-llvm-5ec8fe19cf10d64f17ba24e066c7450ee95abecb.tar.gz bcm5719-llvm-5ec8fe19cf10d64f17ba24e066c7450ee95abecb.zip |
PGO: add instrumentation for Objective-C methods.
llvm-svn: 203085
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGObjC.cpp | 5 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenPGO.cpp | 27 |
2 files changed, 30 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp index c1d7d2024ce..800d3a97dc2 100644 --- a/clang/lib/CodeGen/CGObjC.cpp +++ b/clang/lib/CodeGen/CGObjC.cpp @@ -502,9 +502,14 @@ static llvm::Value *emitARCRetainLoadOfScalar(CodeGenFunction &CGF, /// its pointer, name, and types registered in the class struture. void CodeGenFunction::GenerateObjCMethod(const ObjCMethodDecl *OMD) { StartObjCMethod(OMD, OMD->getClassInterface(), OMD->getLocStart()); + PGO.assignRegionCounters(OMD, CurFn); assert(isa<CompoundStmt>(OMD->getBody())); + RegionCounter Cnt = getPGORegionCounter(OMD->getBody()); + Cnt.beginRegion(Builder); EmitCompoundStmtWithoutScope(*cast<CompoundStmt>(OMD->getBody())); FinishFunction(OMD->getBodyRBrace()); + PGO.emitWriteoutFunction(); + PGO.destroyRegionCounters(); } /// emitStructGetterCall - Call the runtime function to load a property diff --git a/clang/lib/CodeGen/CodeGenPGO.cpp b/clang/lib/CodeGen/CodeGenPGO.cpp index 6678c37929b..349160ad352 100644 --- a/clang/lib/CodeGen/CodeGenPGO.cpp +++ b/clang/lib/CodeGen/CodeGenPGO.cpp @@ -49,11 +49,17 @@ PGOProfileData::PGOProfileData(CodeGenModule &CGM, std::string Path) while (CurPtr < BufferEnd) { // Read the function name. const char *FuncStart = CurPtr; - CurPtr = strchr(CurPtr, ' '); + // For Objective-C methods, the name may include whitespace, so search + // backward from the end of the line to find the space that separates the + // name from the number of counters. (This is a temporary hack since we are + // going to completely replace this file format in the near future.) + CurPtr = strchr(CurPtr, '\n'); if (!CurPtr) { ReportBadPGOData(CGM, "pgo data file has malformed function entry"); return; } + while (*--CurPtr != ' ') + ; StringRef FuncName(FuncStart, CurPtr - FuncStart); // Read the number of counters. @@ -129,8 +135,10 @@ bool PGOProfileData::getFunctionCounts(StringRef FuncName, const char *CurPtr = DataBuffer->getBufferStart() + OffsetIter->getValue(); // Skip over the function name. - CurPtr = strchr(CurPtr, ' '); + CurPtr = strchr(CurPtr, '\n'); assert(CurPtr && "pgo-data has corrupted function entry"); + while (*--CurPtr != ' ') + ; // Read the number of counters. char *EndPtr; @@ -303,6 +311,10 @@ namespace { (*CounterMap)[S->getBody()] = NextCounter++; Visit(S->getBody()); } + void VisitObjCMethodDecl(const ObjCMethodDecl *S) { + (*CounterMap)[S->getBody()] = NextCounter++; + Visit(S->getBody()); + } /// Assign a counter to track the block following a label. void VisitLabelStmt(const LabelStmt *S) { (*CounterMap)[S] = NextCounter++; @@ -462,6 +474,13 @@ namespace { Visit(S->getBody()); } + void VisitObjCMethodDecl(const ObjCMethodDecl *S) { + RegionCounter Cnt(PGO, S->getBody()); + Cnt.beginRegion(); + (*CountMap)[S->getBody()] = PGO.getCurrentRegionCount(); + Visit(S->getBody()); + } + void VisitReturnStmt(const ReturnStmt *S) { RecordStmtCount(S); if (S->getRetValue()) @@ -781,6 +800,8 @@ void CodeGenPGO::mapRegionCounters(const Decl *D) { MapRegionCounters Walker(RegionCounterMap); if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) Walker.VisitFunctionDecl(FD); + else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D)) + Walker.VisitObjCMethodDecl(MD); NumRegionCounters = Walker.NextCounter; } @@ -789,6 +810,8 @@ void CodeGenPGO::computeRegionCounts(const Decl *D) { ComputeRegionCounts Walker(StmtCountMap, *this); if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) Walker.VisitFunctionDecl(FD); + else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D)) + Walker.VisitObjCMethodDecl(MD); } void CodeGenPGO::emitCounterVariables() { |