@@ -1448,66 +1448,39 @@ 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- }
14711451} // namespace
14721452
14731453void 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-
14791454 llvm::SmallString<128 > cur_working_dir;
14801455 llvm::SmallString<128 > clang_argument;
14811456 for (const std::string &arg : ExtraArgs) {
1482- // Join multi-arg options for uniquing.
1457+ // Join multi-arg -D and -U options for uniquing.
14831458 clang_argument += arg;
1484- if (IsMultiArgClangFlag (clang_argument))
1459+ if (clang_argument == " -D" || clang_argument == " -U" ||
1460+ clang_argument == " -working-directory" )
14851461 continue ;
14861462
14871463 auto clear_arg = llvm::make_scope_exit ([&] { clang_argument.clear (); });
14881464
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+
14891470 // Consume any -working-directory arguments.
14901471 StringRef cwd (clang_argument);
14911472 if (cwd.consume_front (" -working-directory" )) {
14921473 cur_working_dir = cwd;
14931474 continue ;
14941475 }
14951476 // Drop -Werror; it would only cause trouble in the debugger.
1496- if (clang_argument.startswith (" -Werror" ))
1477+ if (clang_argument.startswith (" -Werror" )) {
14971478 continue ;
1498-
1499- if (clang_argument.empty ())
1500- continue ;
1501-
1479+ }
15021480 // Otherwise add the argument to the list.
1503- if (!IsMacroDefinition (clang_argument) )
1481+ if (!is_macro )
15041482 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);
15111484 }
15121485}
15131486
@@ -3414,6 +3387,41 @@ swift::DWARFImporterDelegate *SwiftASTContext::GetDWARFImporterDelegate() {
34143387 return m_dwarf_importer_delegate_up.get ();
34153388}
34163389
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+
34173425const swift::SearchPathOptions *SwiftASTContext::GetSearchPathOptions () const {
34183426 VALID_OR_RETURN (0 );
34193427
0 commit comments