@@ -1437,39 +1437,66 @@ void ApplyWorkingDir(SmallString &clang_argument, StringRef cur_working_dir) {
1437
1437
llvm::sys::path::append (clang_argument, cur_working_dir, rel_path);
1438
1438
llvm::sys::path::remove_dots (clang_argument);
1439
1439
}
1440
+
1441
+ std::array<StringRef, 2 > macro_flags = { " -D" , " -U" };
1442
+
1443
+ bool IsMultiArgClangFlag (StringRef arg) {
1444
+ for (auto &flag : macro_flags)
1445
+ if (flag == arg)
1446
+ return true ;
1447
+ return arg == " -working-directory" ;
1448
+ }
1449
+
1450
+ bool IsMacroDefinition (StringRef arg) {
1451
+ for (auto &flag : macro_flags)
1452
+ if (arg.startswith (flag))
1453
+ return true ;
1454
+ return false ;
1455
+ }
1456
+
1457
+ bool ShouldUnique (StringRef arg) {
1458
+ return IsMacroDefinition (arg);
1459
+ }
1440
1460
} // namespace
1441
1461
1442
1462
void SwiftASTContext::AddExtraClangArgs (std::vector<std::string> ExtraArgs) {
1463
+ swift::ClangImporterOptions &importer_options = GetClangImporterOptions ();
1464
+ llvm::DenseSet<StringRef> unique_flags;
1465
+ for (auto &arg : importer_options.ExtraArgs )
1466
+ unique_flags.insert (arg);
1467
+
1443
1468
llvm::SmallString<128 > cur_working_dir;
1444
1469
llvm::SmallString<128 > clang_argument;
1445
1470
for (const std::string &arg : ExtraArgs) {
1446
- // Join multi-arg -D and -U options for uniquing.
1471
+ // Join multi-arg options for uniquing.
1447
1472
clang_argument += arg;
1448
- if (clang_argument == " -D" || clang_argument == " -U" ||
1449
- clang_argument == " -working-directory" )
1473
+ if (IsMultiArgClangFlag (clang_argument))
1450
1474
continue ;
1451
1475
1452
1476
auto clear_arg = llvm::make_scope_exit ([&] { clang_argument.clear (); });
1453
1477
1454
- // Enable uniquing for -D and -U options.
1455
- bool is_macro = (clang_argument.size () >= 2 && clang_argument[0 ] == ' -' &&
1456
- (clang_argument[1 ] == ' D' || clang_argument[1 ] == ' U' ));
1457
- bool unique = is_macro;
1458
-
1459
1478
// Consume any -working-directory arguments.
1460
1479
StringRef cwd (clang_argument);
1461
1480
if (cwd.consume_front (" -working-directory" )) {
1462
1481
cur_working_dir = cwd;
1463
1482
continue ;
1464
1483
}
1465
1484
// Drop -Werror; it would only cause trouble in the debugger.
1466
- if (clang_argument.startswith (" -Werror" )) {
1485
+ if (clang_argument.startswith (" -Werror" ))
1467
1486
continue ;
1468
- }
1487
+
1488
+ if (clang_argument.empty ())
1489
+ continue ;
1490
+
1469
1491
// Otherwise add the argument to the list.
1470
- if (!is_macro )
1492
+ if (!IsMacroDefinition (clang_argument) )
1471
1493
ApplyWorkingDir (clang_argument, cur_working_dir);
1472
- AddClangArgument (std::string (clang_argument), unique);
1494
+
1495
+ auto clang_arg_str = clang_argument.str ();
1496
+ if (!ShouldUnique (clang_argument) || !unique_flags.count (clang_arg_str)) {
1497
+ importer_options.ExtraArgs .push_back (clang_arg_str);
1498
+ unique_flags.insert (clang_arg_str);
1499
+ }
1473
1500
}
1474
1501
}
1475
1502
@@ -3347,41 +3374,6 @@ swift::DWARFImporterDelegate *SwiftASTContext::GetDWARFImporterDelegate() {
3347
3374
return m_dwarf_importer_delegate_up.get ();
3348
3375
}
3349
3376
3350
- bool SwiftASTContext::AddClangArgument (std::string clang_arg, bool unique) {
3351
- if (clang_arg.empty ())
3352
- return false ;
3353
-
3354
- swift::ClangImporterOptions &importer_options = GetClangImporterOptions ();
3355
- // Avoid inserting the same option twice.
3356
- if (unique)
3357
- for (std::string &arg : importer_options.ExtraArgs )
3358
- if (arg == clang_arg)
3359
- return false ;
3360
-
3361
- importer_options.ExtraArgs .push_back (clang_arg);
3362
- return true ;
3363
- }
3364
-
3365
- bool SwiftASTContext::AddClangArgumentPair (StringRef clang_arg_1,
3366
- StringRef clang_arg_2) {
3367
- if (clang_arg_1.empty () || clang_arg_2.empty ())
3368
- return false ;
3369
-
3370
- swift::ClangImporterOptions &importer_options = GetClangImporterOptions ();
3371
- bool add_hmap = true ;
3372
- for (ssize_t ai = 0 , ae = importer_options.ExtraArgs .size () -
3373
- 1 ; // -1 because we look at the next one too
3374
- ai < ae; ++ai) {
3375
- if (clang_arg_1.equals (importer_options.ExtraArgs [ai]) &&
3376
- clang_arg_2.equals (importer_options.ExtraArgs [ai + 1 ]))
3377
- return false ;
3378
- }
3379
-
3380
- importer_options.ExtraArgs .push_back (clang_arg_1.str ());
3381
- importer_options.ExtraArgs .push_back (clang_arg_2.str ());
3382
- return true ;
3383
- }
3384
-
3385
3377
const swift::SearchPathOptions *SwiftASTContext::GetSearchPathOptions () const {
3386
3378
VALID_OR_RETURN (0 );
3387
3379
0 commit comments