diff options
author | Zancanaro; Carlo <czan8762@plang3.cs.usyd.edu.au> | 2012-09-24 09:58:17 +1000 |
---|---|---|
committer | Zancanaro; Carlo <czan8762@plang3.cs.usyd.edu.au> | 2012-09-24 09:58:17 +1000 |
commit | 222e2a7620e6520ffaf4fc4e69d79c18da31542e (patch) | |
tree | 7bfbc05bfa3b41c8f9d2e56d53a0bc3e310df239 /clang/test/CodeGenObjC/synchronized.m | |
parent | 3d206f03985b50beacae843d880bccdc91a9f424 (diff) |
Add the clang library to the repo (with some of my changes, too).
Diffstat (limited to 'clang/test/CodeGenObjC/synchronized.m')
-rw-r--r-- | clang/test/CodeGenObjC/synchronized.m | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/clang/test/CodeGenObjC/synchronized.m b/clang/test/CodeGenObjC/synchronized.m new file mode 100644 index 0000000..4997bb7 --- /dev/null +++ b/clang/test/CodeGenObjC/synchronized.m @@ -0,0 +1,79 @@ +// RUN: %clang_cc1 -emit-llvm -triple i686-apple-darwin9 -fobjc-fragile-abi -o - %s -O2 | FileCheck %s + +@interface MyClass +{ +} +- (void)method; +@end + +@implementation MyClass + +// CHECK: define internal void @"\01-[MyClass method]" +- (void)method +{ + // CHECK: call void @objc_sync_enter + // CHECK: call void @objc_exception_try_enter + // CHECK: call i32 @_setjmp + @synchronized(self) { + } +} + +@end + +// CHECK: define void @foo( +void foo(id a) { + // CHECK: [[A:%.*]] = alloca i8* + // CHECK: [[SYNC:%.*]] = alloca i8* + + // CHECK: store i8* [[AVAL:%.*]], i8** [[A]] + // CHECK-NEXT: call void @objc_sync_enter(i8* [[AVAL]]) + // CHECK-NEXT: store i8* [[AVAL]], i8** [[SYNC]] + // CHECK-NEXT: call void @objc_exception_try_enter + // CHECK: call i32 @_setjmp + @synchronized(a) { + // This is unreachable, but the optimizers can't know that. + // CHECK: call void asm sideeffect "", "=*m,=*m,=*m"(i8** [[A]], i8** [[SYNC]] + // CHECK: call void @objc_sync_exit + // CHECK: call i8* @objc_exception_extract + // CHECK: call void @objc_exception_throw + // CHECK: unreachable + + // CHECK: call void @objc_exception_try_exit + // CHECK: [[T:%.*]] = load i8** [[SYNC]] + // CHECK-NEXT: call void @objc_sync_exit + // CHECK: ret void + return; + } + +} + +// CHECK: define i32 @f0( +int f0(id a) { + // TODO: we can optimize the ret to a constant if we can figure out + // either that x isn't stored to within the synchronized block or + // that the synchronized block can't longjmp. + + // CHECK: [[X:%.*]] = alloca i32 + // CHECK: store i32 1, i32* [[X]] + int x = 0; + @synchronized((x++, a)) { + } + + // CHECK: [[T:%.*]] = load i32* [[X]] + // CHECK: ret i32 [[T]] + return x; +} + +// CHECK: define void @f1( +void f1(id a) { + // Check that the return doesn't go through the cleanup. + extern void opaque(void); + opaque(); + + // CHECK: call void @opaque() + // CHECK-NEXT: ret void + + @synchronized(({ return; }), a) { + return; + } +} |