On Jun 17, 2010, at 12:56, Fariborz Jahanian <[email protected]> wrote:
> Author: fjahanian > Date: Thu Jun 17 14:56:20 2010 > New Revision: 106235 > > URL: http://llvm.org/viewvc/llvm-project?rev=106235&view=rev > Log: > Objective-c++ IRGen. Support for @selector expression as > an lvalue. Fixes PR7390. > > Added: > cfe/trunk/test/CodeGenObjCXX/selactor-expr-lvalue.mm Typo, this should be selector... - Daniel > Modified: > cfe/trunk/lib/AST/Expr.cpp > cfe/trunk/lib/CodeGen/CGExpr.cpp > cfe/trunk/lib/CodeGen/CGObjCGNU.cpp > cfe/trunk/lib/CodeGen/CGObjCMac.cpp > cfe/trunk/lib/CodeGen/CGObjCRuntime.h > cfe/trunk/lib/CodeGen/CodeGenFunction.h > > Modified: cfe/trunk/lib/AST/Expr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=106235&r1=106234&r2=106235&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/Expr.cpp (original) > +++ cfe/trunk/lib/AST/Expr.cpp Thu Jun 17 14:56:20 2010 > @@ -1194,6 +1194,7 @@ > case ObjCIsaExprClass: > case StringLiteralClass: // C99 6.5.1p4 > case ObjCEncodeExprClass: // @encode behaves like its string in every way. > + case ObjCSelectorExprClass: // @selector > return LV_Valid; > case ArraySubscriptExprClass: // C99 6.5.3p4 (e1[e2] == (*((e1)+(e2)))) > // For vectors, make sure base is an lvalue (i.e. not a function call). > > Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=106235&r1=106234&r2=106235&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Thu Jun 17 14:56:20 2010 > @@ -568,6 +568,8 @@ > switch (E->getStmtClass()) { > default: return EmitUnsupportedLValue(E, "l-value expression"); > > + case Expr::ObjCSelectorExprClass: > + return EmitObjCSelectorLValue(cast<ObjCSelectorExpr>(E)); > case Expr::ObjCIsaExprClass: > return EmitObjCIsaExpr(cast<ObjCIsaExpr>(E)); > case Expr::BinaryOperatorClass: > @@ -1977,6 +1979,12 @@ > return LValue::MakeAddr(RV.getAggregateAddr(), > MakeQualifiers(E->getType())); > } > > +LValue CodeGenFunction::EmitObjCSelectorLValue(const ObjCSelectorExpr *E) { > + llvm::Value *V = > + CGM.getObjCRuntime().GetSelector(Builder, E->getSelector(), true); > + return LValue::MakeAddr(V, MakeQualifiers(E->getType())); > +} > + > llvm::Value *CodeGenFunction::EmitIvarOffset(const ObjCInterfaceDecl > *Interface, > const ObjCIvarDecl *Ivar) { > return CGM.getObjCRuntime().EmitIvarOffset(*this, Interface, Ivar); > > Modified: cfe/trunk/lib/CodeGen/CGObjCGNU.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCGNU.cpp?rev=106235&r1=106234&r2=106235&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGObjCGNU.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGObjCGNU.cpp Thu Jun 17 14:56:20 2010 > @@ -162,7 +162,8 @@ > const ObjCMethodDecl *Method); > virtual llvm::Value *GetClass(CGBuilderTy &Builder, > const ObjCInterfaceDecl *OID); > - virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector Sel); > + virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector Sel, > + bool lval = false); > virtual llvm::Value *GetSelector(CGBuilderTy &Builder, const ObjCMethodDecl > *Method); > > @@ -360,14 +361,16 @@ > return Builder.CreateCall(ClassLookupFn, ClassName); > } > > -llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, Selector Sel) { > +llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, Selector Sel, > + bool lval) { > llvm::GlobalAlias *&US = UntypedSelectors[Sel.getAsString()]; > if (US == 0) > US = new llvm::GlobalAlias(llvm::PointerType::getUnqual(SelectorTy), > llvm::GlobalValue::PrivateLinkage, > > ".objc_untyped_selector_alias"+Sel.getAsString(), > NULL, &TheModule); > - > + if (lval) > + return US; > return Builder.CreateLoad(US); > } > > > Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=106235&r1=106234&r2=106235&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Thu Jun 17 14:56:20 2010 > @@ -1129,7 +1129,8 @@ > > /// EmitSelector - Return a Value*, of type ObjCTypes.SelectorPtrTy, > /// for the given selector. > - llvm::Value *EmitSelector(CGBuilderTy &Builder, Selector Sel); > + llvm::Value *EmitSelector(CGBuilderTy &Builder, Selector Sel, > + bool lval=false); > > public: > CGObjCMac(CodeGen::CodeGenModule &cgm); > @@ -1160,7 +1161,8 @@ > virtual llvm::Value *GetClass(CGBuilderTy &Builder, > const ObjCInterfaceDecl *ID); > > - virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector Sel); > + virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector Sel, > + bool lval = false); > > /// The NeXT/Apple runtimes do not support typed selectors; just emit an > /// untyped one. > @@ -1328,7 +1330,8 @@ > > /// EmitSelector - Return a Value*, of type ObjCTypes.SelectorPtrTy, > /// for the given selector. > - llvm::Value *EmitSelector(CGBuilderTy &Builder, Selector Sel); > + llvm::Value *EmitSelector(CGBuilderTy &Builder, Selector Sel, > + bool lval=false); > > /// GetInterfaceEHType - Get the cached ehtype for the given Objective-C > /// interface. The return value has type EHTypePtrTy. > @@ -1391,8 +1394,9 @@ > virtual llvm::Value *GetClass(CGBuilderTy &Builder, > const ObjCInterfaceDecl *ID); > > - virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector Sel) > - { return EmitSelector(Builder, Sel); } > + virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector Sel, > + bool lvalue = false) > + { return EmitSelector(Builder, Sel, lvalue); } > > /// The NeXT/Apple runtimes do not support typed selectors; just emit an > /// untyped one. > @@ -1492,8 +1496,9 @@ > } > > /// GetSelector - Return the pointer to the unique'd string for this selector. > -llvm::Value *CGObjCMac::GetSelector(CGBuilderTy &Builder, Selector Sel) { > - return EmitSelector(Builder, Sel); > +llvm::Value *CGObjCMac::GetSelector(CGBuilderTy &Builder, Selector Sel, > + bool lval) { > + return EmitSelector(Builder, Sel, lval); > } > llvm::Value *CGObjCMac::GetSelector(CGBuilderTy &Builder, const ObjCMethodDecl > *Method) { > @@ -3107,7 +3112,8 @@ > return Builder.CreateLoad(Entry, "tmp"); > } > > -llvm::Value *CGObjCMac::EmitSelector(CGBuilderTy &Builder, Selector Sel) { > +llvm::Value *CGObjCMac::EmitSelector(CGBuilderTy &Builder, Selector Sel, > + bool lvalue) { > llvm::GlobalVariable *&Entry = SelectorReferences[Sel]; > > if (!Entry) { > @@ -3120,6 +3126,8 @@ > 4, true); > } > > + if (lvalue) > + return Entry; > return Builder.CreateLoad(Entry, "tmp"); > } > > @@ -5408,7 +5416,7 @@ > } > > llvm::Value *CGObjCNonFragileABIMac::EmitSelector(CGBuilderTy &Builder, > - Selector Sel) { > + Selector Sel, bool lval) { > llvm::GlobalVariable *&Entry = SelectorReferences[Sel]; > > if (!Entry) { > @@ -5423,6 +5431,8 @@ > CGM.AddUsedGlobal(Entry); > } > > + if (lval) > + return Entry; > return Builder.CreateLoad(Entry, "tmp"); > } > /// EmitObjCIvarAssign - Code gen for assigning to a __strong object. > > Modified: cfe/trunk/lib/CodeGen/CGObjCRuntime.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCRuntime.h?rev=106235&r1=106234&r2=106235&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGObjCRuntime.h (original) > +++ cfe/trunk/lib/CodeGen/CGObjCRuntime.h Thu Jun 17 14:56:20 2010 > @@ -97,7 +97,7 @@ > /// return value should have the LLVM type for pointer-to > /// ASTContext::getObjCSelType(). > virtual llvm::Value *GetSelector(CGBuilderTy &Builder, > - Selector Sel) = 0; > + Selector Sel, bool lval=false) = 0; > > /// Get a typed selector. > virtual llvm::Value *GetSelector(CGBuilderTy &Builder, > > Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=106235&r1=106234&r2=106235&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original) > +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Thu Jun 17 14:56:20 2010 > @@ -1087,6 +1087,7 @@ > LValue EmitObjCSuperExprLValue(const ObjCSuperExpr *E); > LValue EmitStmtExprLValue(const StmtExpr *E); > LValue EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E); > + LValue EmitObjCSelectorLValue(const ObjCSelectorExpr *E); > > > //===--------------------------------------------------------------------===// > // Scalar Expression Emission > > Added: cfe/trunk/test/CodeGenObjCXX/selactor-expr-lvalue.mm > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/selactor-expr-lvalue.mm?rev=106235&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGenObjCXX/selactor-expr-lvalue.mm (added) > +++ cfe/trunk/test/CodeGenObjCXX/selactor-expr-lvalue.mm Thu Jun 17 14:56:20 > 2010 > @@ -0,0 +1,16 @@ > +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s > +// PR7390 > + > +...@interface NSObject {} > +- (void)respondsToSelector:(SEL&)s : (SEL*)s1; > +- (void) setPriority:(int)p; > +- (void)Meth; > +...@end > + > +...@implementation NSObject > +- (void)Meth { > + [self respondsToSelector:@selector(setPriority:) : > &@selector(setPriority:)]; > +} > +- (void) setPriority:(int)p{} > +- (void)respondsToSelector:(SEL&)s : (SEL*)s1 {} > +...@end > > > _______________________________________________ > 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
