Files
swift-mirror/test/DebugInfo/local-vars.swift.gyb
Saleem Abdulrasool cd744dad6d test: make test syntactically compatible with Python3
Python3 does not like the use of the unpacked tuple in the argument
list, change the function's arity and require the caller to expand the
tuple.

`map` now returns an iterator rather than a list, simplify the iteration
to unpack the elements in the list and use that to invoke the map'ed
method instead.
2020-07-09 20:19:32 +00:00

475 lines
13 KiB
Swift

// An end-to-end test to ensure local variables have debug info. This
// test only verifies that the variables show up in the debug info at
// all. There are other tests testing liveness and representation.
// rdar://problem/57611302
// XFAIL: windows
// RUN: %gyb %s -o %t.swift
// RUN: %target-swift-frontend %t.swift -g -emit-ir -o - | %FileCheck %t.swift
// RUN: %target-swift-frontend %t.swift -g -c -o %t.o
// RUN: %llvm-dwarfdump %t.o \
// RUN: | %FileCheck %t.swift --check-prefix=DWARF
// RUN: %llvm-dwarfdump --verify %t.o
// RUN: %target-swift-frontend %t.swift -O -g -emit-ir -o - \
// RUN: | %FileCheck %t.swift --check-prefix=OPTZNS
// OPTZNS-NOT: alloca{{.*}}.addr
public class C {
let member : Int
init(_ i : Int) { member = i }
func isZero() -> Bool { return member == 0 }
}
public struct S {
let i : Int32 = -1
let j : Int32 = 2
}
public struct SLarge {
var tuple : (Int64, Int64, Int64, Int64, Int64, Int64, Int64, Int64)
}
public enum ENoPayload {
case one
case two
}
public enum ESinglePayload : Int {
case one = 1
case two = 2
}
public enum EMultiPayload {
case int(Int)
indirect case recursive(EMultiPayload)
case string(String)
}
public protocol Proto {
func f()
}
func nop() {}
func use<T>(_ x: T) {}
func variable_use<T>(_ x: inout T) {}
%{
type_initializer_map = [
#// Basic types.
("UInt64", "64"), ("UInt32", "32"), ("Int64", "64"), ("Int32", "32"),
("Int", "42"), ("UInt", "42"),
("Float", "2.71"), ("Double", "3.14"),
#// Sugared types and strings.
("String", '"string"'),
("[UInt64]", "[1, 2, 3]"),
("Dictionary<UInt64, String>", '[1:"entry"]'),
#// Classes, structs, tuples.
("(Int, C)", "(42, C(42))"),
("C", "C(42)"),
("S", "S()"),
("SLarge", "SLarge(tuple: (1,2,3,4,5,6,7,8))"),
#// Enums.
("ENoPayload", ".two"),
("ESinglePayload", ".two"),
("EMultiPayload", ".recursive(.string(\"string\"))"),
#// Existentials.
("T", "self.t"),
("U", "self.u"),
#// Functions.
("(() -> ())", "nop")
]
import re
def derive_name(type, val):
return (re.sub(r'[<> ,\.\?\(\)\[\]-]', '_', type), type, val)
for (type, val) in type_initializer_map:
(name, type, val) = derive_name(type, val)
generic = (type in ['T', 'U'])
function = "->" in type
}%
% if generic:
public class ContextA_${name}<T, U : Proto> {
let t : T
let u : U
init(_ t: T, _ u: U) { self.t = t; self.u = u; }
% end
public func constant_${name}() -> ${type} {
let v : ${type} = ${val}
// CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]]
// DWARF: DW_TAG_subprogram
// DWARF-LABEL: DW_AT_name {{.*}}constant_${name}
// DWARF-NOT: DW_TAG_subprogram
% if generic:
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("self")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
% end
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: {{(DW_AT_location)|(DW_AT_const_value)}}
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("v")
return v
}
public func constvar_${name}() {
var v : ${type} = ${val}
// CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]]
// DWARF: DW_TAG_subprogram
// DWARF-LABEL: DW_AT_name {{.*}}constvar_${name}
// DWARF-NOT: DW_TAG_subprogram
% if generic:
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("self")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
% end
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: {{(DW_AT_location)|(DW_AT_const_value)}}
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("v")
variable_use(&v)
}
public func let_${name}() {
let v : ${type} = constant_${name}()
// CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]]
// DWARF: DW_TAG_subprogram
// DWARF-LABEL: DW_AT_name {{.*}}let_${name}
// DWARF-NOT: DW_TAG_subprogram
% if generic:
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("self")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
% end
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: {{(DW_AT_location)|(DW_AT_const_value)}}
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("v")
use(v)
}
public func case_let_${name}() {
switch constant_${name}() {
case let v:
// CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]]
use(v)
}
// DWARF: DW_TAG_subprogram
// DWARF-LABEL: DW_AT_name {{.*}}let_${name}
// DWARF-NOT: DW_TAG_subprogram
% if generic:
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("self")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
% end
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: {{(DW_AT_location)|(DW_AT_const_value)}}
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("v")
}
public func optional_${name}() -> ${type}? {
return constant_${name}();
}
public func guard_let_${name}() {
let opt : ${type}? = optional_${name}()
// CHECK: !DILocalVariable(name: "opt",{{.*}} line: [[@LINE-1]]
// DWARF: DW_TAG_subprogram
// DWARF-LABEL: DW_AT_name {{.*}}guard_let_${name}
// DWARF-NOT: DW_TAG_subprogram
% if generic:
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("self")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
% end
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_location
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name
// DWARF-SAME: "{{(opt)|(val)}}"
guard let val = opt else {
use(opt)
fatalError()
}
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_location
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name
// DWARF-SAME: "{{(opt)|(val)}}"
use(val)
}
public func var_${name}() {
var v : ${type} = constant_${name}()
// CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]]
// DWARF: DW_TAG_subprogram
// DWARF-LABEL: DW_AT_name {{.*}}var_${name}
// DWARF-NOT: DW_TAG_subprogram
% if generic:
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("self")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
% end
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_location
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name {{.*}}"v"
variable_use(&v)
}
public func arg_${name}(_ v: ${type}) {
// CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]]
// DWARF: DW_TAG_subprogram
// DWARF-LABEL: DW_AT_name {{.*}}arg_${name}
// DWARF-NOT: DW_TAG_subprogram
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_location
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name {{.*}}"v"
% if generic:
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("self")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF: DW_AT_artificial
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
% end
% if not function:
use(v)
% end
}
public func arg_inout_${name}(_ v: inout ${type}) {
// CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]]
// DWARF: DW_TAG_subprogram
// DWARF-LABEL: DW_AT_name {{.*}}arg_inout_${name}
// DWARF-NOT: DW_TAG_subprogram
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_location
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name {{.*}}"v"
% if generic:
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("self")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
% end
variable_use(&v)
}
public func arg_tuple_${name}(_ v: (${type}, ${type})) {
let (_, y) = v
// CHECK: !DILocalVariable(name: "y",{{.*}} line: [[@LINE-1]]
// DWARF: DW_TAG_subprogram
// DWARF-LABEL: DW_AT_name {{.*}}arg_tuple_${name}
// DWARF-NOT: DW_TAG_subprogram
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_location
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name {{.*}}"v"
% if generic:
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("self")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
// FIMXE-DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF: DW_AT_artificial
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
% end
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_location
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name {{.*}}"y"
use(y)
}
public func closure_capture_${name}() {
let v : ${type} = constant_${name}();
// CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]]
use({ () -> ${type} in v }())
// DWARF: DW_TAG_subprogram
// DWARF-LABEL: DW_AT_name {{.*}}closure_capture_${name}
// DWARF: DW_TAG_subprogram
// DWARF: DW_AT_linkage_name {{.*}}closure_capture_${name}
// DWARF-NOT: DW_AT_name {{.*}}closure_capture_${name}
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_location
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name {{.*}}"v"
% if generic:
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
% end
}
public func closure_capture_byref_${name}() {
var v : ${type} = constant_${name}();
// CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]]
{ () -> () in v = ${val} }()
use(v)
// DWARF: DW_TAG_subprogram
// DWARF-LABEL: DW_AT_name {{.*}}closure_capture_byref_${name}
// DWARF: DW_TAG_subprogram
// DWARF: DW_AT_linkage_name {{.*}}closure_capture_byref_${name}
// DWARF-NOT: DW_AT_name {{.*}}closure_capture_byref_${name}
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_location
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name {{.*}}"v"
% if generic:
// DWARF: DW_TAG_formal_parameter
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("self")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
// DWARF-NOT: DW_TAG
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF: DW_AT_artificial
// DWARF: DW_TAG_variable
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_name ("$swift.type.{{T|U}}")
// DWARF-NOT: DW_TAG
// DWARF: DW_AT_artificial
% end
}
% if generic:
} // End of Context_${name}.
% end