Slide 1

Slide 1 text

swiftcͷmanglingͱ Substitution Θ͍Θ͍swiftc #3, 2018/06/22 omochimetaru @ 1

Slide 2

Slide 2 text

mangling ϓϩάϥϜΛίϯύΠϧͯ͠LLVMόΠφϦʹͳΔͱ͖ɺ ఆ਺΍ؔ਺ͳͲͷ໊લ͕ม׵͞ΕΔɻ ͜ΕΛγϯϘϧ໊ͱݺͿɻ // c.swift func hogehoge() -> Void { ... } ; c.ll define hidden swiftcc void @"$S1c8hogehogeyyF"() #0 { ... } 2

Slide 3

Slide 3 text

γϯϘϧ໊ γϯϘϧ໊͸ίϯύΠϧ͞ΕͨόΠφϦͷதͰͷ໊લɻ ΋ͱ΋ͱͷݴޠͷ໊લ͚ͩͰ͸ͳ͘ɺ ༷ʑͳ৘ใ΋ಉ࣌ʹຒΊࠐ·ΕΔɻ ͜ͷม׵Λmanglingͱ͍͏ɻ 3

Slide 4

Slide 4 text

manglingͱSwift γϯϘϧ໊ʹ͸SwiftͷγϯϘϧͰ͋Δ͜ͱΛࣔ͢ϔομ͕෇ ͘ɻ $S1c8hogehogeyyF $S: SwiftͷγϯϘϧ 4

Slide 5

Slide 5 text

manglingͱϞδϡʔϧ໊ γϯϘϧ໊ʹ͸Ϟδϡʔϧؚ໊͕·ΕΔɻ ͜ΕʹΑΓɺผϞδϡʔϧͷಉ໊ΤϯςΟςΟͱিಥ͠ͳ͍ɻ $S1c8hogehogeyyF 1c: "c" ͷ 8hogehoge: "hogehoge" ͜͜Ͱ͸Ϟδϡʔϧ໊͸ c ਺ࣈ͸Ωʔϫʔυͷ௕͞ϔομ 5

Slide 6

Slide 6 text

manglingͱΤϯςΟςΟͷछྨ γϯϘϧ໊ʹ͸ΤϯςΟςΟͷछྨ͕͍͍ͭͯΔ $S1c8hogehogeyyF F: ؔ਺ ΤϯςΟςΟͷྫ WV: value witness table fC: allocating init fc: non-allocating init s: property setter g: property getter 6

Slide 7

Slide 7 text

manglingͱܕ৘ใ ؔ਺ͷγϯϘϧ໊ʹ͸Ҿ਺΍ฦΓ஋ͷܕ͕͍͍ͭͯΔ $S1c8hogehogeyyF y: ฦΓ஋͸Void y: Ҿ਺͸ແ͠ ܕͷྫ Si: Swift.Int Sf: Swift.Float SS: Swift.String 7

Slide 8

Slide 8 text

manglingͱܕ৘ใ ؔ਺ͷγϯϘϧ໊ʹ͸ϥϕϧ໊΋͍͍ͭͯΔ func hogehoge(aaa: Int, bbb: Float) -> String $S1c8hogehoge3aaa3bbbSSSi_SftF 3aaa: "aaa" 3bbb: "bbb" SS: ฦΓ஋͸String Si: ୈ1Ҿ਺͸Int _: Ϧετ͕ଓ͘ Sf: ୈ2Ҿ਺͸Float t: Ϧετ͸ऴΘΓ 8

Slide 9

Slide 9 text

manglingͱϢʔβఆٛܕ struct Stone { func hogehoge() {} } $S1c5StoneV8hogehogeyyF 1c: "c" 5Stone: "Stone" V: struct 8hogehoge: "hogehoge" 9

Slide 10

Slide 10 text

Swift demangle γϯϘϧ໊͔Βٯม׵Λͯ͠ɺຒΊࠐ·Εͨ৘ใΛಡΊΔɻ $ swift demangle '$S1c5StoneV8hogehogeyyF' $S1c5StoneV8hogehogeyyF ---> c.Stone.hogehoge() -> () 10

Slide 11

Slide 11 text

-expandΦϓγϣϯ͕͓͢͢Ί $ swift demangle -expand '$S1c5StoneV8hogehogeyyF' Demangling for $S1c5StoneV8hogehogeyyF kind=Global kind=Function kind=Structure kind=Module, text="c" kind=Identifier, text="Stone" kind=Identifier, text="hogehoge" kind=Type kind=FunctionType kind=ArgumentTuple, index=0 kind=Type kind=Tuple kind=ReturnType kind=Type kind=Tuple $S1c5StoneV8hogehogeyyF ---> c.Stone.hogehoge() -> () 11

Slide 12

Slide 12 text

Substitution 12

Slide 13

Slide 13 text

manglingͱSubstitution struct Water {} struct Stone { func hogehoge(aaa: Stone, bbb: Water, ccc: Stone) -> Water { fatalError() } } $S1c5StoneV8hogehoge3aaa3bbb3cccAA5WaterVAC_AiCtF 13

Slide 14

Slide 14 text

ʁ expect $S1c5StoneV8hogehoge3aaa3bbb3ccc1c5WaterV1c5StoneV_1c5WaterV1c5StoneVtF 1c5WaterV: struct c.Water 1c5StoneV: struct c.Stone 1c5WaterV: struct c.Water 1c5StoneV: struct c.Stone actual $S1c5StoneV8hogehoge3aaa3bbb3cccAA5WaterVAC_AiCtF AA: ?? 5WaterV: struct Water AC: ?? AiC: ?? 14

Slide 15

Slide 15 text

Substitution ManglingͷաఔͰग़ݱͨ͠จࣈྻ΍ܕ͕഑ྻʹอଘ͞ΕΔɻ 2౓໨Ҏ߱ͷग़ݱ࣌ʹ͸ͦͷ഑ྻͷΠϯσοΫεͱͯ͠Τϯίʔ υ͞Εɺ σίʔυ࣌ʹ͸ͦͷ഑ྻͷཁૉʹஔ׵͞ΕΔɻ ͜ͷػೳΛSubstitution(ஔ׵)ͱ͍͏ɻ 15

Slide 16

Slide 16 text

Substitutionͷྫ AA A: ஔ׵։࢝ A: [0]൪ʹஔ׵, ஔ׵ऴྃ(େจࣈ) AiC i: [8]൪ʹஔ׵ C: [2]൪ʹஔ׵, ஔ׵ऴྃ(େจࣈ) A2C 2: ࣍ͷஔ׵Λ2ճ܁Γฦ͢ C: [2]൪ʹஔ׵, ஔ׵ऴྃ(େจࣈ) 16

Slide 17

Slide 17 text

Substitutionͷྫ $S1c5StoneV8hogehoge3aaa3bbb3cccAA5WaterVAC_AiCtF 1c: [0] = "c" 5Stone: [1] = "Stone" V: [2] = struct c.Stone 8hogehoge: [3] = "hogehoge" 3aaa: [4] = "aaa" 3bbb: [5] = "bbb" 3ccc: [6] = "ccc" AA: "c" from [0] 5Water: [7] = "Water" V: [8] = struct c.Water AC: struct c.Stone from [2] Ai: struct c.Water from [8] C: struct c.Stone from [2] 17

Slide 18

Slide 18 text

ࢿྉ Mangling https://github.com/apple/swift/blob/master/docs/ABI/ Mangling.rst 18

Slide 19

Slide 19 text

·ͱΊ • mangling͸໘ന͍ • swift demangle ศར • substitution͸͍͢͝ 19

Slide 20

Slide 20 text

͓ΘΓ 20