mirror of
https://github.com/apple/swift.git
synced 2025-12-25 12:15:36 +01:00
Add logging of function and closure parameter values when the playground transform is enabled and its "high-performance" mode is off. MOTIVATION The goal of the optional "playground transform" step in Sema is to instrument the code by inserting calls to `__builtin_log()` and similar log functions, in order to record the execution of the compiled code. Some IDEs (such as Xcode) enable this transform by passing -playground and provide implementations of the logger functions that record information that can then be shown in the IDE. The playground transform currently logs variable assignments and return statements, but it doesn't log the input parameters received by functions and closures. Knowing these values can be very useful in order to understand the behaviour of functions and closures. CHANGES - add a `ParameterList` parameter to `InstrumenterSupport::transformBraceStmt()` - this is an optional parameter list that, if given, specifies the parameters that should be logged at the start of the brace statement - this has to be passed into the function because it comes from the owner of the BraceStmt - adjust `PlaygroundTransform.cpp` to make use of this list - the transform will insert calls to `__builtin_log()` for each of the parameters, in order - adjust `PCMacro.cpp` to accept the parameter, though this instrumenter doesn't currently make use of the new information - add two new unit tests (one for functions and one for closures) - adjust four existing unit tests to account for the new log calls REMARKS - this is currently guarded by the existing "high performance" option (parameter logging is omitted in that case) rdar://104974072
51 lines
2.1 KiB
Swift
51 lines
2.1 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: cp %s %t/main.swift
|
|
// RUN: %target-build-swift -whole-module-optimization -module-name PlaygroundSupport -emit-module-path %t/PlaygroundSupport.swiftmodule -parse-as-library -c -o %t/PlaygroundSupport.o %S/Inputs/SilentPCMacroRuntime.swift %S/Inputs/PlaygroundsRuntime.swift
|
|
// RUN: %target-build-swift -Xfrontend -playground -Xfrontend -debugger-support -o %t/main -I=%t %t/PlaygroundSupport.o %t/main.swift
|
|
// RUN: %target-codesign %t/main
|
|
// RUN: %target-run %t/main | %FileCheck %s
|
|
// RUN: %target-build-swift -Xfrontend -pc-macro -Xfrontend -playground -Xfrontend -debugger-support -o %t/main2 -I=%t %t/PlaygroundSupport.o %t/main.swift
|
|
// RUN: %target-codesign %t/main2
|
|
// RUN: %target-run %t/main2 | %FileCheck %s
|
|
// REQUIRES: executable_test
|
|
|
|
import PlaygroundSupport
|
|
|
|
// Labeled, unlabeled, and multi-value parameters are logged.
|
|
func f(x: Int, _ y: Float = 7.62, z: String...) -> Int {
|
|
func g(w: (Int, Int)) -> Int {
|
|
func h(v: Int) -> Int {
|
|
return v + 1
|
|
}
|
|
return h(v: w.0) + h(v: w.1) + 1
|
|
}
|
|
return x + z.count + g(w: (1, 2))
|
|
}
|
|
let foo = f(x: 42, z: "hello", "world")
|
|
|
|
// Unnamed parameters do are not logged.
|
|
func f(_: Int) -> Int {
|
|
return 42
|
|
}
|
|
let bar = f(21)
|
|
|
|
// CHECK: {{.*}} __builtin_log_scope_entry
|
|
// CHECK-NEXT: {{.*}} __builtin_log[x='42']
|
|
// CHECK-NEXT: {{.*}} __builtin_log[y='7.62']
|
|
// CHECK-NEXT: {{.*}} __builtin_log[z='["hello", "world"]']
|
|
// CHECK-NEXT: {{.*}} __builtin_log_scope_entry
|
|
// CHECK-NEXT: {{.*}} __builtin_log[w='(1, 2)']
|
|
// CHECK-NEXT: {{.*}} __builtin_log_scope_entry
|
|
// CHECK-NEXT: {{.*}} __builtin_log[v='1']
|
|
// CHECK-NEXT: {{.*}} __builtin_log[='2']
|
|
// CHECK-NEXT: {{.*}} __builtin_log_scope_exit
|
|
// CHECK-NEXT: {{.*}} __builtin_log_scope_entry
|
|
// CHECK-NEXT: {{.*}} __builtin_log[v='2']
|
|
// CHECK-NEXT: {{.*}} __builtin_log[='3']
|
|
// CHECK-NEXT: {{.*}} __builtin_log_scope_exit
|
|
// CHECK-NEXT: {{.*}} __builtin_log[='6']
|
|
// CHECK-NEXT: {{.*}} __builtin_log_scope_exit
|
|
// CHECK-NEXT: {{.*}} __builtin_log[='50']
|
|
// CHECK-NEXT: {{.*}} __builtin_log_scope_exit
|
|
// CHECK-NEXT: {{.*}} __builtin_log[foo='50']
|