mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
This is in preparation for wiring up debug info support for noncopyable values. Originally this flag name made sense since it was set when we performed consume operator checking. Now I am going to use it for noncopyable types as well. I think the new name uses_moveable_value_debuginfo actually describes what the flag is supposed to do, tell IRGen that the value may be moved since it needs to use moveable value debug info emission.
139 lines
4.7 KiB
Plaintext
139 lines
4.7 KiB
Plaintext
// RUN: %target-sil-opt -sil-onone-debuginfo-canonicalizer -enable-sil-verify-all %s 2>&1 | %FileCheck %s
|
|
|
|
sil_stage canonical
|
|
|
|
import Builtin
|
|
|
|
struct Int64 {
|
|
var value: Builtin.Int64
|
|
}
|
|
|
|
class Klass {
|
|
var value: Int64
|
|
}
|
|
|
|
// Since we only take the last debug_value associated with a SILDebugVariable,
|
|
// we only should see someVar for debug_value %2.
|
|
//
|
|
// CHECK-LABEL: sil @yieldOnceCoroutine : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64 {
|
|
// CHECK: bb0([[ARG:%.*]] : $Klass):
|
|
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]] : $Klass, let, name "someVar"
|
|
// CHECK-NEXT: [[ADDR:%.*]] = ref_element_addr [[ARG]] : $Klass
|
|
// CHECK-NEXT: yield [[ADDR]] : $*Int64, resume bb1, unwind bb2
|
|
//
|
|
// CHECK: bb1:
|
|
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]] : $Klass, let, name "someVar"
|
|
// CHECK-NEXT: tuple
|
|
// CHECK-NEXT: return
|
|
//
|
|
// CHECK: bb2:
|
|
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]] : $Klass, let, name "someVar"
|
|
// CHECK-NEXT: unwind
|
|
// CHECK: } // end sil function 'yieldOnceCoroutine'
|
|
sil @yieldOnceCoroutine : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64 {
|
|
bb0(%0 : $Klass):
|
|
debug_value [moveable_value_debuginfo] %0 : $Klass, let, name "someVar"
|
|
%1 = ref_element_addr %0 : $Klass, #Klass.value
|
|
yield %1 : $*Int64, resume bb1, unwind bb2
|
|
|
|
bb1:
|
|
%9999 = tuple()
|
|
return %9999 : $()
|
|
|
|
bb2:
|
|
unwind
|
|
}
|
|
|
|
// CHECK-LABEL: sil @testSimple : $@convention(thin) (@guaranteed Klass) -> () {
|
|
// CHECK: bb0([[ARG:%.*]] :
|
|
// CHECK: debug_value [moveable_value_debuginfo] [[ARG]]
|
|
// CHECK: begin_apply
|
|
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]]
|
|
// CHECK: end_apply
|
|
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]]
|
|
// CHECK: } // end sil function 'testSimple'
|
|
sil @testSimple : $@convention(thin) (@guaranteed Klass) -> () {
|
|
bb0(%0 : $Klass):
|
|
debug_value [moveable_value_debuginfo] %0 : $Klass, let, name "arg"
|
|
%f = function_ref @yieldOnceCoroutine : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64
|
|
(%3, %4) = begin_apply %f(%0) : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64
|
|
%9999 = tuple()
|
|
end_apply %4
|
|
return %9999 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil @testDiamond : $@convention(thin) (@guaranteed Klass) -> () {
|
|
// CHECK: bb0([[ARG:%.*]] :
|
|
// CHECK: debug_value [moveable_value_debuginfo] [[ARG]]
|
|
// CHECK: begin_apply
|
|
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]]
|
|
// CHECK-NEXT: cond_br undef, [[BB_LHS:bb[0-9]+]], [[BB_RHS:bb[0-9]+]]
|
|
//
|
|
// CHECK: [[BB_LHS]]:
|
|
// CHECK: end_apply
|
|
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]]
|
|
// CHECK-NEXT: br [[BB_CONT:bb[0-9]+]]
|
|
//
|
|
// CHECK: [[BB_RHS]]:
|
|
// CHECK: abort_apply
|
|
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]]
|
|
// CHECK: } // end sil function 'testDiamond'
|
|
sil @testDiamond : $@convention(thin) (@guaranteed Klass) -> () {
|
|
bb0(%0 : $Klass):
|
|
debug_value [moveable_value_debuginfo] %0 : $Klass, let, name "arg"
|
|
%f = function_ref @yieldOnceCoroutine : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64
|
|
(%3, %token) = begin_apply %f(%0) : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64
|
|
cond_br undef, bb1, bb2
|
|
|
|
bb1:
|
|
end_apply %token
|
|
br bb3
|
|
|
|
bb2:
|
|
abort_apply %token
|
|
br bb3
|
|
|
|
bb3:
|
|
%9999 = tuple()
|
|
return %9999 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil @testUndefDiamond : $@convention(thin) (@guaranteed Klass) -> () {
|
|
// CHECK: bb0([[ARG:%.*]] :
|
|
// CHECK: debug_value [moveable_value_debuginfo] [[ARG]]
|
|
// CHECK: begin_apply
|
|
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]]
|
|
// CHECK-NEXT: cond_br undef, [[BB_LHS:bb[0-9]+]], [[BB_RHS:bb[0-9]+]]
|
|
//
|
|
// CHECK: [[BB_LHS]]:
|
|
// CHECK: end_apply
|
|
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]]
|
|
// CHECK-NEXT: br [[BB_CONT:bb[0-9]+]]
|
|
//
|
|
// CHECK: [[BB_RHS]]:
|
|
// CHECK-NEXT: debug_value [moveable_value_debuginfo] undef
|
|
// CHECK-NEXT: abort_apply
|
|
// CHECK-NEXT: debug_value [moveable_value_debuginfo] undef
|
|
// CHECK-NEXT: br [[BB_CONT]]
|
|
// CHECK: } // end sil function 'testUndefDiamond'
|
|
sil @testUndefDiamond : $@convention(thin) (@guaranteed Klass) -> () {
|
|
bb0(%0 : $Klass):
|
|
debug_value [moveable_value_debuginfo] %0 : $Klass, let, name "arg"
|
|
%f = function_ref @yieldOnceCoroutine : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64
|
|
(%3, %token) = begin_apply %f(%0) : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64
|
|
cond_br undef, bb1, bb2
|
|
|
|
bb1:
|
|
end_apply %token
|
|
br bb3
|
|
|
|
bb2:
|
|
debug_value [moveable_value_debuginfo] undef : $Klass, let, name "arg"
|
|
abort_apply %token
|
|
br bb3
|
|
|
|
bb3:
|
|
%9999 = tuple()
|
|
return %9999 : $()
|
|
}
|