Mercurial > hg > truffle
annotate src/share/vm/utilities/accessFlags.hpp @ 1721:413ad0331a0c
6977924: Changes for 6975078 produce build error with certain gcc versions
Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error.
Reviewed-by: jcoomes, ysr, phh
author | johnc |
---|---|
date | Wed, 18 Aug 2010 10:59:06 -0700 |
parents | c18cbe5936b8 |
children | d5d065957597 |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
710
diff
changeset
|
2 * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved. |
0 | 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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
710
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
710
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
710
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 // AccessFlags is an abstraction over Java access flags. | |
26 | |
27 | |
28 enum { | |
29 // See jvm.h for shared JVM_ACC_XXX access flags | |
30 | |
31 // HotSpot-specific access flags | |
32 | |
33 // flags actually put in .class file | |
34 JVM_ACC_WRITTEN_FLAGS = 0x00007FFF, | |
35 | |
36 // methodOop flags | |
37 JVM_ACC_MONITOR_MATCH = 0x10000000, // True if we know that monitorenter/monitorexit bytecodes match | |
38 JVM_ACC_HAS_MONITOR_BYTECODES = 0x20000000, // Method contains monitorenter/monitorexit bytecodes | |
39 JVM_ACC_HAS_LOOPS = 0x40000000, // Method has loops | |
40 JVM_ACC_LOOPS_FLAG_INIT = (int)0x80000000,// The loop flag has been initialized | |
41 JVM_ACC_QUEUED = 0x01000000, // Queued for compilation | |
42 JVM_ACC_NOT_TIER1_COMPILABLE = 0x04000000, | |
43 JVM_ACC_NOT_OSR_COMPILABLE = 0x08000000, | |
44 JVM_ACC_HAS_LINE_NUMBER_TABLE = 0x00100000, | |
45 JVM_ACC_HAS_CHECKED_EXCEPTIONS = 0x00400000, | |
46 JVM_ACC_HAS_JSRS = 0x00800000, | |
47 JVM_ACC_IS_OLD = 0x00010000, // RedefineClasses() has replaced this method | |
48 JVM_ACC_IS_OBSOLETE = 0x00020000, // RedefineClasses() has made method obsolete | |
49 JVM_ACC_IS_PREFIXED_NATIVE = 0x00040000, // JVMTI has prefixed this native method | |
710 | 50 JVM_MH_INVOKE_BITS // = 0x10001100 // MethodHandle.invoke quasi-native |
51 = (JVM_ACC_NATIVE | JVM_ACC_SYNTHETIC | JVM_ACC_MONITOR_MATCH), | |
0 | 52 |
53 // klassOop flags | |
54 JVM_ACC_HAS_MIRANDA_METHODS = 0x10000000, // True if this class has miranda methods in it's vtable | |
55 JVM_ACC_HAS_VANILLA_CONSTRUCTOR = 0x20000000, // True if klass has a vanilla default constructor | |
56 JVM_ACC_HAS_FINALIZER = 0x40000000, // True if klass has a non-empty finalize() method | |
57 JVM_ACC_IS_CLONEABLE = (int)0x80000000,// True if klass supports the Clonable interface | |
58 JVM_ACC_HAS_FINAL_METHOD = 0x01000000, // True if klass has final method | |
59 | |
60 // klassOop and methodOop flags | |
61 JVM_ACC_HAS_LOCAL_VARIABLE_TABLE= 0x00200000, | |
62 | |
63 JVM_ACC_PROMOTED_FLAGS = 0x00200000, // flags promoted from methods to the holding klass | |
64 | |
65 // field flags | |
66 // Note: these flags must be defined in the low order 16 bits because | |
67 // instanceKlass only stores a ushort worth of information from the | |
68 // AccessFlags value. | |
69 // These bits must not conflict with any other field-related access flags | |
70 // (e.g., ACC_ENUM). | |
71 // Note that the class-related ACC_ANNOTATION bit conflicts with these flags. | |
72 JVM_ACC_FIELD_ACCESS_WATCHED = 0x00002000, // field access is watched by JVMTI | |
73 JVM_ACC_FIELD_MODIFICATION_WATCHED = 0x00008000, // field modification is watched by JVMTI | |
74 | |
75 // flags accepted by set_field_flags() | |
76 JVM_ACC_FIELD_FLAGS = 0x00008000 | JVM_ACC_WRITTEN_FLAGS | |
710 | 77 |
0 | 78 }; |
79 | |
80 | |
81 class AccessFlags VALUE_OBJ_CLASS_SPEC { | |
82 friend class VMStructs; | |
83 private: | |
84 jint _flags; | |
85 | |
86 public: | |
87 // Java access flags | |
88 bool is_public () const { return (_flags & JVM_ACC_PUBLIC ) != 0; } | |
89 bool is_private () const { return (_flags & JVM_ACC_PRIVATE ) != 0; } | |
90 bool is_protected () const { return (_flags & JVM_ACC_PROTECTED ) != 0; } | |
91 bool is_static () const { return (_flags & JVM_ACC_STATIC ) != 0; } | |
92 bool is_final () const { return (_flags & JVM_ACC_FINAL ) != 0; } | |
93 bool is_synchronized() const { return (_flags & JVM_ACC_SYNCHRONIZED) != 0; } | |
94 bool is_super () const { return (_flags & JVM_ACC_SUPER ) != 0; } | |
95 bool is_volatile () const { return (_flags & JVM_ACC_VOLATILE ) != 0; } | |
96 bool is_transient () const { return (_flags & JVM_ACC_TRANSIENT ) != 0; } | |
97 bool is_native () const { return (_flags & JVM_ACC_NATIVE ) != 0; } | |
98 bool is_interface () const { return (_flags & JVM_ACC_INTERFACE ) != 0; } | |
99 bool is_abstract () const { return (_flags & JVM_ACC_ABSTRACT ) != 0; } | |
100 bool is_strict () const { return (_flags & JVM_ACC_STRICT ) != 0; } | |
101 | |
102 // Attribute flags | |
103 bool is_synthetic () const { return (_flags & JVM_ACC_SYNTHETIC ) != 0; } | |
104 | |
105 // methodOop flags | |
106 bool is_monitor_matching () const { return (_flags & JVM_ACC_MONITOR_MATCH ) != 0; } | |
107 bool has_monitor_bytecodes () const { return (_flags & JVM_ACC_HAS_MONITOR_BYTECODES ) != 0; } | |
108 bool has_loops () const { return (_flags & JVM_ACC_HAS_LOOPS ) != 0; } | |
109 bool loops_flag_init () const { return (_flags & JVM_ACC_LOOPS_FLAG_INIT ) != 0; } | |
110 bool queued_for_compilation () const { return (_flags & JVM_ACC_QUEUED ) != 0; } | |
111 bool is_not_tier1_compilable () const { return (_flags & JVM_ACC_NOT_TIER1_COMPILABLE ) != 0; } | |
112 bool is_not_osr_compilable () const { return (_flags & JVM_ACC_NOT_OSR_COMPILABLE ) != 0; } | |
113 bool has_linenumber_table () const { return (_flags & JVM_ACC_HAS_LINE_NUMBER_TABLE ) != 0; } | |
114 bool has_checked_exceptions () const { return (_flags & JVM_ACC_HAS_CHECKED_EXCEPTIONS ) != 0; } | |
115 bool has_jsrs () const { return (_flags & JVM_ACC_HAS_JSRS ) != 0; } | |
116 bool is_old () const { return (_flags & JVM_ACC_IS_OLD ) != 0; } | |
117 bool is_obsolete () const { return (_flags & JVM_ACC_IS_OBSOLETE ) != 0; } | |
118 bool is_prefixed_native () const { return (_flags & JVM_ACC_IS_PREFIXED_NATIVE ) != 0; } | |
119 | |
710 | 120 // JSR 292: A method of the form MethodHandle.invoke(A...)R method is |
121 // neither bytecoded nor a JNI native, but rather a fast call through | |
122 // a lightweight method handle object. Because it is not bytecoded, | |
123 // it has the native bit set, but the monitor-match bit is also set | |
124 // to distinguish it from a JNI native (which never has the match bit set). | |
125 // The synthetic bit is also present, because such a method is never | |
126 // explicitly defined in Java code. | |
127 bool is_method_handle_invoke () const { return (_flags & JVM_MH_INVOKE_BITS) == JVM_MH_INVOKE_BITS; } | |
128 | |
0 | 129 // klassOop flags |
130 bool has_miranda_methods () const { return (_flags & JVM_ACC_HAS_MIRANDA_METHODS ) != 0; } | |
131 bool has_vanilla_constructor () const { return (_flags & JVM_ACC_HAS_VANILLA_CONSTRUCTOR) != 0; } | |
132 bool has_finalizer () const { return (_flags & JVM_ACC_HAS_FINALIZER ) != 0; } | |
133 bool has_final_method () const { return (_flags & JVM_ACC_HAS_FINAL_METHOD ) != 0; } | |
134 bool is_cloneable () const { return (_flags & JVM_ACC_IS_CLONEABLE ) != 0; } | |
135 // klassOop and methodOop flags | |
136 bool has_localvariable_table () const { return (_flags & JVM_ACC_HAS_LOCAL_VARIABLE_TABLE) != 0; } | |
137 void set_has_localvariable_table() { atomic_set_bits(JVM_ACC_HAS_LOCAL_VARIABLE_TABLE); } | |
138 void clear_has_localvariable_table() { atomic_clear_bits(JVM_ACC_HAS_LOCAL_VARIABLE_TABLE); } | |
139 | |
140 // field flags | |
141 bool is_field_access_watched() const { return (_flags & JVM_ACC_FIELD_ACCESS_WATCHED) != 0; } | |
142 bool is_field_modification_watched() const | |
143 { return (_flags & JVM_ACC_FIELD_MODIFICATION_WATCHED) != 0; } | |
144 | |
145 // get .class file flags | |
146 jint get_flags () const { return (_flags & JVM_ACC_WRITTEN_FLAGS); } | |
147 | |
148 // Initialization | |
149 void add_promoted_flags(jint flags) { _flags |= (flags & JVM_ACC_PROMOTED_FLAGS); } | |
150 void set_field_flags(jint flags) { _flags = (flags & JVM_ACC_FIELD_FLAGS); } | |
151 void set_flags(jint flags) { _flags = (flags & JVM_ACC_WRITTEN_FLAGS); } | |
152 | |
153 void set_queued_for_compilation() { atomic_set_bits(JVM_ACC_QUEUED); } | |
154 void clear_queued_for_compilation() { atomic_clear_bits(JVM_ACC_QUEUED); } | |
155 | |
156 // Atomic update of flags | |
157 void atomic_set_bits(jint bits); | |
158 void atomic_clear_bits(jint bits); | |
159 | |
160 private: | |
161 friend class methodOopDesc; | |
162 friend class Klass; | |
163 friend class ClassFileParser; | |
164 // the functions below should only be called on the _access_flags inst var directly, | |
165 // otherwise they are just changing a copy of the flags | |
166 | |
167 // attribute flags | |
168 void set_is_synthetic() { atomic_set_bits(JVM_ACC_SYNTHETIC); } | |
169 | |
170 // methodOop flags | |
171 void set_monitor_matching() { atomic_set_bits(JVM_ACC_MONITOR_MATCH); } | |
172 void set_has_monitor_bytecodes() { atomic_set_bits(JVM_ACC_HAS_MONITOR_BYTECODES); } | |
173 void set_has_loops() { atomic_set_bits(JVM_ACC_HAS_LOOPS); } | |
174 void set_loops_flag_init() { atomic_set_bits(JVM_ACC_LOOPS_FLAG_INIT); } | |
175 void set_not_tier1_compilable() { atomic_set_bits(JVM_ACC_NOT_TIER1_COMPILABLE); } | |
176 void set_not_osr_compilable() { atomic_set_bits(JVM_ACC_NOT_OSR_COMPILABLE); } | |
177 void set_has_linenumber_table() { atomic_set_bits(JVM_ACC_HAS_LINE_NUMBER_TABLE); } | |
178 void set_has_checked_exceptions() { atomic_set_bits(JVM_ACC_HAS_CHECKED_EXCEPTIONS); } | |
179 void set_has_jsrs() { atomic_set_bits(JVM_ACC_HAS_JSRS); } | |
180 void set_is_old() { atomic_set_bits(JVM_ACC_IS_OLD); } | |
181 void set_is_obsolete() { atomic_set_bits(JVM_ACC_IS_OBSOLETE); } | |
182 void set_is_prefixed_native() { atomic_set_bits(JVM_ACC_IS_PREFIXED_NATIVE); } | |
183 | |
184 // klassOop flags | |
185 void set_has_vanilla_constructor() { atomic_set_bits(JVM_ACC_HAS_VANILLA_CONSTRUCTOR); } | |
186 void set_has_finalizer() { atomic_set_bits(JVM_ACC_HAS_FINALIZER); } | |
187 void set_has_final_method() { atomic_set_bits(JVM_ACC_HAS_FINAL_METHOD); } | |
188 void set_is_cloneable() { atomic_set_bits(JVM_ACC_IS_CLONEABLE); } | |
189 void set_has_miranda_methods() { atomic_set_bits(JVM_ACC_HAS_MIRANDA_METHODS); } | |
190 | |
191 public: | |
192 // field flags | |
193 void set_is_field_access_watched(const bool value) | |
194 { | |
195 if (value) { | |
196 atomic_set_bits(JVM_ACC_FIELD_ACCESS_WATCHED); | |
197 } else { | |
198 atomic_clear_bits(JVM_ACC_FIELD_ACCESS_WATCHED); | |
199 } | |
200 } | |
201 void set_is_field_modification_watched(const bool value) | |
202 { | |
203 if (value) { | |
204 atomic_set_bits(JVM_ACC_FIELD_MODIFICATION_WATCHED); | |
205 } else { | |
206 atomic_clear_bits(JVM_ACC_FIELD_MODIFICATION_WATCHED); | |
207 } | |
208 } | |
209 | |
210 // Conversion | |
211 jshort as_short() { return (jshort)_flags; } | |
212 jint as_int() { return _flags; } | |
213 | |
710 | 214 inline friend AccessFlags accessFlags_from(jint flags); |
215 | |
0 | 216 // Printing/debugging |
217 void print_on(outputStream* st) const PRODUCT_RETURN; | |
218 }; | |
710 | 219 |
220 inline AccessFlags accessFlags_from(jint flags) { | |
221 AccessFlags af; | |
222 af._flags = flags; | |
223 return af; | |
224 } |