@@ -1448,39 +1448,66 @@ void ApplyWorkingDir(SmallString &clang_argument, StringRef cur_working_dir) {
14481448 llvm::sys::path::append (clang_argument, cur_working_dir, rel_path);
14491449 llvm::sys::path::remove_dots (clang_argument);
14501450}
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+ }
14511471} // namespace
14521472
14531473void 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+
14541479 llvm::SmallString<128 > cur_working_dir;
14551480 llvm::SmallString<128 > clang_argument;
14561481 for (const std::string &arg : ExtraArgs) {
1457- // Join multi-arg -D and -U options for uniquing.
1482+ // Join multi-arg options for uniquing.
14581483 clang_argument += arg;
1459- if (clang_argument == " -D" || clang_argument == " -U" ||
1460- clang_argument == " -working-directory" )
1484+ if (IsMultiArgClangFlag (clang_argument))
14611485 continue ;
14621486
14631487 auto clear_arg = llvm::make_scope_exit ([&] { clang_argument.clear (); });
14641488
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-
14701489 // Consume any -working-directory arguments.
14711490 StringRef cwd (clang_argument);
14721491 if (cwd.consume_front (" -working-directory" )) {
14731492 cur_working_dir = cwd;
14741493 continue ;
14751494 }
14761495 // Drop -Werror; it would only cause trouble in the debugger.
1477- if (clang_argument.startswith (" -Werror" )) {
1496+ if (clang_argument.startswith (" -Werror" ))
14781497 continue ;
1479- }
1498+
1499+ if (clang_argument.empty ())
1500+ continue ;
1501+
14801502 // Otherwise add the argument to the list.
1481- if (!is_macro )
1503+ if (!IsMacroDefinition (clang_argument) )
14821504 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+ }
14841511 }
14851512}
14861513
@@ -3387,41 +3414,6 @@ swift::DWARFImporterDelegate *SwiftASTContext::GetDWARFImporterDelegate() {
33873414 return m_dwarf_importer_delegate_up.get ();
33883415}
33893416
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-
34253417const swift::SearchPathOptions *SwiftASTContext::GetSearchPathOptions () const {
34263418 VALID_OR_RETURN (0 );
34273419
0 commit comments