Slide 1

Slide 1 text

Swift Runtime Library Θ͍Θ͍swiftc #16 @kateinoigakukun 1

Slide 2

Slide 2 text

ϥϯλΠϜϥΠϒϥϦͱ͸ Swiftͷಈతͳݴޠ࢓༷Λαϙʔτ͢ΔͨΊͷϥΠϒϥϦɻ ෳࡶͳݴޠػೳ͸ɺૉ๿ʹίϯύΠϧ࣌ʹίʔυੜ੒͢Δͱ ίʔυαΠζͷංେԽ͢ΔͷͰɺڞ௨ϥΠϒϥϦʹ੾Γग़ͯ͠ ͍Δɻ 2

Slide 3

Slide 3 text

ݴޠ࢓༷ͷ2ͭͷଆ໘ ϓϩάϥϛϯάݴޠͷݴޠ࢓༷Λߟ͑Δͱ͖ɺ2ͭʹ෼ྨͰ͖ Δɻ 1. ੩తͳݴޠ࢓༷ 2. ಈతͳݴޠ࢓༷ 3

Slide 4

Slide 4 text

1. ੩తͳݴޠ࢓༷ • จ๏ • ܕγεςϜ 4

Slide 5

Slide 5 text

2. ಈతͳݴޠ࢓༷ • ࣮ߦ࣌ܕγεςϜ • ྫ֎ϋϯυϦϯά • όΠφϦޓ׵ੑ 5

Slide 6

Slide 6 text

Swiftͷಈతͳݴޠ࢓༷ͷྫ • ϝϞϦ֬อ • ARC • ࣮ߦ࣌ͷܕγεςϜ • ಈతΩϟετ • etc ... 6

Slide 7

Slide 7 text

ϝϞϦ֬อ // 24 byte struct Pet { let name: String // 16 byte let age: Int // 8 byte } let pet = Pet(name: ..., age: ...) // malloc 24 byte 7

Slide 8

Slide 8 text

// 8 byte class View { var point: (x: Float, y: Float) // 8 byte required init(...) { } func copy() -> Self { return Self(...) // malloc n byte } } // 24 byte class TextView: View { var text: String // 16 byte required init(...) { } } let view: View = TextView(...) // ͜ͷ࣌఺Ͱview͕TextViewͰ͋Δ͜ͱΛอূͰ͖ͳ͍ɻ let anotherView: View = view.copy() 8

Slide 9

Slide 9 text

࣮ߦ࣌ܕ৘ใͷඞཁੑ SwiftͷܕγεςϜͷαϒλΠϐϯάʹΑͬͯɺΠϯελϯεͷ ܕ͕੩తʹΘ͔ΔܕͱҰக͢Δͱ͸ݶΒͳ͍ɻ 9

Slide 10

Slide 10 text

Type Metadata ࣮ߦ࣌ʹऔΓճ͞ΕΔܕ৘ใɻ ͍Ζ͍ΖೖͬͯΔɻ • ܕͷαΠζ • ؔ਺ςʔϒϧ • δΣωϦοΫܕύϥϝʔλ • Type Descriptor 10

Slide 11

Slide 11 text

Type Descriptor δΣωϦοΫͳܕύϥϝʔλʹґଘ͠ͳ͍৘ใΛ࣋ͭɻ ಛఆͷܕΠϯελϯε͔Βಠཱ͍ͯ͠ΔͷͰෳ਺ͷType Metadata͔Βࢀর͞Εͯ࢖͍ճ͞ΕΔɻ 11

Slide 12

Slide 12 text

σʔλߏ଄ͷςΫχοΫ 12

Slide 13

Slide 13 text

ΦϒδΣΫτϑΝΠϧͷجຊ • TEXTηάϝϯτ • ࣮ߦ͞ΕΔػցޠ͕֨ೲ͞ΕΔ • ಡΈऔΓઐ༻ • DATAηάϝϯτ • άϩʔόϧม਺ͳͲ • ಡΈॻ͖Մೳ 13

Slide 14

Slide 14 text

TEXTηάϝϯτ͸ಡΈऔΓઐ༻ͳͷͰɺಈతϥΠϒϥϦΛ࢖͏ ͱ͖΍ϓϩηεΛfork͢Δͱ͖ɺෳ਺ͷϓϩηεͰಉ͡ϝϞϦ ۭؒΛڞ༗Ͱ͖Δɻ ͭ·ΓɺΦϒδΣΫτϑΝΠϧͷ઎ΊΔTEXTηάϝϯτ͕ଟ͍ ΄͏͕Α͍ɻ 14

Slide 15

Slide 15 text

࠶഑ஔ ࣮ߦՄೳϑΝΠϧʹؚ·ΕΔΞυϨεࢀরΛ࣮ޮΞυϨεʹஔ ׵͢Δॲཧɻ ϦϯΫ࣌ͱϩʔυ࣌ͷ2ճൃੜ͢Δɻ 15

Slide 16

Slide 16 text

࠶഑ஔ • ϦϯΫ࣌ ηΫγϣϯͷઌ಄͔Βͷڑ཭΍γϯϘϧಉ࢜ͷΞυϨεͷࠩ Λܭࢉͯ͠ஔ׵͢Δɻ • ϩʔυ࣌ ઈରΞυϨεΛ࣮ࡍͷϝϞϦۭؒͷΞυϨεʹஔ׵͢Δɻ جຊɺϓϩάϥϜ͕ల։͞ΕΔϝϞϦۭؒͷઌ಄ΞυϨεΛ ଍͠߹Θ͍͚ͤͯͩ͘ 16

Slide 17

Slide 17 text

࠶഑ஔͷΦʔόʔϔου ϩʔυ࣌ͷ࠶഑ஔ͸ϓϩάϥϜͷىಈ଎౓ʹӨڹͯ͘͠ΔͷͰ গͳ͍΄͏͕Α͍ɻ 17

Slide 18

Slide 18 text

Relative Pointer ϙΠϯλࣗ਎ͷΞυϨε͔Βର৅ͷΞυϨε·ͰͷΦϑηοτ Λอ࣋͢ΔϙΠϯλܗࣜɻ 18

Slide 19

Slide 19 text

struct RelativePointer { var offset: Int32 mutating func pointee() -> Pointee { withUnsafePointer(to: &self) { [offset] pointer in let base = UnsafeRawPointer(pointer) let advanced = base.advanced(by: Int(offset)) return advanced.assumingMemoryBound(to: Pointee.self) }.pointee } } 19

Slide 20

Slide 20 text

Relative PointerͷϝϦοτ 1. όΠφϦαΠζͷઅ໿ 2. ϩʔυ࣌࠶഑ஔΛݮΒͤΔ 3. ϝλσʔλΛTEXTηάϝϯτʹؚΊΒΕΔΑ͏ʹͰ͖Δ 20

Slide 21

Slide 21 text

Indirect Pointer Relative Pointerͱ૊Έ߹Θͤͯ࢖ΘΕ͍ͯΔςΫχοΫͷͻͱ ͭɻ ܕͷΞϥΠϝϯτʹΑͬͯແҙຯʹͳ͍ͬͯΔΞυϨεԼҐbit Λར༻ͯ͠GOTܦ༝ͷϙΠϯλͱ௨ৗͷϙΠϯλΛಉҰͷܕͰ දݱͯ͠Δɻ 21

Slide 22

Slide 22 text

struct RelativeIndirectablePointer /* where alignof(Pointee) => 2 */ { let offsetWithIndirectFlag: Int32 mutating func pointee() -> Pointee { let offset: Int32 if isIndirect { offset = offsetWithIndirectFlag & ~isIndirectMask } else { offset = offsetWithIndirectFlag } return withUnsafePointer(to: &self) { pointer -> UnsafePointer in let rawPointer = UnsafeRawPointer(pointer) var ptr = rawPointer.advanced(by: Int(offset)) if isIndirect { ptr = ptr.load(as: UnsafeRawPointer.self) } return ptr.assumingMemoryBound(to: Pointee.self) }.pointee } var isIndirect: Bool { offsetWithIndirectFlag & isIndirectMask != 0 } var isIndirectMask: Int32 { 0x01 } } 22

Slide 23

Slide 23 text

Int Paired Pointer ࢖ΘΕͳ͍ԼҐϏοτΛͦͷ··਺஋ͱͯ͠औΓग़͢όʔδϣ ϯɻ 23

Slide 24

Slide 24 text

struct RelativeDirectPointerIntPair /* where alignof(Pointee) => 2 */ { let offsetWithInt: Int32 mutating func pointee() -> Pointee { let offset = offsetWithInt & ~intMask return withUnsafePointer(to: &self) { pointer -> UnsafePointer in let rawPointer = UnsafeRawPointer(pointer) let advanced = rawPointer.advanced(by: Int(offset)) return advanced.assumingMemoryBound(to: Pointee.self) }.pointee } var value: IntTy { IntTy(offsetWithInt & intMask) } var intMask: Int32 { Int32( min( MemoryLayout.alignment, MemoryLayout.alignment ) - 1 ) } } 24

Slide 25

Slide 25 text

Symbolic Reference ϚϯάϦϯάͷछྨͷ1ͭɻ จࣈྻͷҰ෦ʹର৅ΦϒδΣΫτͷΞυϨεΛ௚઀ຒΊࠐΉɻ ઌ಄੍͕ޚจࣈͰ࢝·ΔͷͰ௨ॴͷϚϯάϧ͞Εͨจࣈྻͱ۠ ผͰ͖Δɻ 25

Slide 26

Slide 26 text

__swift_instantiateConcreteTypeFromMangledName ܕ໊͔ΒϝλσʔλΛऔಘ͢ΔϥϯλΠϜؔ਺ɻ ಺෦ͰσϚϯάϧͯ͠ϝλσʔλΛεΩϟϯ͢ΔͷͰॏ͍ɻ 26

Slide 27

Slide 27 text

Ҿ਺ʹ { i32, i32 }ͷߏ଄͕౉ͬͯ͘Δɻ union Input { struct { RelativePointer typeName; // 4byte int32_t negativeTypeNameLength; // 4byte } nonCached; TypeMetadata *cached; // 8 byte } 27

Slide 28

Slide 28 text

ූ߸෇͖64bit੔਺ͱͯ͠ݟͨ࣌ɺෛ਺Ͱ͋Ε͹Ωϟογϡͳ ͠ɺਖ਼਺Ͱ͋Ε͹Ωϟογϡ͋Γɺͱͯ۠͠ผͰ͖Δɻ TypeMetadata *__swift_instantiateConcreteTypeFromMangledName(Input input) { if ((int64_t)input > 0) { return input.cached; } else { const auto typeNameLength = -input.nonCached.negativeTypeNameLength; ... // Some heavy operations ... return ...; } } 28

Slide 29

Slide 29 text

·ͱΊ • ϥϯλΠϜϥΠϒϥϦʹ͸ݡ͍σʔλߏ଄ͷςΫχοΫ͕࢖ ΘΕ͍ͯΔɻ • ϙΠϯλαΠζ͕มΘͬͨΒյΕͦ͏ 29