annotate src/share/vm/runtime/relocator.hpp @ 1483:ba37b9335e1e

New option "-graal" that sets up the correct boot class path and C1X options using only the two environment variables MAXINE and GRAAL. This greatly simplifies command line arguments necessary to start the Graal VM.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Mon, 29 Nov 2010 16:58:26 +0100
parents a61af66fc99e
children c18cbe5936b8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved.
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // This code has been converted from the 1.1E java virtual machine
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // Thanks to the JavaTopics group for using the code
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 class ChangeItem;
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // Callback object for code relocations
a61af66fc99e Initial load
duke
parents:
diff changeset
31 class RelocatorListener : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
32 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
33 RelocatorListener() {};
a61af66fc99e Initial load
duke
parents:
diff changeset
34 virtual void relocated(int bci, int delta, int new_method_size) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 };
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class Relocator : public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
39 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
40 Relocator(methodHandle method, RelocatorListener* listener);
a61af66fc99e Initial load
duke
parents:
diff changeset
41 methodHandle insert_space_at(int bci, int space, u_char inst_buffer[], TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // Callbacks from ChangeItem's
a61af66fc99e Initial load
duke
parents:
diff changeset
44 bool handle_code_changes();
a61af66fc99e Initial load
duke
parents:
diff changeset
45 bool handle_widen (int bci, int new_ilen, u_char inst_buffer[]); // handles general instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
46 void push_jump_widen (int bci, int delta, int new_delta); // pushes jumps
a61af66fc99e Initial load
duke
parents:
diff changeset
47 bool handle_jump_widen (int bci, int delta); // handles jumps
a61af66fc99e Initial load
duke
parents:
diff changeset
48 bool handle_switch_pad (int bci, int old_pad, bool is_lookup_switch); // handles table and lookup switches
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
51 unsigned char* _code_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 int _code_array_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 int _code_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 unsigned char* _compressed_line_number_table;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 int _compressed_line_number_table_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 methodHandle _method;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 u_char _overwrite[3]; // stores overwritten bytes for shrunken instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 GrowableArray<ChangeItem*>* _changes;
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 unsigned char* code_array() const { return _code_array; }
a61af66fc99e Initial load
duke
parents:
diff changeset
62 void set_code_array(unsigned char* array) { _code_array = array; }
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 int code_length() const { return _code_length; }
a61af66fc99e Initial load
duke
parents:
diff changeset
65 void set_code_length(int length) { _code_length = length; }
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 int code_array_length() const { return _code_array_length; }
a61af66fc99e Initial load
duke
parents:
diff changeset
68 void set_code_array_length(int length) { _code_array_length = length; }
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 unsigned char* compressed_line_number_table() const { return _compressed_line_number_table; }
a61af66fc99e Initial load
duke
parents:
diff changeset
71 void set_compressed_line_number_table(unsigned char* table) { _compressed_line_number_table = table; }
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 int compressed_line_number_table_size() const { return _compressed_line_number_table_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
74 void set_compressed_line_number_table_size(int size) { _compressed_line_number_table_size = size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 methodHandle method() const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
77 void set_method(methodHandle method) { _method = method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // This will return a raw bytecode, which is possibly rewritten.
a61af66fc99e Initial load
duke
parents:
diff changeset
80 Bytecodes::Code code_at(int bci) const { return (Bytecodes::Code) code_array()[bci]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
81 void code_at_put(int bci, Bytecodes::Code code) { code_array()[bci] = (char) code; }
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // get and set signed integers in the code_array
a61af66fc99e Initial load
duke
parents:
diff changeset
84 inline int int_at(int bci) const { return Bytes::get_Java_u4(&code_array()[bci]); }
a61af66fc99e Initial load
duke
parents:
diff changeset
85 inline void int_at_put(int bci, int value) { Bytes::put_Java_u4(&code_array()[bci], value); }
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // get and set signed shorts in the code_array
a61af66fc99e Initial load
duke
parents:
diff changeset
88 inline short short_at(int bci) const { return (short)Bytes::get_Java_u2(&code_array()[bci]); }
a61af66fc99e Initial load
duke
parents:
diff changeset
89 inline void short_at_put(int bci, short value) { Bytes::put_Java_u2((address) &code_array()[bci], value); }
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // get the address of in the code_array
a61af66fc99e Initial load
duke
parents:
diff changeset
92 inline char* addr_at(int bci) const { return (char*) &code_array()[bci]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 int instruction_length_at(int bci) { return Bytecodes::length_at(code_array() + bci); }
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // Helper methods
a61af66fc99e Initial load
duke
parents:
diff changeset
97 int align(int n) const { return (n+3) & ~3; }
a61af66fc99e Initial load
duke
parents:
diff changeset
98 int code_slop_pct() const { return 25; }
a61af66fc99e Initial load
duke
parents:
diff changeset
99 bool is_opcode_lookupswitch(Bytecodes::Code bc);
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // basic relocation methods
a61af66fc99e Initial load
duke
parents:
diff changeset
102 bool relocate_code (int bci, int ilen, int delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 void change_jumps (int break_bci, int delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
104 void change_jump (int bci, int offset, bool is_short, int break_bci, int delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
105 void adjust_exception_table(int bci, int delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 void adjust_line_no_table (int bci, int delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 void adjust_local_var_table(int bci, int delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 int get_orig_switch_pad (int bci, bool is_lookup_switch);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 int rc_instr_len (int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
110 bool expand_code_array (int delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // Callback support
a61af66fc99e Initial load
duke
parents:
diff changeset
113 RelocatorListener *_listener;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 void notify(int bci, int delta, int new_code_length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 if (_listener != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
116 _listener->relocated(bci, delta, new_code_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
118 };