r207480 - Debug info: Improve line table for functions with cleanups an early exit
Richard Smith
richard at metafoo.co.uk
Mon Apr 28 19:26:38 PDT 2014
On Mon, Apr 28, 2014 at 6:45 PM, Richard Smith <richard at metafoo.co.uk>wrote:
> On Mon, Apr 28, 2014 at 6:08 PM, Adrian Prantl <aprantl at apple.com> wrote:
>
>> Author: adrian
>> Date: Mon Apr 28 20:07:59 2014
>> New Revision: 207480
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=207480&view=rev
>> Log:
>> Debug info: Improve line table for functions with cleanups an early exit
>> and no return expr at the end of the function.
>> The "function has only simple returns" check in FinishFunction tests
>> whether the number of simple return exprs equals the number of return
>> exprs, but so far a fallthrough at the end of a function was not counted
>> as a return, which would result in cleanup code being associated with the
>> wrong source line.
>>
>> rdar://problem/16733984.
>>
>> Modified:
>> cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
>> cfe/trunk/test/CodeGenObjC/arc-linetable.m
>>
>> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=207480&r1=207479&r2=207480&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Mon Apr 28 20:07:59 2014
>> @@ -498,6 +498,22 @@ void CodeGenFunction::EmitOpenCLKernelMe
>> OpenCLKernelMetadata->addOperand(kernelMDNode);
>> }
>>
>> +/// Determine whether the function F ends with a return stmt.
>> +static bool endsWithReturn(const Decl* F) {
>> + const Stmt *Body = nullptr;
>> + if (auto *FD = dyn_cast_or_null<FunctionDecl>(F))
>> + Body = FD->getBody();
>> + else if (auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(F))
>> + Body = OMD->getBody();
>> +
>> + if (auto *CS = dyn_cast_or_null<CompoundStmt>(Body)) {
>> + auto LastStmt = CS->body_rbegin();
>> + if (LastStmt != CS->body_rend())
>> + return isa<ReturnStmt>(*LastStmt);
>> + }
>> + return false;
>> +}
>> +
>> void CodeGenFunction::StartFunction(GlobalDecl GD,
>> QualType RetTy,
>> llvm::Function *Fn,
>> @@ -593,6 +609,10 @@ void CodeGenFunction::StartFunction(Glob
>> if (RetTy->isVoidType()) {
>> // Void type; nothing to return.
>> ReturnValue = 0;
>> +
>> + // Count the implicit return.
>> + if (!endsWithReturn(D))
>> + ++NumReturnExprs;
>> } else if (CurFnInfo->getReturnInfo().getKind() ==
>> ABIArgInfo::Indirect &&
>> !hasScalarEvaluationKind(CurFnInfo->getReturnType())) {
>> // Indirect aggregate return; emit returned value directly into sret
>> slot.
>>
>> Modified: cfe/trunk/test/CodeGenObjC/arc-linetable.m
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/arc-linetable.m?rev=207480&r1=207479&r2=207480&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenObjC/arc-linetable.m (original)
>> +++ cfe/trunk/test/CodeGenObjC/arc-linetable.m Mon Apr 28 20:07:59 2014
>> @@ -32,6 +32,15 @@
>> // CHECK: @objc_msgSend{{.*}} !dbg ![[MSG7:[0-9]+]]
>> // CHECK: ret {{.*}} !dbg ![[RET7:[0-9]+]]
>>
>> +// CHECK: define {{.*}}testCleanupVoid
>> +// CHECK: icmp ne {{.*}}!dbg ![[SKIP1:[0-9]+]]
>> +// CHECK-NEXT: br {{.*}}, label %[[CLEANUP:.*]], label
>> +// CHECK: [[CLEANUP]]:
>>
>
> This will fail on any non-Asserts clang (where we don't emit label names
> in the IR). Please fix or revert!
>
I've added a workaround in r207488, but this should still be cleaned up to
not rely on a label, if possible.
>
>
>> +// CHECK-NEXT: !dbg ![[RET8:[0-9]+]]
>> +// CHECK: @objc_storeStrong{{.*}}, !dbg ![[ARC8:[0-9]+]]
>> +// CHECK: ret {{.*}} !dbg ![[RET8]]
>> +
>> +typedef signed char BOOL;
>>
>> @interface NSObject
>> + (id)alloc;
>> @@ -93,6 +102,22 @@
>> return 1;
>> }
>>
>> +- (void)testCleanupVoid:(BOOL)skip withDelegate: (AppDelegate *)
>> delegate {
>> + static BOOL skip_all;
>> + // CHECK: ![[SKIP1]] = metadata !{i32 [[@LINE+1]], i32 0,
>> + if (!skip_all) {
>> + if (!skip) {
>> + return;
>> + }
>> + NSString *s = @"bar";
>> + if (!skip) {
>> + [delegate testVoid :s];
>> + }
>> + }
>> + // CHECK: ![[RET8]] = metadata !{i32 [[@LINE+2]], i32 0,
>> + // CHECK: ![[ARC8]] = metadata !{i32 [[@LINE+1]], i32 0,
>> +}
>> +
>>
>> @end
>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140428/1c4c545a/attachment.html>
More information about the cfe-commits
mailing list