| // Copyright 2019 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "src/developer/debug/zxdb/client/exception_settings.h" | |
| #include <set> | |
| namespace zxdb { | |
| debug_ipc::ExceptionType ToExceptionType(const std::string& shorthand) { | |
| if (shorthand == kGeneralExcpTypeShorthand) { | |
| return debug_ipc::ExceptionType::kGeneral; | |
| } else if (shorthand == kPageFaultExcpTypeShorthand) { | |
| return debug_ipc::ExceptionType::kPageFault; | |
| } else if (shorthand == kUndefinedInstructionExcpTypeShorthand) { | |
| return debug_ipc::ExceptionType::kUndefinedInstruction; | |
| } else if (shorthand == kUnalignedAccessExcpTypeShorthand) { | |
| return debug_ipc::ExceptionType::kUnalignedAccess; | |
| } else if (shorthand == kPolicyErrorExcpTypeShorthand) { | |
| return debug_ipc::ExceptionType::kPolicyError; | |
| } | |
| return debug_ipc::ExceptionType::kNone; | |
| } | |
| ErrOr<std::vector<debug_ipc::UpdateGlobalSettingsRequest::UpdateExceptionStrategy>> | |
| ParseExceptionStrategyUpdates(const std::vector<std::string>& second_chance_shorthands) { | |
| std::set<debug_ipc::ExceptionType> second_chance_excps; | |
| for (const auto& shorthand : second_chance_shorthands) { | |
| if (auto excp = ToExceptionType(shorthand); excp == debug_ipc::ExceptionType::kNone) { | |
| return Err("Unrecognized exception type shorthand: %s", shorthand.c_str()); | |
| } else { | |
| second_chance_excps.insert(excp); | |
| } | |
| } | |
| std::vector<debug_ipc::UpdateGlobalSettingsRequest::UpdateExceptionStrategy> updates; | |
| for (uint32_t excp = static_cast<uint32_t>(debug_ipc::ExceptionType::kNone); | |
| excp != static_cast<uint32_t>(debug_ipc::ExceptionType::kLast); ++excp) { | |
| bool second_chance = | |
| second_chance_excps.find(debug_ipc::ExceptionType{excp}) != second_chance_excps.end(); | |
| updates.emplace_back(debug_ipc::UpdateGlobalSettingsRequest::UpdateExceptionStrategy{ | |
| .type = debug_ipc::ExceptionType{excp}, | |
| .value = second_chance ? debug_ipc::ExceptionStrategy::kSecondChance | |
| : debug_ipc::ExceptionStrategy::kFirstChance, | |
| }); | |
| } | |
| return updates; | |
| } | |
| } // namespace zxdb |