[cfe-commits] r106235 - in /cfe/trunk: lib/AST/Expr.cpp lib/CodeGen/CGExpr.cpp lib/CodeGen/CGObjCGNU.cpp lib/CodeGen/CGObjCMac.cpp lib/CodeGen/CGObjCRuntime.h lib/CodeGen/CodeGenFunction.h test/CodeGenObjCXX/selactor-expr-lvalue.mm
Daniel Dunbar
daniel.dunbar at gmail.com
Thu Jun 24 09:12:43 PDT 2010
On Jun 17, 2010, at 12:56, Fariborz Jahanian <fjahanian at apple.com> 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
> +
> + at interface NSObject {}
> +- (void)respondsToSelector:(SEL&)s : (SEL*)s1;
> +- (void) setPriority:(int)p;
> +- (void)Meth;
> + at end
> +
> + at implementation NSObject
> +- (void)Meth {
> + [self respondsToSelector:@selector(setPriority:) : &@selector(setPriority:)];
> +}
> +- (void) setPriority:(int)p{}
> +- (void)respondsToSelector:(SEL&)s : (SEL*)s1 {}
> + at end
>
>
> _______________________________________________
> 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