1 /*
2  * Copyright (c) 1997, 2018, 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.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 
25 #ifndef SHARE_VM_RUNTIME_SIGNATURE_HPP
26 #define SHARE_VM_RUNTIME_SIGNATURE_HPP
27 
28 #include "memory/allocation.hpp"
29 #include "oops/method.hpp"
30 
31 // SignatureIterators iterate over a Java signature (or parts of it).
32 // (Syntax according to: "The Java Virtual Machine Specification" by
33 // Tim Lindholm & Frank Yellin; section 4.3 Descriptors; p. 89ff.)
34 //
35 // Example: Iterating over ([Lfoo;D)I using
36 //                         0123456789
37 //
38 // iterate_parameters() calls: do_array(2, 7); do_double();
39 // iterate_returntype() calls:                              do_int();
40 // iterate()            calls: do_array(2, 7); do_double(); do_int();
41 //
42 // is_return_type()        is: false         ; false      ; true
43 //
44 // NOTE: The new optimizer has an alternate, for-loop based signature
45 // iterator implemented in opto/type.cpp, TypeTuple::make().
46 
47 class SignatureIterator: public ResourceObj {
48  protected:
49   Symbol*      _signature;             // the signature to iterate over
50   int          _index;                 // the current character index (only valid during iteration)
51   int          _parameter_index;       // the current parameter index (0 outside iteration phase)
52   BasicType    _return_type;
53 
54   void expect(char c);
55   int  parse_type();                   // returns the parameter size in words (0 for void)
56   void check_signature_end();
57 
58  public:
59   // Definitions used in generating and iterating the
60   // bit field form of the signature generated by the
61   // Fingerprinter.
62   enum {
63     static_feature_size    = 1,
64     is_static_bit          = 1,
65 
66     result_feature_size    = 4,
67     result_feature_mask    = 0xF,
68     parameter_feature_size = 4,
69     parameter_feature_mask = 0xF,
70 
71       bool_parm            = 1,
72       byte_parm            = 2,
73       char_parm            = 3,
74       short_parm           = 4,
75       int_parm             = 5,
76       long_parm            = 6,
77       float_parm           = 7,
78       double_parm          = 8,
79       obj_parm             = 9,
80       done_parm            = 10,  // marker for end of parameters
81 
82     // max parameters is wordsize minus
83     //    The sign bit, termination field, the result and static bit fields
84     max_size_of_parameters = (BitsPerLong-1 -
85                               result_feature_size - parameter_feature_size -
86                               static_feature_size) / parameter_feature_size
87   };
88 
89   // Constructors
90   SignatureIterator(Symbol* signature);
91 
92   // Iteration
93   void dispatch_field();               // dispatches once for field signatures
94   void iterate_parameters();           // iterates over parameters only
95   void iterate_parameters( uint64_t fingerprint );
96   void iterate_returntype();           // iterates over returntype only
97   void iterate();                      // iterates over whole signature
98   // Returns the word index of the current parameter;
parameter_index() const99   int  parameter_index() const         { return _parameter_index; }
is_return_type() const100   bool is_return_type() const          { return parameter_index() < 0; }
get_ret_type() const101   BasicType get_ret_type() const       { return _return_type; }
102 
103   // Basic types
104   virtual void do_bool  ()             = 0;
105   virtual void do_char  ()             = 0;
106   virtual void do_float ()             = 0;
107   virtual void do_double()             = 0;
108   virtual void do_byte  ()             = 0;
109   virtual void do_short ()             = 0;
110   virtual void do_int   ()             = 0;
111   virtual void do_long  ()             = 0;
112   virtual void do_void  ()             = 0;
113 
114   // Object types (begin indexes the first character of the entry, end indexes the first character after the entry)
115   virtual void do_object(int begin, int end) = 0;
116   virtual void do_array (int begin, int end) = 0;
117 
is_static(uint64_t fingerprint)118   static bool is_static(uint64_t fingerprint) {
119     assert(fingerprint != (uint64_t)CONST64(-1), "invalid fingerprint");
120     return fingerprint & is_static_bit;
121   }
return_type(uint64_t fingerprint)122   static BasicType return_type(uint64_t fingerprint) {
123     assert(fingerprint != (uint64_t)CONST64(-1), "invalid fingerprint");
124     return (BasicType) ((fingerprint >> static_feature_size) & result_feature_mask);
125   }
126 };
127 
128 
129 // Specialized SignatureIterators: Used to compute signature specific values.
130 
131 class SignatureTypeNames : public SignatureIterator {
132  protected:
133   virtual void type_name(const char* name)   = 0;
134 
do_bool()135   void do_bool()                       { type_name("jboolean"); }
do_char()136   void do_char()                       { type_name("jchar"   ); }
do_float()137   void do_float()                      { type_name("jfloat"  ); }
do_double()138   void do_double()                     { type_name("jdouble" ); }
do_byte()139   void do_byte()                       { type_name("jbyte"   ); }
do_short()140   void do_short()                      { type_name("jshort"  ); }
do_int()141   void do_int()                        { type_name("jint"    ); }
do_long()142   void do_long()                       { type_name("jlong"   ); }
do_void()143   void do_void()                       { type_name("void"    ); }
do_object(int begin,int end)144   void do_object(int begin, int end)   { type_name("jobject" ); }
do_array(int begin,int end)145   void do_array (int begin, int end)   { type_name("jobject" ); }
146 
147  public:
SignatureTypeNames(Symbol * signature)148   SignatureTypeNames(Symbol* signature) : SignatureIterator(signature) {}
149 };
150 
151 
152 class SignatureInfo: public SignatureIterator {
153  protected:
154   bool      _has_iterated;             // need this because iterate cannot be called in constructor (set is virtual!)
155   bool      _has_iterated_return;
156   int       _size;
157 
lazy_iterate_parameters()158   void lazy_iterate_parameters()       { if (!_has_iterated) { iterate_parameters(); _has_iterated = true; } }
lazy_iterate_return()159   void lazy_iterate_return()           { if (!_has_iterated_return) { iterate_returntype(); _has_iterated_return = true; } }
160 
161   virtual void set(int size, BasicType type) = 0;
162 
do_bool()163   void do_bool  ()                     { set(T_BOOLEAN_size, T_BOOLEAN); }
do_char()164   void do_char  ()                     { set(T_CHAR_size   , T_CHAR   ); }
do_float()165   void do_float ()                     { set(T_FLOAT_size  , T_FLOAT  ); }
do_double()166   void do_double()                     { set(T_DOUBLE_size , T_DOUBLE ); }
do_byte()167   void do_byte  ()                     { set(T_BYTE_size   , T_BYTE   ); }
do_short()168   void do_short ()                     { set(T_SHORT_size  , T_SHORT  ); }
do_int()169   void do_int   ()                     { set(T_INT_size    , T_INT    ); }
do_long()170   void do_long  ()                     { set(T_LONG_size   , T_LONG   ); }
do_void()171   void do_void  ()                     { set(T_VOID_size   , T_VOID   ); }
do_object(int begin,int end)172   void do_object(int begin, int end)   { set(T_OBJECT_size , T_OBJECT ); }
do_array(int begin,int end)173   void do_array (int begin, int end)   { set(T_ARRAY_size  , T_ARRAY  ); }
174 
175  public:
SignatureInfo(Symbol * signature)176   SignatureInfo(Symbol* signature) : SignatureIterator(signature) {
177     _has_iterated = _has_iterated_return = false;
178     _size         = 0;
179     _return_type  = T_ILLEGAL;
180   }
181 
182 };
183 
184 
185 // Specialized SignatureIterator: Used to compute the argument size.
186 
187 class ArgumentSizeComputer: public SignatureInfo {
188  private:
set(int size,BasicType type)189   void set(int size, BasicType type)   { _size += size; }
190  public:
ArgumentSizeComputer(Symbol * signature)191   ArgumentSizeComputer(Symbol* signature) : SignatureInfo(signature) {}
192 
size()193   int       size()                     { lazy_iterate_parameters(); return _size; }
194 };
195 
196 
197 class ArgumentCount: public SignatureInfo {
198  private:
set(int size,BasicType type)199   void set(int size, BasicType type)   { _size ++; }
200  public:
ArgumentCount(Symbol * signature)201   ArgumentCount(Symbol* signature) : SignatureInfo(signature) {}
202 
size()203   int       size()                     { lazy_iterate_parameters(); return _size; }
204 };
205 
206 
207 // Specialized SignatureIterator: Used to compute the result type.
208 
209 class ResultTypeFinder: public SignatureInfo {
210  private:
set(int size,BasicType type)211   void set(int size, BasicType type)   { _return_type = type; }
212  public:
type()213   BasicType type()                     { lazy_iterate_return(); return _return_type; }
214 
ResultTypeFinder(Symbol * signature)215   ResultTypeFinder(Symbol* signature) : SignatureInfo(signature) {}
216 };
217 
218 
219 // Fingerprinter computes a unique ID for a given method. The ID
220 // is a bitvector characterizing the methods signature (incl. the receiver).
221 class Fingerprinter: public SignatureIterator {
222  private:
223   uint64_t _fingerprint;
224   int _shift_count;
225   methodHandle mh;
226 
227  public:
228 
do_bool()229   void do_bool()    { _fingerprint |= (((uint64_t)bool_parm) << _shift_count); _shift_count += parameter_feature_size; }
do_char()230   void do_char()    { _fingerprint |= (((uint64_t)char_parm) << _shift_count); _shift_count += parameter_feature_size; }
do_byte()231   void do_byte()    { _fingerprint |= (((uint64_t)byte_parm) << _shift_count); _shift_count += parameter_feature_size; }
do_short()232   void do_short()   { _fingerprint |= (((uint64_t)short_parm) << _shift_count); _shift_count += parameter_feature_size; }
do_int()233   void do_int()     { _fingerprint |= (((uint64_t)int_parm) << _shift_count); _shift_count += parameter_feature_size; }
do_long()234   void do_long()    { _fingerprint |= (((uint64_t)long_parm) << _shift_count); _shift_count += parameter_feature_size; }
do_float()235   void do_float()   { _fingerprint |= (((uint64_t)float_parm) << _shift_count); _shift_count += parameter_feature_size; }
do_double()236   void do_double()  { _fingerprint |= (((uint64_t)double_parm) << _shift_count); _shift_count += parameter_feature_size; }
237 
do_object(int begin,int end)238   void do_object(int begin, int end)  { _fingerprint |= (((uint64_t)obj_parm) << _shift_count); _shift_count += parameter_feature_size; }
do_array(int begin,int end)239   void do_array (int begin, int end)  { _fingerprint |= (((uint64_t)obj_parm) << _shift_count); _shift_count += parameter_feature_size; }
240 
do_void()241   void do_void()    { ShouldNotReachHere(); }
242 
Fingerprinter(const methodHandle & method)243   Fingerprinter(const methodHandle& method) : SignatureIterator(method->signature()) {
244     mh = method;
245     _fingerprint = 0;
246   }
247 
fingerprint()248   uint64_t fingerprint() {
249     // See if we fingerprinted this method already
250     if (mh->constMethod()->fingerprint() != CONST64(0)) {
251       return mh->constMethod()->fingerprint();
252     }
253 
254     if (mh->size_of_parameters() > max_size_of_parameters ) {
255       _fingerprint = (uint64_t)CONST64(-1);
256       mh->constMethod()->set_fingerprint(_fingerprint);
257       return _fingerprint;
258     }
259 
260     assert( (int)mh->result_type() <= (int)result_feature_mask, "bad result type");
261     _fingerprint = mh->result_type();
262     _fingerprint <<= static_feature_size;
263     if (mh->is_static())  _fingerprint |= 1;
264     _shift_count = result_feature_size + static_feature_size;
265     iterate_parameters();
266     _fingerprint |= ((uint64_t)done_parm) << _shift_count;// mark end of sig
267     mh->constMethod()->set_fingerprint(_fingerprint);
268     return _fingerprint;
269   }
270 };
271 
272 
273 // Specialized SignatureIterator: Used for native call purposes
274 
275 class NativeSignatureIterator: public SignatureIterator {
276  private:
277   methodHandle _method;
278 // We need separate JNI and Java offset values because in 64 bit mode,
279 // the argument offsets are not in sync with the Java stack.
280 // For example a long takes up 1 "C" stack entry but 2 Java stack entries.
281   int          _offset;                // The java stack offset
282   int          _prepended;             // number of prepended JNI parameters (1 JNIEnv, plus 1 mirror if static)
283   int          _jni_offset;            // the current parameter offset, starting with 0
284 
do_bool()285   void do_bool  ()                     { pass_int();    _jni_offset++; _offset++;       }
do_char()286   void do_char  ()                     { pass_int();    _jni_offset++; _offset++;       }
do_float()287   void do_float ()                     { pass_float();  _jni_offset++; _offset++;       }
288 #ifdef _LP64
do_double()289   void do_double()                     { pass_double(); _jni_offset++; _offset += 2;    }
290 #else
do_double()291   void do_double()                     { pass_double(); _jni_offset += 2; _offset += 2; }
292 #endif
do_byte()293   void do_byte  ()                     { pass_int();    _jni_offset++; _offset++;       }
do_short()294   void do_short ()                     { pass_int();    _jni_offset++; _offset++;       }
do_int()295   void do_int   ()                     { pass_int();    _jni_offset++; _offset++;       }
296 #ifdef _LP64
do_long()297   void do_long  ()                     { pass_long();   _jni_offset++; _offset += 2;    }
298 #else
do_long()299   void do_long  ()                     { pass_long();   _jni_offset += 2; _offset += 2; }
300 #endif
do_void()301   void do_void  ()                     { ShouldNotReachHere();                               }
do_object(int begin,int end)302   void do_object(int begin, int end)   { pass_object(); _jni_offset++; _offset++;        }
do_array(int begin,int end)303   void do_array (int begin, int end)   { pass_object(); _jni_offset++; _offset++;        }
304 
305  public:
method() const306   methodHandle method() const          { return _method; }
offset() const307   int          offset() const          { return _offset; }
jni_offset() const308   int      jni_offset() const          { return _jni_offset + _prepended; }
309 //  int     java_offset() const          { return method()->size_of_parameters() - _offset - 1; }
is_static() const310   bool      is_static() const          { return method()->is_static(); }
311   virtual void pass_int()              = 0;
312   virtual void pass_long()             = 0;
313   virtual void pass_object()           = 0;
314   virtual void pass_float()            = 0;
315 #ifdef _LP64
316   virtual void pass_double()           = 0;
317 #else
pass_double()318   virtual void pass_double()           { pass_long(); }  // may be same as long
319 #endif
320 
NativeSignatureIterator(const methodHandle & method)321   NativeSignatureIterator(const methodHandle& method) : SignatureIterator(method->signature()) {
322     _method = method;
323     _offset = 0;
324     _jni_offset = 0;
325 
326     const int JNIEnv_words = 1;
327     const int mirror_words = 1;
328     _prepended = !is_static() ? JNIEnv_words : JNIEnv_words + mirror_words;
329   }
330 
331   // iterate() calles the 2 virtual methods according to the following invocation syntax:
332   //
333   // {pass_int | pass_long | pass_object}
334   //
335   // Arguments are handled from left to right (receiver first, if any).
336   // The offset() values refer to the Java stack offsets but are 0 based and increasing.
337   // The java_offset() values count down to 0, and refer to the Java TOS.
338   // The jni_offset() values increase from 1 or 2, and refer to C arguments.
339 
iterate()340   void iterate() { iterate(Fingerprinter(method()).fingerprint());
341   }
342 
343 
344   // Optimized path if we have the bitvector form of signature
iterate(uint64_t fingerprint)345   void iterate( uint64_t fingerprint ) {
346 
347     if (!is_static()) {
348       // handle receiver (not handled by iterate because not in signature)
349       pass_object(); _jni_offset++; _offset++;
350     }
351 
352     SignatureIterator::iterate_parameters( fingerprint );
353   }
354 };
355 
356 
357 // Handy stream for iterating over signature
358 
359 class SignatureStream : public StackObj {
360  private:
361   Symbol*      _signature;
362   int          _begin;
363   int          _end;
364   BasicType    _type;
365   bool         _at_return_type;
366   GrowableArray<Symbol*>* _names;  // symbols created while parsing signature
367 
368  public:
at_return_type() const369   bool at_return_type() const                    { return _at_return_type; }
370   bool is_done() const;
371   void next_non_primitive(int t);
next()372   void next() {
373     Symbol* sig = _signature;
374     int len = sig->utf8_length();
375     if (_end >= len) {
376       _end = len + 1;
377       return;
378     }
379 
380     _begin = _end;
381     int t = sig->byte_at(_begin);
382     switch (t) {
383       case 'B': _type = T_BYTE;    break;
384       case 'C': _type = T_CHAR;    break;
385       case 'D': _type = T_DOUBLE;  break;
386       case 'F': _type = T_FLOAT;   break;
387       case 'I': _type = T_INT;     break;
388       case 'J': _type = T_LONG;    break;
389       case 'S': _type = T_SHORT;   break;
390       case 'Z': _type = T_BOOLEAN; break;
391       case 'V': _type = T_VOID;    break;
392       default : next_non_primitive(t);
393                 return;
394     }
395     _end++;
396   }
397 
398   SignatureStream(Symbol* signature, bool is_method = true);
399   ~SignatureStream();
400 
401   bool is_object() const;                        // True if this argument is an object
402   bool is_array() const;                         // True if this argument is an array
type() const403   BasicType type() const                         { return _type; }
404   Symbol* as_symbol(TRAPS);
405   enum FailureMode { ReturnNull, CNFException, NCDFError };
406   Klass* as_klass(Handle class_loader, Handle protection_domain, FailureMode failure_mode, TRAPS);
407   oop as_java_mirror(Handle class_loader, Handle protection_domain, FailureMode failure_mode, TRAPS);
raw_bytes()408   const jbyte* raw_bytes()  { return _signature->bytes() + _begin; }
raw_length()409   int          raw_length() { return _end - _begin; }
410 
411   // return same as_symbol except allocation of new symbols is avoided.
412   Symbol* as_symbol_or_null();
413 
414   // count the number of references in the signature
415   int reference_parameter_count();
416 };
417 
418 class SignatureVerifier : public StackObj {
419   public:
420     // Returns true if the symbol is valid method or type signature
421     static bool is_valid_signature(Symbol* sig);
422 
423     static bool is_valid_method_signature(Symbol* sig);
424     static bool is_valid_type_signature(Symbol* sig);
425   private:
426 
427     static ssize_t is_valid_type(const char*, ssize_t);
428     static bool invalid_name_char(char);
429 };
430 
431 #endif // SHARE_VM_RUNTIME_SIGNATURE_HPP
432