SearchFilterSP SearchFilter::CreateFromStructuredData( Target &target, const StructuredData::Dictionary &filter_dict, Status &error) { SearchFilterSP result_sp; if (!filter_dict.IsValid()) { error.SetErrorString("Can't deserialize from an invalid data object."); return result_sp; } llvm::StringRef subclass_name; bool success = filter_dict.GetValueForKeyAsString( GetSerializationSubclassKey(), subclass_name); if (!success) { error.SetErrorStringWithFormat("Filter data missing subclass key"); return result_sp; } FilterTy filter_type = NameToFilterTy(subclass_name); if (filter_type == UnknownFilter) { error.SetErrorStringWithFormatv("Unknown filter type: {0}.", subclass_name); return result_sp; } StructuredData::Dictionary *subclass_options = nullptr; success = filter_dict.GetValueForKeyAsDictionary( GetSerializationSubclassOptionsKey(), subclass_options); if (!success || !subclass_options || !subclass_options->IsValid()) { error.SetErrorString("Filter data missing subclass options key."); return result_sp; } switch (filter_type) { case Unconstrained: result_sp = SearchFilterForUnconstrainedSearches::CreateFromStructuredData( target, *subclass_options, error); break; case ByModule: result_sp = SearchFilterByModule::CreateFromStructuredData( target, *subclass_options, error); break; case ByModules: result_sp = SearchFilterByModuleList::CreateFromStructuredData( target, *subclass_options, error); break; case ByModulesAndCU: result_sp = SearchFilterByModuleListAndCU::CreateFromStructuredData( target, *subclass_options, error); break; case Exception: error.SetErrorString("Can't serialize exception breakpoints yet."); break; default: llvm_unreachable("Should never get an uresolvable filter type."); } return result_sp; }
BreakpointResolverSP BreakpointResolver::CreateFromStructuredData( const StructuredData::Dictionary &resolver_dict, Status &error) { BreakpointResolverSP result_sp; if (!resolver_dict.IsValid()) { error.SetErrorString("Can't deserialize from an invalid data object."); return result_sp; } llvm::StringRef subclass_name; bool success = resolver_dict.GetValueForKeyAsString( GetSerializationSubclassKey(), subclass_name); if (!success) { error.SetErrorStringWithFormat( "Resolver data missing subclass resolver key"); return result_sp; } ResolverTy resolver_type = NameToResolverTy(subclass_name); if (resolver_type == UnknownResolver) { error.SetErrorStringWithFormatv("Unknown resolver type: {0}.", subclass_name); return result_sp; } StructuredData::Dictionary *subclass_options = nullptr; success = resolver_dict.GetValueForKeyAsDictionary( GetSerializationSubclassOptionsKey(), subclass_options); if (!success || !subclass_options || !subclass_options->IsValid()) { error.SetErrorString("Resolver data missing subclass options key."); return result_sp; } lldb::addr_t offset; success = subclass_options->GetValueForKeyAsInteger( GetKey(OptionNames::Offset), offset); if (!success) { error.SetErrorString("Resolver data missing offset options key."); return result_sp; } BreakpointResolver *resolver; switch (resolver_type) { case FileLineResolver: resolver = BreakpointResolverFileLine::CreateFromStructuredData( nullptr, *subclass_options, error); break; case AddressResolver: resolver = BreakpointResolverAddress::CreateFromStructuredData( nullptr, *subclass_options, error); break; case NameResolver: resolver = BreakpointResolverName::CreateFromStructuredData( nullptr, *subclass_options, error); break; case FileRegexResolver: resolver = BreakpointResolverFileRegex::CreateFromStructuredData( nullptr, *subclass_options, error); break; case PythonResolver: resolver = BreakpointResolverScripted::CreateFromStructuredData( nullptr, *subclass_options, error); break; case ExceptionResolver: error.SetErrorString("Exception resolvers are hard."); break; default: llvm_unreachable("Should never get an unresolvable resolver type."); } if (!error.Success()) { return result_sp; } else { // Add on the global offset option: resolver->SetOffset(offset); return BreakpointResolverSP(resolver); } }