Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import MachOExtensions

extension RelativeDirectPointer: LayoutProtocol {}
58 changes: 23 additions & 35 deletions Sources/MachOSwiftSection/MachOFile+Swift.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ extension MachOFile.Swift: SwiftSectionRepresentable {

public var contextDescriptors: [ContextDescriptorWrapper] {
get throws {
return try _readTypeMetadataRecords(from: .__swift5_types, in: machO) + (try? _readTypeMetadataRecords(from: .__swift5_types2, in: machO))
return try _readTypeMetadataRecords(from: .__swift5_types) + (try? _readTypeMetadataRecords(from: .__swift5_types2))
}
}

Expand All @@ -59,46 +59,51 @@ extension MachOFile.Swift: SwiftSectionRepresentable {

public var protocolDescriptors: [ProtocolDescriptor] {
get throws {
return try _readProtocolRecords(from: .__swift5_protos, in: machO)
return try _readProtocolRecords(from: .__swift5_protos)
}
}

public var protocolConformanceDescriptors: [ProtocolConformanceDescriptor] {
get throws {
return try _readRelativeDescriptors(from: .__swift5_proto, in: machO)
return try _readRelativeDescriptors(from: .__swift5_proto)
}
}

public var associatedTypeDescriptors: [AssociatedTypeDescriptor] {
get throws {
return try _readDescriptors(from: .__swift5_assocty, in: machO)
return try _readDescriptors(from: .__swift5_assocty)
}
}

public var builtinTypeDescriptors: [BuiltinTypeDescriptor] {
get throws {
return try _readDescriptors(from: .__swift5_builtin, in: machO)
return try _readDescriptors(from: .__swift5_builtin)
}
}

public var multiPayloadEnumDescriptors: [MultiPayloadEnumDescriptor] {
get throws {
return try _readDescriptors(from: .__swift5_mpenum, in: machO)
return try _readDescriptors(from: .__swift5_mpenum)
}
}
}

extension MachOFile.Swift {
private func _readDescriptors<Descriptor: TopLevelDescriptor>(from swiftMachOSection: MachOSwiftSectionName, in machO: MachOFile) throws -> [Descriptor] {
private func _sectionOffsetAndSize(of swiftMachOSection: MachOSwiftSectionName) throws -> (offset: Int, size: Int) {
let section = try machO.section(for: swiftMachOSection)
var descriptors: [Descriptor] = []
let offset = if let cache = machO.cache {
section.address - cache.mainCacheHeader.sharedRegionStart.cast()
} else {
section.offset
}
return (offset, section.size)
}

private func _readDescriptors<Descriptor: TopLevelDescriptor>(from swiftMachOSection: MachOSwiftSectionName) throws -> [Descriptor] {
let (offset, size) = try _sectionOffsetAndSize(of: swiftMachOSection)
var descriptors: [Descriptor] = []
var currentOffset = offset
let endOffset = offset + section.size
let endOffset = offset + size
while currentOffset < endOffset {
let descriptor: Descriptor = try machO.readWrapperElement(offset: currentOffset)
currentOffset += descriptor.actualSize
Expand All @@ -107,41 +112,24 @@ extension MachOFile.Swift {
return descriptors
}

private func _readRelativeDescriptors<Descriptor: Resolvable>(from swiftMachOSection: MachOSwiftSectionName, in machO: MachOFile) throws -> [Descriptor] {
let section = try machO.section(for: swiftMachOSection)
private func _readRelativeDescriptors<Descriptor: Resolvable>(from swiftMachOSection: MachOSwiftSectionName) throws -> [Descriptor] {
let (offset, size) = try _sectionOffsetAndSize(of: swiftMachOSection)
let pointerSize: Int = MemoryLayout<RelativeDirectPointer<Descriptor>>.size
let offset = if let cache = machO.cache {
section.address - cache.mainCacheHeader.sharedRegionStart.cast()
} else {
section.offset
}
let data: [AnyLocatableLayoutWrapper<RelativeDirectPointer<Descriptor>>] = try machO.readWrapperElements(offset: offset, numberOfElements: section.size / pointerSize)
let data: [AnyLocatableLayoutWrapper<RelativeDirectPointer<Descriptor>>] = try machO.readWrapperElements(offset: offset, numberOfElements: size / pointerSize)
return try data.map { try $0.layout.resolve(from: $0.offset, in: machO) }
}

private func _readTypeMetadataRecords(from swiftMachOSection: MachOSwiftSectionName, in machO: MachOFile) throws -> [ContextDescriptorWrapper] {
let section = try machO.section(for: swiftMachOSection)
let offset = if let cache = machO.cache {
section.address - cache.mainCacheHeader.sharedRegionStart.cast()
} else {
section.offset
}
private func _readTypeMetadataRecords(from swiftMachOSection: MachOSwiftSectionName) throws -> [ContextDescriptorWrapper] {
let (offset, size) = try _sectionOffsetAndSize(of: swiftMachOSection)
let recordSize = MemoryLayout<TypeMetadataRecord.Layout>.size
let records: [TypeMetadataRecord] = try machO.readWrapperElements(offset: offset, numberOfElements: section.size / recordSize)
let records: [TypeMetadataRecord] = try machO.readWrapperElements(offset: offset, numberOfElements: size / recordSize)
return try records.compactMap { try $0.contextDescriptor(in: machO) }
}

private func _readProtocolRecords(from swiftMachOSection: MachOSwiftSectionName, in machO: MachOFile) throws -> [ProtocolDescriptor] {
let section = try machO.section(for: swiftMachOSection)
let offset = if let cache = machO.cache {
section.address - cache.mainCacheHeader.sharedRegionStart.cast()
} else {
section.offset
}
private func _readProtocolRecords(from swiftMachOSection: MachOSwiftSectionName) throws -> [ProtocolDescriptor] {
let (offset, size) = try _sectionOffsetAndSize(of: swiftMachOSection)
let recordSize = MemoryLayout<ProtocolRecord.Layout>.size
let records: [ProtocolRecord] = try machO.readWrapperElements(offset: offset, numberOfElements: section.size / recordSize)
let records: [ProtocolRecord] = try machO.readWrapperElements(offset: offset, numberOfElements: size / recordSize)
return try records.compactMap { try $0.protocolDescriptor(in: machO) }
}
}

extension RelativeDirectPointer: LayoutProtocol {}
52 changes: 24 additions & 28 deletions Sources/MachOSwiftSection/MachOImage+Swift.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ extension MachOImage.Swift: SwiftSectionRepresentable {

public var contextDescriptors: [ContextDescriptorWrapper] {
get throws {
return try _readTypeMetadataRecords(from: .__swift5_types, in: machO) + (try? _readTypeMetadataRecords(from: .__swift5_types2, in: machO))
return try _readTypeMetadataRecords(from: .__swift5_types) + (try? _readTypeMetadataRecords(from: .__swift5_types2))
}
}

Expand All @@ -59,44 +59,49 @@ extension MachOImage.Swift: SwiftSectionRepresentable {

public var protocolDescriptors: [ProtocolDescriptor] {
get throws {
return try _readProtocolRecords(from: .__swift5_protos, in: machO)
return try _readProtocolRecords(from: .__swift5_protos)
}
}

public var protocolConformanceDescriptors: [ProtocolConformanceDescriptor] {
get throws {
return try _readRelativeDescriptors(from: .__swift5_proto, in: machO)
return try _readRelativeDescriptors(from: .__swift5_proto)
}
}

public var associatedTypeDescriptors: [AssociatedTypeDescriptor] {
get throws {
return try _readDescriptors(from: .__swift5_assocty, in: machO)
return try _readDescriptors(from: .__swift5_assocty)
}
}

public var builtinTypeDescriptors: [BuiltinTypeDescriptor] {
get throws {
return try _readDescriptors(from: .__swift5_builtin, in: machO)
return try _readDescriptors(from: .__swift5_builtin)
}
}

public var multiPayloadEnumDescriptors: [MultiPayloadEnumDescriptor] {
get throws {
return try _readDescriptors(from: .__swift5_mpenum, in: machO)
return try _readDescriptors(from: .__swift5_mpenum)
}
}
}

extension MachOImage.Swift {
private func _readDescriptors<Descriptor: TopLevelDescriptor>(from swiftMachOSection: MachOSwiftSectionName, in machO: MachOImage) throws -> [Descriptor] {
private func _sectionOffsetAndSize(of swiftMachOSection: MachOSwiftSectionName) throws -> (offset: Int, size: Int) {
let section = try machO.section(for: swiftMachOSection)
var descriptors: [Descriptor] = []
let vmaddrSlide = try required(machO.vmaddrSlide)
let start = try required(UnsafeRawPointer(bitPattern: section.address + vmaddrSlide))
let offset = start.bitPattern.int - machO.ptr.bitPattern.int
let offset = machO.ptr.distance(to: start)
return (offset, section.size)
}

private func _readDescriptors<Descriptor: TopLevelDescriptor>(from swiftMachOSection: MachOSwiftSectionName) throws -> [Descriptor] {
let (offset, size) = try _sectionOffsetAndSize(of: swiftMachOSection)
var descriptors: [Descriptor] = []
var currentOffset = offset
let endOffset = offset + section.size
let endOffset = offset + size
while currentOffset < endOffset {
let descriptor: Descriptor = try machO.readWrapperElement(offset: currentOffset)
currentOffset += descriptor.actualSize
Expand All @@ -105,33 +110,24 @@ extension MachOImage.Swift {
return descriptors
}

private func _readRelativeDescriptors<Descriptor: Resolvable>(from swiftMachOSection: MachOSwiftSectionName, in machO: MachOImage) throws -> [Descriptor] {
let section = try machO.section(for: swiftMachOSection)
let vmaddrSlide = try required(machO.vmaddrSlide)
let start = try required(UnsafeRawPointer(bitPattern: section.address + vmaddrSlide))
let offset = start.bitPattern.int - machO.ptr.bitPattern.int
private func _readRelativeDescriptors<Descriptor: Resolvable>(from swiftMachOSection: MachOSwiftSectionName) throws -> [Descriptor] {
let (offset, size) = try _sectionOffsetAndSize(of: swiftMachOSection)
let pointerSize: Int = MemoryLayout<RelativeDirectPointer<Descriptor>>.size
let data: [AnyLocatableLayoutWrapper<RelativeDirectPointer<Descriptor>>] = try machO.readWrapperElements(offset: offset, numberOfElements: section.size / pointerSize)
let data: [AnyLocatableLayoutWrapper<RelativeDirectPointer<Descriptor>>] = try machO.readWrapperElements(offset: offset, numberOfElements: size / pointerSize)
return try data.map { try $0.layout.resolve(from: $0.offset, in: machO) }
}

private func _readTypeMetadataRecords(from swiftMachOSection: MachOSwiftSectionName, in machO: MachOImage) throws -> [ContextDescriptorWrapper] {
let section = try machO.section(for: swiftMachOSection)
let vmaddrSlide = try required(machO.vmaddrSlide)
let start = try required(UnsafeRawPointer(bitPattern: section.address + vmaddrSlide))
let offset = start.bitPattern.int - machO.ptr.bitPattern.int
private func _readTypeMetadataRecords(from swiftMachOSection: MachOSwiftSectionName) throws -> [ContextDescriptorWrapper] {
let (offset, size) = try _sectionOffsetAndSize(of: swiftMachOSection)
let recordSize = MemoryLayout<TypeMetadataRecord.Layout>.size
let records: [TypeMetadataRecord] = try machO.readWrapperElements(offset: offset, numberOfElements: section.size / recordSize)
let records: [TypeMetadataRecord] = try machO.readWrapperElements(offset: offset, numberOfElements: size / recordSize)
return try records.compactMap { try $0.contextDescriptor(in: machO) }
}

private func _readProtocolRecords(from swiftMachOSection: MachOSwiftSectionName, in machO: MachOImage) throws -> [ProtocolDescriptor] {
let section = try machO.section(for: swiftMachOSection)
let vmaddrSlide = try required(machO.vmaddrSlide)
let start = try required(UnsafeRawPointer(bitPattern: section.address + vmaddrSlide))
let offset = start.bitPattern.int - machO.ptr.bitPattern.int
private func _readProtocolRecords(from swiftMachOSection: MachOSwiftSectionName) throws -> [ProtocolDescriptor] {
let (offset, size) = try _sectionOffsetAndSize(of: swiftMachOSection)
let recordSize = MemoryLayout<ProtocolRecord.Layout>.size
let records: [ProtocolRecord] = try machO.readWrapperElements(offset: offset, numberOfElements: section.size / recordSize)
let records: [ProtocolRecord] = try machO.readWrapperElements(offset: offset, numberOfElements: size / recordSize)
return try records.compactMap { try $0.protocolDescriptor(in: machO) }
}
}
Expand Down
Loading