mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This passes on the rebranch. Unmark it as XFAIL on Windows to get the test suite passing.
472 lines
13 KiB
Swift
472 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.
|
|
|
|
// 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: 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_lexical_block
|
|
// 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
|