r203085 - PGO: add instrumentation for Objective-C methods.

Bob Wilson bob.wilson at apple.com
Wed Mar 5 23:45:06 PST 2014


Thanks. I was just trying something similar and had the same thought about using %clang_cc1. It seems like there was an issue with that earlier with the CodeGen/instr-profile.c tests, but I can look into it tomorrow.

On Mar 5, 2014, at 11:42 PM, NAKAMURA Takumi <geek4civic at gmail.com> wrote:

> Tweaked in r203092.
> 
> Please confirm "-target x86_64-darwin" would be proper here.
> Could you consider to use %clang_cc1 instead of %clang ?
> 
> 2014-03-06 15:10 GMT+09:00 Bob Wilson <bob.wilson at apple.com>:
>> Author: bwilson
>> Date: Thu Mar  6 00:10:02 2014
>> New Revision: 203085
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=203085&view=rev
>> Log:
>> PGO: add instrumentation for Objective-C methods.
>> 
>> Modified:
>>    cfe/trunk/lib/CodeGen/CGObjC.cpp
>>    cfe/trunk/lib/CodeGen/CodeGenPGO.cpp
>>    cfe/trunk/test/CodeGenObjC/Inputs/instr-profile.profdata
>>    cfe/trunk/test/CodeGenObjC/instr-profile.m
>> 
>> Modified: cfe/trunk/lib/CodeGen/CGObjC.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjC.cpp?rev=203085&r1=203084&r2=203085&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGObjC.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGObjC.cpp Thu Mar  6 00:10:02 2014
>> @@ -502,9 +502,14 @@ static llvm::Value *emitARCRetainLoadOfS
>> /// 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
>> 
>> Modified: cfe/trunk/lib/CodeGen/CodeGenPGO.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenPGO.cpp?rev=203085&r1=203084&r2=203085&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CodeGenPGO.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CodeGenPGO.cpp Thu Mar  6 00:10:02 2014
>> @@ -49,11 +49,17 @@ PGOProfileData::PGOProfileData(CodeGenMo
>>   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(S
>>   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
>>   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(con
>>   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() {
>> 
>> Modified: cfe/trunk/test/CodeGenObjC/Inputs/instr-profile.profdata
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/Inputs/instr-profile.profdata?rev=203085&r1=203084&r2=203085&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenObjC/Inputs/instr-profile.profdata (original)
>> +++ cfe/trunk/test/CodeGenObjC/Inputs/instr-profile.profdata Thu Mar  6 00:10:02 2014
>> @@ -1,4 +1,4 @@
>> -foreach 2
>> +instr-profile.m:+[A foreach:] 2
>> 1
>> 2
>> 
>> 
>> Modified: cfe/trunk/test/CodeGenObjC/instr-profile.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/instr-profile.m?rev=203085&r1=203084&r2=203085&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenObjC/instr-profile.m (original)
>> +++ cfe/trunk/test/CodeGenObjC/instr-profile.m Thu Mar  6 00:10:02 2014
>> @@ -8,11 +8,24 @@
>> // RUN: %clang %s -o - -emit-llvm -S -fprofile-instr-use=%S/Inputs/instr-profile.profdata | FileCheck -check-prefix=PGOUSE %s
>> 
>> #ifdef HAVE_FOUNDATION
>> +
>> // Use this to build an instrumented version to regenerate the input file.
>> #import <Foundation/Foundation.h>
>> +
>> #else
>> +
>> +// Minimal definitions to get this to compile without Foundation.h.
>> +
>> + at protocol NSObject
>> + at end
>> +
>> + at interface NSObject <NSObject>
>> +- (id)init;
>> ++ (id)alloc;
>> + at end
>> +
>> struct NSFastEnumerationState;
>> - at interface NSArray
>> + at interface NSArray : NSObject
>> - (unsigned long) countByEnumeratingWithState: (struct NSFastEnumerationState*) state
>>                   objects: (id*) buffer
>>                   count: (unsigned long) bufferSize;
>> @@ -22,17 +35,26 @@ struct NSFastEnumerationState;
>> 
>> // PGOGEN: @[[FOR:__llvm_pgo_ctr[0-9]*]] = private global [2 x i64] zeroinitializer
>> 
>> -// PGOGEN-LABEL: @foreach
>> -// PGOUSE-LABEL: @foreach
>> + at interface A : NSObject
>> ++ (void)foreach: (NSArray *)array;
>> + at end
>> +
>> + at implementation A
>> +// PGOGEN-LABEL: define {{.*}}+[A foreach:]
>> +// PGOUSE-LABEL: define {{.*}}+[A foreach:]
>> // PGOGEN: store {{.*}} @[[FOR]], i64 0, i64 0
>> -void foreach(NSArray *array) {
>> ++ (void)foreach: (NSArray *)array
>> +{
>>   // PGOGEN: store {{.*}} @[[FOR]], i64 0, i64 1
>>   // FIXME: We don't emit branch weights for this yet.
>>   for (id x in array) {
>>   }
>> }
>> + at end
>> 
>> int main(int argc, const char *argv[]) {
>> +  A *a = [[A alloc] init];
>>   NSArray *array = [NSArray arrayWithObjects: @"0", @"1", (void*)0];
>> -  foreach(array);
>> +  [A foreach: array];
>> +  return 0;
>> }
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list