//===-- DNBArch.cpp ---------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // Created by Greg Clayton on 6/24/07. // //===----------------------------------------------------------------------===// #include "DNBArch.h" #include #include #include #include "DNBLog.h" typedef std::map CPUPluginInfoMap; static uint32_t g_current_cpu_type = 0; CPUPluginInfoMap g_arch_plugins; static const DNBArchPluginInfo *GetArchInfo() { CPUPluginInfoMap::const_iterator pos = g_arch_plugins.find(g_current_cpu_type); if (pos != g_arch_plugins.end()) return &pos->second; return NULL; } uint32_t DNBArchProtocol::GetArchitecture() { return g_current_cpu_type; } bool DNBArchProtocol::SetArchitecture(uint32_t cpu_type) { g_current_cpu_type = cpu_type; bool result = g_arch_plugins.find(g_current_cpu_type) != g_arch_plugins.end(); DNBLogThreadedIf( LOG_PROCESS, "DNBArchProtocol::SetDefaultArchitecture (cpu_type=0x%8.8x) => %i", cpu_type, result); return result; } void DNBArchProtocol::RegisterArchPlugin(const DNBArchPluginInfo &arch_info) { if (arch_info.cpu_type) g_arch_plugins[arch_info.cpu_type] = arch_info; } uint32_t DNBArchProtocol::GetRegisterCPUType() { const DNBArchPluginInfo *arch_info = GetArchInfo(); if (arch_info) return arch_info->cpu_type; return 0; } const DNBRegisterSetInfo * DNBArchProtocol::GetRegisterSetInfo(nub_size_t *num_reg_sets) { const DNBArchPluginInfo *arch_info = GetArchInfo(); if (arch_info) return arch_info->GetRegisterSetInfo(num_reg_sets); *num_reg_sets = 0; return NULL; } DNBArchProtocol *DNBArchProtocol::Create(MachThread *thread) { const DNBArchPluginInfo *arch_info = GetArchInfo(); if (arch_info) return arch_info->Create(thread); return NULL; } const uint8_t *DNBArchProtocol::GetBreakpointOpcode(nub_size_t byte_size) { const DNBArchPluginInfo *arch_info = GetArchInfo(); if (arch_info) return arch_info->GetBreakpointOpcode(byte_size); return NULL; }