Skip to content

Commit d02593f

Browse files
Refactor clang extra args addition
(cherry picked from commit 5484364) Conflicts: lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp
1 parent 266355d commit d02593f

File tree

2 files changed

+39
-51
lines changed

2 files changed

+39
-51
lines changed

lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp

Lines changed: 39 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,39 +1437,66 @@ void ApplyWorkingDir(SmallString &clang_argument, StringRef cur_working_dir) {
14371437
llvm::sys::path::append(clang_argument, cur_working_dir, rel_path);
14381438
llvm::sys::path::remove_dots(clang_argument);
14391439
}
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+
}
14401460
} // namespace
14411461

14421462
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+
14431468
llvm::SmallString<128> cur_working_dir;
14441469
llvm::SmallString<128> clang_argument;
14451470
for (const std::string &arg : ExtraArgs) {
1446-
// Join multi-arg -D and -U options for uniquing.
1471+
// Join multi-arg options for uniquing.
14471472
clang_argument += arg;
1448-
if (clang_argument == "-D" || clang_argument == "-U" ||
1449-
clang_argument == "-working-directory")
1473+
if (IsMultiArgClangFlag(clang_argument))
14501474
continue;
14511475

14521476
auto clear_arg = llvm::make_scope_exit([&] { clang_argument.clear(); });
14531477

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-
14591478
// Consume any -working-directory arguments.
14601479
StringRef cwd(clang_argument);
14611480
if (cwd.consume_front("-working-directory")) {
14621481
cur_working_dir = cwd;
14631482
continue;
14641483
}
14651484
// Drop -Werror; it would only cause trouble in the debugger.
1466-
if (clang_argument.startswith("-Werror")) {
1485+
if (clang_argument.startswith("-Werror"))
14671486
continue;
1468-
}
1487+
1488+
if (clang_argument.empty())
1489+
continue;
1490+
14691491
// Otherwise add the argument to the list.
1470-
if (!is_macro)
1492+
if (!IsMacroDefinition(clang_argument))
14711493
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+
}
14731500
}
14741501
}
14751502

@@ -3347,41 +3374,6 @@ swift::DWARFImporterDelegate *SwiftASTContext::GetDWARFImporterDelegate() {
33473374
return m_dwarf_importer_delegate_up.get();
33483375
}
33493376

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-
33853377
const swift::SearchPathOptions *SwiftASTContext::GetSearchPathOptions() const {
33863378
VALID_OR_RETURN(0);
33873379

lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,10 +207,6 @@ class SwiftASTContext : public TypeSystemSwift {
207207

208208
bool AddModuleSearchPath(llvm::StringRef path);
209209

210-
bool AddClangArgument(std::string arg, bool unique = true);
211-
212-
bool AddClangArgumentPair(llvm::StringRef arg1, llvm::StringRef arg2);
213-
214210
/// Add a list of Clang arguments to the ClangImporter options and
215211
/// apply the working directory to any relative paths.
216212
void AddExtraClangArgs(std::vector<std::string> ExtraArgs);

0 commit comments

Comments
 (0)