Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SwiftのDemanglerを書く @ わいわいswiftc番外編

ukitaka
December 15, 2018

SwiftのDemanglerを書く @ わいわいswiftc番外編

ukitaka

December 15, 2018
Tweet

More Decks by ukitaka

Other Decks in Programming

Transcript

  1. Θ͍Θ͍swiftc൪֎ฤ @ukitaka
    SwiftͷDemanglerΛॻ͘

    View Slide

  2. ࠓ೔ͷ໨ඪ

    View Slide

  3. $S13ExampleNumber6isEven6numberSbSi_tF
    isEven(number: Int) -> Bool
    Ψν੎

    View Slide

  4. Mangle / Demangleͱ͸
    Mangleͱ͸
    $S13ExampleNumber6isEven6numberSbSi_tF
    ExampleNumber.swift ͷ isEven(number: Int) -> Bool

    View Slide

  5. Mangle / Demangleͱ͸
    Demangleͱ͸
    $S13ExampleNumber6isEven6numberSbSi_tF
    ExampleNumber.isEven(number: Swift.Int) -> Swift.Bool

    View Slide

  6. Mangle / Demangleͱ͸
    Mangle͞ΕͨγϯϘϧ໊Λ֬ೝ͢Δ
    $ swiftc -emit-sil Examples/ExampleNumber.swift

    View Slide

  7. Mangle / Demangleͱ͸
    Mangle͞ΕͨγϯϘϧ໊Λ֬ೝ͢Δ
    $ swiftc -emit-sil Examples/ExampleNumber.swift

    View Slide

  8. Mangle / Demangleͱ͸
    SwiftͷDemangleίϚϯυ
    $ swift demangle '$S13ExampleNumber6isEven6numberSbSi_tF'
    $S13ExampleNumber6isEven6numberSbSi_tF
    —> ExampleNumber.isEven(number: Swift.Int) -> Swift.Bool

    View Slide

  9. Mangle / Demangleͱ͸
    SwiftͷDemangleίϚϯυ
    $ swift demangle '$S13ExampleNumber6isEven6numberSbSi_tF'
    $S13ExampleNumber6isEven6numberSbSi_tF
    —> ExampleNumber.isEven(number: Swift.Int) -> Swift.Bool
    ࠓ೔͸͜ΕΛ࡞Γ·͢

    View Slide

  10. Demangler
    Demangler
    ▸ Demanglerͷ࡞੒Λ௨ͯ͠ҎԼΛֶ΅͏
    ▸ SwiftͷManglingͷ࢓૊ΈΛֶͿ
    ▸ ؆୯ͳParserΛ࡞੒͢ΔͷͰɺParserͷςΫχοΫΛମݧͰ͖Δ

    View Slide

  11. Swift Demangler workshop
    ՝୊ʹ͍ͭͯ
    ▸ جຊ֤ࣗREADMEΛΈͳ͕ΒਐΊͯ΋Β͍·͢
    ▸ ՝୊1ʙ5·Ͱ͋Γɺ՝୊1Λશһ͕ୡ੒͢Δ͜ͱΛ໨ඪʹ͠·͢
    ▸ ՝୊1ʹ͸αϙʔτ͕͍ͭͯΔͷͰɺͦΕΛΈͳ͕Β΍ͬͯΈ·͠ΐ͏
    ▸ Ͱ͖Δਓ͸ͲΜͲΜਐΊͯ΋Βͬͯେৎ෉Ͱ͢
    ▸ ಛʹ5ͷsubstitution͸ॏཁͳͱ͜ΖͳͷͰ

    View Slide

  12. ՝୊1

    View Slide

  13. Swift Demangler workshop
    ՝୊1
    $S13ExampleNumber6isEven6numberSbSi_tF
    ExampleNumber.isEven(number: Swift.Int) -> Swift.Bool

    View Slide

  14. Swift Demangler workshop
    ՝୊1
    $S13ExampleNumber6isEven6numberSbSi_tF
    SwiftͷMangle nameʹڞ௨Ͱͭ͘Prefix

    View Slide

  15. Swift Demangler workshop
    ՝୊1
    $S13ExampleNumber6isEven6numberSbSi_tF
    ؔ਺ΛMangleͨ͠΋ͷͰ͋Δͱ͍͏໨ҹ F

    View Slide

  16. Swift Demangler workshop
    ՝୊1
    $S13ExampleNumber6isEven6numberSbSi_tF
    “ExampleNumber” ͱ͍͏Ϟδϡʔϧ໊ (ϑΝΠϧ໊)
    13͸͔͜͜Β13จࣈ෼͕ࣝผࢠͰ͋Δ͜ͱΛද͢

    View Slide

  17. Swift Demangler workshop
    ՝୊1
    $S13ExampleNumber6isEven6numberSbSi_tF
    “isEven” ͱ͍͏ؔ਺ͷ໊લ
    6จࣈ෼͕ࣝผࢠͰ͋Δ͜ͱΛࣔ͢

    View Slide

  18. Swift Demangler workshop
    ՝୊1
    $S13ExampleNumber6isEven6numberSbSi_tF
    “number” ͱ͍͏ϥϕϧ
    6จࣈ෼͕ࣝผࢠͰ͋Δ͜ͱΛࣔ͢

    View Slide

  19. Swift Demangler workshop
    ՝୊1
    $S13ExampleNumber6isEven6numberSbSi_tF
    ؔ਺ͷγάωνϟ (≒ ܕ)
    Sb͸ฦΓ஋ͷܕ Bool
    Si_t͸Ҿ਺ͷܕ (Int)

    View Slide

  20. Swift Demangler workshop
    ՝୊1
    global ::= entity
    entity ::= context entity-spec
    context ::= module
    module ::= identifier
    $S13ExampleNumber6isEven6numberSbSi_tF
    global

    View Slide

  21. Swift Demangler workshop
    ՝୊1
    global ::= entity
    entity ::= context entity-spec
    context ::= module
    module ::= identifier
    $S13ExampleNumber6isEven6numberSbSi_tF
    global
    entity

    View Slide

  22. Swift Demangler workshop
    ՝୊1
    global ::= entity
    entity ::= context entity-spec
    context ::= module
    module ::= identifier
    $S13ExampleNumber6isEven6numberSbSi_tF
    context
    entity-spec
    module

    View Slide

  23. Swift Demangler workshop
    ՝୊1
    entity-spec ::= decl-name label-list function-signature 'F'
    function-signature ::= params-type params-type throws?
    label-list ::= empty-list
    label-list ::= ('_' | identifier)*
    throws ::= 'K'
    params-type ::= type
    decl-name ::= identifier
    identifier ::= NATURAL IDENTIFIER-STRING
    $S13ExampleNumber6isEven6numberSbSi_tF
    decl-name label-list function-signature

    View Slide

  24. Swift Demangler workshop
    ՝୊1 (࠶ܝ)
    $S13ExampleNumber6isEven6numberSbSi_tF
    ExampleNumber.isEven(number: Swift.Int) -> Swift.Bool

    View Slide