1 //===-- RegisterContextFreeBSD_x86_64.cpp ----------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===---------------------------------------------------------------------===//
11 #include "RegisterContextPOSIX_x86.h"
12 #include "RegisterContextFreeBSD_i386.h"
13 #include "RegisterContextFreeBSD_x86_64.h"
15 using namespace lldb_private;
18 // http://svnweb.freebsd.org/base/head/sys/x86/include/reg.h
50 uint64_t dr[16]; /* debug registers */
51 /* Index 0-3: debug address registers */
52 /* Index 4-5: reserved */
53 /* Index 6: debug status */
54 /* Index 7: debug control */
55 /* Index 8-15: reserved */
58 #define DR_SIZE sizeof(uint64_t)
59 #define DR_OFFSET(reg_index) \
60 (LLVM_EXTENSION offsetof(dbreg, dr[reg_index]))
63 //---------------------------------------------------------------------------
64 // Include RegisterInfos_x86_64 to declare our g_register_infos_x86_64 structure.
65 //---------------------------------------------------------------------------
66 #define DECLARE_REGISTER_INFOS_X86_64_STRUCT
67 #include "RegisterInfos_x86_64.h"
68 #undef DECLARE_REGISTER_INFOS_X86_64_STRUCT
70 static const RegisterInfo *
71 GetRegisterInfo_i386(const lldb_private::ArchSpec& arch)
73 static std::vector<lldb_private::RegisterInfo> g_register_infos;
75 // Allocate RegisterInfo only once
76 if (g_register_infos.empty())
78 // Copy the register information from base class
79 std::unique_ptr<RegisterContextFreeBSD_i386> reg_interface(new RegisterContextFreeBSD_i386 (arch));
80 const RegisterInfo *base_info = reg_interface->GetRegisterInfo();
81 g_register_infos.insert(g_register_infos.end(), &base_info[0], &base_info[k_num_registers_i386]);
83 //---------------------------------------------------------------------------
84 // Include RegisterInfos_x86_64 to update the g_register_infos structure
85 // with x86_64 offsets.
86 //---------------------------------------------------------------------------
87 #define UPDATE_REGISTER_INFOS_I386_STRUCT_WITH_X86_64_OFFSETS
88 #include "RegisterInfos_x86_64.h"
89 #undef UPDATE_REGISTER_INFOS_I386_STRUCT_WITH_X86_64_OFFSETS
92 return &g_register_infos[0];
95 RegisterContextFreeBSD_x86_64::RegisterContextFreeBSD_x86_64(const ArchSpec &target_arch) :
96 RegisterInfoInterface(target_arch)
100 RegisterContextFreeBSD_x86_64::~RegisterContextFreeBSD_x86_64()
105 RegisterContextFreeBSD_x86_64::GetGPRSize()
111 RegisterContextFreeBSD_x86_64::GetRegisterInfo()
113 switch (m_target_arch.GetCore())
115 case ArchSpec::eCore_x86_32_i386:
116 case ArchSpec::eCore_x86_32_i486:
117 case ArchSpec::eCore_x86_32_i486sx:
118 return GetRegisterInfo_i386 (m_target_arch);
119 case ArchSpec::eCore_x86_64_x86_64:
120 return g_register_infos_x86_64;
122 assert(false && "Unhandled target architecture.");