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 <[email protected]> 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 <[email protected]>: >> 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. >> + >> +@protocol NSObject >> +@end >> + >> +@interface NSObject <NSObject> >> +- (id)init; >> ++ (id)alloc; >> +@end >> + >> struct NSFastEnumerationState; >> -@interface NSArray >> +@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 >> +@interface A : NSObject >> ++ (void)foreach: (NSArray *)array; >> +@end >> + >> +@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) { >> } >> } >> +@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 >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
