@@ -219,22 +219,58 @@ static std::optional<bool> toOptionalBool(llvm::cl::boolOrDefault defaultable) {
219
219
llvm_unreachable (" Bad case for llvm::cl::boolOrDefault!" );
220
220
}
221
221
222
+ namespace {
223
+ class LLVMOptionFilter {
224
+ // / Options with -Xllvm removed. We let through -Xllvm options so that LLVM's
225
+ // / processing can find it.
226
+ SmallVector<const char *, 32 > filteredOptions;
227
+
228
+ // / Options with the -Xllvm prefix. We have that here so we can process them
229
+ // / separately.
230
+ SmallVector<const char *, 32 > llvmOptions;
231
+
232
+ public:
233
+ LLVMOptionFilter (ArrayRef<const char *> argv) {
234
+ for (unsigned i = 0 ; i < argv.size (); ++i) {
235
+ // Not a -Xllvm option... just let it through.
236
+ if (StringRef (argv[i]) != " -Xllvm" ) {
237
+ filteredOptions.push_back (argv[i]);
238
+ continue ;
239
+ }
240
+
241
+ assert (i + 1 < argv.size () && " -Xllvm without a corresponding option" );
242
+ ++i;
243
+ filteredOptions.push_back (argv[i]);
244
+ llvmOptions.push_back (argv[i]);
245
+ }
246
+ }
247
+
248
+ ArrayRef<const char *> getFilteredOptions () const { return filteredOptions; }
249
+ ArrayRef<const char *> getLLVMOptions () const { return llvmOptions; }
250
+ };
251
+ } // namespace
252
+
222
253
int sil_llvm_gen_main (ArrayRef<const char *> argv, void *MainAddr) {
223
254
INITIALIZE_LLVM ();
224
255
225
256
llvm::setBugReportMsg (SWIFT_CRASH_BUG_REPORT_MESSAGE " \n " );
226
257
llvm::EnablePrettyStackTraceOnSigInfoForThisThread ();
227
258
228
259
SILLLVMGenOptions options;
229
-
230
- llvm::cl::ParseCommandLineOptions (argv.size (), argv.data (), " Swift LLVM IR Generator\n " );
231
-
232
- if (options.PrintStats )
233
- llvm::EnableStatistics ();
260
+ LLVMOptionFilter filteredOptions (argv);
234
261
235
262
CompilerInvocation Invocation;
236
263
237
264
Invocation.setMainExecutablePath (llvm::sys::fs::getMainExecutable (argv[0 ], MainAddr));
265
+ copy (filteredOptions.getLLVMOptions (),
266
+ std::back_inserter (Invocation.getFrontendOptions ().LLVMArgs ));
267
+
268
+ llvm::cl::ParseCommandLineOptions (filteredOptions.getFilteredOptions ().size (),
269
+ filteredOptions.getFilteredOptions ().data (),
270
+ " Swift LLVM IR Generator\n " );
271
+
272
+ if (options.PrintStats )
273
+ llvm::EnableStatistics ();
238
274
239
275
// Give the context the list of search paths to use for modules.
240
276
std::vector<SearchPathOptions::SearchPath> ImportPaths;
0 commit comments