Added Args::StringForEncoding(), Args::StringToGenericRegister() and centralized the parsing of the string to encoding and string to generic register.

Added code the initialize the register context in the OperatingSystemPython plug-in with the new PythonData classes, and added a test OperatingSystemPython module in lldb/examples/python/operating_system.py that we can use for testing.

llvm-svn: 162530
This commit is contained in:
Greg Clayton
2012-08-24 01:42:50 +00:00
parent 6fb4b055fb
commit 2443cbd7f5
9 changed files with 326 additions and 124 deletions

View File

@@ -12,13 +12,12 @@
// C Includes
// C++ Includes
// Other libraries and framework includes
#include "llvm/ADT/Triple.h"
#include "lldb/Core/ArchSpec.h"
#include "lldb/Core/DataBufferHeap.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Interpreter/PythonDataObjects.h"
#include "lldb/Core/RegisterValue.h"
#include "lldb/Core/ValueObjectVariable.h"
#include "lldb/Interpreter/CommandInterpreter.h"
@@ -56,7 +55,7 @@ OperatingSystem *
OperatingSystemPython::CreateInstance (Process *process, bool force)
{
// Python OperatingSystem plug-ins must be requested by name, so force must be true
//if (force)
if (force)
return new OperatingSystemPython (process);
return NULL;
}
@@ -93,7 +92,11 @@ OperatingSystemPython::OperatingSystemPython (lldb_private::Process *process) :
// TODO: hardcoded is not good
auto object_sp = m_interpreter->CreateOSPlugin("operating_system.PlugIn",process->CalculateProcess());
if (object_sp)
{
m_python_object = object_sp->GetObject();
// GetDynamicRegisterInfo (); // Only for testing should this be done here
}
}
}
@@ -104,74 +107,22 @@ OperatingSystemPython::~OperatingSystemPython ()
DynamicRegisterInfo *
OperatingSystemPython::GetDynamicRegisterInfo ()
{
if (!m_interpreter || !m_python_object)
return NULL;
auto object_sp = m_interpreter->OSPlugin_QueryForRegisterInfo(m_interpreter->MakeScriptObject(m_python_object));
if (!object_sp)
return NULL;
PythonDataObject dictionary_data_obj((PyObject*)object_sp->GetObject());
PythonDataDictionary dictionary = dictionary_data_obj.GetDictionaryObject();
if(!dictionary)
return NULL;
// TODO: iterate over the dictionary
if (m_register_info_ap.get() == NULL && m_thread_list_valobj_sp)
if (m_register_info_ap.get() == NULL)
{
// static ConstString g_gpr_member_name("gpr");
// m_register_info_ap.reset (new DynamicRegisterInfo());
// ConstString empty_name;
// const bool can_create = true;
// AddressType addr_type;
// addr_t base_addr = LLDB_INVALID_ADDRESS;
// ValueObjectSP gpr_valobj_sp (m_thread_list_valobj_sp->GetChildMemberWithName(GetThreadGPRMemberName (), can_create));
//
// if (gpr_valobj_sp->IsPointerType ())
// base_addr = gpr_valobj_sp->GetPointerValue (&addr_type);
// else
// base_addr = gpr_valobj_sp->GetAddressOf (true, &addr_type);
//
// ValueObjectSP child_valobj_sp;
// if (gpr_valobj_sp)
// {
// ABI *abi = m_process->GetABI().get();
// assert (abi);
// uint32_t num_children = gpr_valobj_sp->GetNumChildren();
//
// ConstString gpr_name (gpr_valobj_sp->GetName());
// uint32_t reg_num = 0;
// for (uint32_t i=0; i<num_children; ++i)
// {
// child_valobj_sp = gpr_valobj_sp->GetChildAtIndex(i, can_create);
//
// ConstString reg_name(child_valobj_sp->GetName());
// if (reg_name)
// {
// const char *reg_name_cstr = reg_name.GetCString();
// while (reg_name_cstr[0] == '_')
// ++reg_name_cstr;
// if (reg_name_cstr != reg_name.GetCString())
// reg_name.SetCString (reg_name_cstr);
// }
//
// RegisterInfo reg_info;
// if (abi->GetRegisterInfoByName(reg_name, reg_info))
// {
// // Adjust the byte size and the offset to match the layout of registers in our struct
// reg_info.byte_size = child_valobj_sp->GetByteSize();
// reg_info.byte_offset = child_valobj_sp->GetAddressOf(true, &addr_type) - base_addr;
// reg_info.kinds[eRegisterKindLLDB] = reg_num++;
// m_register_info_ap->AddRegister (reg_info, reg_name, empty_name, gpr_name);
// }
// else
// {
// printf ("not able to find register info for %s\n", reg_name.GetCString()); // REMOVE THIS printf before checkin!!!
// }
// }
//
// m_register_info_ap->Finalize();
// }
if (!m_interpreter || !m_python_object)
return NULL;
auto object_sp = m_interpreter->OSPlugin_QueryForRegisterInfo(m_interpreter->MakeScriptObject(m_python_object));
if (!object_sp)
return NULL;
PythonDataObject dictionary_data_obj((PyObject*)object_sp->GetObject());
PythonDataDictionary dictionary = dictionary_data_obj.GetDictionaryObject();
if (!dictionary)
return NULL;
m_register_info_ap.reset (new DynamicRegisterInfo (dictionary));
assert (m_register_info_ap->GetNumRegisters() > 0);
assert (m_register_info_ap->GetNumRegisterSets() > 0);
}
assert (m_register_info_ap.get());
return m_register_info_ap.get();
}