Files
clang-p2996/lldb/tools/debugserver/source/DNBArch.cpp
Greg Clayton d04f0edad9 Added XML to the host layer.
We know have on API we should use for all XML within LLDB in XML.h. This API will be easy back the XML parsing by different libraries in case libxml2 doesn't work on all platforms. It also allows the only place for #ifdef ...XML... to be in XML.h and XML.cpp. The API is designed so it will still compile with or without XML support and there is a static function "bool XMLDocument::XMLEnabled()" that can be called to see if XML is currently supported. All APIs will return errors, false, or nothing when XML isn't enabled.

Converted all locations that used XML over to using the host XML implementation.

Added target.xml support to debugserver. Extended the XML register format to work for LLDB by including extra attributes and elements where needed. This allows the target.xml to replace the qRegisterInfo packets and allows us to fetch all register info in a single packet.

<rdar://problem/21090173>

llvm-svn: 238224
2015-05-26 18:00:51 +00:00

98 lines
2.3 KiB
C++

//===-- 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 <assert.h>
#include <mach/mach.h>
#include <map>
#include "DNBLog.h"
typedef std::map<uint32_t, DNBArchPluginInfo> 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 * const
DNBArchProtocol::GetBreakpointOpcode (nub_size_t byte_size)
{
const DNBArchPluginInfo *arch_info = GetArchInfo ();
if (arch_info)
return arch_info->GetBreakpointOpcode (byte_size);
return NULL;
}