Missing sema test cases, but otherwise LGTM! ~Aaron
On Wed, Dec 18, 2013 at 6:09 PM, Fariborz Jahanian <[email protected]> wrote: > Author: fjahanian > Date: Wed Dec 18 17:09:57 2013 > New Revision: 197625 > > URL: http://llvm.org/viewvc/llvm-project?rev=197625&view=rev > Log: > ObjectiveC. support "section" attribute on properties > and methods. rdar://15450637 > > Added: > cfe/trunk/test/CodeGenObjC/property-section-attribute.m > Modified: > cfe/trunk/include/clang/Basic/Attr.td > cfe/trunk/include/clang/Sema/AttributeList.h > cfe/trunk/lib/Sema/SemaObjCProperty.cpp > > Modified: cfe/trunk/include/clang/Basic/Attr.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=197625&r1=197624&r2=197625&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/Attr.td (original) > +++ cfe/trunk/include/clang/Basic/Attr.td Wed Dec 18 17:09:57 2013 > @@ -818,8 +818,9 @@ def InitPriority : InheritableAttr { > def Section : InheritableAttr { > let Spellings = [GNU<"section">, CXX11<"gnu", "section">]; > let Args = [StringArgument<"Name">]; > - let Subjects = SubjectList<[Function, GlobalVar], ErrorDiag, > - "ExpectedFunctionOrGlobalVar">; > + let Subjects = SubjectList<[Function, GlobalVar, > + ObjCMethod, ObjCProperty], ErrorDiag, > + "ExpectedFunctionGlobalVarMethodOrProperty">; > } > > def Sentinel : InheritableAttr { > > Modified: cfe/trunk/include/clang/Sema/AttributeList.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/AttributeList.h?rev=197625&r1=197624&r2=197625&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Sema/AttributeList.h (original) > +++ cfe/trunk/include/clang/Sema/AttributeList.h Wed Dec 18 17:09:57 2013 > @@ -912,7 +912,7 @@ enum AttributeDeclKind { > ExpectedObjCInterfaceDeclInitMethod, > ExpectedFunctionVariableOrClass, > ExpectedObjectiveCProtocol, > - ExpectedFunctionOrGlobalVar > + ExpectedFunctionGlobalVarMethodOrProperty > }; > > } // end namespace clang > > Modified: cfe/trunk/lib/Sema/SemaObjCProperty.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaObjCProperty.cpp?rev=197625&r1=197624&r2=197625&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaObjCProperty.cpp (original) > +++ cfe/trunk/lib/Sema/SemaObjCProperty.cpp Wed Dec 18 17:09:57 2013 > @@ -1934,6 +1934,10 @@ void Sema::ProcessPropertyDecl(ObjCPrope > if (property->hasAttr<ObjCReturnsInnerPointerAttr>()) > GetterMethod->addAttr( > ::new (Context) ObjCReturnsInnerPointerAttr(Loc, Context)); > + > + if (const SectionAttr *SA = property->getAttr<SectionAttr>()) > + GetterMethod->addAttr(::new (Context) SectionAttr(Loc, > + Context, > SA->getName())); > > if (getLangOpts().ObjCAutoRefCount) > CheckARCMethodDecl(GetterMethod); > @@ -1984,7 +1988,9 @@ void Sema::ProcessPropertyDecl(ObjCPrope > // and the real context should be the same. > if (lexicalDC) > SetterMethod->setLexicalDeclContext(lexicalDC); > - > + if (const SectionAttr *SA = property->getAttr<SectionAttr>()) > + SetterMethod->addAttr(::new (Context) SectionAttr(Loc, > + Context, > SA->getName())); > // It's possible for the user to have set a very odd custom > // setter selector that causes it to have a method family. > if (getLangOpts().ObjCAutoRefCount) > > Added: cfe/trunk/test/CodeGenObjC/property-section-attribute.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/property-section-attribute.m?rev=197625&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGenObjC/property-section-attribute.m (added) > +++ cfe/trunk/test/CodeGenObjC/property-section-attribute.m Wed Dec 18 > 17:09:57 2013 > @@ -0,0 +1,13 @@ > +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | > FileCheck %s > +// rdar://15450637. > + > +@interface NSObject @end > + > +@interface Foo : NSObject > +@property int p __attribute__((section("__TEXT,foo"))); > +@end > + > +@implementation Foo @end > + > +// CHECK: define internal i32 @"\01-[Foo p]"({{.*}} section "__TEXT,foo" { > +// CHECK: define internal void @"\01-[Foo setP:]"({{.*}} section > "__TEXT,foo" { > > > _______________________________________________ > 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
