hotspot/src/share/tools/hsdis/hsdis.c
author vlivanov
Fri, 18 Dec 2015 20:23:26 +0300
changeset 35542 9dccb7f9f656
parent 35075 ca79cbf3f106
child 42062 473286891dd8
permissions -rw-r--r--
8071374: -XX:+PrintAssembly -XX:+PrintSignatureHandlers crash fastdebug VM with assert(limit == __null || limit <= nm->code_end()) in RelocIterator::initialize Reviewed-by: kvn, iklam, shade
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
/*
22822
696e77cc8e7b 8019926: PPC64 (part 106): Make hsdis build and work on Linux/PPC64
simonis
parents: 17618
diff changeset
     2
 * Copyright (c) 2008, 2013, 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
17618
882c7fe997eb 8012312: hsdis fails to compile with binutils-2.23.2
anoll
parents: 14384
diff changeset
    30
#include <config.h> /* required by bfd.h */
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    31
#include <libiberty.h>
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    32
#include <bfd.h>
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    33
#include <dis-asm.h>
2564
85c3ae53ca1c 6684007: PrintAssembly plugin not available for linux or windows
never
parents: 347
diff changeset
    34
#include <inttypes.h>
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    35
#include <string.h>
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    36
#include <errno.h>
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    37
#include "hsdis.h"
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    38
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    39
#ifndef bool
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    40
#define bool int
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    41
#define true 1
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    42
#define false 0
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    43
#endif /*bool*/
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    44
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    45
/* short names for stuff in hsdis.h */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    46
typedef decode_instructions_event_callback_ftype  event_callback_t;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    47
typedef decode_instructions_printf_callback_ftype printf_callback_t;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    48
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    49
/* disassemble_info.application_data object */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    50
struct hsdis_app_data {
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    51
  /* virtual address of data */
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    52
  uintptr_t start_va, end_va;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    53
  /* the instructions to be decoded */
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    54
  unsigned char* buffer;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    55
  uintptr_t length;
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    56
  event_callback_t  event_callback;  void* event_stream;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    57
  printf_callback_t printf_callback; void* printf_stream;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    58
  bool losing;
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    59
  bool do_newline;
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    60
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    61
  /* the architecture being disassembled */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    62
  const char* arch_name;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    63
  const bfd_arch_info_type* arch_info;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    64
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    65
  /* the disassembler we are going to use: */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    66
  disassembler_ftype      dfn;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    67
  struct disassemble_info dinfo; /* the actual struct! */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    68
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    69
  char mach_option[64];
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    70
  char insn_options[256];
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    71
};
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    72
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    73
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
    74
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    75
#define DECL_APP_DATA(dinfo) \
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    76
  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
    77
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    78
#define DECL_EVENT_CALLBACK(app_data) \
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    79
  event_callback_t  event_callback = (app_data)->event_callback; \
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    80
  void*             event_stream   = (app_data)->event_stream
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    81
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    82
#define DECL_PRINTF_CALLBACK(app_data) \
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    83
  printf_callback_t  printf_callback = (app_data)->printf_callback; \
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    84
  void*              printf_stream   = (app_data)->printf_stream
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
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    87
static void print_help(struct hsdis_app_data* app_data,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    88
                       const char* msg, const char* arg);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    89
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
    90
                           const char* options);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    91
static const char* format_insn_close(const char* close,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    92
                                     disassemble_info* dinfo,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    93
                                     char* buf, size_t bufsize);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    94
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    95
void*
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    96
#ifdef DLL_ENTRY
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    97
  DLL_ENTRY
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
    98
#endif
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
    99
decode_instructions_virtual(uintptr_t start_va, uintptr_t end_va,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   100
                            unsigned char* buffer, uintptr_t length,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   101
                            event_callback_t  event_callback_arg,  void* event_stream_arg,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   102
                            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
   103
                            const char* options, int newline) {
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   104
  struct hsdis_app_data app_data;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   105
  memset(&app_data, 0, sizeof(app_data));
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   106
  app_data.start_va    = start_va;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   107
  app_data.end_va      = end_va;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   108
  app_data.buffer = buffer;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   109
  app_data.length = length;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   110
  app_data.event_callback  = event_callback_arg;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   111
  app_data.event_stream    = event_stream_arg;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   112
  app_data.printf_callback = printf_callback_arg;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   113
  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
   114
  app_data.do_newline = newline == 0 ? false : true;
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   115
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   116
  return decode(&app_data, options);
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
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   119
/* This is the compatability interface for older version of hotspot */
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   120
void*
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   121
#ifdef DLL_ENTRY
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   122
  DLL_ENTRY
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   123
#endif
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   124
decode_instructions(void* start_pv, void* end_pv,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   125
                    event_callback_t  event_callback_arg,  void* event_stream_arg,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   126
                    printf_callback_t printf_callback_arg, void* printf_stream_arg,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   127
                    const char* options) {
35542
9dccb7f9f656 8071374: -XX:+PrintAssembly -XX:+PrintSignatureHandlers crash fastdebug VM with assert(limit == __null || limit <= nm->code_end()) in RelocIterator::initialize
vlivanov
parents: 35075
diff changeset
   128
  return decode_instructions_virtual((uintptr_t)start_pv,
9dccb7f9f656 8071374: -XX:+PrintAssembly -XX:+PrintSignatureHandlers crash fastdebug VM with assert(limit == __null || limit <= nm->code_end()) in RelocIterator::initialize
vlivanov
parents: 35075
diff changeset
   129
                                     (uintptr_t)end_pv,
9dccb7f9f656 8071374: -XX:+PrintAssembly -XX:+PrintSignatureHandlers crash fastdebug VM with assert(limit == __null || limit <= nm->code_end()) in RelocIterator::initialize
vlivanov
parents: 35075
diff changeset
   130
                                     (unsigned char*)start_pv,
9dccb7f9f656 8071374: -XX:+PrintAssembly -XX:+PrintSignatureHandlers crash fastdebug VM with assert(limit == __null || limit <= nm->code_end()) in RelocIterator::initialize
vlivanov
parents: 35075
diff changeset
   131
                                     (uintptr_t)end_pv - (uintptr_t)start_pv,
9dccb7f9f656 8071374: -XX:+PrintAssembly -XX:+PrintSignatureHandlers crash fastdebug VM with assert(limit == __null || limit <= nm->code_end()) in RelocIterator::initialize
vlivanov
parents: 35075
diff changeset
   132
                                     event_callback_arg,
9dccb7f9f656 8071374: -XX:+PrintAssembly -XX:+PrintSignatureHandlers crash fastdebug VM with assert(limit == __null || limit <= nm->code_end()) in RelocIterator::initialize
vlivanov
parents: 35075
diff changeset
   133
                                     event_stream_arg,
9dccb7f9f656 8071374: -XX:+PrintAssembly -XX:+PrintSignatureHandlers crash fastdebug VM with assert(limit == __null || limit <= nm->code_end()) in RelocIterator::initialize
vlivanov
parents: 35075
diff changeset
   134
                                     printf_callback_arg,
9dccb7f9f656 8071374: -XX:+PrintAssembly -XX:+PrintSignatureHandlers crash fastdebug VM with assert(limit == __null || limit <= nm->code_end()) in RelocIterator::initialize
vlivanov
parents: 35075
diff changeset
   135
                                     printf_stream_arg,
9dccb7f9f656 8071374: -XX:+PrintAssembly -XX:+PrintSignatureHandlers crash fastdebug VM with assert(limit == __null || limit <= nm->code_end()) in RelocIterator::initialize
vlivanov
parents: 35075
diff changeset
   136
                                     options, false);
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   137
}
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   138
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   139
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
   140
  setup_app_data(app_data, options);
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   141
  char buf[128];
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
  {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   144
    /* now reload everything from app_data: */
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   145
    DECL_EVENT_CALLBACK(app_data);
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   146
    DECL_PRINTF_CALLBACK(app_data);
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   147
    uintptr_t start = app_data->start_va;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   148
    uintptr_t end   = app_data->end_va;
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   149
    uintptr_t p     = start;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   150
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   151
    (*event_callback)(event_stream, "insns", (void*)start);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   152
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   153
    (*event_callback)(event_stream, "mach name='%s'",
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   154
                      (void*) app_data->arch_info->printable_name);
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   155
    if (app_data->dinfo.bytes_per_line != 0) {
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   156
      (*event_callback)(event_stream, "format bytes-per-line='%p'/",
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   157
                        (void*)(intptr_t) app_data->dinfo.bytes_per_line);
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   158
    }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   159
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   160
    while (p < end && !app_data->losing) {
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   161
      (*event_callback)(event_stream, "insn", (void*) p);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   162
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   163
      /* reset certain state, so we can read it with confidence */
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   164
      app_data->dinfo.insn_info_valid    = 0;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   165
      app_data->dinfo.branch_delay_insns = 0;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   166
      app_data->dinfo.data_size          = 0;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   167
      app_data->dinfo.insn_type          = 0;
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   168
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   169
      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
   170
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   171
      if (size > 0)  p += size;
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   172
      else           app_data->losing = true;
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   173
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   174
      if (!app_data->losing) {
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   175
        const char* insn_close = format_insn_close("/insn", &app_data->dinfo,
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   176
                                                   buf, sizeof(buf));
14384
801df8025142 8000489: older builds of hsdis don't work anymore after 6879063
minqi
parents: 13873
diff changeset
   177
        (*event_callback)(event_stream, insn_close, (void*) p);
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   178
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   179
        if (app_data->do_newline) {
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   180
          /* follow each complete insn by a nice newline */
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   181
          (*printf_callback)(printf_stream, "\n");
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   182
        }
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   183
      }
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   184
    }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   185
14384
801df8025142 8000489: older builds of hsdis don't work anymore after 6879063
minqi
parents: 13873
diff changeset
   186
    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
   187
    return (void*) p;
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
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   191
/* 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
   192
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
   193
const decode_func_stype decode_func_address = &decode_instructions;
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   194
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   195
static const char* format_insn_close(const char* close,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   196
                                     disassemble_info* dinfo,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   197
                                     char* buf, size_t bufsize) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   198
  if (!dinfo->insn_info_valid)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   199
    return close;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   200
  enum dis_insn_type itype = dinfo->insn_type;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   201
  int dsize = dinfo->data_size, delays = dinfo->branch_delay_insns;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   202
  if ((itype == dis_nonbranch && (dsize | delays) == 0)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   203
      || (strlen(close) + 3*20 > bufsize))
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   204
    return close;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   205
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   206
  const char* type = "unknown";
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   207
  switch (itype) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   208
  case dis_nonbranch:   type = NULL;         break;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   209
  case dis_branch:      type = "branch";     break;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   210
  case dis_condbranch:  type = "condbranch"; break;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   211
  case dis_jsr:         type = "jsr";        break;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   212
  case dis_condjsr:     type = "condjsr";    break;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   213
  case dis_dref:        type = "dref";       break;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   214
  case dis_dref2:       type = "dref2";      break;
35542
9dccb7f9f656 8071374: -XX:+PrintAssembly -XX:+PrintSignatureHandlers crash fastdebug VM with assert(limit == __null || limit <= nm->code_end()) in RelocIterator::initialize
vlivanov
parents: 35075
diff changeset
   215
  case dis_noninsn:     type = "noninsn";    break;
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   216
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   217
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   218
  strcpy(buf, close);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   219
  char* p = buf;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   220
  if (type)    sprintf(p += strlen(p), " type='%s'", type);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   221
  if (dsize)   sprintf(p += strlen(p), " dsize='%d'", dsize);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   222
  if (delays)  sprintf(p += strlen(p), " delay='%d'", delays);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   223
  return buf;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   224
}
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
/* handler functions */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   227
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   228
static int
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   229
hsdis_read_memory_func(bfd_vma memaddr,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   230
                       bfd_byte* myaddr,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   231
                       unsigned int length,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   232
                       struct disassemble_info* dinfo) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   233
  DECL_APP_DATA(dinfo);
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   234
  /* convert the virtual address memaddr into an address within memory buffer */
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   235
  uintptr_t offset = ((uintptr_t) memaddr) - app_data->start_va;
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   236
  if (offset + length > app_data->length) {
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   237
    /* read is out of bounds */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   238
    return EIO;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   239
  } else {
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   240
    memcpy(myaddr, (bfd_byte*) (app_data->buffer + offset), length);
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   241
    return 0;
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
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   244
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   245
static void
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   246
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
   247
  /* the actual value to print: */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   248
  void* addr_value = (void*) (uintptr_t) vma;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   249
  DECL_APP_DATA(dinfo);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   250
  DECL_EVENT_CALLBACK(app_data);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   251
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   252
  /* issue the event: */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   253
  void* result =
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   254
    (*event_callback)(event_stream, "addr/", addr_value);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   255
  if (result == NULL) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   256
    /* event declined */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   257
    generic_print_address(vma, dinfo);
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
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
/* configuration */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   263
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   264
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
   265
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
   266
                                 const char* caller_options);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   267
static const char* native_arch_name();
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   268
static enum bfd_endian native_endian();
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   269
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
   270
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
   271
                           /* to avoid malloc: */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   272
                           bfd* empty_bfd, bfd_target* empty_xvec);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   273
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
   274
                                           void *stream,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   275
                                           fprintf_ftype fprintf_func,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   276
                                           bfd* bfd,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   277
                                           char* disassembler_options);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   278
static void parse_fake_insn(disassembler_ftype dfn,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   279
                            struct disassemble_info* dinfo);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   280
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   281
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
   282
                           const char* caller_options) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   283
  /* Make reasonable defaults for null callbacks.
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   284
     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
   285
     Events are rendered as XML.
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
  set_optional_callbacks(app_data);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   288
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   289
  /* Look into caller_options for anything interesting. */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   290
  if (caller_options != NULL)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   291
    parse_caller_options(app_data, caller_options);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   292
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   293
  /* Discover which architecture we are going to disassemble. */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   294
  app_data->arch_name = &app_data->mach_option[0];
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   295
  if (app_data->arch_name[0] == '\0')
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   296
    app_data->arch_name = native_arch_name();
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   297
  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
   298
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   299
  /* 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
   300
  struct {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   301
    bfd_target empty_xvec;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   302
    bfd        empty_bfd;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   303
  } buf;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   304
  bfd* native_bfd = get_native_bfd(app_data->arch_info,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   305
                                   /* to avoid malloc: */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   306
                                   &buf.empty_bfd, &buf.empty_xvec);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   307
  init_disassemble_info_from_bfd(&app_data->dinfo,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   308
                                 app_data->printf_stream,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   309
                                 app_data->printf_callback,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   310
                                 native_bfd,
22822
696e77cc8e7b 8019926: PPC64 (part 106): Make hsdis build and work on Linux/PPC64
simonis
parents: 17618
diff changeset
   311
                                 /* On PowerPC we get warnings, if we pass empty options */
696e77cc8e7b 8019926: PPC64 (part 106): Make hsdis build and work on Linux/PPC64
simonis
parents: 17618
diff changeset
   312
                                 (caller_options == NULL) ? NULL : app_data->insn_options);
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   313
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   314
  /* Finish linking together the various callback blocks. */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   315
  app_data->dinfo.application_data = (void*) app_data;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   316
  app_data->dfn = disassembler(native_bfd);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   317
  app_data->dinfo.print_address_func = hsdis_print_address_func;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   318
  app_data->dinfo.read_memory_func = hsdis_read_memory_func;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   319
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   320
  if (app_data->dfn == NULL) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   321
    const char* bad = app_data->arch_name;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   322
    static bool complained;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   323
    if (bad == &app_data->mach_option[0])
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   324
      print_help(app_data, "bad mach=%s", bad);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   325
    else if (!complained)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   326
      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
   327
    complained = true;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   328
    /* must bail out */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   329
    app_data->losing = true;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   330
    return;
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
  parse_fake_insn(app_data->dfn, &app_data->dinfo);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   334
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   335
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   336
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   337
/* ignore all events, return a null */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   338
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
   339
  return NULL;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   340
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   341
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   342
/* print all events as XML markup */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   343
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
   344
  FILE* fp = (FILE*) stream;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   345
#define NS_PFX "dis:"
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   346
  if (event[0] != '/') {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   347
    /* issue the tag, with or without a formatted argument */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   348
    fprintf(fp, "<"NS_PFX);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   349
    fprintf(fp, event, arg);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   350
    fprintf(fp, ">");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   351
  } else {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   352
    ++event;                    /* skip slash */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   353
    const char* argp = strchr(event, ' ');
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   354
    if (argp == NULL) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   355
      /* no arguments; just issue the closing tag */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   356
      fprintf(fp, "</"NS_PFX"%s>", event);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   357
    } else {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   358
      /* 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
   359
      int event_prefix = (argp - event);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   360
      fprintf(fp, "<"NS_PFX"%.*s_done", event_prefix, event);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   361
      fprintf(fp, argp, arg);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   362
      fprintf(fp, "/></"NS_PFX"%.*s>", event_prefix, event);
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
  return NULL;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   366
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   367
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   368
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
   369
  if (app_data->printf_callback == NULL) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   370
    int (*fprintf_callback)(FILE*, const char*, ...) = &fprintf;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   371
    FILE* fprintf_stream = stdout;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   372
    app_data->printf_callback = (printf_callback_t) fprintf_callback;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   373
    if (app_data->printf_stream == NULL)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   374
      app_data->printf_stream   = (void*)           fprintf_stream;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   375
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   376
  if (app_data->event_callback == NULL) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   377
    if (app_data->event_stream == NULL)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   378
      app_data->event_callback = &null_event_callback;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   379
    else
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   380
      app_data->event_callback = &xml_event_callback;
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
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   383
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   384
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   385
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
   386
  char* iop_base = app_data->insn_options;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   387
  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
   388
  char* iop = iop_base;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   389
  const char* p;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   390
  for (p = caller_options; p != NULL; ) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   391
    const char* q = strchr(p, ',');
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   392
    size_t plen = (q == NULL) ? strlen(p) : ((q++) - p);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   393
    if (plen == 4 && strncmp(p, "help", plen) == 0) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   394
      print_help(app_data, NULL, NULL);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   395
    } else if (plen >= 5 && strncmp(p, "mach=", 5) == 0) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   396
      char*  mach_option = app_data->mach_option;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   397
      size_t mach_size   = sizeof(app_data->mach_option);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   398
      mach_size -= 1;           /*leave room for the null*/
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   399
      if (plen > mach_size)  plen = mach_size;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   400
      strncpy(mach_option, p, plen);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   401
      mach_option[plen] = '\0';
11782
38cbdb77b3d1 7140985: HSDIS does not handle caller options correctly
kvn
parents: 8921
diff changeset
   402
    } else if (plen > 6 && strncmp(p, "hsdis-", 6) == 0) {
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   403
      // do not pass these to the next level
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   404
    } else {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   405
      /* 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
   406
      if (iop > iop_base && iop < iop_limit)  (*iop++) = ',';
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   407
      if (iop + plen > iop_limit)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   408
        plen = iop_limit - iop;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   409
      strncpy(iop, p, plen);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   410
      iop += plen;
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
    p = q;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   413
  }
30281
b1608535e50f 8076475: Misuses of strncpy/strncat
stuefe
parents: 29191
diff changeset
   414
  *iop = '\0';
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   415
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   416
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   417
static void print_help(struct hsdis_app_data* app_data,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   418
                       const char* msg, const char* arg) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   419
  DECL_PRINTF_CALLBACK(app_data);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   420
  if (msg != NULL) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   421
    (*printf_callback)(printf_stream, "hsdis: ");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   422
    (*printf_callback)(printf_stream, msg, arg);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   423
    (*printf_callback)(printf_stream, "\n");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   424
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   425
  (*printf_callback)(printf_stream, "hsdis output options:\n");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   426
  if (printf_callback == (printf_callback_t) &fprintf)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   427
    disassembler_usage((FILE*) printf_stream);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   428
  else
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   429
    disassembler_usage(stderr); /* better than nothing */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   430
  (*printf_callback)(printf_stream, "  mach=<arch>   select disassembly mode\n");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   431
#if defined(LIBARCH_i386) || defined(LIBARCH_amd64)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   432
  (*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
   433
  (*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
   434
  (*printf_callback)(printf_stream, "  suffix        always print instruction suffix\n");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   435
#endif
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   436
  (*printf_callback)(printf_stream, "  help          print this message\n");
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
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   439
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   440
/* 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
   441
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   442
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
   443
  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
   444
  if (arch_info == NULL) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   445
    extern const bfd_arch_info_type bfd_default_arch_struct;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   446
    arch_info = &bfd_default_arch_struct;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   447
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   448
  return arch_info;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   449
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   450
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   451
static const char* native_arch_name() {
2564
85c3ae53ca1c 6684007: PrintAssembly plugin not available for linux or windows
never
parents: 347
diff changeset
   452
  const char* res = NULL;
85c3ae53ca1c 6684007: PrintAssembly plugin not available for linux or windows
never
parents: 347
diff changeset
   453
#ifdef LIBARCH_i386
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   454
  res = "i386";
2564
85c3ae53ca1c 6684007: PrintAssembly plugin not available for linux or windows
never
parents: 347
diff changeset
   455
#endif
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   456
#ifdef LIBARCH_amd64
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   457
  res = "i386:x86-64";
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   458
#endif
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   459
#ifdef LIBARCH_sparc
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   460
  res = "sparc:v8plusb";
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   461
#endif
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   462
#ifdef LIBARCH_sparcv9
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   463
  res = "sparc:v9b";
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   464
#endif
35075
ca79cbf3f106 8073139: PPC64: User-visible arch directory and os.arch value on ppc64le cause issues with Java tooling
asmundak
parents: 30281
diff changeset
   465
#if  defined(LIBARCH_ppc64) || defined(LIBARCH_ppc64le)
22822
696e77cc8e7b 8019926: PPC64 (part 106): Make hsdis build and work on Linux/PPC64
simonis
parents: 17618
diff changeset
   466
  res = "powerpc:common64";
696e77cc8e7b 8019926: PPC64 (part 106): Make hsdis build and work on Linux/PPC64
simonis
parents: 17618
diff changeset
   467
#endif
29191
07d26bb7e4bc 8072698: Add AArch64 support to hsdis
aph
parents: 22872
diff changeset
   468
#ifdef LIBARCH_aarch64
07d26bb7e4bc 8072698: Add AArch64 support to hsdis
aph
parents: 22872
diff changeset
   469
  res = "aarch64";
07d26bb7e4bc 8072698: Add AArch64 support to hsdis
aph
parents: 22872
diff changeset
   470
#endif
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   471
  if (res == NULL)
2564
85c3ae53ca1c 6684007: PrintAssembly plugin not available for linux or windows
never
parents: 347
diff changeset
   472
    res = "architecture not set in Makefile!";
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   473
  return res;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   474
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   475
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   476
static enum bfd_endian native_endian() {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   477
  int32_t endian_test = 'x';
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   478
  if (*(const char*) &endian_test == 'x')
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   479
    return BFD_ENDIAN_LITTLE;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   480
  else
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   481
    return BFD_ENDIAN_BIG;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   482
}
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
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
   485
                           bfd* empty_bfd, bfd_target* empty_xvec) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   486
  memset(empty_bfd,  0, sizeof(*empty_bfd));
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   487
  memset(empty_xvec, 0, sizeof(*empty_xvec));
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   488
  empty_xvec->flavour = bfd_target_unknown_flavour;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   489
  empty_xvec->byteorder = native_endian();
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   490
  empty_bfd->xvec = empty_xvec;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   491
  empty_bfd->arch_info = arch_info;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   492
  return empty_bfd;
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
static int read_zero_data_only(bfd_vma ignore_p,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   496
                               bfd_byte* myaddr, unsigned int length,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   497
                               struct disassemble_info *ignore_info) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   498
  memset(myaddr, 0, length);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   499
  return 0;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   500
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   501
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
   502
  return 0;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   503
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   504
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   505
/* 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
   506
   This forces the machine-specific disassembler to divulge invariant
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   507
   information like bytes_per_line.
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   508
 */
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   509
static void parse_fake_insn(disassembler_ftype dfn,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   510
                            struct disassemble_info* dinfo) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   511
  typedef int (*read_memory_ftype)
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   512
    (bfd_vma memaddr, bfd_byte *myaddr, unsigned int length,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   513
     struct disassemble_info *info);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   514
  read_memory_ftype read_memory_func = dinfo->read_memory_func;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   515
  fprintf_ftype     fprintf_func     = dinfo->fprintf_func;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   516
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   517
  dinfo->read_memory_func = &read_zero_data_only;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   518
  dinfo->fprintf_func     = &print_to_dev_null;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   519
  (*dfn)(0, dinfo);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   520
13873
7b72e3873785 6879063: SA should use hsdis for disassembly
minqi
parents: 11782
diff changeset
   521
  /* put it back */
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   522
  dinfo->read_memory_func = read_memory_func;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   523
  dinfo->fprintf_func     = fprintf_func;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   524
}
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   525
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   526
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
   527
                                           void *stream,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   528
                                           fprintf_ftype fprintf_func,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   529
                                           bfd* abfd,
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   530
                                           char* disassembler_options) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   531
  init_disassemble_info(dinfo, stream, fprintf_func);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   532
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   533
  dinfo->flavour = bfd_get_flavour(abfd);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   534
  dinfo->arch = bfd_get_arch(abfd);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   535
  dinfo->mach = bfd_get_mach(abfd);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   536
  dinfo->disassembler_options = disassembler_options;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   537
  dinfo->octets_per_byte = bfd_octets_per_byte (abfd);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   538
  dinfo->skip_zeroes = sizeof(void*) * 2;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   539
  dinfo->skip_zeroes_at_end = sizeof(void*)-1;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   540
  dinfo->disassembler_needs_relocs = FALSE;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   541
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   542
  if (bfd_big_endian(abfd))
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   543
    dinfo->display_endian = dinfo->endian = BFD_ENDIAN_BIG;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   544
  else if (bfd_little_endian(abfd))
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   545
    dinfo->display_endian = dinfo->endian = BFD_ENDIAN_LITTLE;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   546
  else
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   547
    dinfo->endian = native_endian();
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   548
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   549
  disassemble_init_for_target(dinfo);
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents:
diff changeset
   550
}