Skip to content

Commit 954f8ad

Browse files
authored
Merge pull request #233 from p-x9/feature/export-symbol-func-variant
Support new export symbol flag `EXPORT_SYMBOL_FLAGS_FUNCTION_VARIANT`
2 parents 8ca77d0 + dfa3846 commit 954f8ad

File tree

5 files changed

+35
-3
lines changed

5 files changed

+35
-3
lines changed

Sources/MachOKit/Extension/TrieTreeProtocol+.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ extension TrieTreeProtocol where Content == ExportTrieNodeContent {
2828
ordinal: content.ordinal,
2929
importedName: content.importedName,
3030
stub: content.stub,
31-
resolverOffset: content.resolver
31+
resolverOffset: content.resolver,
32+
functionVariantTableIndex: content.functionVariantTableIndex
3233
)
3334
}
3435
}
@@ -48,7 +49,8 @@ extension TrieTreeProtocol where Content == ExportTrieNodeContent {
4849
ordinal: content.ordinal,
4950
importedName: content.importedName,
5051
stub: content.stub,
51-
resolverOffset: content.resolver
52+
resolverOffset: content.resolver,
53+
functionVariantTableIndex: content.functionVariantTableIndex
5254
)
5355
}
5456

@@ -67,7 +69,8 @@ extension TrieTreeProtocol where Content == ExportTrieNodeContent {
6769
ordinal: content.ordinal,
6870
importedName: content.importedName,
6971
stub: content.stub,
70-
resolverOffset: content.resolver
72+
resolverOffset: content.resolver,
73+
functionVariantTableIndex: content.functionVariantTableIndex
7174
)
7275
}
7376
}

Sources/MachOKit/Model/Export/ExportSymbolFlags.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ extension ExportSymbolFlags {
3939
public static let static_resolver = ExportSymbolFlags(
4040
rawValue: Bit.static_resolver.rawValue
4141
)
42+
/// EXPORT_SYMBOL_FLAGS_FUNCTION_VARIANT
43+
public static let function_variant = ExportSymbolFlags(
44+
rawValue: Bit.function_variant.rawValue
45+
)
4246
}
4347

4448
extension ExportSymbolFlags {
@@ -51,6 +55,8 @@ extension ExportSymbolFlags {
5155
case stub_and_resolver
5256
/// EXPORT_SYMBOL_FLAGS_STATIC_RESOLVER
5357
case static_resolver
58+
/// EXPORT_SYMBOL_FLAGS_FUNCTION_VARIANT
59+
case function_variant
5460
}
5561
}
5662

@@ -63,6 +69,7 @@ extension ExportSymbolFlags.Bit: RawRepresentable {
6369
case RawValue(EXPORT_SYMBOL_FLAGS_REEXPORT): self = .reexport
6470
case RawValue(EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER): self = .stub_and_resolver
6571
case RawValue(EXPORT_SYMBOL_FLAGS_STATIC_RESOLVER): self = .static_resolver
72+
case RawValue(EXPORT_SYMBOL_FLAGS_FUNCTION_VARIANT): self = .function_variant
6673
default: return nil
6774
}
6875
}
@@ -73,6 +80,7 @@ extension ExportSymbolFlags.Bit: RawRepresentable {
7380
case .reexport: RawValue(EXPORT_SYMBOL_FLAGS_REEXPORT)
7481
case .stub_and_resolver: RawValue(EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER)
7582
case .static_resolver: RawValue(EXPORT_SYMBOL_FLAGS_STATIC_RESOLVER)
83+
case .function_variant: RawValue(EXPORT_SYMBOL_FLAGS_FUNCTION_VARIANT)
7684
}
7785
}
7886
}
@@ -84,6 +92,7 @@ extension ExportSymbolFlags.Bit: CustomStringConvertible {
8492
case .reexport: "EXPORT_SYMBOL_FLAGS_REEXPORT"
8593
case .stub_and_resolver: "EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER"
8694
case .static_resolver: "EXPORT_SYMBOL_FLAGS_STATIC_RESOLVER"
95+
case .function_variant: "EXPORT_SYMBOL_FLAGS_FUNCTION_VARIANT"
8796
}
8897
}
8998
}

Sources/MachOKit/Model/Export/ExportTrieEntry.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ public struct ExportTrieNodeContent {
1919
public var stub: UInt?
2020
public var resolver: UInt?
2121

22+
public var functionVariantTableIndex: UInt?
23+
2224
public var symbolOffset: UInt?
2325
}
2426

@@ -67,6 +69,18 @@ extension ExportTrieNodeContent: TrieNodeContent {
6769

6870
content.stub = stub
6971
content.resolver = resolver
72+
} else if flags.contains(.function_variant) {
73+
let (symbolOffset, ulebOffset) = basePointer
74+
.advanced(by: nextOffset)
75+
.readULEB128()
76+
nextOffset += ulebOffset
77+
let (functionVariantTableIndex, ulebOffset2) = basePointer
78+
.advanced(by: nextOffset)
79+
.readULEB128()
80+
nextOffset += ulebOffset2
81+
82+
content.symbolOffset = symbolOffset
83+
content.functionVariantTableIndex = functionVariantTableIndex
7084
} else {
7185
let (value, ulebOffset) = basePointer
7286
.advanced(by: nextOffset)

Sources/MachOKit/Model/ExportedSymbol.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public struct ExportedSymbol {
2121

2222
public var stub: UInt?
2323
public var resolverOffset: UInt?
24+
25+
public var functionVariantTableIndex: UInt?
2426
}
2527

2628
extension ExportedSymbol {

Sources/MachOKitC/include/backports.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,8 @@ struct target_triple_command {
8181

8282
#endif /* __linux__ */
8383

84+
#ifndef EXPORT_SYMBOL_FLAGS_FUNCTION_VARIANT
85+
#define EXPORT_SYMBOL_FLAGS_FUNCTION_VARIANT 0x20
86+
#endif
87+
8488
#endif /* backports_h */

0 commit comments

Comments
 (0)