23 #include "llvm/ADT/StringRef.h"
24 #include "llvm/Support/ErrorHandling.h"
43 const char *SearchFilter::g_ty_to_name[] = {
"Unconstrained",
"Exception",
45 "ModulesAndCU",
"Unknown"};
48 *SearchFilter::g_option_names[SearchFilter::OptionNames::LastOptionName] = {
49 "ModuleList",
"CUList"};
51 const char *SearchFilter::FilterTyToName(
enum FilterTy type) {
52 if (type > LastKnownFilterType)
53 return g_ty_to_name[UnknownFilter];
55 return g_ty_to_name[type];
59 for (
size_t i = 0; i <= LastKnownFilterType; i++) {
60 if (name == g_ty_to_name[i])
66 Searcher::Searcher() =
default;
68 Searcher::~Searcher() =
default;
70 void Searcher::GetDescription(
Stream *s) {}
72 SearchFilter::SearchFilter(
const TargetSP &target_sp,
unsigned char filterType)
73 : m_target_sp(target_sp), SubclassID(filterType) {}
78 const lldb::TargetSP& target_sp,
81 SearchFilterSP result_sp;
83 error.SetErrorString(
"Can't deserialize from an invalid data object.");
87 llvm::StringRef subclass_name;
92 error.SetErrorString(
"Filter data missing subclass key");
98 error.SetErrorStringWithFormatv(
"Unknown filter type: {0}.", subclass_name);
105 if (!success || !subclass_options || !subclass_options->
IsValid()) {
106 error.SetErrorString(
"Filter data missing subclass options key.");
110 switch (filter_type) {
113 target_sp, *subclass_options,
error);
117 target_sp, *subclass_options,
error);
121 target_sp, *subclass_options,
error);
125 target_sp, *subclass_options,
error);
128 error.SetErrorString(
"Can't serialize exception breakpoints yet.");
131 llvm_unreachable(
"Should never get an uresolvable filter type.");
151 Address addr =
function.GetAddressRange().GetBaseAddress();
157 return (lldb::SymbolContextItem)0;
166 ret_sp->SetTarget(target_sp);
174 if (!options_dict_sp || !options_dict_sp->IsValid())
177 auto type_dict_sp = std::make_shared<StructuredData::Dictionary>();
186 FileSpecList &file_list) {
187 size_t num_modules = file_list.GetSize();
190 if (num_modules == 0)
193 auto module_array_sp = std::make_shared<StructuredData::Array>();
194 for (
size_t i = 0; i < num_modules; i++) {
195 module_array_sp->AddItem(std::make_shared<StructuredData::String>(
196 file_list.GetFileSpecAtIndex(i).GetPath()));
198 options_dict_sp->AddItem(
GetKey(name), module_array_sp);
231 for (ModuleSP module_sp : modules.
Modules()) {
261 for (ModuleSP module_sp :
m_target_sp->GetImages().Modules()) {
274 return shouldContinue;
279 return shouldContinue;
300 const size_t num_comp_units = module_sp->GetNumCompileUnits();
301 for (
size_t i = 0; i < num_comp_units; i++) {
302 CompUnitSP cu_sp(module_sp->GetCompileUnitAtIndex(i));
311 shouldContinue = searcher.
SearchCallback(*
this, matchingContext,
nullptr);
316 return shouldContinue;
323 SymbolFile *sym_file = module_sp->GetSymbolFile();
329 cu_sp->ForeachFunction([&](
const FunctionSP &func_sp) {
333 SymbolContext matchingContext(m_target_sp, module_sp, cu_sp.get(),
336 searcher.SearchCallback(*this, matchingContext, nullptr);
338 shouldContinue = DoFunctionIteration(func_sp.get(), context, searcher);
356 const lldb::TargetSP& target_sp,
360 return std::make_shared<SearchFilterForUnconstrainedSearches>(target_sp);
366 auto result_sp = std::make_shared<StructuredData::Dictionary>();
372 return !
m_target_sp->ModuleIsExcludedForUnconstrainedSearches(module_spec);
376 const lldb::ModuleSP &module_sp) {
379 else if (
m_target_sp->ModuleIsExcludedForUnconstrainedSearches(module_sp))
385 return std::make_shared<SearchFilterForUnconstrainedSearches>(*
this);
426 std::lock_guard<std::recursive_mutex> guard(target_modules.
GetMutex());
428 for (ModuleSP module_sp :
m_target_sp->GetImages().Modules()) {
446 return eSymbolContextModule;
452 return std::make_shared<SearchFilterByModule>(*
this);
456 const lldb::TargetSP& target_sp,
463 error.SetErrorString(
"SFBM::CFSD: Could not find the module list key.");
467 size_t num_modules = modules_array->
GetSize();
468 if (num_modules > 1) {
469 error.SetErrorString(
470 "SFBM::CFSD: Only one modules allowed for SearchFilterByModule.");
474 llvm::StringRef module;
477 error.SetErrorString(
"SFBM::CFSD: filter module item not a string.");
482 return std::make_shared<SearchFilterByModule>(target_sp, module_spec);
486 auto options_dict_sp = std::make_shared<StructuredData::Dictionary>();
487 auto module_array_sp = std::make_shared<StructuredData::Array>();
488 module_array_sp->AddItem(
490 options_dict_sp->AddItem(
GetKey(OptionNames::ModList), module_array_sp);
498 const lldb::TargetSP &target_sp,
const FileSpecList &module_list)
500 m_module_spec_list(module_list) {}
503 const lldb::TargetSP &target_sp,
const FileSpecList &module_list,
505 :
SearchFilter(target_sp, filter_ty), m_module_spec_list(module_list) {}
514 0, module_sp->GetFileSpec(),
false) !=
UINT32_MAX;
542 for (ModuleSP module_sp :
m_target_sp->GetImages().Modules()) {
557 if (num_modules == 1) {
565 s->
Printf(
", modules(%" PRIu64
") = ", (uint64_t)num_modules);
566 for (
size_t i = 0; i < num_modules; i++) {
570 if (i != num_modules - 1)
576 return eSymbolContextModule;
582 return std::make_shared<SearchFilterByModuleList>(*
this);
586 const lldb::TargetSP& target_sp,
594 return std::make_shared<SearchFilterByModuleList>(target_sp,
596 FileSpecList modules;
597 size_t num_modules = modules_array->
GetSize();
598 for (
size_t i = 0; i < num_modules; i++) {
599 llvm::StringRef module;
602 error.SetErrorStringWithFormat(
603 "SFBM::CFSD: filter module item %zu not a string.", i);
606 modules.EmplaceBack(module);
608 return std::make_shared<SearchFilterByModuleList>(target_sp, modules);
618 auto options_dict_sp = std::make_shared<StructuredData::Dictionary>();
627 const lldb::TargetSP &target_sp,
const FileSpecList &module_list,
628 const FileSpecList &cu_list)
631 m_cu_spec_list(cu_list) {}
636 const lldb::TargetSP& target_sp,
640 SearchFilterSP result_sp;
643 FileSpecList modules;
645 size_t num_modules = modules_array->
GetSize();
646 for (
size_t i = 0; i < num_modules; i++) {
647 llvm::StringRef module;
650 error.SetErrorStringWithFormat(
651 "SFBM::CFSD: filter module item %zu not a string.", i);
654 modules.EmplaceBack(module);
662 error.SetErrorString(
"SFBM::CFSD: Could not find the CU list key.");
666 size_t num_cus = cus_array->
GetSize();
668 for (
size_t i = 0; i < num_cus; i++) {
672 error.SetErrorStringWithFormat(
673 "SFBM::CFSD: filter CU item %zu not a string.", i);
679 return std::make_shared<SearchFilterByModuleListAndCU>(
680 target_sp, modules, cus);
685 auto options_dict_sp = std::make_shared<StructuredData::Dictionary>();
716 ModuleSP module_sp(compUnit.
GetModule());
740 for (ModuleSP module_sp :
m_target_sp->GetImages().Modules()) {
741 if (!no_modules_in_filter &&
756 const size_t num_cu = module_sp->GetNumCompileUnits();
757 for (
size_t cu_idx = 0; cu_idx < num_cu; cu_idx++) {
758 CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(cu_idx);
766 shouldContinue =
DoCUIteration(module_sp, matchingContext, searcher);
775 if (num_modules == 1) {
780 }
else if (num_modules > 0) {
781 s->
Printf(
", modules(%" PRIu64
") = ",
static_cast<uint64_t
>(num_modules));
782 for (
size_t i = 0; i < num_modules; i++) {
786 if (i != num_modules - 1)
793 return eSymbolContextModule | eSymbolContextCompUnit;
799 return std::make_shared<SearchFilterByModuleListAndCU>(*
this);