blob: 46aaedbe6add5937790bc952c3c8c5f8ddb9e33c [file] [log] [blame]
// 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.
// REQUIRES: rdar47777473
// 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 name, type, val in map(derive_name, type_initializer_map):
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