comparison src/share/vm/ci/ciStreams.hpp @ 1579:e9ff18c4ace7

Merge
author jrose
date Wed, 02 Jun 2010 22:45:42 -0700
parents c18cbe5936b8 ab102d5d923e
children 136b78722a08
comparison
equal deleted inserted replaced
1562:dfe27f03244a 1579:e9ff18c4ace7
1 /* 1 /*
2 * Copyright (c) 1999, 2009, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
29 // providing accessors for constant pool items. It returns only pure 29 // providing accessors for constant pool items. It returns only pure
30 // Java bytecodes; VM-internal _fast bytecodes are translated back to 30 // Java bytecodes; VM-internal _fast bytecodes are translated back to
31 // their original form during iteration. 31 // their original form during iteration.
32 class ciBytecodeStream : StackObj { 32 class ciBytecodeStream : StackObj {
33 private: 33 private:
34 // Handling for the weird bytecodes 34 // Handling for the weird bytecodes
35 Bytecodes::Code wide(); // Handle wide bytecode 35 Bytecodes::Code next_wide_or_table(Bytecodes::Code); // Handle _wide & complicated inline table
36 Bytecodes::Code table(Bytecodes::Code); // Handle complicated inline table
37 36
38 static Bytecodes::Code check_java(Bytecodes::Code c) { 37 static Bytecodes::Code check_java(Bytecodes::Code c) {
39 assert(Bytecodes::is_java_code(c), "should not return _fast bytecodes"); 38 assert(Bytecodes::is_java_code(c), "should not return _fast bytecodes");
39 return c;
40 }
41
42 static Bytecodes::Code check_defined(Bytecodes::Code c) {
43 assert(Bytecodes::is_defined(c), "");
40 return c; 44 return c;
41 } 45 }
42 46
43 ciMethod* _method; // the method 47 ciMethod* _method; // the method
44 ciInstanceKlass* _holder; 48 ciInstanceKlass* _holder;
48 52
49 address _start; // Start of bytecodes 53 address _start; // Start of bytecodes
50 address _end; // Past end of bytecodes 54 address _end; // Past end of bytecodes
51 address _pc; // Current PC 55 address _pc; // Current PC
52 Bytecodes::Code _bc; // Current bytecode 56 Bytecodes::Code _bc; // Current bytecode
57 Bytecodes::Code _raw_bc; // Current bytecode, raw form
53 58
54 void reset( address base, unsigned int size ) { 59 void reset( address base, unsigned int size ) {
55 _bc_start =_was_wide = 0; 60 _bc_start =_was_wide = 0;
56 _start = _pc = base; _end = base + size; } 61 _start = _pc = base; _end = base + size; }
62
63 void assert_wide(bool require_wide) const {
64 if (require_wide)
65 { assert(is_wide(), "must be a wide instruction"); }
66 else { assert(!is_wide(), "must not be a wide instruction"); }
67 }
68
69 Bytecode* bytecode() const { return Bytecode_at(_bc_start); }
70 Bytecode* next_bytecode() const { return Bytecode_at(_pc); }
57 71
58 public: 72 public:
59 // End-Of-Bytecodes 73 // End-Of-Bytecodes
60 static Bytecodes::Code EOBC() { 74 static Bytecodes::Code EOBC() {
61 return Bytecodes::_illegal; 75 return Bytecodes::_illegal;
90 void set_max_bci( int max ) { 104 void set_max_bci( int max ) {
91 _end = _start + max; 105 _end = _start + max;
92 } 106 }
93 107
94 address cur_bcp() const { return _bc_start; } // Returns bcp to current instruction 108 address cur_bcp() const { return _bc_start; } // Returns bcp to current instruction
95 int next_bci() const { return _pc -_start; } 109 int next_bci() const { return _pc - _start; }
96 int cur_bci() const { return _bc_start - _start; } 110 int cur_bci() const { return _bc_start - _start; }
97 int instruction_size() const { return _pc - _bc_start; } 111 int instruction_size() const { return _pc - _bc_start; }
98 112
99 Bytecodes::Code cur_bc() const{ return check_java(_bc); } 113 Bytecodes::Code cur_bc() const{ return check_java(_bc); }
114 Bytecodes::Code cur_bc_raw() const { return check_defined(_raw_bc); }
100 Bytecodes::Code next_bc() { return Bytecodes::java_code((Bytecodes::Code)* _pc); } 115 Bytecodes::Code next_bc() { return Bytecodes::java_code((Bytecodes::Code)* _pc); }
101 116
102 // Return current ByteCode and increment PC to next bytecode, skipping all 117 // Return current ByteCode and increment PC to next bytecode, skipping all
103 // intermediate constants. Returns EOBC at end. 118 // intermediate constants. Returns EOBC at end.
104 // Expected usage: 119 // Expected usage:
107 _bc_start = _pc; // Capture start of bc 122 _bc_start = _pc; // Capture start of bc
108 if( _pc >= _end ) return EOBC(); // End-Of-Bytecodes 123 if( _pc >= _end ) return EOBC(); // End-Of-Bytecodes
109 124
110 // Fetch Java bytecode 125 // Fetch Java bytecode
111 // All rewritten bytecodes maintain the size of original bytecode. 126 // All rewritten bytecodes maintain the size of original bytecode.
112 _bc = Bytecodes::java_code((Bytecodes::Code)*_pc); 127 _bc = Bytecodes::java_code(_raw_bc = (Bytecodes::Code)*_pc);
113 int csize = Bytecodes::length_for(_bc); // Expected size 128 int csize = Bytecodes::length_for(_bc); // Expected size
114 129 _pc += csize; // Bump PC past bytecode
115 if( _bc == Bytecodes::_wide ) { 130 if (csize == 0) {
116 _bc=wide(); // Handle wide bytecode 131 _bc = next_wide_or_table(_bc);
117 } else if( csize == 0 ) {
118 _bc=table(_bc); // Handle inline tables
119 } else {
120 _pc += csize; // Bump PC past bytecode
121 } 132 }
122 return check_java(_bc); 133 return check_java(_bc);
123 } 134 }
124 135
125 bool is_wide() const { return ( _pc == _was_wide ); } 136 bool is_wide() const { return ( _pc == _was_wide ); }
137
138 // Does this instruction contain an index which refes into the CP cache?
139 bool uses_cp_cache() const { return Bytecodes::uses_cp_cache(cur_bc_raw()); }
140
141 int get_index_u1() const {
142 return bytecode()->get_index_u1(cur_bc_raw());
143 }
126 144
127 // Get a byte index following this bytecode. 145 // Get a byte index following this bytecode.
128 // If prefixed with a wide bytecode, get a wide index. 146 // If prefixed with a wide bytecode, get a wide index.
129 int get_index() const { 147 int get_index() const {
130 assert_index_size(is_wide() ? 2 : 1);
131 return (_pc == _was_wide) // was widened? 148 return (_pc == _was_wide) // was widened?
132 ? Bytes::get_Java_u2(_bc_start+2) // yes, return wide index 149 ? get_index_u2(true) // yes, return wide index
133 : _bc_start[1]; // no, return narrow index 150 : get_index_u1(); // no, return narrow index
134 } 151 }
135 152
136 // Get 2-byte index (getfield/putstatic/etc) 153 // Get 2-byte index (byte swapping depending on which bytecode)
137 int get_index_big() const { 154 int get_index_u2(bool is_wide = false) const {
138 assert_index_size(2); 155 return bytecode()->get_index_u2(cur_bc_raw(), is_wide);
139 return Bytes::get_Java_u2(_bc_start+1); 156 }
140 } 157
141 158 // Get 2-byte index in native byte order. (Rewriter::rewrite makes these.)
142 // Get 2-byte index (or 4-byte, for invokedynamic) 159 int get_index_u2_cpcache() const {
143 int get_index_int() const { 160 return bytecode()->get_index_u2_cpcache(cur_bc_raw());
144 return has_giant_index() ? get_index_giant() : get_index_big();
145 } 161 }
146 162
147 // Get 4-byte index, for invokedynamic. 163 // Get 4-byte index, for invokedynamic.
148 int get_index_giant() const { 164 int get_index_u4() const {
149 assert_index_size(4); 165 return bytecode()->get_index_u4(cur_bc_raw());
150 return Bytes::get_native_u4(_bc_start+1); 166 }
151 } 167
152 168 bool has_index_u4() const {
153 bool has_giant_index() const { return (cur_bc() == Bytecodes::_invokedynamic); } 169 return bytecode()->has_index_u4(cur_bc_raw());
170 }
154 171
155 // Get dimensions byte (multinewarray) 172 // Get dimensions byte (multinewarray)
156 int get_dimensions() const { return *(unsigned char*)(_pc-1); } 173 int get_dimensions() const { return *(unsigned char*)(_pc-1); }
157 174
158 // Sign-extended index byte/short, no widening 175 // Sign-extended index byte/short, no widening
159 int get_byte() const { return (int8_t)(_pc[-1]); } 176 int get_constant_u1() const { return bytecode()->get_constant_u1(instruction_size()-1, cur_bc_raw()); }
160 int get_short() const { return (int16_t)Bytes::get_Java_u2(_pc-2); } 177 int get_constant_u2(bool is_wide = false) const { return bytecode()->get_constant_u2(instruction_size()-2, cur_bc_raw(), is_wide); }
161 int get_long() const { return (int32_t)Bytes::get_Java_u4(_pc-4); }
162 178
163 // Get a byte signed constant for "iinc". Invalid for other bytecodes. 179 // Get a byte signed constant for "iinc". Invalid for other bytecodes.
164 // If prefixed with a wide bytecode, get a wide constant 180 // If prefixed with a wide bytecode, get a wide constant
165 int get_iinc_con() const {return (_pc==_was_wide) ? get_short() :get_byte();} 181 int get_iinc_con() const {return (_pc==_was_wide) ? (jshort) get_constant_u2(true) : (jbyte) get_constant_u1();}
166 182
167 // 2-byte branch offset from current pc 183 // 2-byte branch offset from current pc
168 int get_dest( ) const { 184 int get_dest() const {
169 assert( Bytecodes::length_at(_bc_start) == sizeof(jshort)+1, "get_dest called with bad bytecode" ); 185 return cur_bci() + bytecode()->get_offset_s2(cur_bc_raw());
170 return _bc_start-_start + (short)Bytes::get_Java_u2(_pc-2);
171 } 186 }
172 187
173 // 2-byte branch offset from next pc 188 // 2-byte branch offset from next pc
174 int next_get_dest( ) const { 189 int next_get_dest() const {
175 address next_bc_start = _pc; 190 assert(_pc < _end, "");
176 assert( _pc < _end, "" ); 191 return next_bci() + next_bytecode()->get_offset_s2(Bytecodes::_ifeq);
177 Bytecodes::Code next_bc = (Bytecodes::Code)*_pc;
178 assert( next_bc != Bytecodes::_wide, "");
179 int next_csize = Bytecodes::length_for(next_bc);
180 assert( next_csize != 0, "" );
181 assert( next_bc <= Bytecodes::_jsr_w, "");
182 address next_pc = _pc + next_csize;
183 assert( Bytecodes::length_at(next_bc_start) == sizeof(jshort)+1, "next_get_dest called with bad bytecode" );
184 return next_bc_start-_start + (short)Bytes::get_Java_u2(next_pc-2);
185 } 192 }
186 193
187 // 4-byte branch offset from current pc 194 // 4-byte branch offset from current pc
188 int get_far_dest( ) const { 195 int get_far_dest() const {
189 assert( Bytecodes::length_at(_bc_start) == sizeof(jint)+1, "dest4 called with bad bytecode" ); 196 return cur_bci() + bytecode()->get_offset_s4(cur_bc_raw());
190 return _bc_start-_start + (int)Bytes::get_Java_u4(_pc-4);
191 } 197 }
192 198
193 // For a lookup or switch table, return target destination 199 // For a lookup or switch table, return target destination
194 int get_int_table( int index ) const { 200 int get_int_table( int index ) const {
195 return Bytes::get_Java_u4((address)&_table_base[index]); } 201 return Bytes::get_Java_u4((address)&_table_base[index]); }
232 int get_method_holder_index(); 238 int get_method_holder_index();
233 int get_method_signature_index(); 239 int get_method_signature_index();
234 240
235 ciCPCache* get_cpcache(); 241 ciCPCache* get_cpcache();
236 ciCallSite* get_call_site(); 242 ciCallSite* get_call_site();
237
238 private:
239 void assert_index_size(int required_size) const {
240 #ifdef ASSERT
241 int isize = instruction_size() - (is_wide() ? 1 : 0) - 1;
242 if (isize == 2 && cur_bc() == Bytecodes::_iinc)
243 isize = 1;
244 else if (isize <= 2)
245 ; // no change
246 else if (has_giant_index())
247 isize = 4;
248 else
249 isize = 2;
250 assert(isize = required_size, "wrong index size");
251 #endif
252 }
253 }; 243 };
254 244
255 245
256 // ciSignatureStream 246 // ciSignatureStream
257 // 247 //