hotspot/src/share/tools/hsdis/hsdis.c
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 14384 801df8025142
child 17618 882c7fe997eb
permissions -rw-r--r--
8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
     1
/*
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
     2
 * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
     4
 *
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
     7
 * published by the Free Software Foundation.
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
     8
 *
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    13
 * accompanied this code).
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    14
 *
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 3261
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 3261
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 3261
diff changeset
    21
 * questions.
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    22
 *
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    23
 */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    24
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    25
/* hsdis.c -- dump a range of addresses as native instructions
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    26
   This implements the plugin protocol required by the
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    27
   HotSpot PrintAssembly option.
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    28
*/
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    29
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    30
#include <libiberty.h>
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    31
#include <bfd.h>
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    32
#include <dis-asm.h>
2564
85c3ae53ca1c 6684007: PrintAssembly plugin not available for linux or windows
never
parents: 347
diff changeset
    33
#include <inttypes.h>
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    34
#include <string.h>
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    35
#include <errno.h>
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    36
#include "hsdis.h"
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    37
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    38
#ifndef bool
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    39
#define bool int
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    40
#define true 1
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    41
#define false 0
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    42
#endif /*bool*/
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    43
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    44
/* short names for stuff in hsdis.h */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    45
typedef decode_instructions_event_callback_ftype  event_callback_t;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    46
typedef decode_instructions_printf_callback_ftype printf_callback_t;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    47
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    48
/* disassemble_info.application_data object */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    49
struct hsdis_app_data {
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    50
  /* virtual address of data */
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    51
  uintptr_t start_va, end_va;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    52
  /* the instructions to be decoded */
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    53
  unsigned char* buffer;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    54
  uintptr_t length;
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    55
  event_callback_t  event_callback;  void* event_stream;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    56
  printf_callback_t printf_callback; void* printf_stream;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    57
  bool losing;
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    58
  bool do_newline;
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    59
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    60
  /* the architecture being disassembled */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    61
  const char* arch_name;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    62
  const bfd_arch_info_type* arch_info;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    63
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    64
  /* the disassembler we are going to use: */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    65
  disassembler_ftype      dfn;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    66
  struct disassemble_info dinfo; /* the actual struct! */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    67
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    68
  char mach_option[64];
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    69
  char insn_options[256];
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    70
};
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    71
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    72
static void* decode(struct hsdis_app_data* app_data, const char* options);
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    73
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    74
#define DECL_APP_DATA(dinfo) \
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    75
  struct hsdis_app_data* app_data = (struct hsdis_app_data*) (dinfo)->application_data
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    76
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    77
#define DECL_EVENT_CALLBACK(app_data) \
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    78
  event_callback_t  event_callback = (app_data)->event_callback; \
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    79
  void*             event_stream   = (app_data)->event_stream
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    80
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    81
#define DECL_PRINTF_CALLBACK(app_data) \
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    82
  printf_callback_t  printf_callback = (app_data)->printf_callback; \
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    83
  void*              printf_stream   = (app_data)->printf_stream
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    84
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    85
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    86
static void print_help(struct hsdis_app_data* app_data,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    87
                       const char* msg, const char* arg);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    88
static void setup_app_data(struct hsdis_app_data* app_data,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    89
                           const char* options);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    90
static const char* format_insn_close(const char* close,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    91
                                     disassemble_info* dinfo,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    92
                                     char* buf, size_t bufsize);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    93
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    94
void*
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    95
#ifdef DLL_ENTRY
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    96
  DLL_ENTRY
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    97
#endif
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    98
decode_instructions_virtual(uintptr_t start_va, uintptr_t end_va,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    99
                            unsigned char* buffer, uintptr_t length,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   100
                            event_callback_t  event_callback_arg,  void* event_stream_arg,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   101
                            printf_callback_t printf_callback_arg, void* printf_stream_arg,
14384
801df8025142 8000489: older builds of hsdis don't work anymore after 6879063
minqi
parents: 13873
diff changeset
   102
                            const char* options, int newline) {
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   103
  struct hsdis_app_data app_data;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   104
  memset(&app_data, 0, sizeof(app_data));
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   105
  app_data.start_va    = start_va;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   106
  app_data.end_va      = end_va;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   107
  app_data.buffer = buffer;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   108
  app_data.length = length;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   109
  app_data.event_callback  = event_callback_arg;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   110
  app_data.event_stream    = event_stream_arg;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   111
  app_data.printf_callback = printf_callback_arg;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   112
  app_data.printf_stream   = printf_stream_arg;
14384
801df8025142 8000489: older builds of hsdis don't work anymore after 6879063
minqi
parents: 13873
diff changeset
   113
  app_data.do_newline = newline == 0 ? false : true;
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   114
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   115
  return decode(&app_data, options);
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   116
}
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   117
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   118
/* This is the compatability interface for older version of hotspot */
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   119
void*
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   120
#ifdef DLL_ENTRY
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   121
  DLL_ENTRY
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   122
#endif
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   123
decode_instructions(void* start_pv, void* end_pv,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   124
                    event_callback_t  event_callback_arg,  void* event_stream_arg,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   125
                    printf_callback_t printf_callback_arg, void* printf_stream_arg,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   126
                    const char* options) {
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   127
  decode_instructions_virtual((uintptr_t)start_pv,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   128
                             (uintptr_t)end_pv,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   129
                             (unsigned char*)start_pv,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   130
                             (uintptr_t)end_pv - (uintptr_t)start_pv,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   131
                             event_callback_arg,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   132
                             event_stream_arg,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   133
                             printf_callback_arg,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   134
                             printf_stream_arg,
14384
801df8025142 8000489: older builds of hsdis don't work anymore after 6879063
minqi
parents: 13873
diff changeset
   135
                             options, false);
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   136
}
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   137
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   138
static void* decode(struct hsdis_app_data* app_data, const char* options) {
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   139
  setup_app_data(app_data, options);
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   140
  char buf[128];
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   141
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   142
  {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   143
    /* now reload everything from app_data: */
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   144
    DECL_EVENT_CALLBACK(app_data);
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   145
    DECL_PRINTF_CALLBACK(app_data);
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   146
    uintptr_t start = app_data->start_va;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   147
    uintptr_t end   = app_data->end_va;
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   148
    uintptr_t p     = start;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   149
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   150
    (*event_callback)(event_stream, "insns", (void*)start);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   151
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   152
    (*event_callback)(event_stream, "mach name='%s'",
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   153
                      (void*) app_data->arch_info->printable_name);
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   154
    if (app_data->dinfo.bytes_per_line != 0) {
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   155
      (*event_callback)(event_stream, "format bytes-per-line='%p'/",
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   156
                        (void*)(intptr_t) app_data->dinfo.bytes_per_line);
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   157
    }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   158
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   159
    while (p < end && !app_data->losing) {
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   160
      (*event_callback)(event_stream, "insn", (void*) p);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   161
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   162
      /* reset certain state, so we can read it with confidence */
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   163
      app_data->dinfo.insn_info_valid    = 0;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   164
      app_data->dinfo.branch_delay_insns = 0;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   165
      app_data->dinfo.data_size          = 0;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   166
      app_data->dinfo.insn_type          = 0;
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   167
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   168
      int size = (*app_data->dfn)((bfd_vma) p, &app_data->dinfo);
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   169
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   170
      if (size > 0)  p += size;
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   171
      else           app_data->losing = true;
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   172
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   173
      if (!app_data->losing) {
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   174
        const char* insn_close = format_insn_close("/insn", &app_data->dinfo,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   175
                                                   buf, sizeof(buf));
14384
801df8025142 8000489: older builds of hsdis don't work anymore after 6879063
minqi
parents: 13873
diff changeset
   176
        (*event_callback)(event_stream, insn_close, (void*) p);
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   177
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   178
        if (app_data->do_newline) {
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   179
          /* follow each complete insn by a nice newline */
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   180
          (*printf_callback)(printf_stream, "\n");
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   181
        }
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   182
      }
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   183
    }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   184
14384
801df8025142 8000489: older builds of hsdis don't work anymore after 6879063
minqi
parents: 13873
diff changeset
   185
    if (app_data->losing) (*event_callback)(event_stream, "/insns", (void*) p);
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   186
    return (void*) p;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   187
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   188
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   189
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   190
/* take the address of the function, for luck, and also test the typedef: */
14384
801df8025142 8000489: older builds of hsdis don't work anymore after 6879063
minqi
parents: 13873
diff changeset
   191
const decode_func_vtype decode_func_virtual_address = &decode_instructions_virtual;
801df8025142 8000489: older builds of hsdis don't work anymore after 6879063
minqi
parents: 13873
diff changeset
   192
const decode_func_stype decode_func_address = &decode_instructions;
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   193
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   194
static const char* format_insn_close(const char* close,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   195
                                     disassemble_info* dinfo,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   196
                                     char* buf, size_t bufsize) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   197
  if (!dinfo->insn_info_valid)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   198
    return close;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   199
  enum dis_insn_type itype = dinfo->insn_type;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   200
  int dsize = dinfo->data_size, delays = dinfo->branch_delay_insns;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   201
  if ((itype == dis_nonbranch && (dsize | delays) == 0)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   202
      || (strlen(close) + 3*20 > bufsize))
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   203
    return close;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   204
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   205
  const char* type = "unknown";
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   206
  switch (itype) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   207
  case dis_nonbranch:   type = NULL;         break;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   208
  case dis_branch:      type = "branch";     break;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   209
  case dis_condbranch:  type = "condbranch"; break;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   210
  case dis_jsr:         type = "jsr";        break;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   211
  case dis_condjsr:     type = "condjsr";    break;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   212
  case dis_dref:        type = "dref";       break;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   213
  case dis_dref2:       type = "dref2";      break;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   214
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   215
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   216
  strcpy(buf, close);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   217
  char* p = buf;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   218
  if (type)    sprintf(p += strlen(p), " type='%s'", type);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   219
  if (dsize)   sprintf(p += strlen(p), " dsize='%d'", dsize);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   220
  if (delays)  sprintf(p += strlen(p), " delay='%d'", delays);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   221
  return buf;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   222
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   223
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   224
/* handler functions */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   225
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   226
static int
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   227
hsdis_read_memory_func(bfd_vma memaddr,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   228
                       bfd_byte* myaddr,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   229
                       unsigned int length,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   230
                       struct disassemble_info* dinfo) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   231
  DECL_APP_DATA(dinfo);
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   232
  /* convert the virtual address memaddr into an address within memory buffer */
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   233
  uintptr_t offset = ((uintptr_t) memaddr) - app_data->start_va;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   234
  if (offset + length > app_data->length) {
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   235
    /* read is out of bounds */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   236
    return EIO;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   237
  } else {
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   238
    memcpy(myaddr, (bfd_byte*) (app_data->buffer + offset), length);
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   239
    return 0;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   240
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   241
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   242
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   243
static void
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   244
hsdis_print_address_func(bfd_vma vma, struct disassemble_info* dinfo) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   245
  /* the actual value to print: */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   246
  void* addr_value = (void*) (uintptr_t) vma;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   247
  DECL_APP_DATA(dinfo);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   248
  DECL_EVENT_CALLBACK(app_data);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   249
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   250
  /* issue the event: */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   251
  void* result =
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   252
    (*event_callback)(event_stream, "addr/", addr_value);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   253
  if (result == NULL) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   254
    /* event declined */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   255
    generic_print_address(vma, dinfo);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   256
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   257
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   258
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   259
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   260
/* configuration */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   261
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   262
static void set_optional_callbacks(struct hsdis_app_data* app_data);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   263
static void parse_caller_options(struct hsdis_app_data* app_data,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   264
                                 const char* caller_options);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   265
static const char* native_arch_name();
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   266
static enum bfd_endian native_endian();
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   267
static const bfd_arch_info_type* find_arch_info(const char* arch_nane);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   268
static bfd* get_native_bfd(const bfd_arch_info_type* arch_info,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   269
                           /* to avoid malloc: */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   270
                           bfd* empty_bfd, bfd_target* empty_xvec);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   271
static void init_disassemble_info_from_bfd(struct disassemble_info* dinfo,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   272
                                           void *stream,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   273
                                           fprintf_ftype fprintf_func,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   274
                                           bfd* bfd,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   275
                                           char* disassembler_options);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   276
static void parse_fake_insn(disassembler_ftype dfn,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   277
                            struct disassemble_info* dinfo);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   278
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   279
static void setup_app_data(struct hsdis_app_data* app_data,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   280
                           const char* caller_options) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   281
  /* Make reasonable defaults for null callbacks.
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   282
     A non-null stream for a null callback is assumed to be a FILE* for output.
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   283
     Events are rendered as XML.
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   284
  */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   285
  set_optional_callbacks(app_data);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   286
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   287
  /* Look into caller_options for anything interesting. */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   288
  if (caller_options != NULL)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   289
    parse_caller_options(app_data, caller_options);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   290
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   291
  /* Discover which architecture we are going to disassemble. */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   292
  app_data->arch_name = &app_data->mach_option[0];
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   293
  if (app_data->arch_name[0] == '\0')
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   294
    app_data->arch_name = native_arch_name();
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   295
  app_data->arch_info = find_arch_info(app_data->arch_name);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   296
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   297
  /* Make a fake bfd to hold the arch. and byteorder info. */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   298
  struct {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   299
    bfd_target empty_xvec;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   300
    bfd        empty_bfd;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   301
  } buf;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   302
  bfd* native_bfd = get_native_bfd(app_data->arch_info,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   303
                                   /* to avoid malloc: */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   304
                                   &buf.empty_bfd, &buf.empty_xvec);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   305
  init_disassemble_info_from_bfd(&app_data->dinfo,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   306
                                 app_data->printf_stream,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   307
                                 app_data->printf_callback,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   308
                                 native_bfd,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   309
                                 app_data->insn_options);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   310
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   311
  /* Finish linking together the various callback blocks. */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   312
  app_data->dinfo.application_data = (void*) app_data;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   313
  app_data->dfn = disassembler(native_bfd);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   314
  app_data->dinfo.print_address_func = hsdis_print_address_func;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   315
  app_data->dinfo.read_memory_func = hsdis_read_memory_func;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   316
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   317
  if (app_data->dfn == NULL) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   318
    const char* bad = app_data->arch_name;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   319
    static bool complained;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   320
    if (bad == &app_data->mach_option[0])
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   321
      print_help(app_data, "bad mach=%s", bad);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   322
    else if (!complained)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   323
      print_help(app_data, "bad native mach=%s; please port hsdis to this platform", bad);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   324
    complained = true;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   325
    /* must bail out */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   326
    app_data->losing = true;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   327
    return;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   328
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   329
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   330
  parse_fake_insn(app_data->dfn, &app_data->dinfo);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   331
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   332
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   333
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   334
/* ignore all events, return a null */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   335
static void* null_event_callback(void* ignore_stream, const char* ignore_event, void* arg) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   336
  return NULL;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   337
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   338
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   339
/* print all events as XML markup */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   340
static void* xml_event_callback(void* stream, const char* event, void* arg) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   341
  FILE* fp = (FILE*) stream;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   342
#define NS_PFX "dis:"
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   343
  if (event[0] != '/') {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   344
    /* issue the tag, with or without a formatted argument */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   345
    fprintf(fp, "<"NS_PFX);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   346
    fprintf(fp, event, arg);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   347
    fprintf(fp, ">");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   348
  } else {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   349
    ++event;                    /* skip slash */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   350
    const char* argp = strchr(event, ' ');
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   351
    if (argp == NULL) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   352
      /* no arguments; just issue the closing tag */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   353
      fprintf(fp, "</"NS_PFX"%s>", event);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   354
    } else {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   355
      /* split out the closing attributes as <dis:foo_done attr='val'/> */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   356
      int event_prefix = (argp - event);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   357
      fprintf(fp, "<"NS_PFX"%.*s_done", event_prefix, event);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   358
      fprintf(fp, argp, arg);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   359
      fprintf(fp, "/></"NS_PFX"%.*s>", event_prefix, event);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   360
    }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   361
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   362
  return NULL;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   363
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   364
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   365
static void set_optional_callbacks(struct hsdis_app_data* app_data) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   366
  if (app_data->printf_callback == NULL) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   367
    int (*fprintf_callback)(FILE*, const char*, ...) = &fprintf;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   368
    FILE* fprintf_stream = stdout;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   369
    app_data->printf_callback = (printf_callback_t) fprintf_callback;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   370
    if (app_data->printf_stream == NULL)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   371
      app_data->printf_stream   = (void*)           fprintf_stream;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   372
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   373
  if (app_data->event_callback == NULL) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   374
    if (app_data->event_stream == NULL)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   375
      app_data->event_callback = &null_event_callback;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   376
    else
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   377
      app_data->event_callback = &xml_event_callback;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   378
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   379
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   380
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   381
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   382
static void parse_caller_options(struct hsdis_app_data* app_data, const char* caller_options) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   383
  char* iop_base = app_data->insn_options;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   384
  char* iop_limit = iop_base + sizeof(app_data->insn_options) - 1;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   385
  char* iop = iop_base;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   386
  const char* p;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   387
  for (p = caller_options; p != NULL; ) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   388
    const char* q = strchr(p, ',');
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   389
    size_t plen = (q == NULL) ? strlen(p) : ((q++) - p);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   390
    if (plen == 4 && strncmp(p, "help", plen) == 0) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   391
      print_help(app_data, NULL, NULL);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   392
    } else if (plen >= 5 && strncmp(p, "mach=", 5) == 0) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   393
      char*  mach_option = app_data->mach_option;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   394
      size_t mach_size   = sizeof(app_data->mach_option);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   395
      mach_size -= 1;           /*leave room for the null*/
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   396
      if (plen > mach_size)  plen = mach_size;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   397
      strncpy(mach_option, p, plen);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   398
      mach_option[plen] = '\0';
11782
38cbdb77b3d1 7140985: HSDIS does not handle caller options correctly
kvn
parents: 8921
diff changeset
   399
    } else if (plen > 6 && strncmp(p, "hsdis-", 6) == 0) {
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   400
      // do not pass these to the next level
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   401
    } else {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   402
      /* just copy it; {i386,sparc}-dis.c might like to see it  */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   403
      if (iop > iop_base && iop < iop_limit)  (*iop++) = ',';
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   404
      if (iop + plen > iop_limit)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   405
        plen = iop_limit - iop;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   406
      strncpy(iop, p, plen);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   407
      iop += plen;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   408
    }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   409
    p = q;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   410
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   411
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   412
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   413
static void print_help(struct hsdis_app_data* app_data,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   414
                       const char* msg, const char* arg) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   415
  DECL_PRINTF_CALLBACK(app_data);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   416
  if (msg != NULL) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   417
    (*printf_callback)(printf_stream, "hsdis: ");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   418
    (*printf_callback)(printf_stream, msg, arg);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   419
    (*printf_callback)(printf_stream, "\n");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   420
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   421
  (*printf_callback)(printf_stream, "hsdis output options:\n");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   422
  if (printf_callback == (printf_callback_t) &fprintf)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   423
    disassembler_usage((FILE*) printf_stream);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   424
  else
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   425
    disassembler_usage(stderr); /* better than nothing */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   426
  (*printf_callback)(printf_stream, "  mach=<arch>   select disassembly mode\n");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   427
#if defined(LIBARCH_i386) || defined(LIBARCH_amd64)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   428
  (*printf_callback)(printf_stream, "  mach=i386     select 32-bit mode\n");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   429
  (*printf_callback)(printf_stream, "  mach=x86-64   select 64-bit mode\n");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   430
  (*printf_callback)(printf_stream, "  suffix        always print instruction suffix\n");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   431
#endif
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   432
  (*printf_callback)(printf_stream, "  help          print this message\n");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   433
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   434
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   435
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   436
/* low-level bfd and arch stuff that binutils doesn't do for us */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   437
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   438
static const bfd_arch_info_type* find_arch_info(const char* arch_name) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   439
  const bfd_arch_info_type* arch_info = bfd_scan_arch(arch_name);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   440
  if (arch_info == NULL) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   441
    extern const bfd_arch_info_type bfd_default_arch_struct;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   442
    arch_info = &bfd_default_arch_struct;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   443
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   444
  return arch_info;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   445
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   446
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   447
static const char* native_arch_name() {
2564
85c3ae53ca1c 6684007: PrintAssembly plugin not available for linux or windows
never
parents: 347
diff changeset
   448
  const char* res = NULL;
85c3ae53ca1c 6684007: PrintAssembly plugin not available for linux or windows
never
parents: 347
diff changeset
   449
#ifdef LIBARCH_i386
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   450
  res = "i386";
2564
85c3ae53ca1c 6684007: PrintAssembly plugin not available for linux or windows
never
parents: 347
diff changeset
   451
#endif
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   452
#ifdef LIBARCH_amd64
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   453
  res = "i386:x86-64";
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   454
#endif
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   455
#ifdef LIBARCH_sparc
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   456
  res = "sparc:v8plusb";
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   457
#endif
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   458
#ifdef LIBARCH_sparcv9
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   459
  res = "sparc:v9b";
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   460
#endif
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   461
  if (res == NULL)
2564
85c3ae53ca1c 6684007: PrintAssembly plugin not available for linux or windows
never
parents: 347
diff changeset
   462
    res = "architecture not set in Makefile!";
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   463
  return res;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   464
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   465
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   466
static enum bfd_endian native_endian() {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   467
  int32_t endian_test = 'x';
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   468
  if (*(const char*) &endian_test == 'x')
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   469
    return BFD_ENDIAN_LITTLE;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   470
  else
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   471
    return BFD_ENDIAN_BIG;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   472
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   473
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   474
static bfd* get_native_bfd(const bfd_arch_info_type* arch_info,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   475
                           bfd* empty_bfd, bfd_target* empty_xvec) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   476
  memset(empty_bfd,  0, sizeof(*empty_bfd));
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   477
  memset(empty_xvec, 0, sizeof(*empty_xvec));
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   478
  empty_xvec->flavour = bfd_target_unknown_flavour;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   479
  empty_xvec->byteorder = native_endian();
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   480
  empty_bfd->xvec = empty_xvec;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   481
  empty_bfd->arch_info = arch_info;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   482
  return empty_bfd;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   483
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   484
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   485
static int read_zero_data_only(bfd_vma ignore_p,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   486
                               bfd_byte* myaddr, unsigned int length,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   487
                               struct disassemble_info *ignore_info) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   488
  memset(myaddr, 0, length);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   489
  return 0;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   490
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   491
static int print_to_dev_null(void* ignore_stream, const char* ignore_format, ...) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   492
  return 0;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   493
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   494
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   495
/* Prime the pump by running the selected disassembler on a null input.
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   496
   This forces the machine-specific disassembler to divulge invariant
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   497
   information like bytes_per_line.
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   498
 */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   499
static void parse_fake_insn(disassembler_ftype dfn,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   500
                            struct disassemble_info* dinfo) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   501
  typedef int (*read_memory_ftype)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   502
    (bfd_vma memaddr, bfd_byte *myaddr, unsigned int length,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   503
     struct disassemble_info *info);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   504
  read_memory_ftype read_memory_func = dinfo->read_memory_func;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   505
  fprintf_ftype     fprintf_func     = dinfo->fprintf_func;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   506
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   507
  dinfo->read_memory_func = &read_zero_data_only;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   508
  dinfo->fprintf_func     = &print_to_dev_null;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   509
  (*dfn)(0, dinfo);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   510
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   511
  /* put it back */
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   512
  dinfo->read_memory_func = read_memory_func;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   513
  dinfo->fprintf_func     = fprintf_func;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   514
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   515
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   516
static void init_disassemble_info_from_bfd(struct disassemble_info* dinfo,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   517
                                           void *stream,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   518
                                           fprintf_ftype fprintf_func,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   519
                                           bfd* abfd,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   520
                                           char* disassembler_options) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   521
  init_disassemble_info(dinfo, stream, fprintf_func);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   522
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   523
  dinfo->flavour = bfd_get_flavour(abfd);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   524
  dinfo->arch = bfd_get_arch(abfd);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   525
  dinfo->mach = bfd_get_mach(abfd);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   526
  dinfo->disassembler_options = disassembler_options;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   527
  dinfo->octets_per_byte = bfd_octets_per_byte (abfd);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   528
  dinfo->skip_zeroes = sizeof(void*) * 2;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   529
  dinfo->skip_zeroes_at_end = sizeof(void*)-1;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   530
  dinfo->disassembler_needs_relocs = FALSE;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   531
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   532
  if (bfd_big_endian(abfd))
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   533
    dinfo->display_endian = dinfo->endian = BFD_ENDIAN_BIG;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   534
  else if (bfd_little_endian(abfd))
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   535
    dinfo->display_endian = dinfo->endian = BFD_ENDIAN_LITTLE;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   536
  else
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   537
    dinfo->endian = native_endian();
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   538
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   539
  disassemble_init_for_target(dinfo);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   540
}