#include "gdbcore.h"
#include "gdbcmd.h"
#include "objfiles.h"
+#include "osabi.h"
#include "prologue-value.h"
+#include "target-descriptions.h"
#include "trad-frame.h"
/* ARC header files. */
#include "opcode/arc.h"
#include "opcodes/arc-dis.h"
#include "arc-tdep.h"
+#include "arch/arc.h"
/* Standard headers. */
#include <algorithm>
-/* Default target descriptions. */
-#include "features/arc-v2.c"
-#include "features/arc-arcompact.c"
-
/* The frame unwind cache for ARC. */
struct arc_frame_cache
static char *arc_disassembler_options = NULL;
+/* Possible arc target descriptors. */
+static struct target_desc *tdesc_arc_list[ARC_SYS_TYPE_NUM];
+
/* Functions are sorted in the order as they are used in the
_initialize_arc_tdep (), which uses the same order as gdbarch.h. Static
functions are defined before the first invocation. */
function passes a hidden first parameter to the callee (in R0). That
parameter is the address at which the value being returned should be
stored. Otherwise, the result is returned in registers. */
- int is_struct_return = (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
- || TYPE_CODE (valtype) == TYPE_CODE_UNION
+ int is_struct_return = (valtype->code () == TYPE_CODE_STRUCT
+ || valtype->code () == TYPE_CODE_UNION
|| TYPE_LENGTH (valtype) > 2 * ARC_REGISTER_SIZE);
if (arc_debug)
const char *const *core_regs;
const char *core_feature_name;
- /* If target doesn't provide a description - use default one. */
+ /* If target doesn't provide a description, use the default ones. */
if (!tdesc_has_registers (tdesc_loc))
{
if (is_arcv2)
- {
- tdesc_loc = tdesc_arc_v2;
- if (arc_debug)
- debug_printf ("arc: Using default register set for ARC v2.\n");
- }
+ tdesc_loc = arc_read_description (ARC_SYS_TYPE_ARCV2);
else
- {
- tdesc_loc = tdesc_arc_arcompact;
- if (arc_debug)
- debug_printf ("arc: Using default register set for ARCompact.\n");
- }
+ tdesc_loc = arc_read_description (ARC_SYS_TYPE_ARCOMPACT);
}
else
{
static ULONGEST
arc_type_align (struct gdbarch *gdbarch, struct type *type)
{
- switch (TYPE_CODE (type))
+ switch (type->code ())
{
case TYPE_CODE_PTR:
case TYPE_CODE_FUNC:
fprintf_unfiltered (file, "arc_dump_tdep: jb_pc = %i\n", tdep->jb_pc);
}
-/* Wrapper for "maintenance print arc" list of commands. */
-
-static void
-maintenance_print_arc_command (const char *args, int from_tty)
-{
- cmd_show_list (maintenance_print_arc_list, from_tty, "");
-}
-
/* This command accepts single argument - address of instruction to
disassemble. */
arc_insn_dump (insn);
}
+/* See arc-tdep.h. */
+
+const target_desc *
+arc_read_description (arc_sys_type sys_type)
+{
+ if (arc_debug)
+ debug_printf ("arc: Reading target description for \"%s\".\n",
+ arc_sys_type_to_str (sys_type));
+
+ gdb_assert ((sys_type >= 0) && (sys_type < ARC_SYS_TYPE_NUM));
+ struct target_desc *tdesc = tdesc_arc_list[sys_type];
+
+ if (tdesc == nullptr)
+ {
+ tdesc = arc_create_target_description (sys_type);
+ tdesc_arc_list[sys_type] = tdesc;
+
+ if (arc_debug)
+ {
+ const char *arch = tdesc_architecture_name (tdesc);
+ const char *abi = tdesc_osabi_name (tdesc);
+ arch = arch != NULL ? arch : "";
+ abi = abi != NULL ? abi : "";
+ debug_printf ("arc: Created target description for "
+ "\"%s\": arch=\"%s\", ABI=\"%s\"\n",
+ arc_sys_type_to_str (sys_type), arch, abi);
+ }
+ }
+
+ return tdesc;
+}
+
void _initialize_arc_tdep ();
void
_initialize_arc_tdep ()
{
gdbarch_register (bfd_arch_arc, arc_gdbarch_init, arc_dump_tdep);
- initialize_tdesc_arc_v2 ();
- initialize_tdesc_arc_arcompact ();
-
/* Register ARC-specific commands with gdb. */
/* Add root prefix command for "maintenance print arc" commands. */
- add_prefix_cmd ("arc", class_maintenance, maintenance_print_arc_command,
- _("ARC-specific maintenance commands for printing GDB "
- "internal state."),
- &maintenance_print_arc_list, "maintenance print arc ", 0,
- &maintenanceprintlist);
+ add_show_prefix_cmd ("arc", class_maintenance,
+ _("ARC-specific maintenance commands for printing GDB "
+ "internal state."),
+ &maintenance_print_arc_list, "maintenance print arc ",
+ 0, &maintenanceprintlist);
add_cmd ("arc-instruction", class_maintenance,
dump_arc_instruction_command,