Fix a number of pr21529 testcase failures
[deliverable/binutils-gdb.git] / sim / aarch64 / interp.c
index d9710399581e26725d5b103a610d344a879f9fa8..5c7cc7002a36b57f7db83266a560a6b2fedf1b2c 100644 (file)
@@ -1,6 +1,6 @@
 /* interp.c -- AArch64 sim interface to GDB.
 
-   Copyright (C) 2015 Free Software Foundation, Inc.
+   Copyright (C) 2015-2017 Free Software Foundation, Inc.
 
    Contributed by Red Hat.
 
@@ -28,6 +28,7 @@
 #include <stdlib.h>
 
 #include "ansidecl.h"
+#include "bfd.h"
 #include "gdb/callback.h"
 #include "gdb/remote-sim.h"
 #include "gdb/signals.h"
 #include "memory.h"
 #include "simulator.h"
 
-#include "dis-asm.h"
-
-static struct disassemble_info  info;
-static unsigned long            symcount = 0;
-static asymbol **               symtab = NULL;
-
-/* FIXME: 1000 characters should be enough to hold the disassembled
-   instruction plus any comments that come after it.  But maybe with
-   C++ programs this might not be enough.  Not sure if it is worth
-   adding logic to dynamically grow the buffer though.  */
-static char opbuf[1000];
-
-static int op_printf (void *, const char *, ...) ATTRIBUTE_FPTR_PRINTF_2;
-
-static int
-op_printf (void *stream ATTRIBUTE_UNUSED, const char *fmt, ...)
-{
-  size_t space_remaining;
-  int ret;
-  va_list ap;
-
-  space_remaining = sizeof (opbuf) - strlen (opbuf);
-  va_start (ap, fmt);
-  /* Instead of printing to stream we store the text in opbuf.
-     This allows us to use the sim_io_eprintf routine to output
-     the text in aarch64_print_insn.  */
-  ret = vsnprintf (opbuf + strlen (opbuf), space_remaining, fmt, ap);
-  va_end (ap);
-  return ret;
-}
-
-void
-aarch64_print_insn (SIM_DESC sd, uint64_t addr)
-{
-  int size;
-
-  opbuf[0] = 0;
-  size = print_insn_aarch64 (addr, & info);
-  sim_io_eprintf (sd, " %*s\n", size, opbuf);
-}
-
-static int
-sim_dis_read (bfd_vma                     memaddr,
-             bfd_byte *                  ptr,
-             unsigned int                length,
-             struct disassemble_info *   info)
-{
-  aarch64_get_mem_blk (info->private_data, memaddr, (char *) ptr, length);
-
-  return 0;
-}
-
 /* Filter out (in place) symbols that are useless for disassembly.
    COUNT is the number of elements in SYMBOLS.
    Return the number of useful symbols. */
 
-static unsigned long
-remove_useless_symbols (asymbol **symbols, unsigned long count)
+static long
+remove_useless_symbols (asymbol **symbols, long count)
 {
   asymbol **in_ptr  = symbols;
   asymbol **out_ptr = symbols;
@@ -136,8 +85,10 @@ compare_symbols (const void *ap, const void *bp)
 
 /* Find the name of the function at ADDR.  */
 const char *
-aarch64_get_func (uint64_t addr)
+aarch64_get_func (SIM_DESC sd, uint64_t addr)
 {
+  long symcount = STATE_PROG_SYMS_COUNT (sd);
+  asymbol **symtab = STATE_PROG_SYMS (sd);
   int  min, max;
 
   min = -1;
@@ -167,23 +118,11 @@ aarch64_get_func (uint64_t addr)
   return "";
 }
 
-uint64_t
-aarch64_get_sym_value (const char *name)
-{
-  unsigned long i;
-
-  for (i = 0; i < symcount; i++)
-    if (strcmp (bfd_asymbol_name (symtab[i]), name) == 0)
-      return bfd_asymbol_value (symtab[i]);
-
-  return 0;
-}
-
 SIM_RC
-sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char **argv, char **env)
+sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
+                    char * const *argv, char * const *env)
 {
   sim_cpu *cpu = STATE_CPU (sd, 0);
-  long storage;
   bfd_vma addr = 0;
 
   if (abfd != NULL)
@@ -202,26 +141,16 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char **argv, char **env)
       STATE_PROG_ARGV (sd) = dupargv (argv);
     }
 
-  memset (& info, 0, sizeof (info));
-  init_disassemble_info (& info, NULL, op_printf);
-  info.read_memory_func = sim_dis_read;
-  info.arch = bfd_get_arch (abfd);
-  info.mach = bfd_get_mach (abfd);
-  info.private_data = cpu;
-  if (info.mach == 0)
-    info.arch = bfd_arch_aarch64;
-  disassemble_init_for_target (& info);
-
-  storage = bfd_get_symtab_upper_bound (abfd);
-  if (storage > 0)
+  if (trace_load_symbols (sd))
     {
-      symtab = (asymbol **) xmalloc (storage);
-      symcount = bfd_canonicalize_symtab (abfd, symtab);
-      symcount = remove_useless_symbols (symtab, symcount);
-      qsort (symtab, symcount, sizeof (asymbol *), compare_symbols);
+      STATE_PROG_SYMS_COUNT (sd) =
+       remove_useless_symbols (STATE_PROG_SYMS (sd),
+                               STATE_PROG_SYMS_COUNT (sd));
+      qsort (STATE_PROG_SYMS (sd), STATE_PROG_SYMS_COUNT (sd),
+            sizeof (asymbol *), compare_symbols);
     }
 
-  aarch64_init (cpu, bfd_get_start_address (abfd));
+  aarch64_init (cpu, addr);
 
   return SIM_RC_OK;
 }
@@ -384,48 +313,12 @@ free_state (SIM_DESC sd)
   sim_state_free (sd);
 }
 
-enum
-{
-  OPTION_DISAS = OPTION_START,
-};
-
-static SIM_RC
-aarch64_option_handler (SIM_DESC  sd ATTRIBUTE_UNUSED,
-                       sim_cpu * current_cpu ATTRIBUTE_UNUSED,
-                       int       opt,
-                       char *    arg ATTRIBUTE_UNUSED,
-                       int       is_command ATTRIBUTE_UNUSED)
-{
-  switch (opt)
-    {
-    case OPTION_DISAS:
-      disas = TRUE;
-      return SIM_RC_OK;
-
-    default:
-      sim_io_eprintf (sd, "Unknown AArch64 option %d\n", opt);
-      return SIM_RC_FAIL;
-    }
-}
-
-static DECLARE_OPTION_HANDLER (aarch64_option_handler);
-
-const OPTION aarch64_options[] =
-{
-  { {"disas", no_argument, NULL, OPTION_DISAS },
-      '\0', NULL, "Enable instruction disassembly",
-      aarch64_option_handler, NULL },
-
-  { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL, NULL }
-};
-
 SIM_DESC
 sim_open (SIM_OPEN_KIND                  kind,
          struct host_callback_struct *  callback,
          struct bfd *                   abfd,
-         char **                        argv)
+         char * const *                 argv)
 {
-  int i;
   sim_cpu *cpu;
   SIM_DESC sd = sim_state_alloc (kind, callback);
 
@@ -434,8 +327,6 @@ sim_open (SIM_OPEN_KIND                  kind,
 
   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
 
-  sim_add_option_table (sd, NULL, aarch64_options);
-
   /* Perform the initialization steps one by one.  */
   if (sim_cpu_alloc_all (sd, 1, 0) != SIM_RC_OK
       || sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK
This page took 0.028392 seconds and 4 git commands to generate.