comparison src/share/vm/ci/bcEscapeAnalyzer.hpp @ 1648:8099e71601df

6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies Summary: Use GrowableArray and VectorSet allocated in ciEnv arena. Reviewed-by: never, twisti
author kvn
date Wed, 14 Jul 2010 14:47:34 -0700
parents c18cbe5936b8
children f95d63e2154a
comparison
equal deleted inserted replaced
1647:079980c86f33 1648:8099e71601df
20 * or visit www.oracle.com if you need additional information or have any 20 * or visit www.oracle.com if you need additional information or have any
21 * questions. 21 * questions.
22 * 22 *
23 */ 23 */
24 24
25 define_array(ciObjectArray, ciObject*);
26 define_stack(ciObjectList, ciObjectArray);
27
28 // This class implements a fast, conservative analysis of effect of methods 25 // This class implements a fast, conservative analysis of effect of methods
29 // on the escape state of their arguments. The analysis is at the bytecode 26 // on the escape state of their arguments. The analysis is at the bytecode
30 // level. 27 // level.
31 28
32 class ciMethodBlocks; 29 class ciMethodBlocks;
33 class ciBlock; 30 class ciBlock;
34 31
35 class BCEscapeAnalyzer : public ResourceObj { 32 class BCEscapeAnalyzer : public ResourceObj {
36 private: 33 private:
34 Arena* _arena; // ciEnv arena
35
37 bool _conservative; // If true, return maximally 36 bool _conservative; // If true, return maximally
38 // conservative results. 37 // conservative results.
39 ciMethod* _method; 38 ciMethod* _method;
40 ciMethodData* _methodData; 39 ciMethodData* _methodData;
41 int _arg_size; 40 int _arg_size;
42 41 VectorSet _arg_local;
43 intStack _stack; 42 VectorSet _arg_stack;
44 43 VectorSet _arg_returned;
45 BitMap _arg_local; 44 VectorSet _dirty;
46 BitMap _arg_stack;
47 BitMap _arg_returned;
48 BitMap _dirty;
49 enum{ ARG_OFFSET_MAX = 31}; 45 enum{ ARG_OFFSET_MAX = 31};
50 uint *_arg_modified; 46 uint *_arg_modified;
51 47
52 bool _return_local; 48 bool _return_local;
53 bool _return_allocated; 49 bool _return_allocated;
54 bool _allocated_escapes; 50 bool _allocated_escapes;
55 bool _unknown_modified; 51 bool _unknown_modified;
56 52
57 ciObjectList _dependencies; 53 GrowableArray<ciObject *> _dependencies;
58 54
59 ciMethodBlocks *_methodBlocks; 55 ciMethodBlocks *_methodBlocks;
60 56
61 BCEscapeAnalyzer* _parent; 57 BCEscapeAnalyzer* _parent;
62 int _level; 58 int _level;
66 class StateInfo; 62 class StateInfo;
67 63
68 private: 64 private:
69 // helper functions 65 // helper functions
70 bool is_argument(int i) { return i >= 0 && i < _arg_size; } 66 bool is_argument(int i) { return i >= 0 && i < _arg_size; }
71
72 void raw_push(int i) { _stack.push(i); }
73 int raw_pop() { return _stack.is_empty() ? -1 : _stack.pop(); }
74 void apush(int i) { raw_push(i); }
75 void spush() { raw_push(-1); }
76 void lpush() { spush(); spush(); }
77 int apop() { return raw_pop(); }
78 void spop() { assert(_stack.is_empty() || _stack.top() == -1, ""); raw_pop(); }
79 void lpop() { spop(); spop(); }
80
81 void set_returned(ArgumentMap vars); 67 void set_returned(ArgumentMap vars);
82 bool is_argument(ArgumentMap vars); 68 bool is_argument(ArgumentMap vars);
83 bool is_arg_stack(ArgumentMap vars); 69 bool is_arg_stack(ArgumentMap vars);
84 void clear_bits(ArgumentMap vars, BitMap &bs); 70 void clear_bits(ArgumentMap vars, VectorSet &bs);
85 void set_method_escape(ArgumentMap vars); 71 void set_method_escape(ArgumentMap vars);
86 void set_global_escape(ArgumentMap vars); 72 void set_global_escape(ArgumentMap vars);
87 void set_dirty(ArgumentMap vars); 73 void set_dirty(ArgumentMap vars);
88 void set_modified(ArgumentMap vars, int offs, int size); 74 void set_modified(ArgumentMap vars, int offs, int size);
89 75
114 // accessors 100 // accessors
115 ciMethod* method() const { return _method; } 101 ciMethod* method() const { return _method; }
116 ciMethodData* methodData() const { return _methodData; } 102 ciMethodData* methodData() const { return _methodData; }
117 BCEscapeAnalyzer* parent() const { return _parent; } 103 BCEscapeAnalyzer* parent() const { return _parent; }
118 int level() const { return _level; } 104 int level() const { return _level; }
119 ciObjectList* dependencies() { return &_dependencies; } 105 GrowableArray<ciObject *>* dependencies() { return &_dependencies; }
120 bool has_dependencies() const { return !_dependencies.is_empty(); } 106 bool has_dependencies() const { return !_dependencies.is_empty(); }
121 107
122 // retrieval of interprocedural escape information 108 // retrieval of interprocedural escape information
123 109
124 // The given argument does not escape the callee. 110 // The given argument does not escape the callee.
125 bool is_arg_local(int i) const { 111 bool is_arg_local(int i) const {
126 return !_conservative && _arg_local.at(i); 112 return !_conservative && _arg_local.test(i);
127 } 113 }
128 114
129 // The given argument escapes the callee, but does not become globally 115 // The given argument escapes the callee, but does not become globally
130 // reachable. 116 // reachable.
131 bool is_arg_stack(int i) const { 117 bool is_arg_stack(int i) const {
132 return !_conservative && _arg_stack.at(i); 118 return !_conservative && _arg_stack.test(i);
133 } 119 }
134 120
135 // The given argument does not escape globally, and may be returned. 121 // The given argument does not escape globally, and may be returned.
136 bool is_arg_returned(int i) const { 122 bool is_arg_returned(int i) const {
137 return !_conservative && _arg_returned.at(i); } 123 return !_conservative && _arg_returned.test(i); }
138 124
139 // True iff only input arguments are returned. 125 // True iff only input arguments are returned.
140 bool is_return_local() const { 126 bool is_return_local() const {
141 return !_conservative && _return_local; 127 return !_conservative && _return_local;
142 } 128 }