[swift-dev] [RFC] SIL syntax for debug information Part 2: Scopes and Locations
Joe Groff
jgroff at apple.com
Wed Feb 10 13:43:30 CST 2016
I'm not a fan of generic metadata syntax. I think there's little enough information here that we should just print and parse it inline, something like this maybe:
debug_value %0 : $Int, let, name "k", argno 1,
loc "foo.swift":line:column,
scope @foo -> "foo.swift":parentLine:column -> "foo.swift":line:column
which I think is easier to read and test. I always have trouble mentally piecing together the DAG when updating LLVM debug info tests. If you don't think that's practical, I would still prefer proper declarations to metadata syntax:
debug_value <...>, scope 123, loc 456
sil_scope 123 { parent_scope 124 loc 457 }
sil_loc 456 { "foo.swift":line:column }
-Joe
> On Feb 10, 2016, at 11:34 AM, Adrian Prantl <aprantl at apple.com> wrote:
>
> Hi Everybody,
>
> I’d like to solicit comments on extending the textual .sil assembler
> language with even more debug information.
>
> At the moment it is only possible to test the effects that SIL
> optimization passes have on debug information by observing the
> effects of a full .swift -> LLVM IR compilation. To enable us
> writing targeted testcases for single SIL optimization passes,
> I'd like to propose a serialization format for scope and location
> information for textual SIL.
>
> The format is inspired by LLVM IR's metadata representation, but
> with a couple of improvements that reduce the amount of
> individual metadata records and improve the overall readability
> by moving the metadata definition closer to their (first) use.
>
> Each SIL instruction is extended by a location and scope reference.
> sil-instruction-def ::= (sil-value-name '=')? sil-instruction, sil-loc, sil-scope
> sil-loc ::= 'loc' md-name
> sil-scope ::= 'scope' md-name
> md-name ::= '!' [0-9]+
>
> The individual metadata nodes are defined in a global context, as
> they may be shared between individual SIL functions.
>
> decl ::= md-def
> md-def ::= md-name '=' md-node
> md-node ::= 'loc' ',' 'line' [0-9]+ ',' 'column' [0-9]+ ',' 'file' string-literal
> md-node ::= 'scope' ',' 'loc' md-name ',' 'parent' scope-parent (',' 'inlinedCallSite' md-name )?
> scope-parent ::= sil-function-name
> scope-parent ::= md-name
>
> Let me know what you think!
>
> -- adrian
>
> PS:
> Below is an example of what this would look like in practice for the following program:
>
> Swift source code
> -----------------
>
> #line 100 "abc.swift"
> @inline(__always)
> public func h(k : Int) -> Int { // 101
> return k // 102
> }
>
> #line 200 "abc.swift"
> @inline(__always)
> public func g(j : Int) -> Int { // 201
> return h(j) // 202
> }
>
> #line 301 "abc.swift"
> public func f(i : Int) -> Int { // 301
> return g(i) // 302
> }
>
> Verbose SIL output
> ------------------
>
> Note that metadata is defined before its first use:
>
> !1 = loc, line 0, column 0
> !2 = scope, loc !1, parent @main
> [...]
> !3 = loc, line 101, column 15, file "abc.swift"
> !4 = loc, line 101, column 13, file "abc.swift"
> !5 = scope, loc !4, parent @_TF9inlinedAt1hFSiSi
> !6 = loc, line 102, column 3, file "abc.swift"
> !7 = loc, line 103, column 1, file "abc.swift"
> !8 = scope, loc !7, parent !5
>
> // h(Int) -> Int
> sil [always_inline] @_TF9inlinedAt1hFSiSi : $@convention(thin) (Int) -> Int {
> // %0 // users: %1, %2
> bb0(%0 : $Int):
> debug_value %0 : $Int, let, name "k", argno 1, loc !3, scope !5 // id: %1 line:101:15:in_prologue
> return %0 : $Int, loc !6, scope !8 // id: %2 line:102:3:return
> }
>
> !9 = loc, line 201, column 15, file "abc.swift"
> !10 = loc, line 201, column 13, file "abc.swift"
> !11 = scope, loc !10, parent @_TF9inlinedAt1gFSiSi
> !12 = loc, line 203, column 1, file "abc.swift"
> !13 = scope, loc !12, parent !11
> !14 = loc, line 202, column 13, file "abc.swift"
> !15 = scope, loc !14, parent !13
> !16 = scope, loc !4, parent !5, inlinedCallSite !15
> !17 = loc, line 202, column 3, file "abc.swift"
>
> // g(Int) -> Int
> sil [always_inline] @_TF9inlinedAt1gFSiSi : $@convention(thin) (Int) -> Int {
> // %0 // users: %1, %2, %3
> bb0(%0 : $Int):
> debug_value %0 : $Int, let, name "j", argno 1, loc !9, scope !11 // id: %1 line:201:15:in_prologue
> debug_value %0 : $Int, let, name "k", argno 1, loc !3, scope !16 // id: %2 line:101:15:in_prologue: h(Int) -> Int perf_inlined_at /Volumes/Data/swift/swift/test/DebugInfo/inlinedAt.swift:202:10
> return %0 : $Int, loc !17, scope !13 // id: %3 line:202:3:return
> }
>
> !18 = loc, line 301, column 15, file "abc.swift"
> !19 = loc, line 301, column 13, file "abc.swift"
> !20 = scope, loc !19, parent @_TF9inlinedAt1fFSiSi
> !21 = loc, line 303, column 1, file "abc.swift"
> !22 = scope, loc !21, parent !20
> !23 = loc, line 302, column 13, file "abc.swift"
> !24 = scope, loc !23, parent !22
> !25 = scope, loc !10, parent !11, inlinedCallSite !24
> !26 = scope, loc !4, parent !16, inlinedCallSite !24
> !27 = loc, line 302, column 3, file "abc.swift"
>
>
More information about the swift-dev
mailing list