@@ -1448,39 +1448,66 @@ void ApplyWorkingDir(SmallString &clang_argument, StringRef cur_working_dir) {
1448
1448
llvm::sys::path::append (clang_argument, cur_working_dir, rel_path);
1449
1449
llvm::sys::path::remove_dots (clang_argument);
1450
1450
}
1451
+
1452
+ std::array<StringRef, 2 > macro_flags = { " -D" , " -U" };
1453
+
1454
+ bool IsMultiArgClangFlag (StringRef arg) {
1455
+ for (auto &flag : macro_flags)
1456
+ if (flag == arg)
1457
+ return true ;
1458
+ return arg == " -working-directory" ;
1459
+ }
1460
+
1461
+ bool IsMacroDefinition (StringRef arg) {
1462
+ for (auto &flag : macro_flags)
1463
+ if (arg.startswith (flag))
1464
+ return true ;
1465
+ return false ;
1466
+ }
1467
+
1468
+ bool ShouldUnique (StringRef arg) {
1469
+ return IsMacroDefinition (arg);
1470
+ }
1451
1471
} // namespace
1452
1472
1453
1473
void SwiftASTContext::AddExtraClangArgs (std::vector<std::string> ExtraArgs) {
1474
+ swift::ClangImporterOptions &importer_options = GetClangImporterOptions ();
1475
+ llvm::DenseSet<StringRef> unique_flags;
1476
+ for (auto &arg : importer_options.ExtraArgs )
1477
+ unique_flags.insert (arg);
1478
+
1454
1479
llvm::SmallString<128 > cur_working_dir;
1455
1480
llvm::SmallString<128 > clang_argument;
1456
1481
for (const std::string &arg : ExtraArgs) {
1457
- // Join multi-arg -D and -U options for uniquing.
1482
+ // Join multi-arg options for uniquing.
1458
1483
clang_argument += arg;
1459
- if (clang_argument == " -D" || clang_argument == " -U" ||
1460
- clang_argument == " -working-directory" )
1484
+ if (IsMultiArgClangFlag (clang_argument))
1461
1485
continue ;
1462
1486
1463
1487
auto clear_arg = llvm::make_scope_exit ([&] { clang_argument.clear (); });
1464
1488
1465
- // Enable uniquing for -D and -U options.
1466
- bool is_macro = (clang_argument.size () >= 2 && clang_argument[0 ] == ' -' &&
1467
- (clang_argument[1 ] == ' D' || clang_argument[1 ] == ' U' ));
1468
- bool unique = is_macro;
1469
-
1470
1489
// Consume any -working-directory arguments.
1471
1490
StringRef cwd (clang_argument);
1472
1491
if (cwd.consume_front (" -working-directory" )) {
1473
1492
cur_working_dir = cwd;
1474
1493
continue ;
1475
1494
}
1476
1495
// Drop -Werror; it would only cause trouble in the debugger.
1477
- if (clang_argument.startswith (" -Werror" )) {
1496
+ if (clang_argument.startswith (" -Werror" ))
1478
1497
continue ;
1479
- }
1498
+
1499
+ if (clang_argument.empty ())
1500
+ continue ;
1501
+
1480
1502
// Otherwise add the argument to the list.
1481
- if (!is_macro )
1503
+ if (!IsMacroDefinition (clang_argument) )
1482
1504
ApplyWorkingDir (clang_argument, cur_working_dir);
1483
- AddClangArgument (clang_argument.str (), unique);
1505
+
1506
+ auto clang_arg_str = clang_argument.str ();
1507
+ if (!ShouldUnique (clang_argument) || !unique_flags.count (clang_arg_str)) {
1508
+ importer_options.ExtraArgs .push_back (clang_arg_str);
1509
+ unique_flags.insert (clang_arg_str);
1510
+ }
1484
1511
}
1485
1512
}
1486
1513
@@ -3387,41 +3414,6 @@ swift::DWARFImporterDelegate *SwiftASTContext::GetDWARFImporterDelegate() {
3387
3414
return m_dwarf_importer_delegate_up.get ();
3388
3415
}
3389
3416
3390
- bool SwiftASTContext::AddClangArgument (std::string clang_arg, bool unique) {
3391
- if (clang_arg.empty ())
3392
- return false ;
3393
-
3394
- swift::ClangImporterOptions &importer_options = GetClangImporterOptions ();
3395
- // Avoid inserting the same option twice.
3396
- if (unique)
3397
- for (std::string &arg : importer_options.ExtraArgs )
3398
- if (arg == clang_arg)
3399
- return false ;
3400
-
3401
- importer_options.ExtraArgs .push_back (clang_arg);
3402
- return true ;
3403
- }
3404
-
3405
- bool SwiftASTContext::AddClangArgumentPair (StringRef clang_arg_1,
3406
- StringRef clang_arg_2) {
3407
- if (clang_arg_1.empty () || clang_arg_2.empty ())
3408
- return false ;
3409
-
3410
- swift::ClangImporterOptions &importer_options = GetClangImporterOptions ();
3411
- bool add_hmap = true ;
3412
- for (ssize_t ai = 0 , ae = importer_options.ExtraArgs .size () -
3413
- 1 ; // -1 because we look at the next one too
3414
- ai < ae; ++ai) {
3415
- if (clang_arg_1.equals (importer_options.ExtraArgs [ai]) &&
3416
- clang_arg_2.equals (importer_options.ExtraArgs [ai + 1 ]))
3417
- return false ;
3418
- }
3419
-
3420
- importer_options.ExtraArgs .push_back (clang_arg_1);
3421
- importer_options.ExtraArgs .push_back (clang_arg_2);
3422
- return true ;
3423
- }
3424
-
3425
3417
const swift::SearchPathOptions *SwiftASTContext::GetSearchPathOptions () const {
3426
3418
VALID_OR_RETURN (0 );
3427
3419
0 commit comments