diff options
Diffstat (limited to 'source/Plugins/Process/elf-core/ThreadElfCore.cpp')
-rw-r--r-- | source/Plugins/Process/elf-core/ThreadElfCore.cpp | 70 |
1 files changed, 46 insertions, 24 deletions
diff --git a/source/Plugins/Process/elf-core/ThreadElfCore.cpp b/source/Plugins/Process/elf-core/ThreadElfCore.cpp index 3bda86d..cadcf53 100644 --- a/source/Plugins/Process/elf-core/ThreadElfCore.cpp +++ b/source/Plugins/Process/elf-core/ThreadElfCore.cpp @@ -17,6 +17,7 @@ #include "ThreadElfCore.h" #include "ProcessElfCore.h" #include "RegisterContextLinux_x86_64.h" +#include "RegisterContextFreeBSD_i386.h" #include "RegisterContextFreeBSD_mips64.h" #include "RegisterContextFreeBSD_x86_64.h" #include "RegisterContextPOSIXCore_mips64.h" @@ -85,45 +86,66 @@ ThreadElfCore::CreateRegisterContextForFrame (StackFrame *frame) ProcessElfCore *process = static_cast<ProcessElfCore *>(GetProcess().get()); ArchSpec arch = process->GetArchitecture(); - switch (arch.GetMachine()) + RegisterInfoInterface *reg_interface = NULL; + + switch (arch.GetTriple().getOS()) { - case llvm::Triple::mips64: - switch (arch.GetTriple().getOS()) + case llvm::Triple::FreeBSD: + { + switch (arch.GetMachine()) { - case llvm::Triple::FreeBSD: - m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_mips64 (*this, new RegisterContextFreeBSD_mips64(arch), m_gpregset_data, m_fpregset_data)); + case llvm::Triple::mips64: + reg_interface = new RegisterContextFreeBSD_mips64(arch); + break; + case llvm::Triple::x86: + reg_interface = new RegisterContextFreeBSD_i386(arch); + break; + case llvm::Triple::x86_64: + reg_interface = new RegisterContextFreeBSD_x86_64(arch); break; default: - if (log) - log->Printf ("elf-core::%s:: OS(%d) not supported", - __FUNCTION__, arch.GetTriple().getOS()); - assert (false && "OS not supported"); break; } break; - case llvm::Triple::x86_64: - switch (arch.GetTriple().getOS()) + } + + case llvm::Triple::Linux: + { + switch (arch.GetMachine()) { - case llvm::Triple::FreeBSD: - m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_x86_64 (*this, new RegisterContextFreeBSD_x86_64(arch), m_gpregset_data, m_fpregset_data)); - break; - case llvm::Triple::Linux: - m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_x86_64 (*this, new RegisterContextLinux_x86_64(arch), m_gpregset_data, m_fpregset_data)); + case llvm::Triple::x86_64: + reg_interface = new RegisterContextLinux_x86_64(arch); break; default: - if (log) - log->Printf ("elf-core::%s:: OS(%d) not supported", - __FUNCTION__, arch.GetTriple().getOS()); - assert (false && "OS not supported"); break; } break; + } + + default: + break; + } + + if (!reg_interface) { + if (log) + log->Printf ("elf-core::%s:: Architecture(%d) or OS(%d) not supported", + __FUNCTION__, arch.GetMachine(), arch.GetTriple().getOS()); + assert (false && "Architecture or OS not supported"); + } + + switch (arch.GetMachine()) + { + case llvm::Triple::mips64: + m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_mips64 (*this, reg_interface, m_gpregset_data, m_fpregset_data)); + break; + case llvm::Triple::x86: + case llvm::Triple::x86_64: + m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_x86_64 (*this, reg_interface, m_gpregset_data, m_fpregset_data)); + break; default: - if (log) - log->Printf ("elf-core::%s:: Architecture(%d) not supported", - __FUNCTION__, arch.GetMachine()); - assert (false && "Architecture not supported"); + break; } + reg_ctx_sp = m_thread_reg_ctx_sp; } else if (m_unwinder_ap.get()) |