Skip to content

Commit 6ce58e9

Browse files
authored
Merge pull request #20121 from gottesmm/pr-3f72e83daa9956f7052062248db8e4d206f835d9
[benchmark] Fix swiftpm based benchmark build on Linux.
2 parents 65c7d14 + ba7815b commit 6ce58e9

File tree

3 files changed

+56
-16
lines changed

3 files changed

+56
-16
lines changed

benchmark/Package.swift

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,19 @@
33
import PackageDescription
44
import Foundation
55

6+
var unsupportedTests: Set<String> = ["ObjectiveCNoBridgingStubs"]
7+
#if !os(macOS) && !os(iOS) && !os(watchOS) && !os(tvOS)
8+
unsupportedTests.insert("ObjectiveCBridging")
9+
unsupportedTests.insert("ObjectiveCBridgingStubs")
10+
#endif
11+
612
// This is a stop gap hack so we can edit benchmarks in Xcode.
713
let singleSourceLibraries: [String] = {
814
let f = FileManager.`default`
915
let dirURL = URL(fileURLWithPath: "single-source").absoluteURL
1016
let fileURLs = try! f.contentsOfDirectory(at: dirURL,
1117
includingPropertiesForKeys: nil)
12-
return fileURLs.flatMap { (path: URL) -> String? in
18+
return fileURLs.compactMap { (path: URL) -> String? in
1319
let c = path.lastPathComponent.split(separator: ".")
1420
// Too many components. Must be a gyb file.
1521
if c.count > 2 {
@@ -19,13 +25,15 @@ let singleSourceLibraries: [String] = {
1925
return nil
2026
}
2127

28+
let s = String(c[0])
29+
2230
// We do not support this test.
23-
if c[0] == "ObjectiveCNoBridgingStubs" {
31+
if unsupportedTests.contains(s) {
2432
return nil
2533
}
2634

27-
assert(c[0] != "PrimsSplit")
28-
return String(c[0])
35+
assert(s != "PrimsSplit")
36+
return s
2937
}
3038
}()
3139

@@ -42,7 +50,9 @@ let multiSourceLibraries: [String] = {
4250
var products: [Product] = []
4351
products.append(.library(name: "TestsUtils", type: .static, targets: ["TestsUtils"]))
4452
products.append(.library(name: "DriverUtils", type: .static, targets: ["DriverUtils"]))
53+
#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS)
4554
products.append(.library(name: "ObjectiveCTests", type: .static, targets: ["ObjectiveCTests"]))
55+
#endif
4656
products.append(.executable(name: "SwiftBench", targets: ["SwiftBench"]))
4757
products.append(.library(name: "PrimsSplit", type: .static, targets: ["PrimsSplit"]))
4858
products += singleSourceLibraries.map { .library(name: $0, type: .static, targets: [$0]) }
@@ -56,26 +66,35 @@ targets.append(
5666
dependencies: [.target(name: "TestsUtils"), "LibProc"],
5767
path: "utils",
5868
sources: ["DriverUtils.swift", "ArgParse.swift"]))
69+
70+
var swiftBenchDeps: [Target.Dependency] = [.target(name: "TestsUtils")]
71+
#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS)
72+
swiftBenchDeps.append(.target(name: "ObjectiveCTests"))
73+
#endif
74+
swiftBenchDeps.append(.target(name: "DriverUtils"))
75+
swiftBenchDeps += singleSourceLibraries.map { .target(name: $0) }
76+
swiftBenchDeps += multiSourceLibraries.map { .target(name: $0) }
77+
5978
targets.append(
6079
.target(name: "SwiftBench",
61-
dependencies: [
62-
.target(name: "TestsUtils"),
63-
.target(name: "ObjectiveCTests"),
64-
.target(name: "DriverUtils"),
65-
] + singleSourceLibraries.map { .target(name: $0) }
66-
+ multiSourceLibraries.map { .target(name: $0) },
80+
dependencies: swiftBenchDeps,
6781
path: "utils",
6882
sources: ["main.swift"]))
83+
84+
#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS)
6985
targets.append(
7086
.target(name: "ObjectiveCTests",
7187
path: "utils/ObjectiveCTests",
7288
publicHeadersPath: "."))
89+
#endif
90+
91+
var singleSourceDeps: [Target.Dependency] = [.target(name: "TestsUtils")]
92+
#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS)
93+
singleSourceDeps.append(.target(name: "ObjectiveCTests"))
94+
#endif
7395
targets += singleSourceLibraries.map { x in
7496
return .target(name: x,
75-
dependencies: [
76-
.target(name: "TestsUtils"),
77-
.target(name: "ObjectiveCTests"),
78-
],
97+
dependencies: singleSourceDeps,
7998
path: "single-source",
8099
sources: ["\(x).swift"])
81100
}

benchmark/utils/DriverUtils.swift

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,19 +370,35 @@ final class TestRunner {
370370
#endif
371371

372372
private static func getResourceUtilization() -> rusage {
373-
var u = rusage(); getrusage(RUSAGE_SELF, &u); return u
373+
#if canImport(Darwin)
374+
let rusageSelf = RUSAGE_SELF
375+
#else
376+
let rusageSelf = RUSAGE_SELF.rawValue
377+
#endif
378+
var u = rusage(); getrusage(rusageSelf, &u); return u
374379
}
375380

376381
/// Returns maximum resident set size (MAX_RSS) delta in bytes.
377382
///
378383
/// This method of estimating memory usage is valid only for executing single
379384
/// benchmark. That's why we don't worry about reseting the `baseline` in
380385
/// `resetMeasurements`.
386+
///
387+
/// FIXME: This current implementation doesn't work on Linux. It is disabled
388+
/// permanently to avoid linker errors. Feel free to fix.
381389
func measureMemoryUsage() -> Int? {
390+
#if os(Linux)
391+
return nil
392+
#else
382393
guard c.logMemory else { return nil }
383394
let current = TestRunner.getResourceUtilization()
384395
let maxRSS = current.ru_maxrss - baseline.ru_maxrss
385-
let pages = { maxRSS / sysconf(_SC_PAGESIZE) }
396+
#if canImport(Darwin)
397+
let pageSize = _SC_PAGESIZE
398+
#else
399+
let pageSize = Int32(_SC_PAGESIZE)
400+
#endif
401+
let pages = { maxRSS / sysconf(pageSize) }
386402
func deltaEquation(_ stat: KeyPath<rusage, Int>) -> String {
387403
let b = baseline[keyPath: stat], c = current[keyPath: stat]
388404
return "\(c) - \(b) = \(c - b)"
@@ -394,6 +410,7 @@ final class TestRunner {
394410
VCS \(deltaEquation(\rusage.ru_nvcsw))
395411
""")
396412
return maxRSS
413+
#endif
397414
}
398415

399416
private func startMeasurement() {

benchmark/utils/main.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,13 @@ import NSError
9696
import NSStringConversion
9797
import NopDeinit
9898
import ObjectAllocation
99+
#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS)
99100
import ObjectiveCBridging
100101
import ObjectiveCBridgingStubs
101102
#if !(SWIFT_PACKAGE || Xcode)
102103
import ObjectiveCNoBridgingStubs
103104
#endif
105+
#endif
104106
import ObserverClosure
105107
import ObserverForwarderStruct
106108
import ObserverPartiallyAppliedMethod
@@ -265,11 +267,13 @@ registerBenchmark(NSStringConversion)
265267
registerBenchmark(NibbleSort)
266268
registerBenchmark(NopDeinit)
267269
registerBenchmark(ObjectAllocation)
270+
#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS)
268271
registerBenchmark(ObjectiveCBridging)
269272
registerBenchmark(ObjectiveCBridgingStubs)
270273
#if !(SWIFT_PACKAGE || Xcode)
271274
registerBenchmark(ObjectiveCNoBridgingStubs)
272275
#endif
276+
#endif
273277
registerBenchmark(ObserverClosure)
274278
registerBenchmark(ObserverForwarderStruct)
275279
registerBenchmark(ObserverPartiallyAppliedMethod)

0 commit comments

Comments
 (0)