@@ -112,15 +112,18 @@ parseClangDriverArgs(const clang::driver::Driver &clangDriver,
112
112
return clangDriver.getOpts ().ParseArgs (args, unused1, unused2);
113
113
}
114
114
115
- static clang::driver::Driver
116
- createClangDriver (const ASTContext &ctx,
117
- const llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> &vfs) {
115
+ std::pair<clang::driver::Driver,
116
+ llvm::IntrusiveRefCntPtr<clang::DiagnosticsEngine>>
117
+ ClangImporter::createClangDriver (
118
+ const LangOptions &LangOpts, const ClangImporterOptions &ClangImporterOpts,
119
+ llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> vfs) {
120
+ auto *silentDiagConsumer = new clang::DiagnosticConsumer ();
118
121
auto clangDiags = clang::CompilerInstance::createDiagnostics (
119
- new clang::DiagnosticOptions ());
120
- clang::driver::Driver clangDriver (ctx. ClangImporterOpts .clangPath ,
121
- ctx. LangOpts .Target .str (), *clangDiags,
122
+ new clang::DiagnosticOptions (), silentDiagConsumer );
123
+ clang::driver::Driver clangDriver (ClangImporterOpts.clangPath ,
124
+ LangOpts.Target .str (), *clangDiags,
122
125
" clang LLVM compiler" , vfs);
123
- return clangDriver;
126
+ return { std::move ( clangDriver), clangDiags} ;
124
127
}
125
128
126
129
// / Given a list of include paths and a list of file names, finds the first
@@ -162,21 +165,23 @@ static std::optional<Path> findFirstIncludeDir(
162
165
return std::nullopt;
163
166
}
164
167
165
- static llvm::opt::InputArgList
166
- createClangArgs (const ASTContext &ctx, clang::driver::Driver &clangDriver) {
168
+ llvm::opt::InputArgList
169
+ ClangImporter::createClangArgs (const ClangImporterOptions &ClangImporterOpts,
170
+ const SearchPathOptions &SearchPathOpts,
171
+ clang::driver::Driver &clangDriver) {
167
172
// Flags passed to Swift with `-Xcc` might affect include paths.
168
173
std::vector<const char *> clangArgs;
169
- for (const auto &each : ctx. ClangImporterOpts .ExtraArgs ) {
174
+ for (const auto &each : ClangImporterOpts.ExtraArgs ) {
170
175
clangArgs.push_back (each.c_str ());
171
176
}
172
177
llvm::opt::InputArgList clangDriverArgs =
173
178
parseClangDriverArgs (clangDriver, clangArgs);
174
179
// If an SDK path was explicitly passed to Swift, make sure to pass it to
175
180
// Clang driver as well. It affects the resulting include paths.
176
- auto sdkPath = ctx. SearchPathOpts .getSDKPath ();
181
+ auto sdkPath = SearchPathOpts.getSDKPath ();
177
182
if (!sdkPath.empty ())
178
183
clangDriver.SysRoot = sdkPath.str ();
179
- if (auto sysroot = ctx. SearchPathOpts .getSysRoot ())
184
+ if (auto sysroot = SearchPathOpts.getSysRoot ())
180
185
clangDriver.SysRoot = sysroot->str ();
181
186
return clangDriverArgs;
182
187
}
@@ -188,8 +193,10 @@ getLibcFileMapping(ASTContext &ctx, StringRef modulemapFileName,
188
193
const llvm::Triple &triple = ctx.LangOpts .Target ;
189
194
190
195
// Extract the libc path from Clang driver.
191
- auto clangDriver = createClangDriver (ctx, vfs);
192
- auto clangDriverArgs = createClangArgs (ctx, clangDriver);
196
+ auto [clangDriver, clangDiagEngine] = ClangImporter::createClangDriver (
197
+ ctx.LangOpts , ctx.ClangImporterOpts , vfs);
198
+ auto clangDriverArgs = ClangImporter::createClangArgs (
199
+ ctx.ClangImporterOpts , ctx.SearchPathOpts , clangDriver);
193
200
194
201
llvm::opt::ArgStringList includeArgStrings;
195
202
const auto &clangToolchain =
@@ -262,8 +269,10 @@ static void getLibStdCxxFileMapping(
262
269
return ;
263
270
264
271
// Extract the libstdc++ installation path from Clang driver.
265
- auto clangDriver = createClangDriver (ctx, vfs);
266
- auto clangDriverArgs = createClangArgs (ctx, clangDriver);
272
+ auto [clangDriver, clangDiagEngine] = ClangImporter::createClangDriver (
273
+ ctx.LangOpts , ctx.ClangImporterOpts , vfs);
274
+ auto clangDriverArgs = ClangImporter::createClangArgs (
275
+ ctx.ClangImporterOpts , ctx.SearchPathOpts , clangDriver);
267
276
268
277
llvm::opt::ArgStringList stdlibArgStrings;
269
278
const auto &clangToolchain =
@@ -457,8 +466,10 @@ SmallVector<std::pair<std::string, std::string>, 2> GetWindowsFileMappings(
457
466
if (!Triple.isWindowsMSVCEnvironment ())
458
467
return Mappings;
459
468
460
- clang::driver::Driver Driver = createClangDriver (Context, driverVFS);
461
- const llvm::opt::InputArgList Args = createClangArgs (Context, Driver);
469
+ auto [Driver, clangDiagEngine] = ClangImporter::createClangDriver (
470
+ Context.LangOpts , Context.ClangImporterOpts , driverVFS);
471
+ const llvm::opt::InputArgList Args = ClangImporter::createClangArgs (
472
+ Context.ClangImporterOpts , Context.SearchPathOpts , Driver);
462
473
const clang::driver::ToolChain &ToolChain = Driver.getToolChain (Args, Triple);
463
474
llvm::vfs::FileSystem &VFS = ToolChain.getVFS ();
464
475
0 commit comments