Coverage Report

Created: 2021-03-27 08:30

/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/source/Plugins/Process/Utility/RegisterContextLinux_mips.cpp
Line
Count
Source (jump to first uncovered line)
1
//===-- RegisterContextLinux_mips.cpp -------------------------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===---------------------------------------------------------------------===//
8
9
#include <stddef.h>
10
#include <vector>
11
12
// For eh_frame and DWARF Register numbers
13
#include "RegisterContextLinux_mips.h"
14
15
// Internal codes for mips registers
16
#include "lldb-mips-linux-register-enums.h"
17
18
// For GP and FP buffers
19
#include "RegisterContext_mips.h"
20
21
using namespace lldb_private;
22
using namespace lldb;
23
24
// Include RegisterInfos_mips to declare our g_register_infos_mips structure.
25
#define DECLARE_REGISTER_INFOS_MIPS_STRUCT
26
#include "RegisterInfos_mips.h"
27
#undef DECLARE_REGISTER_INFOS_MIPS_STRUCT
28
29
// mips general purpose registers.
30
const uint32_t g_gp_regnums_mips[] = {
31
    gpr_zero_mips,      gpr_r1_mips,    gpr_r2_mips,      gpr_r3_mips,
32
    gpr_r4_mips,        gpr_r5_mips,    gpr_r6_mips,      gpr_r7_mips,
33
    gpr_r8_mips,        gpr_r9_mips,    gpr_r10_mips,     gpr_r11_mips,
34
    gpr_r12_mips,       gpr_r13_mips,   gpr_r14_mips,     gpr_r15_mips,
35
    gpr_r16_mips,       gpr_r17_mips,   gpr_r18_mips,     gpr_r19_mips,
36
    gpr_r20_mips,       gpr_r21_mips,   gpr_r22_mips,     gpr_r23_mips,
37
    gpr_r24_mips,       gpr_r25_mips,   gpr_r26_mips,     gpr_r27_mips,
38
    gpr_gp_mips,        gpr_sp_mips,    gpr_r30_mips,     gpr_ra_mips,
39
    gpr_sr_mips,        gpr_mullo_mips, gpr_mulhi_mips,   gpr_badvaddr_mips,
40
    gpr_cause_mips,     gpr_pc_mips,    gpr_config5_mips,
41
    LLDB_INVALID_REGNUM // register sets need to end with this flag
42
};
43
44
static_assert((sizeof(g_gp_regnums_mips) / sizeof(g_gp_regnums_mips[0])) - 1 ==
45
                  k_num_gpr_registers_mips,
46
              "g_gp_regnums_mips has wrong number of register infos");
47
// mips floating point registers.
48
const uint32_t g_fp_regnums_mips[] = {
49
    fpr_f0_mips,        fpr_f1_mips,  fpr_f2_mips,      fpr_f3_mips,
50
    fpr_f4_mips,        fpr_f5_mips,  fpr_f6_mips,      fpr_f7_mips,
51
    fpr_f8_mips,        fpr_f9_mips,  fpr_f10_mips,     fpr_f11_mips,
52
    fpr_f12_mips,       fpr_f13_mips, fpr_f14_mips,     fpr_f15_mips,
53
    fpr_f16_mips,       fpr_f17_mips, fpr_f18_mips,     fpr_f19_mips,
54
    fpr_f20_mips,       fpr_f21_mips, fpr_f22_mips,     fpr_f23_mips,
55
    fpr_f24_mips,       fpr_f25_mips, fpr_f26_mips,     fpr_f27_mips,
56
    fpr_f28_mips,       fpr_f29_mips, fpr_f30_mips,     fpr_f31_mips,
57
    fpr_fcsr_mips,      fpr_fir_mips, fpr_config5_mips,
58
    LLDB_INVALID_REGNUM // register sets need to end with this flag
59
};
60
61
static_assert((sizeof(g_fp_regnums_mips) / sizeof(g_fp_regnums_mips[0])) - 1 ==
62
                  k_num_fpr_registers_mips,
63
              "g_fp_regnums_mips has wrong number of register infos");
64
65
// mips MSA registers.
66
const uint32_t g_msa_regnums_mips[] = {
67
    msa_w0_mips,        msa_w1_mips,  msa_w2_mips,   msa_w3_mips,
68
    msa_w4_mips,        msa_w5_mips,  msa_w6_mips,   msa_w7_mips,
69
    msa_w8_mips,        msa_w9_mips,  msa_w10_mips,  msa_w11_mips,
70
    msa_w12_mips,       msa_w13_mips, msa_w14_mips,  msa_w15_mips,
71
    msa_w16_mips,       msa_w17_mips, msa_w18_mips,  msa_w19_mips,
72
    msa_w20_mips,       msa_w21_mips, msa_w22_mips,  msa_w23_mips,
73
    msa_w24_mips,       msa_w25_mips, msa_w26_mips,  msa_w27_mips,
74
    msa_w28_mips,       msa_w29_mips, msa_w30_mips,  msa_w31_mips,
75
    msa_fcsr_mips,      msa_fir_mips, msa_mcsr_mips, msa_mir_mips,
76
    msa_config5_mips,
77
    LLDB_INVALID_REGNUM // register sets need to end with this flag
78
};
79
80
static_assert((sizeof(g_msa_regnums_mips) / sizeof(g_msa_regnums_mips[0])) -
81
                      1 ==
82
                  k_num_msa_registers_mips,
83
              "g_msa_regnums_mips has wrong number of register infos");
84
85
// Number of register sets provided by this context.
86
constexpr size_t k_num_register_sets = 3;
87
88
// Register sets for mips.
89
static const RegisterSet g_reg_sets_mips[k_num_register_sets] = {
90
    {"General Purpose Registers", "gpr", k_num_gpr_registers_mips,
91
     g_gp_regnums_mips},
92
    {"Floating Point Registers", "fpu", k_num_fpr_registers_mips,
93
     g_fp_regnums_mips},
94
    {"MSA Registers", "msa", k_num_msa_registers_mips, g_msa_regnums_mips}};
95
96
1
uint32_t GetUserRegisterInfoCount(bool msa_present) {
97
1
  if (msa_present)
98
1
    return static_cast<uint32_t>(k_num_user_registers_mips);
99
0
  return static_cast<uint32_t>(k_num_user_registers_mips -
100
0
                               k_num_msa_registers_mips);
101
1
}
102
103
RegisterContextLinux_mips::RegisterContextLinux_mips(
104
    const ArchSpec &target_arch, bool msa_present)
105
    : RegisterInfoInterface(target_arch),
106
1
      m_user_register_count(GetUserRegisterInfoCount(msa_present)) {}
107
108
0
size_t RegisterContextLinux_mips::GetGPRSize() const {
109
0
  return sizeof(GPR_linux_mips);
110
0
}
111
112
3.47k
const RegisterInfo *RegisterContextLinux_mips::GetRegisterInfo() const {
113
3.47k
  switch (m_target_arch.GetMachine()) {
114
0
  case llvm::Triple::mips:
115
3.47k
  case llvm::Triple::mipsel:
116
3.47k
    return g_register_infos_mips;
117
0
  default:
118
0
    assert(false && "Unhandled target architecture.");
119
0
    return nullptr;
120
3.47k
  }
121
3.47k
}
122
123
const RegisterSet * 
124
3
RegisterContextLinux_mips::GetRegisterSet(size_t set) const {
125
3
  if (set >= k_num_register_sets)
126
0
    return nullptr;
127
3
  switch (m_target_arch.GetMachine()) {
128
0
    case llvm::Triple::mips:
129
3
    case llvm::Triple::mipsel:
130
3
      return &g_reg_sets_mips[set];
131
0
    default:
132
0
      assert(false && "Unhandled target architecture.");
133
0
      return nullptr;
134
3
  }
135
3
}
136
137
size_t
138
1
RegisterContextLinux_mips::GetRegisterSetCount() const {
139
1
  return k_num_register_sets;
140
1
}
141
142
94
uint32_t RegisterContextLinux_mips::GetRegisterCount() const {
143
94
  return static_cast<uint32_t>(sizeof(g_register_infos_mips) /
144
94
                               sizeof(g_register_infos_mips[0]));
145
94
}
146
147
0
uint32_t RegisterContextLinux_mips::GetUserRegisterCount() const {
148
0
  return static_cast<uint32_t>(m_user_register_count);
149
0
}