GDB (xrefs)
Loading...
Searching...
No Matches
arc.c
Go to the documentation of this file.
1/* Copyright (C) 2017-2023 Free Software Foundation, Inc.
2
3 This file is part of GDB.
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
17
18
19#include "gdbsupport/common-defs.h"
20#include "arc.h"
21#include <stdlib.h>
22#include <unordered_map>
23#include <string>
24
25/* Target description features. */
27#include "features/arc/v1-aux.c"
29#include "features/arc/v2-aux.c"
30
31#ifndef GDBSERVER
32#define STATIC_IN_GDB static
33#else
34#define STATIC_IN_GDB
35#endif
36
37STATIC_IN_GDB target_desc_up
39{
40 /* Create a new target description. */
41 target_desc_up tdesc = allocate_target_description ();
42
43#ifndef IN_PROCESS_AGENT
44 std::string arch_name;
45
46 /* Architecture names here must match the ones in
47 ARCH_INFO_STRUCT in bfd/cpu-arc.c. */
48 if (features.isa == ARC_ISA_ARCV1 && features.reg_size == 4)
49 arch_name = "arc:ARC700";
50 else if (features.isa == ARC_ISA_ARCV2 && features.reg_size == 4)
51 arch_name = "arc:ARCv2";
52 else
53 {
54 std::string msg = string_printf
55 ("Cannot determine architecture: ISA=%d; bitness=%d",
56 features.isa, 8 * features.reg_size);
57 gdb_assert_not_reached ("%s", msg.c_str ());
58 }
59
60 set_tdesc_architecture (tdesc.get (), arch_name.c_str ());
61#endif
62
63 long regnum = 0;
64
65 switch (features.isa)
66 {
67 case ARC_ISA_ARCV1:
69 regnum = create_feature_arc_v1_aux (tdesc.get (), regnum);
70 break;
71 case ARC_ISA_ARCV2:
73 regnum = create_feature_arc_v2_aux (tdesc.get (), regnum);
74 break;
75 default:
76 std::string msg = string_printf
77 ("Cannot choose target description XML: %d", features.isa);
78 gdb_assert_not_reached ("%s", msg.c_str ());
79 }
80
81 return tdesc;
82}
83
84#ifndef GDBSERVER
85
86/* Wrapper used by std::unordered_map to generate hash for features set. */
88{
89 std::size_t
90 operator() (const arc_arch_features &features) const noexcept
91 {
92 return features.hash ();
93 }
94};
95
96/* Cache of previously created target descriptions, indexed by the hash
97 of the features set used to create them. */
98static std::unordered_map<arc_arch_features,
99 const target_desc_up,
101
102/* See arch/arc.h. */
103
104const target_desc *
106{
107 /* Lookup in the cache first. If found, return the pointer from the
108 "target_desc_up" type which is a "unique_ptr". This should be fine
109 as the "arc_tdesc_cache" will persist until GDB terminates. */
110 const auto it = arc_tdesc_cache.find (features);
111 if (it != arc_tdesc_cache.end ())
112 return it->second.get ();
113
114 target_desc_up tdesc = arc_create_target_description (features);
115
116
117 /* Add to the cache, and return a pointer borrowed from the
118 target_desc_up. This is safe as the cache (and the pointers
119 contained within it) are not deleted until GDB exits. */
120 target_desc *ptr = tdesc.get ();
121 arc_tdesc_cache.emplace (features, std::move (tdesc));
122 return ptr;
123}
124
125#endif /* !GDBSERVER */
int regnum
STATIC_IN_GDB target_desc_up arc_create_target_description(const struct arc_arch_features &features)
Definition arc.c:38
static std::unordered_map< arc_arch_features, const target_desc_up, arc_arch_features_hasher > arc_tdesc_cache
Definition arc.c:100
const target_desc * arc_lookup_target_description(const struct arc_arch_features &features)
Definition arc.c:105
#define STATIC_IN_GDB
Definition arc.c:32
@ ARC_ISA_ARCV1
Definition arc.h:26
@ ARC_ISA_ARCV2
Definition arc.h:27
std::size_t operator()(const arc_arch_features &features) const noexcept
Definition arc.c:90
const arc_isa isa
Definition arc.h:41
const int reg_size
Definition arc.h:38
void set_tdesc_architecture(struct target_desc *target_desc, const char *name)
target_desc_up allocate_target_description(void)
static int create_feature_arc_v1_aux(struct target_desc *result, long regnum)
Definition v1-aux.c:7
static int create_feature_arc_v1_core(struct target_desc *result, long regnum)
Definition v1-core.c:7
static int create_feature_arc_v2_aux(struct target_desc *result, long regnum)
Definition v2-aux.c:7
static int create_feature_arc_v2_core(struct target_desc *result, long regnum)
Definition v2-core.c:7