Skip to content

Commit 80c70a4

Browse files
authored
Merge pull request swiftlang#745 from jslegendre/lto-library-flag
Add support for -lto_library linker flag
2 parents 3cf63be + da09f0b commit 80c70a4

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

Sources/SwiftDriver/Jobs/DarwinToolchain+LinkerSupport.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,12 @@ extension DarwinToolchain {
338338
)
339339

340340
if lto != nil {
341-
try addLTOLibArgs(to: &commandLine)
341+
if let arg = parsedOptions.getLastArgument(.ltoLibrary)?.asSingle {
342+
commandLine.appendFlag("-lto_library")
343+
commandLine.appendPath(try VirtualPath(path: arg))
344+
} else {
345+
try addLTOLibArgs(to: &commandLine)
346+
}
342347
}
343348

344349
let fSystemArgs = parsedOptions.arguments(for: .F, .Fsystem)

Sources/SwiftOptions/Options.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,7 @@ extension Option {
386386
public static let localizationPath: Option = Option("-localization-path", .separate, attributes: [.frontend, .doesNotAffectIncrementalBuild, .argumentIsPath], metaVar: "<path>", helpText: "Path to localized diagnostic messages directory")
387387
public static let location: Option = Option("-location", .separate, attributes: [.noDriver], metaVar: "<location>", helpText: "Filter nodes with the given location.")
388388
public static let location_: Option = Option("--location", .separate, alias: Option.location, attributes: [.noDriver], metaVar: "<location>", helpText: "Filter nodes with the given location.")
389+
public static let ltoLibrary: Option = Option("-lto-library", .separate, attributes: [.frontend, .argumentIsPath], metaVar: "<lto-library>", helpText: "Perform LTO with <lto-library>")
389390
public static let lto: Option = Option("-lto=", .joined, attributes: [.frontend, .noInteractive], helpText: "Specify the LTO type to either 'llvm-thin' or 'llvm-full'")
390391
public static let L: Option = Option("-L", .joinedOrSeparate, attributes: [.frontend, .doesNotAffectIncrementalBuild, .argumentIsPath], helpText: "Add directory to library link search path", group: .linkerOption)
391392
public static let l: Option = Option("-l", .joined, attributes: [.frontend, .doesNotAffectIncrementalBuild], helpText: "Specifies a library which should be linked against", group: .linkerOption)
@@ -986,6 +987,7 @@ extension Option {
986987
Option.localizationPath,
987988
Option.location,
988989
Option.location_,
990+
Option.ltoLibrary,
989991
Option.lto,
990992
Option.L,
991993
Option.l,

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3810,12 +3810,32 @@ final class SwiftDriverTests: XCTestCase {
38103810
XCTAssertEqual(plannedJobs.map(\.kind), [.compile, .link])
38113811
XCTAssertTrue(plannedJobs[1].commandLine.contains("-lto_library"))
38123812
}
3813+
3814+
do {
3815+
var driver = try Driver(args: ["swiftc", "foo.swift", "-lto=llvm-thin", "-lto-library", "/foo/libLTO.dylib", "-target", "x86_64-apple-macos11.0"])
3816+
let plannedJobs = try driver.planBuild()
3817+
XCTAssertEqual(plannedJobs.map(\.kind), [.compile, .link])
3818+
XCTAssertFalse(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "/foo/libLTO.dylib"))))
3819+
XCTAssertTrue(plannedJobs[1].commandLine.contains("-lto_library"))
3820+
XCTAssertTrue(plannedJobs[1].commandLine.contains(.path(try VirtualPath(path: "/foo/libLTO.dylib"))))
3821+
}
3822+
38133823
do {
38143824
var driver = try Driver(args: ["swiftc", "foo.swift", "-lto=llvm-full", "-target", "x86_64-apple-macos11.0"])
38153825
let plannedJobs = try driver.planBuild()
38163826
XCTAssertEqual(plannedJobs.map(\.kind), [.compile, .link])
38173827
XCTAssertTrue(plannedJobs[1].commandLine.contains("-lto_library"))
38183828
}
3829+
3830+
do {
3831+
var driver = try Driver(args: ["swiftc", "foo.swift", "-lto=llvm-full", "-lto-library", "/foo/libLTO.dylib", "-target", "x86_64-apple-macos11.0"])
3832+
let plannedJobs = try driver.planBuild()
3833+
XCTAssertEqual(plannedJobs.map(\.kind), [.compile, .link])
3834+
XCTAssertFalse(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "/foo/libLTO.dylib"))))
3835+
XCTAssertTrue(plannedJobs[1].commandLine.contains("-lto_library"))
3836+
XCTAssertTrue(plannedJobs[1].commandLine.contains(.path(try VirtualPath(path: "/foo/libLTO.dylib"))))
3837+
}
3838+
38193839
do {
38203840
var driver = try Driver(args: ["swiftc", "foo.swift", "-target", "x86_64-apple-macos11.0"])
38213841
let plannedJobs = try driver.planBuild()

0 commit comments

Comments
 (0)