summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
authorBob Wilson <bob.wilson@apple.com>2014-03-06 06:10:02 +0000
committerBob Wilson <bob.wilson@apple.com>2014-03-06 06:10:02 +0000
commit5ec8fe19cf10d64f17ba24e066c7450ee95abecb (patch)
tree4e8863b01b86325e1b3174def88267f2ddaf875b /clang/lib/CodeGen
parent0a685a9a52e1471a9ee15fe6ed7a0b25b7915a3f (diff)
downloadbcm5719-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.cpp5
-rw-r--r--clang/lib/CodeGen/CodeGenPGO.cpp27
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() {
OpenPOWER on IntegriCloud