@@ -1448,66 +1448,39 @@ 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
- }
1471
1451
} // namespace
1472
1452
1473
1453
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
-
1479
1454
llvm::SmallString<128 > cur_working_dir;
1480
1455
llvm::SmallString<128 > clang_argument;
1481
1456
for (const std::string &arg : ExtraArgs) {
1482
- // Join multi-arg options for uniquing.
1457
+ // Join multi-arg -D and -U options for uniquing.
1483
1458
clang_argument += arg;
1484
- if (IsMultiArgClangFlag (clang_argument))
1459
+ if (clang_argument == " -D" || clang_argument == " -U" ||
1460
+ clang_argument == " -working-directory" )
1485
1461
continue ;
1486
1462
1487
1463
auto clear_arg = llvm::make_scope_exit ([&] { clang_argument.clear (); });
1488
1464
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
+
1489
1470
// Consume any -working-directory arguments.
1490
1471
StringRef cwd (clang_argument);
1491
1472
if (cwd.consume_front (" -working-directory" )) {
1492
1473
cur_working_dir = cwd;
1493
1474
continue ;
1494
1475
}
1495
1476
// Drop -Werror; it would only cause trouble in the debugger.
1496
- if (clang_argument.startswith (" -Werror" ))
1477
+ if (clang_argument.startswith (" -Werror" )) {
1497
1478
continue ;
1498
-
1499
- if (clang_argument.empty ())
1500
- continue ;
1501
-
1479
+ }
1502
1480
// Otherwise add the argument to the list.
1503
- if (!IsMacroDefinition (clang_argument) )
1481
+ if (!is_macro )
1504
1482
ApplyWorkingDir (clang_argument, cur_working_dir);
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
- }
1483
+ AddClangArgument (clang_argument.str (), unique);
1511
1484
}
1512
1485
}
1513
1486
@@ -3414,6 +3387,41 @@ swift::DWARFImporterDelegate *SwiftASTContext::GetDWARFImporterDelegate() {
3414
3387
return m_dwarf_importer_delegate_up.get ();
3415
3388
}
3416
3389
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
+
3417
3425
const swift::SearchPathOptions *SwiftASTContext::GetSearchPathOptions () const {
3418
3426
VALID_OR_RETURN (0 );
3419
3427
0 commit comments