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++ -*-
27struct entry;
28struct cpindex;
29struct unpacker;
30
31struct 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
58  band& nextBand() { return this[1]; }
59  band& prevBand() { return this[-1]; }
60
61  void init(unpacker* u_, int bn_, coding* defc_) {
62    u    = u_;
63    cm.u = u_;
64    bn   = bn_;
65    defc = defc_;
66  }
67  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
76  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.)
91  void rewind() {
92    cm.reset(&vs[0]);
93  }
94
95  byte* &curRP()    { return vs[0].rp; }
96  byte*  minRP()    { return cm.vs0.rp; }
97  byte*  maxRP()    { return rplimit; }
98  size_t size()     { return maxRP() - minRP(); }
99
100  int    getByte()  { assert(ix == null); return vs[0].getByte(); }
101  int    getInt()   { assert(ix == null); return vs[0].getInt(); }
102  entry* getRefN()  { return getRefCommon(ix, true); }
103  entry* getRef()   { return getRefCommon(ix, false); }
104  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
109  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
127extern band all_bands[];
128
129#define BAND_LOCAL /* \
130  band* band_temp = all_bands; \
131  band* all_bands = band_temp */
132
133// Band schema:
134enum 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