hotspot/src/share/vm/code/relocInfo.cpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 14626 0cf4eccf130f
child 18446 635eae7b22fc
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:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
     2
 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
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: 1
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    25
#include "precompiled.hpp"
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 13728
diff changeset
    26
#include "code/codeCache.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    27
#include "code/compiledIC.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    28
#include "code/nmethod.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    29
#include "code/relocInfo.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    30
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    31
#include "runtime/stubCodeGenerator.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    32
#include "utilities/copy.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
const RelocationHolder RelocationHolder::none; // its type is relocInfo::none
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
// Implementation of relocInfo
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
relocInfo::relocInfo(relocType t, int off, int f) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  assert(t != data_prefix_tag, "cannot build a prefix this way");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  assert((t & type_mask) == t, "wrong type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  assert((f & format_mask) == f, "wrong format");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  assert(off >= 0 && off < offset_limit(), "offset out off bounds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  assert((off & (offset_unit-1)) == 0, "misaligned offset");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  (*this) = relocInfo(t, RAW_BITS, off, f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
void relocInfo::initialize(CodeSection* dest, Relocation* reloc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  relocInfo* data = this+1;  // here's where the data might go
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  dest->set_locs_end(data);  // sync end: the next call may read dest.locs_end
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  reloc->pack_data_to(dest); // maybe write data into locs, advancing locs_end
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  relocInfo* data_limit = dest->locs_end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  if (data_limit > data) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
    relocInfo suffix = (*this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
    data_limit = this->finish_prefix((short*) data_limit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
    // Finish up with the suffix.  (Hack note: pack_data_to might edit this.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
    *data_limit = suffix;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
    dest->set_locs_end(data_limit+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
relocInfo* relocInfo::finish_prefix(short* prefix_limit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  assert(sizeof(relocInfo) == sizeof(short), "change this code");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  short* p = (short*)(this+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  assert(prefix_limit >= p, "must be a valid span of data");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  int plen = prefix_limit - p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  if (plen == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
    debug_only(_value = 0xFFFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
    return this;                         // no data: remove self completely
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  if (plen == 1 && fits_into_immediate(p[0])) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
    (*this) = immediate_relocInfo(p[0]); // move data inside self
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
    return this+1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  // cannot compact, so just update the count and return the limit pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  (*this) = prefix_relocInfo(plen);   // write new datalen
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  assert(data() + datalen() == prefix_limit, "pointers must line up");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  return (relocInfo*)prefix_limit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
void relocInfo::set_type(relocType t) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  int old_offset = addr_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  int old_format = format();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  (*this) = relocInfo(t, old_offset, old_format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  assert(type()==(int)t, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  assert(addr_offset()==old_offset, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  assert(format()==old_format, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
void relocInfo::set_format(int f) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  int old_offset = addr_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  assert((f & format_mask) == f, "wrong format");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  _value = (_value & ~(format_mask << offset_width)) | (f << offset_width);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  assert(addr_offset()==old_offset, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
void relocInfo::change_reloc_info_for_address(RelocIterator *itr, address pc, relocType old_type, relocType new_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  bool found = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  while (itr->next() && !found) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
    if (itr->addr() == pc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
      assert(itr->type()==old_type, "wrong relocInfo type found");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
      itr->current()->set_type(new_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
      found=true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  assert(found, "no relocInfo found for pc");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
void relocInfo::remove_reloc_info_for_address(RelocIterator *itr, address pc, relocType old_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  change_reloc_info_for_address(itr, pc, old_type, none);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
// ----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
// Implementation of RelocIterator
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
5686
5435e77aa3df 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1
diff changeset
   124
void RelocIterator::initialize(nmethod* nm, address begin, address limit) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  initialize_misc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
5686
5435e77aa3df 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1
diff changeset
   127
  if (nm == NULL && begin != NULL) {
5435e77aa3df 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1
diff changeset
   128
    // allow nmethod to be deduced from beginning address
5435e77aa3df 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1
diff changeset
   129
    CodeBlob* cb = CodeCache::find_blob(begin);
5435e77aa3df 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1
diff changeset
   130
    nm = cb->as_nmethod_or_null();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  }
5686
5435e77aa3df 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1
diff changeset
   132
  assert(nm != NULL, "must be able to deduce nmethod from other arguments");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
5686
5435e77aa3df 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1
diff changeset
   134
  _code    = nm;
5435e77aa3df 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1
diff changeset
   135
  _current = nm->relocation_begin() - 1;
5435e77aa3df 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1
diff changeset
   136
  _end     = nm->relocation_end();
6432
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   137
  _addr    = nm->content_begin();
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   138
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   139
  // Initialize code sections.
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   140
  _section_start[CodeBuffer::SECT_CONSTS] = nm->consts_begin();
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   141
  _section_start[CodeBuffer::SECT_INSTS ] = nm->insts_begin() ;
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   142
  _section_start[CodeBuffer::SECT_STUBS ] = nm->stub_begin()  ;
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   143
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   144
  _section_end  [CodeBuffer::SECT_CONSTS] = nm->consts_end()  ;
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   145
  _section_end  [CodeBuffer::SECT_INSTS ] = nm->insts_end()   ;
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   146
  _section_end  [CodeBuffer::SECT_STUBS ] = nm->stub_end()    ;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  assert(!has_current(), "just checking");
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 5702
diff changeset
   149
  assert(begin == NULL || begin >= nm->code_begin(), "in bounds");
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 5702
diff changeset
   150
  assert(limit == NULL || limit <= nm->code_end(),   "in bounds");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  set_limits(begin, limit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
RelocIterator::RelocIterator(CodeSection* cs, address begin, address limit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  initialize_misc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  _current = cs->locs_start()-1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  _end     = cs->locs_end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  _addr    = cs->start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  _code    = NULL; // Not cb->blob();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  CodeBuffer* cb = cs->outer();
6432
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   164
  assert((int) SECT_LIMIT == CodeBuffer::SECT_LIMIT, "my copy must be equal");
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   165
  for (int n = (int) CodeBuffer::SECT_FIRST; n < (int) CodeBuffer::SECT_LIMIT; n++) {
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   166
    CodeSection* cs = cb->code_section(n);
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   167
    _section_start[n] = cs->start();
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   168
    _section_end  [n] = cs->end();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  assert(!has_current(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  assert(begin == NULL || begin >= cs->start(), "in bounds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  assert(limit == NULL || limit <= cs->end(),   "in bounds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  set_limits(begin, limit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
enum { indexCardSize = 128 };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
struct RelocIndexEntry {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  jint addr_offset;          // offset from header_end of an addr()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  jint reloc_offset;         // offset from header_end of a relocInfo (prefix)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
6432
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   186
bool RelocIterator::addr_in_const() const {
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   187
  const int n = CodeBuffer::SECT_CONSTS;
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   188
  return section_start(n) <= addr() && addr() < section_end(n);
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   189
}
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   190
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   191
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
static inline int num_cards(int code_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  return (code_size-1) / indexCardSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
int RelocIterator::locs_and_index_size(int code_size, int locs_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  if (!UseRelocIndex)  return locs_size;   // no index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  code_size = round_to(code_size, oopSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  locs_size = round_to(locs_size, oopSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  int index_size = num_cards(code_size) * sizeof(RelocIndexEntry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  // format of indexed relocs:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  //   relocation_begin:   relocInfo ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  //   index:              (addr,reloc#) ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  //                       indexSize           :relocation_end
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  return locs_size + index_size + BytesPerInt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
void RelocIterator::create_index(relocInfo* dest_begin, int dest_count, relocInfo* dest_end) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  address relocation_begin = (address)dest_begin;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  address relocation_end   = (address)dest_end;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  int     total_size       = relocation_end - relocation_begin;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  int     locs_size        = dest_count * sizeof(relocInfo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  if (!UseRelocIndex) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
    Copy::fill_to_bytes(relocation_begin + locs_size, total_size-locs_size, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  int     index_size       = total_size - locs_size - BytesPerInt;      // find out how much space is left
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  int     ncards           = index_size / sizeof(RelocIndexEntry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  assert(total_size == locs_size + index_size + BytesPerInt, "checkin'");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  assert(index_size >= 0 && index_size % sizeof(RelocIndexEntry) == 0, "checkin'");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  jint*   index_size_addr  = (jint*)relocation_end - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  assert(sizeof(jint) == BytesPerInt, "change this code");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  *index_size_addr = index_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  if (index_size != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
    assert(index_size > 0, "checkin'");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
    RelocIndexEntry* index = (RelocIndexEntry *)(relocation_begin + locs_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
    assert(index == (RelocIndexEntry*)index_size_addr - ncards, "checkin'");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
    // walk over the relocations, and fill in index entries as we go
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
    RelocIterator iter;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
    const address    initial_addr    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
    relocInfo* const initial_current = dest_begin - 1;  // biased by -1 like elsewhere
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
    iter._code    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    iter._addr    = initial_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
    iter._limit   = (address)(intptr_t)(ncards * indexCardSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
    iter._current = initial_current;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
    iter._end     = dest_begin + dest_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
    int i = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
    address next_card_addr = (address)indexCardSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    int addr_offset = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
    int reloc_offset = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
    while (true) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
      // Checkpoint the iterator before advancing it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
      addr_offset  = iter._addr    - initial_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
      reloc_offset = iter._current - initial_current;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
      if (!iter.next())  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
      while (iter.addr() >= next_card_addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
        index[i].addr_offset  = addr_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
        index[i].reloc_offset = reloc_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
        i++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
        next_card_addr += indexCardSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
    while (i < ncards) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
      index[i].addr_offset  = addr_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
      index[i].reloc_offset = reloc_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
      i++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
void RelocIterator::set_limits(address begin, address limit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  int index_size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  if (UseRelocIndex && _code != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    index_size = ((jint*)_end)[-1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
    _end = (relocInfo*)( (address)_end - index_size - BytesPerInt );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  _limit = limit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  // the limit affects this next stuff:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  if (begin != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    // In ASSERT mode we do not actually use the index, but simply
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
    // check that its contents would have led us to the right answer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
    address addrCheck = _addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
    relocInfo* infoCheck = _current;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
#endif // ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
    if (index_size > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
      // skip ahead
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
      RelocIndexEntry* index       = (RelocIndexEntry*)_end;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
      RelocIndexEntry* index_limit = (RelocIndexEntry*)((address)index + index_size);
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 5702
diff changeset
   291
      assert(_addr == _code->code_begin(), "_addr must be unadjusted");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
      int card = (begin - _addr) / indexCardSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
      if (card > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
        if (index+card-1 < index_limit)  index += card-1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
        else                             index = index_limit - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
        addrCheck = _addr    + index->addr_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
        infoCheck = _current + index->reloc_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
        // Advance the iterator immediately to the last valid state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
        // for the previous card.  Calling "next" will then advance
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
        // it to the first item on the required card.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
        _addr    += index->addr_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
        _current += index->reloc_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
#endif // ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
    relocInfo* backup;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
    address    backup_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
    while (true) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
      backup      = _current;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
      backup_addr = _addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
      if (backup == infoCheck) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
        assert(backup_addr == addrCheck, "must match"); addrCheck = NULL; infoCheck = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
        assert(addrCheck == NULL || backup_addr <= addrCheck, "must not pass addrCheck");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
#endif // ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
      if (!next() || addr() >= begin) break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    assert(addrCheck == NULL || addrCheck == backup_addr, "must have matched addrCheck");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
    assert(infoCheck == NULL || infoCheck == backup,      "must have matched infoCheck");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    // At this point, either we are at the first matching record,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    // or else there is no such record, and !has_current().
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    // In either case, revert to the immediatly preceding state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
    _current = backup;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    _addr    = backup_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    set_has_current(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
void RelocIterator::set_limit(address limit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  address code_end = (address)code() + code()->size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  assert(limit == NULL || limit <= code_end, "in bounds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  _limit = limit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
void PatchingRelocIterator:: prepass() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  // turn breakpoints off during patching
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  _init_state = (*this);        // save cursor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  while (next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
    if (type() == relocInfo::breakpoint_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
      breakpoint_reloc()->set_active(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  (RelocIterator&)(*this) = _init_state;        // reset cursor for client
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
void PatchingRelocIterator:: postpass() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  // turn breakpoints back on after patching
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  (RelocIterator&)(*this) = _init_state;        // reset cursor again
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  while (next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
    if (type() == relocInfo::breakpoint_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
      breakpoint_Relocation* bpt = breakpoint_reloc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
      bpt->set_active(bpt->enabled());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
// All the strange bit-encodings are in here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
// The idea is to encode relocation data which are small integers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
// very efficiently (a single extra halfword).  Larger chunks of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
// relocation data need a halfword header to hold their size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
void RelocIterator::advance_over_prefix() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  if (_current->is_datalen()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
    _data    = (short*) _current->data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
    _datalen =          _current->datalen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
    _current += _datalen + 1;   // skip the embedded data & header
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
    _databuf = _current->immediate();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
    _data = &_databuf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
    _datalen = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
    _current++;                 // skip the header
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  // The client will see the following relocInfo, whatever that is.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  // It is the reloc to which the preceding data applies.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
6432
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   386
void RelocIterator::initialize_misc() {
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   387
  set_has_current(false);
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   388
  for (int i = (int) CodeBuffer::SECT_FIRST; i < (int) CodeBuffer::SECT_LIMIT; i++) {
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   389
    _section_start[i] = NULL;  // these will be lazily computed, if needed
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   390
    _section_end  [i] = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
Relocation* RelocIterator::reloc() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  // (take the "switch" out-of-line)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  relocInfo::relocType t = type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  if (false) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  #define EACH_TYPE(name)                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  else if (t == relocInfo::name##_type) {             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
    return name##_reloc();                            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  APPLY_TO_RELOCATIONS(EACH_TYPE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  #undef EACH_TYPE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  assert(t == relocInfo::none, "must be padding");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  return new(_rh) Relocation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
//////// Methods for flyweight Relocation types
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
RelocationHolder RelocationHolder::plus(int offset) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  if (offset != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
    switch (type()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
    case relocInfo::none:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
    case relocInfo::oop_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
        oop_Relocation* r = (oop_Relocation*)reloc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
        return oop_Relocation::spec(r->oop_index(), r->offset() + offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
      }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   423
    case relocInfo::metadata_type:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   424
      {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   425
        metadata_Relocation* r = (metadata_Relocation*)reloc();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   426
        return metadata_Relocation::spec(r->metadata_index(), r->offset() + offset);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   427
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  return (*this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
void Relocation::guarantee_size() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  guarantee(false, "Make _relocbuf bigger!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
    // some relocations can compute their own values
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
address Relocation::value() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
void Relocation::set_value(address x) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
RelocationHolder Relocation::spec_simple(relocInfo::relocType rtype) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  if (rtype == relocInfo::none)  return RelocationHolder::none;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  relocInfo ri = relocInfo(rtype, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  RelocIterator itr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  itr.set_current(ri);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  itr.reloc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  return itr._rh;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
int32_t Relocation::runtime_address_to_index(address runtime_address) {
9111
c100c09c66f2 6777083: assert(target != __null,"must not be null")
never
parents: 8724
diff changeset
   462
  assert(!is_reloc_index((intptr_t)runtime_address), "must not look like an index");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  if (runtime_address == NULL)  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  StubCodeDesc* p = StubCodeDesc::desc_for(runtime_address);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  if (p != NULL && p->begin() == runtime_address) {
9111
c100c09c66f2 6777083: assert(target != __null,"must not be null")
never
parents: 8724
diff changeset
   468
    assert(is_reloc_index(p->index()), "there must not be too many stubs");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
    return (int32_t)p->index();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
    // Known "miscellaneous" non-stub pointers:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
    // os::get_polling_page(), SafepointSynchronize::address_of_state()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
    if (PrintRelocations) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
      tty->print_cr("random unregistered address in relocInfo: " INTPTR_FORMAT, runtime_address);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
#ifndef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
    return (int32_t) (intptr_t)runtime_address;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
    // didn't fit return non-index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
    return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
#endif /* _LP64 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
address Relocation::index_to_runtime_address(int32_t index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  if (index == 0)  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
9111
c100c09c66f2 6777083: assert(target != __null,"must not be null")
never
parents: 8724
diff changeset
   489
  if (is_reloc_index(index)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
    StubCodeDesc* p = StubCodeDesc::desc_for_index(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
    assert(p != NULL, "there must be a stub for this index");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
    return p->begin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
#ifndef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
    // this only works on 32bit machines
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
    return (address) ((intptr_t) index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
    fatal("Relocation::index_to_runtime_address, int32_t not pointer sized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
#endif /* _LP64 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
address Relocation::old_addr_for(address newa,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
                                 const CodeBuffer* src, CodeBuffer* dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
  int sect = dest->section_index_of(newa);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  guarantee(sect != CodeBuffer::SECT_NONE, "lost track of this address");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  address ostart = src->code_section(sect)->start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  address nstart = dest->code_section(sect)->start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  return ostart + (newa - nstart);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
address Relocation::new_addr_for(address olda,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
                                 const CodeBuffer* src, CodeBuffer* dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  debug_only(const CodeBuffer* src0 = src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  int sect = CodeBuffer::SECT_NONE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  // Look for olda in the source buffer, and all previous incarnations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  // if the source buffer has been expanded.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  for (; src != NULL; src = src->before_expand()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
    sect = src->section_index_of(olda);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
    if (sect != CodeBuffer::SECT_NONE)  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  guarantee(sect != CodeBuffer::SECT_NONE, "lost track of this address");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  address ostart = src->code_section(sect)->start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  address nstart = dest->code_section(sect)->start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  return nstart + (olda - ostart);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
void Relocation::normalize_address(address& addr, const CodeSection* dest, bool allow_other_sections) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  address addr0 = addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  if (addr0 == NULL || dest->allocates2(addr0))  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  CodeBuffer* cb = dest->outer();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  addr = new_addr_for(addr0, cb, cb);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  assert(allow_other_sections || dest->contains2(addr),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
         "addr must be in required section");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
void CallRelocation::set_destination(address x) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  pd_set_call_destination(x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
void CallRelocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  // Usually a self-relative reference to an external routine.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  // On some platforms, the reference is absolute (not self-relative).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  // The enhanced use of pd_call_destination sorts this all out.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  address orig_addr = old_addr_for(addr(), src, dest);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  address callee    = pd_call_destination(orig_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  // Reassert the callee address, this time in the new copy of the code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  pd_set_call_destination(callee);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
//// pack/unpack methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
void oop_Relocation::pack_data_to(CodeSection* dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  short* p = (short*) dest->locs_end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  p = pack_2_ints_to(p, _oop_index, _offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  dest->set_locs_end((relocInfo*) p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
void oop_Relocation::unpack_data() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  unpack_2_ints(_oop_index, _offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   567
void metadata_Relocation::pack_data_to(CodeSection* dest) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   568
  short* p = (short*) dest->locs_end();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   569
  p = pack_2_ints_to(p, _metadata_index, _offset);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   570
  dest->set_locs_end((relocInfo*) p);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   571
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   572
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   573
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   574
void metadata_Relocation::unpack_data() {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   575
  unpack_2_ints(_metadata_index, _offset);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   576
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   577
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
void virtual_call_Relocation::pack_data_to(CodeSection* dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  short*  p     = (short*) dest->locs_end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  address point =          dest->locs_point();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   583
  normalize_address(_cached_value, dest);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   584
  jint x0 = scaled_offset_null_special(_cached_value, point);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   585
  p = pack_1_int_to(p, x0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  dest->set_locs_end((relocInfo*) p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
void virtual_call_Relocation::unpack_data() {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   591
  jint x0 = unpack_1_int();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  address point = addr();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   593
  _cached_value = x0==0? NULL: address_from_scaled_offset(x0, point);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
void static_stub_Relocation::pack_data_to(CodeSection* dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  short* p = (short*) dest->locs_end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
  CodeSection* insts = dest->outer()->insts();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  normalize_address(_static_call, insts);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  p = pack_1_int_to(p, scaled_offset(_static_call, insts->start()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  dest->set_locs_end((relocInfo*) p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
void static_stub_Relocation::unpack_data() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  address base = binding()->section_start(CodeBuffer::SECT_INSTS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
  _static_call = address_from_scaled_offset(unpack_1_int(), base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
void external_word_Relocation::pack_data_to(CodeSection* dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
  short* p = (short*) dest->locs_end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
  int32_t index = runtime_address_to_index(_target);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
#ifndef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  p = pack_1_int_to(p, index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
#else
9111
c100c09c66f2 6777083: assert(target != __null,"must not be null")
never
parents: 8724
diff changeset
   617
  if (is_reloc_index(index)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
    p = pack_2_ints_to(p, index, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
    jlong t = (jlong) _target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
    int32_t lo = low(t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
    int32_t hi = high(t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
    p = pack_2_ints_to(p, lo, hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
    DEBUG_ONLY(jlong t1 = jlong_from(hi, lo));
9111
c100c09c66f2 6777083: assert(target != __null,"must not be null")
never
parents: 8724
diff changeset
   625
    assert(!is_reloc_index(t1) && (address) t1 == _target, "not symmetric");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
#endif /* _LP64 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
  dest->set_locs_end((relocInfo*) p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
void external_word_Relocation::unpack_data() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
#ifndef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
  _target = index_to_runtime_address(unpack_1_int());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
  int32_t lo, hi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
  unpack_2_ints(lo, hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
  jlong t = jlong_from(hi, lo);;
9111
c100c09c66f2 6777083: assert(target != __null,"must not be null")
never
parents: 8724
diff changeset
   639
  if (is_reloc_index(t)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
    _target = index_to_runtime_address(t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
    _target = (address) t;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
#endif /* _LP64 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
void internal_word_Relocation::pack_data_to(CodeSection* dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  short* p = (short*) dest->locs_end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  normalize_address(_target, dest, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  // Check whether my target address is valid within this section.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
  // If not, strengthen the relocation type to point to another section.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  int sindex = _section;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
  if (sindex == CodeBuffer::SECT_NONE && _target != NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
      && (!dest->allocates(_target) || _target == dest->locs_point())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
    sindex = dest->outer()->section_index_of(_target);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
    guarantee(sindex != CodeBuffer::SECT_NONE, "must belong somewhere");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
    relocInfo* base = dest->locs_end() - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
    assert(base->type() == this->type(), "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
    // Change the written type, to be section_word_type instead.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
    base->set_type(relocInfo::section_word_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
  // Note: An internal_word relocation cannot refer to its own instruction,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
  // because we reserve "0" to mean that the pointer itself is embedded
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  // in the code stream.  We use a section_word relocation for such cases.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  if (sindex == CodeBuffer::SECT_NONE) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
    assert(type() == relocInfo::internal_word_type, "must be base class");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
    guarantee(_target == NULL || dest->allocates2(_target), "must be within the given code section");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
    jint x0 = scaled_offset_null_special(_target, dest->locs_point());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
    assert(!(x0 == 0 && _target != NULL), "correct encoding of null target");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
    p = pack_1_int_to(p, x0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
    assert(_target != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
    CodeSection* sect = dest->outer()->code_section(sindex);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
    guarantee(sect->allocates2(_target), "must be in correct section");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
    address base = sect->start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
    jint offset = scaled_offset(_target, base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
    assert((uint)sindex < (uint)CodeBuffer::SECT_LIMIT, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
    assert(CodeBuffer::SECT_LIMIT <= (1 << section_width), "section_width++");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
    p = pack_1_int_to(p, (offset << section_width) | sindex);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  dest->set_locs_end((relocInfo*) p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
void internal_word_Relocation::unpack_data() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
  jint x0 = unpack_1_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
  _target = x0==0? NULL: address_from_scaled_offset(x0, addr());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
  _section = CodeBuffer::SECT_NONE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
void section_word_Relocation::unpack_data() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  jint    x      = unpack_1_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  jint    offset = (x >> section_width);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
  int     sindex = (x & ((1<<section_width)-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  address base   = binding()->section_start(sindex);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
  _section = sindex;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
  _target  = address_from_scaled_offset(offset, base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
void breakpoint_Relocation::pack_data_to(CodeSection* dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
  short* p = (short*) dest->locs_end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
  address point = dest->locs_point();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
  *p++ = _bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  assert(_target != NULL, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  if (internal())  normalize_address(_target, dest);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  jint target_bits =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
    (jint)( internal() ? scaled_offset           (_target, point)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
                       : runtime_address_to_index(_target) );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  if (settable()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
    // save space for set_target later
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
    p = add_jint(p, target_bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
    p = add_var_int(p, target_bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  for (int i = 0; i < instrlen(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
    // put placeholder words until bytes can be saved
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
    p = add_short(p, (short)0x7777);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  dest->set_locs_end((relocInfo*) p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
void breakpoint_Relocation::unpack_data() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
  _bits = live_bits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
  int targetlen = datalen() - 1 - instrlen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
  jint target_bits = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  if (targetlen == 0)       target_bits = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
  else if (targetlen == 1)  target_bits = *(data()+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  else if (targetlen == 2)  target_bits = relocInfo::jint_from_data(data()+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
  else                      { ShouldNotReachHere(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
  _target = internal() ? address_from_scaled_offset(target_bits, addr())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
                       : index_to_runtime_address  (target_bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
//// miscellaneous methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
oop* oop_Relocation::oop_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
  int n = _oop_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
  if (n == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
    // oop is stored in the code stream
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
    return (oop*) pd_address_in_code();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
  } else {
5686
5435e77aa3df 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1
diff changeset
   759
    // oop is stored in table at nmethod::oops_begin
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
    return code()->oop_addr_at(n);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
oop oop_Relocation::oop_value() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
  oop v = *oop_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  // clean inline caches store a special pseudo-null
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  if (v == (oop)Universe::non_oop_word())  v = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  return v;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
void oop_Relocation::fix_oop_relocation() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  if (!oop_is_immediate()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
    // get the oop from the pool, and re-insert it into the instruction:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
    set_value(value());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
8724
693c6b883b54 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 8107
diff changeset
   781
void oop_Relocation::verify_oop_relocation() {
693c6b883b54 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 8107
diff changeset
   782
  if (!oop_is_immediate()) {
693c6b883b54 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 8107
diff changeset
   783
    // get the oop from the pool, and re-insert it into the instruction:
693c6b883b54 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 8107
diff changeset
   784
    verify_value(value());
693c6b883b54 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 8107
diff changeset
   785
  }
693c6b883b54 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 8107
diff changeset
   786
}
693c6b883b54 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 8107
diff changeset
   787
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   788
// meta data versions
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   789
Metadata** metadata_Relocation::metadata_addr() {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   790
  int n = _metadata_index;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   791
  if (n == 0) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   792
    // metadata is stored in the code stream
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   793
    return (Metadata**) pd_address_in_code();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
    } else {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   795
    // metadata is stored in table at nmethod::metadatas_begin
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   796
    return code()->metadata_addr_at(n);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   801
Metadata* metadata_Relocation::metadata_value() {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   802
  Metadata* v = *metadata_addr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   803
  // clean inline caches store a special pseudo-null
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   804
  if (v == (Metadata*)Universe::non_oop_word())  v = NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   805
  return v;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   808
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   809
void metadata_Relocation::fix_metadata_relocation() {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   810
  if (!metadata_is_immediate()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   811
    // get the metadata from the pool, and re-insert it into the instruction:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   812
    pd_fix_value(value());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   813
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   817
void metadata_Relocation::verify_metadata_relocation() {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   818
  if (!metadata_is_immediate()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   819
    // get the metadata from the pool, and re-insert it into the instruction:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   820
    verify_value(value());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   821
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   824
address virtual_call_Relocation::cached_value() {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   825
  assert(_cached_value != NULL && _cached_value < addr(), "must precede ic_call");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
   826
  return _cached_value;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
void virtual_call_Relocation::clear_inline_cache() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  // No stubs for ICs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
  // Clean IC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
  CompiledIC* icache = CompiledIC_at(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
  icache->set_to_clean();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
void opt_virtual_call_Relocation::clear_inline_cache() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
  // No stubs for ICs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  // Clean IC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
  CompiledIC* icache = CompiledIC_at(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
  icache->set_to_clean();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
address opt_virtual_call_Relocation::static_stub() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
  // search for the static stub who points back to this static call
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
  address static_call_addr = addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
  RelocIterator iter(code());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
  while (iter.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
    if (iter.type() == relocInfo::static_stub_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
      if (iter.static_stub_reloc()->static_call() == static_call_addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
        return iter.addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
void static_call_Relocation::clear_inline_cache() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
  // Safe call site info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
  CompiledStaticCall* handler = compiledStaticCall_at(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
  handler->set_to_clean();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
address static_call_Relocation::static_stub() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
  // search for the static stub who points back to this static call
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
  address static_call_addr = addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
  RelocIterator iter(code());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
  while (iter.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
    if (iter.type() == relocInfo::static_stub_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
      if (iter.static_stub_reloc()->static_call() == static_call_addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
        return iter.addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
void static_stub_Relocation::clear_inline_cache() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
  // Call stub is only used when calling the interpreted code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
  // It does not really need to be cleared, except that we want to clean out the methodoop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
  CompiledStaticCall::set_stub_to_clean(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
void external_word_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
  address target = _target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  if (target == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
    // An absolute embedded reference to an external location,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
    // which means there is nothing to fix here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
  // Probably this reference is absolute, not relative, so the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
  // following is probably a no-op.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
  assert(src->section_index_of(target) == CodeBuffer::SECT_NONE, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
  set_value(target);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
address external_word_Relocation::target() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
  address target = _target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
  if (target == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
    target = pd_get_address_from_code();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
  return target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
void internal_word_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
  address target = _target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
  if (target == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
    if (addr_in_const()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
      target = new_addr_for(*(address*)addr(), src, dest);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
      target = new_addr_for(pd_get_address_from_code(), src, dest);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  set_value(target);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
address internal_word_Relocation::target() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
  address target = _target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
  if (target == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
    target = pd_get_address_from_code();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  return target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
breakpoint_Relocation::breakpoint_Relocation(int kind, address target, bool internal) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  bool active    = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
  bool enabled   = (kind == initialization);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
  bool removable = (kind != safepoint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
  bool settable  = (target == NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
  int bits = kind;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
  if (enabled)    bits |= enabled_state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
  if (internal)   bits |= internal_attr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
  if (removable)  bits |= removable_attr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
  if (settable)   bits |= settable_attr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
  _bits = bits | high_bit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
  _target = target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
  assert(this->kind()      == kind,      "kind encoded");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
  assert(this->enabled()   == enabled,   "enabled encoded");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
  assert(this->active()    == active,    "active encoded");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
  assert(this->internal()  == internal,  "internal encoded");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
  assert(this->removable() == removable, "removable encoded");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
  assert(this->settable()  == settable,  "settable encoded");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
address breakpoint_Relocation::target() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
  return _target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
void breakpoint_Relocation::set_target(address x) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
  assert(settable(), "must be settable");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
  jint target_bits =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
    (jint)(internal() ? scaled_offset           (x, addr())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
                      : runtime_address_to_index(x));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
  short* p = &live_bits() + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
  p = add_jint(p, target_bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
  assert(p == instrs(), "new target must fit");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
  _target = x;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
void breakpoint_Relocation::set_enabled(bool b) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
  if (enabled() == b) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
  if (b) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
    set_bits(bits() | enabled_state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
    set_active(false);          // remove the actual breakpoint insn, if any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
    set_bits(bits() & ~enabled_state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
void breakpoint_Relocation::set_active(bool b) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
  assert(!b || enabled(), "cannot activate a disabled breakpoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
  if (active() == b) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
  // %%% should probably seize a lock here (might not be the right lock)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
  //MutexLockerEx ml_patch(Patching_lock, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
  //if (active() == b)  return;         // recheck state after locking
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
  if (b) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
    set_bits(bits() | active_state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
    if (instrlen() == 0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
      fatal("breakpoints in original code must be undoable");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
    pd_swap_in_breakpoint (addr(), instrs(), instrlen());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
    set_bits(bits() & ~active_state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
    pd_swap_out_breakpoint(addr(), instrs(), instrlen());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
//---------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
// Non-product code
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
static const char* reloc_type_string(relocInfo::relocType t) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
  switch (t) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
  #define EACH_CASE(name) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
  case relocInfo::name##_type: \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
    return #name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
  APPLY_TO_RELOCATIONS(EACH_CASE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
  #undef EACH_CASE
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
  case relocInfo::none:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
    return "none";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  case relocInfo::data_prefix_tag:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
    return "prefix";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
  default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
    return "UNKNOWN RELOC TYPE";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
void RelocIterator::print_current() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
  if (!has_current()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
    tty->print_cr("(no relocs)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
  }
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1040
  tty->print("relocInfo@" INTPTR_FORMAT " [type=%d(%s) addr=" INTPTR_FORMAT " offset=%d",
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1041
             _current, type(), reloc_type_string((relocInfo::relocType) type()), _addr, _current->addr_offset());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
  if (current()->format() != 0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
    tty->print(" format=%d", current()->format());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
  if (datalen() == 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
    tty->print(" data=%d", data()[0]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  } else if (datalen() > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
    tty->print(" data={");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
    for (int i = 0; i < datalen(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
      tty->print("%04x", data()[i] & 0xFFFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
    tty->print("}");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
  tty->print("]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
  switch (type()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
  case relocInfo::oop_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
      oop_Relocation* r = oop_reloc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
      oop* oop_addr  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
      oop  raw_oop   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
      oop  oop_value = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
      if (code() != NULL || r->oop_is_immediate()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
        oop_addr  = r->oop_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
        raw_oop   = *oop_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
        oop_value = r->oop_value();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
      tty->print(" | [oop_addr=" INTPTR_FORMAT " *=" INTPTR_FORMAT " offset=%d]",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
                 oop_addr, (address)raw_oop, r->offset());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
      // Do not print the oop by default--we want this routine to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
      // work even during GC or other inconvenient times.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
      if (WizardMode && oop_value != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
        tty->print("oop_value=" INTPTR_FORMAT ": ", (address)oop_value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
        oop_value->print_value_on(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
    }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1076
  case relocInfo::metadata_type:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1077
    {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1078
      metadata_Relocation* r = metadata_reloc();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1079
      Metadata** metadata_addr  = NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1080
      Metadata*    raw_metadata   = NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1081
      Metadata*    metadata_value = NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1082
      if (code() != NULL || r->metadata_is_immediate()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1083
        metadata_addr  = r->metadata_addr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1084
        raw_metadata   = *metadata_addr;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1085
        metadata_value = r->metadata_value();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1086
      }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1087
      tty->print(" | [metadata_addr=" INTPTR_FORMAT " *=" INTPTR_FORMAT " offset=%d]",
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1088
                 metadata_addr, (address)raw_metadata, r->offset());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1089
      if (metadata_value != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1090
        tty->print("metadata_value=" INTPTR_FORMAT ": ", (address)metadata_value);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1091
        metadata_value->print_value_on(tty);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1092
      }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1093
      break;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1094
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
  case relocInfo::external_word_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
  case relocInfo::internal_word_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
  case relocInfo::section_word_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
      DataRelocation* r = (DataRelocation*) reloc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
      tty->print(" | [target=" INTPTR_FORMAT "]", r->value()); //value==target
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
  case relocInfo::static_call_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
  case relocInfo::runtime_call_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
      CallRelocation* r = (CallRelocation*) reloc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
      tty->print(" | [destination=" INTPTR_FORMAT "]", r->destination());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
  case relocInfo::virtual_call_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
      virtual_call_Relocation* r = (virtual_call_Relocation*) reloc();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1113
      tty->print(" | [destination=" INTPTR_FORMAT " cached_value=" INTPTR_FORMAT "]",
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9124
diff changeset
  1114
                 r->destination(), r->cached_value());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
  case relocInfo::static_stub_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
      static_stub_Relocation* r = (static_stub_Relocation*) reloc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
      tty->print(" | [static_call=" INTPTR_FORMAT "]", r->static_call());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
void RelocIterator::print() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
  RelocIterator save_this = (*this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  relocInfo* scan = _current;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
  if (!has_current())  scan += 1;  // nothing to scan here!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
  bool skip_next = has_current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
  bool got_next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
  while (true) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
    got_next = (skip_next || next());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
    skip_next = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
    tty->print("         @" INTPTR_FORMAT ": ", scan);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
    relocInfo* newscan = _current+1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
    if (!has_current())  newscan -= 1;  // nothing to scan here!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
    while (scan < newscan) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
      tty->print("%04x", *(short*)scan & 0xFFFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
      scan++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
    tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
    if (!got_next)  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
    print_current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
  (*this) = save_this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
// For the debugger:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
extern "C"
5686
5435e77aa3df 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1
diff changeset
  1157
void print_blob_locs(nmethod* nm) {
5435e77aa3df 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1
diff changeset
  1158
  nm->print();
5435e77aa3df 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1
diff changeset
  1159
  RelocIterator iter(nm);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
  iter.print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
extern "C"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
void print_buf_locs(CodeBuffer* cb) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
  FlagSetting fs(PrintRelocations, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
  cb->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
#endif // !PRODUCT