1 /*
2  * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
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
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 // -*- C++ -*-
27 struct entry;
28 struct cpindex;
29 struct unpacker;
30 
31 struct band {
32   const char*   name;
33   int           bn;             // band_number of this band
34   coding*       defc;           // default coding method
35   cpindex*      ix;             // CP entry mapping, if CPRefBand
36   byte          ixTag;          // 0 or 1; null is coded as (nullOK?0:-1)
37   byte          nullOK;         // 0 or 1; null is coded as (nullOK?0:-1)
38   int           length;         // expected # values
39   unpacker*     u;              // back pointer
40 
41   value_stream  vs[2];         // source of values
42   coding_method cm;            // method used for initial state of vs[0]
43   byte*         rplimit;       // end of band (encoded, transmitted)
44 
45   int           total_memo;    // cached value of getIntTotal, or -1
46   int*          hist0;         // approximate. histogram
47   enum { HIST0_MIN = 0, HIST0_MAX = 255 }; // catches the usual cases
48 
49   // properties for attribute layout elements:
50   byte          le_kind;       // EK_XXX
51   byte          le_bci;        // 0,EK_BCI,EK_BCD,EK_BCO
52   byte          le_back;       // ==EF_BACK
53   byte          le_len;        // 0,1,2,4 (size in classfile), or call addr
54   band**        le_body;       // body of repl, union, call (null-terminated)
55   // Note:  EK_CASE elements use hist0 to record union tags.
56   #define       le_casetags    hist0
57 
nextBandband58   band& nextBand() { return this[1]; }
prevBandband59   band& prevBand() { return this[-1]; }
60 
initband61   void init(unpacker* u_, int bn_, coding* defc_) {
62     u    = u_;
63     cm.u = u_;
64     bn   = bn_;
65     defc = defc_;
66   }
initband67   void init(unpacker* u_, int bn_, int defcSpec) {
68     init(u_, bn_, coding::findBySpec(defcSpec));
69   }
70   void initRef(int ixTag_ = 0, bool nullOK_ = false) {
71     ixTag  = ixTag_;
72     nullOK = nullOK_;
73     setIndexByTag(ixTag);
74   }
75 
expectMoreLengthband76   void expectMoreLength(int l) {
77     assert(length >= 0);      // able to accept a length
78     assert((int)l >= 0);      // no overflow
79     assert(rplimit == null);  // readData not yet called
80     length += l;
81     assert(length >= l);      // no overflow
82   }
83 
84   void setIndex(cpindex* ix_);
85   void setIndexByTag(byte tag);
86 
87   // Parse the band and its meta-coding header.
88   void readData(int expectedLength = 0);
89 
90   // Reset the band for another pass (Cf. Java Band.resetForSecondPass.)
rewindband91   void rewind() {
92     cm.reset(&vs[0]);
93   }
94 
curRPband95   byte* &curRP()    { return vs[0].rp; }
minRPband96   byte*  minRP()    { return cm.vs0.rp; }
maxRPband97   byte*  maxRP()    { return rplimit; }
sizeband98   size_t size()     { return maxRP() - minRP(); }
99 
getByteband100   int    getByte()  { assert(ix == null); return vs[0].getByte(); }
getIntband101   int    getInt()   { assert(ix == null); return vs[0].getInt(); }
getRefNband102   entry* getRefN()  { return getRefCommon(ix, true); }
getRefband103   entry* getRef()   { return getRefCommon(ix, false); }
getRefUsingband104   entry* getRefUsing(cpindex* ix2)
105                     { assert(ix == null); return getRefCommon(ix2, true); }
106   entry* getRefCommon(cpindex* ix, bool nullOK);
107   jlong  getLong(band& lo_band, bool have_hi);
108 
makeLongband109   static jlong makeLong(uint hi, uint lo) {
110     return ((julong)hi << 32) + (((julong)lo << 32) >> 32);
111   }
112 
113   int    getIntTotal();
114   int    getIntCount(int tag);
115 
116   static band* makeBands(unpacker* u);
117   static void initIndexes(unpacker* u);
118 
119 #ifndef PRODUCT
120   void dump();
121 #endif
122 
123   void abort(const char* msg = null); //{ u->abort(msg); }
124   bool aborting(); //{ return u->aborting(); }
125 };
126 
127 extern band all_bands[];
128 
129 #define BAND_LOCAL /* \
130   band* band_temp = all_bands; \
131   band* all_bands = band_temp */
132 
133 // Band schema:
134 enum band_number {
135   //e_archive_magic,
136   //e_archive_header,
137   //e_band_headers,
138 
139     // constant pool contents
140     e_cp_Utf8_prefix,
141     e_cp_Utf8_suffix,
142     e_cp_Utf8_chars,
143     e_cp_Utf8_big_suffix,
144     e_cp_Utf8_big_chars,
145     e_cp_Int,
146     e_cp_Float,
147     e_cp_Long_hi,
148     e_cp_Long_lo,
149     e_cp_Double_hi,
150     e_cp_Double_lo,
151     e_cp_String,
152     e_cp_Class,
153     e_cp_Signature_form,
154     e_cp_Signature_classes,
155     e_cp_Descr_name,
156     e_cp_Descr_type,
157     e_cp_Field_class,
158     e_cp_Field_desc,
159     e_cp_Method_class,
160     e_cp_Method_desc,
161     e_cp_Imethod_class,
162     e_cp_Imethod_desc,
163     e_cp_MethodHandle_refkind,
164     e_cp_MethodHandle_member,
165     e_cp_MethodType,
166     e_cp_BootstrapMethod_ref,
167     e_cp_BootstrapMethod_arg_count,
168     e_cp_BootstrapMethod_arg,
169     e_cp_InvokeDynamic_spec,
170     e_cp_InvokeDynamic_desc,
171 
172     // bands which define transmission of attributes
173     e_attr_definition_headers,
174     e_attr_definition_name,
175     e_attr_definition_layout,
176 
177     // band for hardwired InnerClasses attribute (shared across the package)
178     e_ic_this_class,
179     e_ic_flags,
180     // These bands contain data only where flags sets ACC_IC_LONG_FORM:
181     e_ic_outer_class,
182     e_ic_name,
183 
184     // bands for carrying class schema information:
185     e_class_this,
186     e_class_super,
187     e_class_interface_count,
188     e_class_interface,
189 
190     // bands for class members
191     e_class_field_count,
192     e_class_method_count,
193 
194     e_field_descr,
195     e_field_flags_hi,
196     e_field_flags_lo,
197     e_field_attr_count,
198     e_field_attr_indexes,
199     e_field_attr_calls,
200     e_field_ConstantValue_KQ,
201     e_field_Signature_RS,
202     e_field_metadata_bands,
203     e_field_attr_bands,
204 
205     e_method_descr,
206     e_method_flags_hi,
207     e_method_flags_lo,
208     e_method_attr_count,
209     e_method_attr_indexes,
210     e_method_attr_calls,
211     e_method_Exceptions_N,
212     e_method_Exceptions_RC,
213     e_method_Signature_RS,
214     e_method_metadata_bands,
215     e_method_MethodParameters_NB,
216     e_method_MethodParameters_name_RUN,
217     e_method_MethodParameters_flag_FH,
218     e_method_attr_bands,
219 
220     e_class_flags_hi,
221     e_class_flags_lo,
222     e_class_attr_count,
223     e_class_attr_indexes,
224     e_class_attr_calls,
225     e_class_SourceFile_RUN,
226     e_class_EnclosingMethod_RC,
227     e_class_EnclosingMethod_RDN,
228     e_class_Signature_RS,
229     e_class_metadata_bands,
230     e_class_InnerClasses_N,
231     e_class_InnerClasses_RC,
232     e_class_InnerClasses_F,
233     e_class_InnerClasses_outer_RCN,
234     e_class_InnerClasses_name_RUN,
235     e_class_ClassFile_version_minor_H,
236     e_class_ClassFile_version_major_H,
237     e_class_attr_bands,
238 
239     e_code_headers,
240     e_code_max_stack,
241     e_code_max_na_locals,
242     e_code_handler_count,
243     e_code_handler_start_P,
244     e_code_handler_end_PO,
245     e_code_handler_catch_PO,
246     e_code_handler_class_RCN,
247 
248     // code attributes
249     e_code_flags_hi,
250     e_code_flags_lo,
251     e_code_attr_count,
252     e_code_attr_indexes,
253     e_code_attr_calls,
254     e_code_StackMapTable_N,
255     e_code_StackMapTable_frame_T,
256     e_code_StackMapTable_local_N,
257     e_code_StackMapTable_stack_N,
258     e_code_StackMapTable_offset,
259     e_code_StackMapTable_T,
260     e_code_StackMapTable_RC,
261     e_code_StackMapTable_P,
262     e_code_LineNumberTable_N,
263     e_code_LineNumberTable_bci_P,
264     e_code_LineNumberTable_line,
265     e_code_LocalVariableTable_N,
266     e_code_LocalVariableTable_bci_P,
267     e_code_LocalVariableTable_span_O,
268     e_code_LocalVariableTable_name_RU,
269     e_code_LocalVariableTable_type_RS,
270     e_code_LocalVariableTable_slot,
271     e_code_LocalVariableTypeTable_N,
272     e_code_LocalVariableTypeTable_bci_P,
273     e_code_LocalVariableTypeTable_span_O,
274     e_code_LocalVariableTypeTable_name_RU,
275     e_code_LocalVariableTypeTable_type_RS,
276     e_code_LocalVariableTypeTable_slot,
277     e_code_attr_bands,
278 
279     // bands for bytecodes
280     e_bc_codes,
281     // remaining bands provide typed opcode fields required by the bc_codes
282 
283     e_bc_case_count,
284     e_bc_case_value,
285     e_bc_byte,
286     e_bc_short,
287     e_bc_local,
288     e_bc_label,
289 
290     // ldc* operands:
291     e_bc_intref,
292     e_bc_floatref,
293     e_bc_longref,
294     e_bc_doubleref,
295     e_bc_stringref,
296     e_bc_loadablevalueref,
297     e_bc_classref,
298 
299     e_bc_fieldref,
300     e_bc_methodref,
301     e_bc_imethodref,
302     e_bc_indyref,
303 
304     // _self_linker_op family
305     e_bc_thisfield,
306     e_bc_superfield,
307     e_bc_thismethod,
308     e_bc_supermethod,
309 
310     // bc_invokeinit family:
311     e_bc_initref,
312 
313     // bytecode escape sequences
314     e_bc_escref,
315     e_bc_escrefsize,
316     e_bc_escsize,
317     e_bc_escbyte,
318 
319     // file attributes and contents
320     e_file_name,
321     e_file_size_hi,
322     e_file_size_lo,
323     e_file_modtime,
324     e_file_options,
325     //e_file_bits,  // handled specially as an appendix
326 
327     BAND_LIMIT
328 };
329 
330 // Symbolic names for bands, as if in a giant global struct:
331 //#define archive_magic all_bands[e_archive_magic]
332 //#define archive_header all_bands[e_archive_header]
333 //#define band_headers all_bands[e_band_headers]
334 #define cp_Utf8_prefix all_bands[e_cp_Utf8_prefix]
335 #define cp_Utf8_suffix all_bands[e_cp_Utf8_suffix]
336 #define cp_Utf8_chars all_bands[e_cp_Utf8_chars]
337 #define cp_Utf8_big_suffix all_bands[e_cp_Utf8_big_suffix]
338 #define cp_Utf8_big_chars all_bands[e_cp_Utf8_big_chars]
339 #define cp_Int all_bands[e_cp_Int]
340 #define cp_Float all_bands[e_cp_Float]
341 #define cp_Long_hi all_bands[e_cp_Long_hi]
342 #define cp_Long_lo all_bands[e_cp_Long_lo]
343 #define cp_Double_hi all_bands[e_cp_Double_hi]
344 #define cp_Double_lo all_bands[e_cp_Double_lo]
345 #define cp_String all_bands[e_cp_String]
346 #define cp_Class all_bands[e_cp_Class]
347 #define cp_Signature_form all_bands[e_cp_Signature_form]
348 #define cp_Signature_classes all_bands[e_cp_Signature_classes]
349 #define cp_Descr_name all_bands[e_cp_Descr_name]
350 #define cp_Descr_type all_bands[e_cp_Descr_type]
351 #define cp_Field_class all_bands[e_cp_Field_class]
352 #define cp_Field_desc all_bands[e_cp_Field_desc]
353 #define cp_Method_class all_bands[e_cp_Method_class]
354 #define cp_Method_desc all_bands[e_cp_Method_desc]
355 #define cp_Imethod_class all_bands[e_cp_Imethod_class]
356 #define cp_Imethod_desc all_bands[e_cp_Imethod_desc]
357 #define cp_MethodHandle_refkind all_bands[e_cp_MethodHandle_refkind]
358 #define cp_MethodHandle_member all_bands[e_cp_MethodHandle_member]
359 #define cp_MethodType all_bands[e_cp_MethodType]
360 #define cp_BootstrapMethod_ref all_bands[e_cp_BootstrapMethod_ref]
361 #define cp_BootstrapMethod_arg_count all_bands[e_cp_BootstrapMethod_arg_count]
362 #define cp_BootstrapMethod_arg all_bands[e_cp_BootstrapMethod_arg]
363 #define cp_InvokeDynamic_spec  all_bands[e_cp_InvokeDynamic_spec]
364 #define cp_InvokeDynamic_desc all_bands[e_cp_InvokeDynamic_desc]
365 #define attr_definition_headers all_bands[e_attr_definition_headers]
366 #define attr_definition_name all_bands[e_attr_definition_name]
367 #define attr_definition_layout all_bands[e_attr_definition_layout]
368 #define ic_this_class all_bands[e_ic_this_class]
369 #define ic_flags all_bands[e_ic_flags]
370 #define ic_outer_class all_bands[e_ic_outer_class]
371 #define ic_name all_bands[e_ic_name]
372 #define class_this all_bands[e_class_this]
373 #define class_super all_bands[e_class_super]
374 #define class_interface_count all_bands[e_class_interface_count]
375 #define class_interface all_bands[e_class_interface]
376 #define class_field_count all_bands[e_class_field_count]
377 #define class_method_count all_bands[e_class_method_count]
378 #define field_descr all_bands[e_field_descr]
379 #define field_flags_hi all_bands[e_field_flags_hi]
380 #define field_flags_lo all_bands[e_field_flags_lo]
381 #define field_attr_count all_bands[e_field_attr_count]
382 #define field_attr_indexes all_bands[e_field_attr_indexes]
383 #define field_ConstantValue_KQ all_bands[e_field_ConstantValue_KQ]
384 #define field_Signature_RS all_bands[e_field_Signature_RS]
385 #define field_attr_bands all_bands[e_field_attr_bands]
386 #define method_descr all_bands[e_method_descr]
387 #define method_flags_hi all_bands[e_method_flags_hi]
388 #define method_flags_lo all_bands[e_method_flags_lo]
389 #define method_attr_count all_bands[e_method_attr_count]
390 #define method_attr_indexes all_bands[e_method_attr_indexes]
391 #define method_Exceptions_N all_bands[e_method_Exceptions_N]
392 #define method_Exceptions_RC all_bands[e_method_Exceptions_RC]
393 #define method_Signature_RS all_bands[e_method_Signature_RS]
394 #define method_MethodParameters_NB all_bands[e_method_MethodParameters_NB]
395 #define method_MethodParameters_name_RUN all_bands[e_method_MethodParameters_name_RUN]
396 #define method_MethodParameters_flag_FH all_bands[e_method_MethodParameters_flag_FH]
397 #define method_attr_bands all_bands[e_method_attr_bands]
398 #define class_flags_hi all_bands[e_class_flags_hi]
399 #define class_flags_lo all_bands[e_class_flags_lo]
400 #define class_attr_count all_bands[e_class_attr_count]
401 #define class_attr_indexes all_bands[e_class_attr_indexes]
402 #define class_SourceFile_RUN all_bands[e_class_SourceFile_RUN]
403 #define class_EnclosingMethod_RC all_bands[e_class_EnclosingMethod_RC]
404 #define class_EnclosingMethod_RDN all_bands[e_class_EnclosingMethod_RDN]
405 #define class_Signature_RS all_bands[e_class_Signature_RS]
406 #define class_InnerClasses_N all_bands[e_class_InnerClasses_N]
407 #define class_InnerClasses_RC all_bands[e_class_InnerClasses_RC]
408 #define class_InnerClasses_F all_bands[e_class_InnerClasses_F]
409 #define class_InnerClasses_outer_RCN all_bands[e_class_InnerClasses_outer_RCN]
410 #define class_InnerClasses_name_RUN all_bands[e_class_InnerClasses_name_RUN]
411 #define class_ClassFile_version_minor_H all_bands[e_class_ClassFile_version_minor_H]
412 #define class_ClassFile_version_major_H all_bands[e_class_ClassFile_version_major_H]
413 #define class_attr_bands all_bands[e_class_attr_bands]
414 #define code_headers all_bands[e_code_headers]
415 #define code_max_stack all_bands[e_code_max_stack]
416 #define code_max_na_locals all_bands[e_code_max_na_locals]
417 #define code_handler_count all_bands[e_code_handler_count]
418 #define code_handler_start_P all_bands[e_code_handler_start_P]
419 #define code_handler_end_PO all_bands[e_code_handler_end_PO]
420 #define code_handler_catch_PO all_bands[e_code_handler_catch_PO]
421 #define code_handler_class_RCN all_bands[e_code_handler_class_RCN]
422 #define code_flags_hi all_bands[e_code_flags_hi]
423 #define code_flags_lo all_bands[e_code_flags_lo]
424 #define code_attr_count all_bands[e_code_attr_count]
425 #define code_attr_indexes all_bands[e_code_attr_indexes]
426 #define code_StackMapTable_N all_bands[e_code_StackMapTable_N]
427 #define code_StackMapTable_frame_T all_bands[e_code_StackMapTable_frame_T]
428 #define code_StackMapTable_local_N all_bands[e_code_StackMapTable_local_N]
429 #define code_StackMapTable_stack_N all_bands[e_code_StackMapTable_stack_N]
430 #define code_StackMapTable_offset all_bands[e_code_StackMapTable_offset]
431 #define code_StackMapTable_T all_bands[e_code_StackMapTable_T]
432 #define code_StackMapTable_RC all_bands[e_code_StackMapTable_RC]
433 #define code_StackMapTable_P all_bands[e_code_StackMapTable_P]
434 #define code_LineNumberTable_N all_bands[e_code_LineNumberTable_N]
435 #define code_LineNumberTable_bci_P all_bands[e_code_LineNumberTable_bci_P]
436 #define code_LineNumberTable_line all_bands[e_code_LineNumberTable_line]
437 #define code_LocalVariableTable_N all_bands[e_code_LocalVariableTable_N]
438 #define code_LocalVariableTable_bci_P all_bands[e_code_LocalVariableTable_bci_P]
439 #define code_LocalVariableTable_span_O all_bands[e_code_LocalVariableTable_span_O]
440 #define code_LocalVariableTable_name_RU all_bands[e_code_LocalVariableTable_name_RU]
441 #define code_LocalVariableTable_type_RS all_bands[e_code_LocalVariableTable_type_RS]
442 #define code_LocalVariableTable_slot all_bands[e_code_LocalVariableTable_slot]
443 #define code_LocalVariableTypeTable_N all_bands[e_code_LocalVariableTypeTable_N]
444 #define code_LocalVariableTypeTable_bci_P all_bands[e_code_LocalVariableTypeTable_bci_P]
445 #define code_LocalVariableTypeTable_span_O all_bands[e_code_LocalVariableTypeTable_span_O]
446 #define code_LocalVariableTypeTable_name_RU all_bands[e_code_LocalVariableTypeTable_name_RU]
447 #define code_LocalVariableTypeTable_type_RS all_bands[e_code_LocalVariableTypeTable_type_RS]
448 #define code_LocalVariableTypeTable_slot all_bands[e_code_LocalVariableTypeTable_slot]
449 #define code_attr_bands all_bands[e_code_attr_bands]
450 #define bc_codes all_bands[e_bc_codes]
451 #define bc_case_count all_bands[e_bc_case_count]
452 #define bc_case_value all_bands[e_bc_case_value]
453 #define bc_byte all_bands[e_bc_byte]
454 #define bc_short all_bands[e_bc_short]
455 #define bc_local all_bands[e_bc_local]
456 #define bc_label all_bands[e_bc_label]
457 #define bc_intref all_bands[e_bc_intref]
458 #define bc_floatref all_bands[e_bc_floatref]
459 #define bc_longref all_bands[e_bc_longref]
460 #define bc_doubleref all_bands[e_bc_doubleref]
461 #define bc_stringref all_bands[e_bc_stringref]
462 #define bc_loadablevalueref all_bands[e_bc_loadablevalueref]
463 #define bc_classref all_bands[e_bc_classref]
464 #define bc_fieldref all_bands[e_bc_fieldref]
465 #define bc_methodref all_bands[e_bc_methodref]
466 #define bc_imethodref all_bands[e_bc_imethodref]
467 #define bc_indyref all_bands[e_bc_indyref]
468 #define bc_thisfield all_bands[e_bc_thisfield]
469 #define bc_superfield all_bands[e_bc_superfield]
470 #define bc_thismethod all_bands[e_bc_thismethod]
471 #define bc_supermethod all_bands[e_bc_supermethod]
472 #define bc_initref all_bands[e_bc_initref]
473 #define bc_escref all_bands[e_bc_escref]
474 #define bc_escrefsize all_bands[e_bc_escrefsize]
475 #define bc_escsize all_bands[e_bc_escsize]
476 #define bc_escbyte all_bands[e_bc_escbyte]
477 #define file_name all_bands[e_file_name]
478 #define file_size_hi all_bands[e_file_size_hi]
479 #define file_size_lo all_bands[e_file_size_lo]
480 #define file_modtime all_bands[e_file_modtime]
481 #define file_options all_bands[e_file_options]
482