On 17.12.2012, at 16:59, David Chisnall <[email protected]> wrote: > Author: theraven > Date: Mon Dec 17 09:59:29 2012 > New Revision: 170344 > > URL: http://llvm.org/viewvc/llvm-project?rev=170344&view=rev > Log: > Added support for new property helpers (GNUstep runtime). > > > Modified: > cfe/trunk/lib/CodeGen/CGObjC.cpp > cfe/trunk/lib/CodeGen/CGObjCGNU.cpp > cfe/trunk/lib/CodeGen/CGObjCMac.cpp > cfe/trunk/lib/CodeGen/CGObjCRuntime.h > cfe/trunk/test/CodeGenObjC/optimized-setter.m > cfe/trunk/test/CodeGenObjCXX/property-object-reference-2.mm > > Modified: cfe/trunk/lib/CodeGen/CGObjC.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjC.cpp?rev=170344&r1=170343&r2=170344&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGObjC.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGObjC.cpp Mon Dec 17 09:59:29 2012 > @@ -772,7 +772,7 @@ > args.add(RValue::get(AtomicHelperFn), CGF.getContext().VoidPtrTy); > > llvm::Value *copyCppAtomicObjectFn = > - CGF.CGM.getObjCRuntime().GetCppAtomicObjectFunction(); > + CGF.CGM.getObjCRuntime().GetCppAtomicObjectGetFunction(); > CGF.EmitCall(CGF.getTypes().arrangeFreeFunctionCall(CGF.getContext().VoidTy, > args, > FunctionType::ExtInfo(), > @@ -1007,7 +1007,7 @@ > args.add(RValue::get(AtomicHelperFn), CGF.getContext().VoidPtrTy); > > llvm::Value *copyCppAtomicObjectFn = > - CGF.CGM.getObjCRuntime().GetCppAtomicObjectFunction(); > + CGF.CGM.getObjCRuntime().GetCppAtomicObjectSetFunction(); > CGF.EmitCall(CGF.getTypes().arrangeFreeFunctionCall(CGF.getContext().VoidTy, > args, > FunctionType::ExtInfo(), > @@ -2800,8 +2800,7 @@ > } > > static bool hasAtomicCopyHelperAPI(const ObjCRuntime &runtime) { > - // For now, only NeXT has these APIs. > - return runtime.isNeXTFamily(); > + return runtime.hasAtomicCopyHelper();
lib/CodeGen/CGObjC.cpp:2803:18: error: no member named 'hasAtomicCopyHelper' in 'clang::ObjCRuntime' > } > > /// GenerateObjCAtomicSetterCopyHelperFunction - Given a c++ object type with > > Modified: cfe/trunk/lib/CodeGen/CGObjCGNU.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCGNU.cpp?rev=170344&r1=170343&r2=170344&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGObjCGNU.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGObjCGNU.cpp Mon Dec 17 09:59:29 2012 > @@ -492,8 +492,9 @@ > virtual llvm::Constant *GetOptimizedPropertySetFunction(bool atomic, > bool copy); > virtual llvm::Constant *GetSetStructFunction(); > - virtual llvm::Constant *GetCppAtomicObjectFunction(); > virtual llvm::Constant *GetGetStructFunction(); > + virtual llvm::Constant *GetCppAtomicObjectGetFunction(); > + virtual llvm::Constant *GetCppAtomicObjectSetFunction(); > virtual llvm::Constant *EnumerationMutationFunction(); > > virtual void EmitTryStmt(CodeGenFunction &CGF, > @@ -601,6 +602,20 @@ > /// arguments. Returns the slot for the corresponding method. Superclass > /// message lookup rarely changes, so this is a good caching opportunity. > LazyRuntimeFunction SlotLookupSuperFn; > + /// Specialised function for setting atomic retain properties > + LazyRuntimeFunction SetPropertyAtomic; > + /// Specialised function for setting atomic copy properties > + LazyRuntimeFunction SetPropertyAtomicCopy; > + /// Specialised function for setting nonatomic retain properties > + LazyRuntimeFunction SetPropertyNonAtomic; > + /// Specialised function for setting nonatomic copy properties > + LazyRuntimeFunction SetPropertyNonAtomicCopy; > + /// Function to perform atomic copies of C++ objects with nontrivial copy > + /// constructors from Objective-C ivars. > + LazyRuntimeFunction CxxAtomicObjectGetFn; > + /// Function to perform atomic copies of C++ objects with nontrivial copy > + /// constructors to Objective-C ivars. > + LazyRuntimeFunction CxxAtomicObjectSetFn; > /// Type of an slot structure pointer. This is returned by the various > /// lookup functions. > llvm::Type *SlotTy; > @@ -676,8 +691,60 @@ > // void __cxa_end_catch(void) > ExitCatchFn.init(&CGM, "__cxa_end_catch", VoidTy, NULL); > // void _Unwind_Resume_or_Rethrow(void*) > - ExceptionReThrowFn.init(&CGM, "_Unwind_Resume_or_Rethrow", VoidTy, > PtrTy, NULL); > + ExceptionReThrowFn.init(&CGM, "_Unwind_Resume_or_Rethrow", VoidTy, > + PtrTy, NULL); > } > + llvm::Type *VoidTy = llvm::Type::getVoidTy(VMContext); > + SetPropertyAtomic.init(&CGM, "objc_setProperty_atomic", VoidTy, IdTy, > + SelectorTy, IdTy, PtrDiffTy, NULL); > + SetPropertyAtomicCopy.init(&CGM, "objc_setProperty_atomic_copy", > VoidTy, > + IdTy, SelectorTy, IdTy, PtrDiffTy, NULL); > + SetPropertyNonAtomic.init(&CGM, "objc_setProperty_nonatomic", VoidTy, > + IdTy, SelectorTy, IdTy, PtrDiffTy, NULL); > + SetPropertyNonAtomicCopy.init(&CGM, "objc_setProperty_nonatomic_copy", > + VoidTy, IdTy, SelectorTy, IdTy, PtrDiffTy, NULL); > + // void objc_setCppObjectAtomic(void *dest, const void *src, void > + // *helper); > + CxxAtomicObjectSetFn.init(&CGM, "objc_setCppObjectAtomic", VoidTy, > PtrTy, > + PtrTy, PtrTy, NULL); > + // void objc_getCppObjectAtomic(void *dest, const void *src, void > + // *helper); > + CxxAtomicObjectGetFn.init(&CGM, "objc_getCppObjectAtomic", VoidTy, > PtrTy, > + PtrTy, PtrTy, NULL); > + } > + virtual llvm::Constant *GetCppAtomicObjectGetFunction() { > + // The optimised functions were added in version 1.7 of the GNUstep > + // runtime. > + assert (CGM.getLangOpts().ObjCRuntime.getVersion() >= > + VersionTuple(1, 7)); > + return CxxAtomicObjectGetFn; > + } > + virtual llvm::Constant *GetCppAtomicObjectSetFunction() { > + ObjCRuntime R = CGM.getLangOpts().ObjCRuntime; > + // The optimised functions were added in version 1.7 of the GNUstep > + // runtime. > + if (R.getVersion() < VersionTuple(1, 7)) return 0; > + return CxxAtomicObjectSetFn; > + } > + virtual llvm::Constant *GetOptimizedPropertySetFunction(bool atomic, > + bool copy) { > + // The optimised property functions omit the GC check, and so are not > + // safe to use in GC mode. The standard functions are fast in GC mode, > + // so there is less advantage in using them. > + assert ((CGM.getLangOpts().getGC() == LangOptions::NonGC)) return 0; lib/CodeGen/CGObjCGNU.cpp:734:65: error: expected ';' after expression Please fix or revert asap. - Ben > + // The optimised functions were added in version 1.7 of the GNUstep > + // runtime. > + assert (CGM.getLangOpts().ObjCRuntime.getVersion() >= > + VersionTuple(1, 7)); > + > + if (atomic) { > + if (copy) return SetPropertyAtomicCopy; > + return SetPropertyAtomic; > + } > + if (copy) return SetPropertyNonAtomicCopy; > + return SetPropertyNonAtomic; > + > + return 0; > } > }; > > @@ -2535,7 +2602,10 @@ > llvm::Constant *CGObjCGNU::GetSetStructFunction() { > return SetStructPropertyFn; > } > -llvm::Constant *CGObjCGNU::GetCppAtomicObjectFunction() { > +llvm::Constant *CGObjCGNU::GetCppAtomicObjectGetFunction() { > + return 0; > +} > +llvm::Constant *CGObjCGNU::GetCppAtomicObjectSetFunction() { > return 0; > } > > > Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=170344&r1=170343&r2=170344&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Mon Dec 17 09:59:29 2012 > @@ -1223,7 +1223,8 @@ > bool copy); > virtual llvm::Constant *GetGetStructFunction(); > virtual llvm::Constant *GetSetStructFunction(); > - virtual llvm::Constant *GetCppAtomicObjectFunction(); > + virtual llvm::Constant *GetCppAtomicObjectGetFunction(); > + virtual llvm::Constant *GetCppAtomicObjectSetFunction(); > virtual llvm::Constant *EnumerationMutationFunction(); > > virtual void EmitTryStmt(CodeGen::CodeGenFunction &CGF, > @@ -1494,7 +1495,10 @@ > virtual llvm::Constant *GetGetStructFunction() { > return ObjCTypes.getCopyStructFn(); > } > - virtual llvm::Constant *GetCppAtomicObjectFunction() { > + virtual llvm::Constant *GetCppAtomicObjectSetFunction() { > + return ObjCTypes.getCppAtomicObjectFunction(); > + } > + virtual llvm::Constant *GetCppAtomicObjectGetFunction() { > return ObjCTypes.getCppAtomicObjectFunction(); > } > > @@ -3409,7 +3413,10 @@ > return ObjCTypes.getCopyStructFn(); > } > > -llvm::Constant *CGObjCMac::GetCppAtomicObjectFunction() { > +llvm::Constant *CGObjCMac::GetCppAtomicObjectGetFunction() { > + return ObjCTypes.getCppAtomicObjectFunction(); > +} > +llvm::Constant *CGObjCMac::GetCppAtomicObjectSetFunction() { > return ObjCTypes.getCppAtomicObjectFunction(); > } > > > Modified: cfe/trunk/lib/CodeGen/CGObjCRuntime.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCRuntime.h?rev=170344&r1=170343&r2=170344&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGObjCRuntime.h (original) > +++ cfe/trunk/lib/CodeGen/CGObjCRuntime.h Mon Dec 17 09:59:29 2012 > @@ -209,9 +209,12 @@ > virtual llvm::Constant *GetGetStructFunction() = 0; > // API for atomic copying of qualified aggregates in setter. > virtual llvm::Constant *GetSetStructFunction() = 0; > - // API for atomic copying of qualified aggregates with non-trivial copy > - // assignment (c++) in setter/getter. > - virtual llvm::Constant *GetCppAtomicObjectFunction() = 0; > + /// API for atomic copying of qualified aggregates with non-trivial copy > + /// assignment (c++) in setter. > + virtual llvm::Constant *GetCppAtomicObjectSetFunction() = 0; > + /// API for atomic copying of qualified aggregates with non-trivial copy > + /// assignment (c++) in getter. > + virtual llvm::Constant *GetCppAtomicObjectGetFunction() = 0; > > /// GetClass - Return a reference to the class for the given > /// interface decl. > > Modified: cfe/trunk/test/CodeGenObjC/optimized-setter.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/optimized-setter.m?rev=170344&r1=170343&r2=170344&view=diff > ============================================================================== > --- cfe/trunk/test/CodeGenObjC/optimized-setter.m (original) > +++ cfe/trunk/test/CodeGenObjC/optimized-setter.m Mon Dec 17 09:59:29 2012 > @@ -1,5 +1,6 @@ > // RUN: %clang_cc1 %s -emit-llvm -fobjc-runtime=macosx-10.8 -triple > x86_64-apple-macosx10.8.0 -o - | FileCheck %s > // RUN: %clang_cc1 %s -emit-llvm -fobjc-runtime=ios-6.0.0 -triple > x86_64-apple-ios6.0.0 -o - | FileCheck %s > +// RUN: %clang_cc1 %s -emit-llvm -fobjc-runtime=gnustep-1.7 -triple > x86_64-unknown-freebsd -o - | FileCheck %s > // rdar://10179974 > > @interface I > > Modified: cfe/trunk/test/CodeGenObjCXX/property-object-reference-2.mm > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/property-object-reference-2.mm?rev=170344&r1=170343&r2=170344&view=diff > ============================================================================== > --- cfe/trunk/test/CodeGenObjCXX/property-object-reference-2.mm (original) > +++ cfe/trunk/test/CodeGenObjCXX/property-object-reference-2.mm Mon Dec 17 > 09:59:29 2012 > @@ -1,4 +1,5 @@ > // RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 > -fobjc-runtime=macosx-10.7 -emit-llvm -o - | FileCheck %s > +// RUN: %clang_cc1 %s -triple x86_64-unknown-freebsd > -fobjc-runtime=gnustep-1.7 -emit-llvm -o - | FileCheck > -check-prefix=CHECK-GNUSTEP %s > // rdar://6137845 > > extern int DEFAULT(); > @@ -54,3 +55,6 @@ > // CHECK: [[THREE:%.*]] = bitcast %struct.TCPPObject* [[MYPROPERTY:%.*]] to > i8* > // CHECK: call void @objc_copyCppObjectAtomic(i8* [[TWO]], i8* [[THREE]], i8* > bitcast (void (%struct.TCPPObject*, %struct.TCPPObject*)* > @__assign_helper_atomic_property_ to i8*)) > // CHECK: ret void > + > +// CHECK-GNUSTEP: objc_getCppObjectAtomic > +// CHECK-GNUSTEP: objc_setCppObjectAtomic > > > _______________________________________________ > 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
