Author: adrian
Date: Thu May 30 13:12:23 2013
New Revision: 182947

URL: http://llvm.org/viewvc/llvm-project?rev=182947&view=rev
Log:
Do not reuse the debug location of the return value's store if there is 
autorelease code to be emitted between store and return instructions. This is 
analoguous to what we do for lexical scope cleanups.

rdar://problem/13977888

Added:
    cfe/trunk/test/CodeGenObjC/arc-linetable-autorelease.m
Modified:
    cfe/trunk/lib/CodeGen/CGCall.cpp

Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=182947&r1=182946&r2=182947&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Thu May 30 13:12:23 2013
@@ -1667,8 +1667,10 @@ void CodeGenFunction::EmitFunctionEpilog
       // If there is a dominating store to ReturnValue, we can elide
       // the load, zap the store, and usually zap the alloca.
       if (llvm::StoreInst *SI = findDominatingStoreToReturnValue(*this)) {
-        // Reuse the debug location from the store unless we're told not to.
-        if (EmitRetDbgLoc)
+        // Reuse the debug location from the store unless there is
+        // cleanup code to be emitted between the store and return
+        // instruction.
+        if (EmitRetDbgLoc && !AutoreleaseResult)
           RetDbgLoc = SI->getDebugLoc();
         // Get the stored value and nuke the now-dead store.
         RV = SI->getValueOperand();

Added: cfe/trunk/test/CodeGenObjC/arc-linetable-autorelease.m
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/arc-linetable-autorelease.m?rev=182947&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenObjC/arc-linetable-autorelease.m (added)
+++ cfe/trunk/test/CodeGenObjC/arc-linetable-autorelease.m Thu May 30 13:12:23 
2013
@@ -0,0 +1,40 @@
+// RUN: %clang_cc1 -emit-llvm -fobjc-arc -g -triple x86_64-apple-darwin10 %s 
-o - | FileCheck %s
+// Ensure that the line info is making sense:
+// ARC cleanups should be at the closing '}'.
+@protocol NSObject
+@end
+
+@interface NSObject <NSObject> {}
+@end
+
+@protocol NSCopying
+@end
+
+@protocol NSCoding
+@end
+
+typedef double CGFloat;
+struct CGRect {};
+typedef struct CGRect CGRect;
+typedef CGRect NSRect;
+NSRect NSMakeRect(CGFloat x, CGFloat y, CGFloat w, CGFloat h);
+@interface NSBezierPath : NSObject <NSCopying, NSCoding>
++ (NSBezierPath *)bezierPathWithRoundedRect:(NSRect)rect 
xRadius:(CGFloat)xRadius yRadius:(CGFloat)yRadius;
+@end
+@implementation AppDelegate : NSObject {}
+- (NSBezierPath *)_createBezierPathWithWidth:(CGFloat)width 
height:(CGFloat)height radius:(CGFloat)radius lineWidth:(CGFloat)lineWidth
+{
+  NSRect rect = NSMakeRect(0, 0, width, height);
+  NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:rect 
xRadius:radius yRadius:radius];
+  CGFloat pattern[2];
+  // CHECK: define {{.*}}_createBezierPathWithWidth
+  // CHECK: load {{.*}} %path, align {{.*}}, !dbg ![[RET:[0-9]+]]
+  // CHECK: call void @objc_storeStrong{{.*}} !dbg ![[ARC1:[0-9]+]]
+  // CHECK: call {{.*}} @objc_autoreleaseReturnValue{{.*}} !dbg 
![[ARC2:[0-9]+]]
+  // CHECK: ret {{.*}} !dbg ![[ARC2]]
+  // CHECK: ![[RET]] = metadata !{i32 [[@LINE+1]], i32 0, metadata !{{.*}}, 
null}
+  return path;
+  // CHECK: ![[ARC1]] = metadata !{i32 [[@LINE+2]], i32 0, metadata !{{.*}}, 
null}
+  // CHECK: ![[ARC2]] = metadata !{i32 [[@LINE+1]], i32 0, metadata !{{.*}}, 
null}
+}
+@end


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to