File: debug_info_expression.sil

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (87 lines) | stat: -rw-r--r-- 4,289 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// RUN: %target-swift-frontend %s -sil-verify-all -g -emit-sil -o - | %FileCheck --check-prefix=CHECK-SIL %s
// RUN: %target-swift-frontend -disable-debugger-shadow-copies -primary-file %s -emit-ir -g -o - | %FileCheck %s
import Builtin
import Swift

struct MyStruct {
  var x: Builtin.Int64
  var y: Builtin.Int64
}

struct SmallStruct {
  var z : Builtin.Int64
}

sil_scope 1 { loc "file.swift":7:6 parent @test_fragment : $@convention(thin) () -> () }

// Testing op_fragment w/ debug_value
sil hidden @test_fragment : $@convention(thin) () -> () {
bb0:
  %2 = alloc_stack $MyStruct, var, name "my_struct", loc "file.swift":8:9, scope 1
  // CHECK: %[[MY_STRUCT:.+]] = alloca %{{.*}}MyStruct
  // CHECK: llvm.dbg.declare(metadata {{.*}} %[[MY_STRUCT]], metadata ![[VAR_DECL_MD:[0-9]+]]
  // CHECK: %[[SMALL_STRUCT:.+]] = alloca %{{.*}}SmallStruct
  // CHECK: llvm.dbg.declare(metadata {{.*}} %[[SMALL_STRUCT]], metadata ![[SMALL_VAR_DECL_MD:[0-9]+]]
  %3 = struct_element_addr %2 : $*MyStruct, #MyStruct.x, loc "file.swift":9:17, scope 1
  // CHECK: %[[FIELD_X:.*]] = getelementptr {{.*}} %[[MY_STRUCT]]
  // CHECK-SIL: debug_value %{{[0-9]+}} : $*Builtin.Int64
  // CHECK-SIL-SAME:        (name "my_struct", loc "file.swift":8:9)
  // CHECK-SIL-SAME:        type $MyStruct, expr op_deref:op_fragment:#MyStruct.x
  debug_value %3 : $*Builtin.Int64, var, (name "my_struct", loc "file.swift":8:9, scope 1), type $MyStruct, expr op_deref:op_fragment:#MyStruct.x, loc "file.swift":9:17, scope 1

  %4 = alloc_stack $SmallStruct, var, name "small_struct", loc "file.swift":10:11, scope 1
  %5 = struct_element_addr %4 : $*SmallStruct, #SmallStruct.z, loc "file.swift":11:13, scope 1
  // CHECK: %[[FIELD_Z:.*]] = getelementptr {{.*}} %[[SMALL_STRUCT]]
  // If the fragment covers the whole struct, we're not generating the
  // DW_OP_LLVM_fragment part.
  debug_value %5 : $*Builtin.Int64, var, (name "small_struct", loc "file.swift":10:11, scope 1), type $SmallStruct, expr op_deref:op_fragment:#SmallStruct.z, loc "file.swift":11:13, scope 1
  dealloc_stack %4 : $*SmallStruct

  dealloc_stack %2 : $*MyStruct
  %r = tuple()
  return %r : $()
}

sil_scope 2 { loc "file.swift":14:6 parent @test_alloc_stack : $@convention(thin) () -> () }

// Testing di-expression w/ alloc_stack
sil hidden @test_alloc_stack : $@convention(thin) () -> () {
bb0:
  %my_struct = alloc_stack $MyStruct, var, name "my_struct", loc "file.swift":15:9, scope 2
  // CHECK: %[[MY_STRUCT:.+]] = alloca %{{.*}}MyStruct
  // CHECK: llvm.dbg.declare(metadata ptr %[[MY_STRUCT]], metadata ![[VAR_DECL_MD:[0-9]+]]
  // CHECK-SIL: alloc_stack $Int, var
  // CHECK-SIL-SAME:        (name "my_struct", loc "file.swift":15:9)
  // CHECK-SIL-SAME:        type $MyStruct, expr op_fragment:#MyStruct.x
  %field_x = alloc_stack $Int, var, (name "my_struct", loc "file.swift":15:9, scope 2), type $MyStruct, expr op_fragment:#MyStruct.x, loc "file.swift":16:17, scope 2
  // CHECK: %[[FIELD_X:.+]] = alloca %TSi
  // CHECK: llvm.dbg.declare(metadata ptr %[[FIELD_X]], metadata ![[VAR_DECL_MD]]
  // CHECK-SAME:             !DIExpression(DW_OP_LLVM_fragment, 0, 64)
  dealloc_stack %field_x : $*Int
  dealloc_stack %my_struct: $*MyStruct
  %r = tuple()
  return %r : $()
}

sil_scope 3 { loc "file.swift":16:7 parent @test_op_const : $@convention(thin) (Int64, Int64) -> () }

// Testing op_constu and op_consts
sil hidden @test_op_const : $@convention(thin) (Int64, Int64) -> () {
bb0(%arg : $Int64, %arg2 : $Int64):
  debug_value %arg : $Int64, let, name "the_arg", argno 1, expr op_constu:77, loc "file.swift":17:2, scope 3
  debug_value %arg2 : $Int64, let, name "the_2nd_arg", argno 2, expr op_consts:-87, loc "file.swift":17:4, scope 3
  %r = tuple()
  return %r : $()
}

sil_scope 4 { loc "file.swift":18:8 parent @test_arithmetic : $@convention(thin) (Int64, Int64) -> () }

// Testing basic arithmetic operators like op_plus and op_minus
sil hidden @test_arithmetic : $@convention(thin) (Int64, Int64) -> () {
bb0(%arg : $Int64, %arg2 : $Int64):
  debug_value %arg : $Int64, let, name "the_arg", argno 1, expr op_constu:3:op_plus, loc "file.swift":19:2, scope 4
  debug_value %arg2 : $Int64, let, name "the_2nd_arg", argno 2, expr op_constu:5:op_minus, loc "file.swift":19:4, scope 4
  %r = tuple()
  return %r : $()
}