Skip to content

Commit a8c48d1

Browse files
authored
Merge pull request swiftlang#34154 from nkcsgexi/forward-call-new-driver
Driver: forwarding driver invocations to the new driver when SWIFT_USE_NEW_DRIVER is defined
2 parents 836a8ee + 11b2251 commit a8c48d1

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

include/swift/AST/DiagnosticsDriver.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,5 +190,7 @@ WARNING(warn_drv_darwin_sdk_invalid_settings, none,
190190
"SDK settings were ignored because 'SDKSettings.json' could not be parsed",
191191
())
192192

193+
REMARK(remark_forwarding_to_new_driver, none, "new Swift driver will be used", ())
194+
193195
#define UNDEFINE_DIAGNOSTIC_MACROS
194196
#include "DefineDiagnosticMacros.h"

tools/driver/driver.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
//===----------------------------------------------------------------------===//
1616

1717
#include "swift/AST/DiagnosticEngine.h"
18+
#include "swift/AST/DiagnosticsDriver.h"
1819
#include "swift/Basic/LLVMInitialize.h"
1920
#include "swift/Basic/PrettyStackTrace.h"
2021
#include "swift/Basic/Program.h"
@@ -159,6 +160,35 @@ static int run_driver(StringRef ExecName,
159160
DiagnosticEngine Diags(SM);
160161
Diags.addConsumer(PDC);
161162

163+
// Forwarding calls to the swift driver if the C++ driver is invoked as `swift`
164+
// or `swiftc`, and an environment variable SWIFT_USE_NEW_DRIVER is defined.
165+
if (llvm::sys::Process::GetEnv("SWIFT_USE_NEW_DRIVER") &&
166+
(ExecName == "swift" || ExecName == "swiftc")) {
167+
SmallString<256> NewDriverPath(llvm::sys::path::parent_path(Path));
168+
llvm::sys::path::append(NewDriverPath, "swift-driver");
169+
SmallVector<const char *, 256> subCommandArgs;
170+
// Rewrite the program argument.
171+
subCommandArgs.push_back(NewDriverPath.c_str());
172+
if (ExecName == "swiftc") {
173+
subCommandArgs.push_back("--driver-mode=swiftc");
174+
} else {
175+
assert(ExecName == "swift");
176+
subCommandArgs.push_back("--driver-mode=swift");
177+
}
178+
subCommandArgs.insert(subCommandArgs.end(), argv.begin() + 1, argv.end());
179+
180+
// Execute the subcommand.
181+
subCommandArgs.push_back(nullptr);
182+
Diags.diagnose(SourceLoc(), diag::remark_forwarding_to_new_driver);
183+
ExecuteInPlace(NewDriverPath.c_str(), subCommandArgs.data());
184+
185+
// If we reach here then an error occurred (typically a missing path).
186+
std::string ErrorString = llvm::sys::StrError();
187+
llvm::errs() << "error: unable to invoke subcommand: " << subCommandArgs[0]
188+
<< " (" << ErrorString << ")\n";
189+
return 2;
190+
}
191+
162192
Driver TheDriver(Path, ExecName, argv, Diags);
163193
switch (TheDriver.getDriverKind()) {
164194
case Driver::DriverKind::AutolinkExtract:

0 commit comments

Comments
 (0)