1 //===-- RegisterContextLinux_mips64.cpp ------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===---------------------------------------------------------------------===//
9 
10 #if defined (__mips__)
11 
12 #include <vector>
13 #include <stddef.h>
14 
15 // For GDB, GCC and DWARF Register numbers
16 #include "RegisterContextLinux_mips64.h"
17 
18 // For GP and FP buffers
19 #include "RegisterContext_mips.h"
20 
21 // Internal codes for all mips32 and mips64 registers
22 #include "lldb-mips-linux-register-enums.h"
23 
24 using namespace lldb;
25 using namespace lldb_private;
26 
27 //---------------------------------------------------------------------------
28 // Include RegisterInfos_mips64 to declare our g_register_infos_mips64 structure.
29 //---------------------------------------------------------------------------
30 #define DECLARE_REGISTER_INFOS_MIPS64_STRUCT
31 #define LINUX_MIPS64
32 #include "RegisterInfos_mips64.h"
33 #undef LINUX_MIPS64
34 #undef DECLARE_REGISTER_INFOS_MIPS64_STRUCT
35 
36 //---------------------------------------------------------------------------
37 // Include RegisterInfos_mips to declare our g_register_infos_mips structure.
38 //---------------------------------------------------------------------------
39 #define DECLARE_REGISTER_INFOS_MIPS_STRUCT
40 #include "RegisterInfos_mips.h"
41 #undef DECLARE_REGISTER_INFOS_MIPS_STRUCT
42 
43 static const RegisterInfo *
44 GetRegisterInfoPtr (const ArchSpec &target_arch)
45 {
46     switch (target_arch.GetMachine())
47     {
48         case llvm::Triple::mips64:
49         case llvm::Triple::mips64el:
50             return g_register_infos_mips64;
51         case llvm::Triple::mips:
52         case llvm::Triple::mipsel:
53             return g_register_infos_mips;
54         default:
55             assert(false && "Unhandled target architecture.");
56             return nullptr;
57     }
58 }
59 
60 static uint32_t
61 GetRegisterInfoCount (const ArchSpec &target_arch)
62 {
63     switch (target_arch.GetMachine())
64     {
65         case llvm::Triple::mips64:
66         case llvm::Triple::mips64el:
67             return static_cast<uint32_t> (sizeof (g_register_infos_mips64) / sizeof (g_register_infos_mips64 [0]));
68         case llvm::Triple::mips:
69         case llvm::Triple::mipsel:
70             return static_cast<uint32_t> (sizeof (g_register_infos_mips) / sizeof (g_register_infos_mips [0]));
71         default:
72             assert(false && "Unhandled target architecture.");
73             return 0;
74     }
75 }
76 
77 uint32_t
78 GetUserRegisterInfoCount (const ArchSpec &target_arch)
79 {
80     switch (target_arch.GetMachine())
81     {
82         case llvm::Triple::mips:
83         case llvm::Triple::mipsel:
84             return static_cast<uint32_t> (k_num_user_registers_mips);
85         case llvm::Triple::mips64el:
86         case llvm::Triple::mips64:
87             return static_cast<uint32_t> (k_num_user_registers_mips64);
88         default:
89             assert(false && "Unhandled target architecture.");
90             return 0;
91     }
92 }
93 
94 RegisterContextLinux_mips64::RegisterContextLinux_mips64(const ArchSpec &target_arch) :
95     lldb_private::RegisterInfoInterface(target_arch),
96     m_register_info_p (GetRegisterInfoPtr (target_arch)),
97     m_register_info_count (GetRegisterInfoCount (target_arch)),
98     m_user_register_count (GetUserRegisterInfoCount (target_arch))
99 {
100 }
101 
102 size_t
103 RegisterContextLinux_mips64::GetGPRSize() const
104 {
105     return sizeof(GPR_linux_mips);
106 }
107 
108 const RegisterInfo *
109 RegisterContextLinux_mips64::GetRegisterInfo() const
110 {
111     return m_register_info_p;
112 }
113 
114 uint32_t
115 RegisterContextLinux_mips64::GetRegisterCount () const
116 {
117     return m_register_info_count;
118 }
119 
120 uint32_t
121 RegisterContextLinux_mips64::GetUserRegisterCount () const
122 {
123     return m_user_register_count;
124 }
125 
126 #endif
127