Mercurial > hg > truffle
annotate src/share/vm/interpreter/interpreterRuntime.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 | 136b78722a08 |
children | f95d63e2154a |
rev | line source |
---|---|
0 | 1 /* |
1579 | 2 * Copyright (c) 1997, 2010, 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:
1059
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1059
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:
1059
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 // The InterpreterRuntime is called by the interpreter for everything | |
26 // that cannot/should not be dealt with in assembly and needs C support. | |
27 | |
28 class InterpreterRuntime: AllStatic { | |
29 friend class BytecodeClosure; // for method and bcp | |
30 friend class PrintingClosure; // for method and bcp | |
31 | |
32 private: | |
33 // Helper functions to access current interpreter state | |
34 static frame last_frame(JavaThread *thread) { return thread->last_frame(); } | |
35 static methodOop method(JavaThread *thread) { return last_frame(thread).interpreter_frame_method(); } | |
36 static address bcp(JavaThread *thread) { return last_frame(thread).interpreter_frame_bcp(); } | |
1602 | 37 static int bci(JavaThread *thread) { return last_frame(thread).interpreter_frame_bci(); } |
0 | 38 static void set_bcp_and_mdp(address bcp, JavaThread*thread); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
39 static Bytecodes::Code code(JavaThread *thread) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
40 // pass method to avoid calling unsafe bcp_to_method (partial fix 4926272) |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
41 return Bytecodes::code_at(bcp(thread), method(thread)); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
42 } |
0 | 43 static bool already_resolved(JavaThread *thread) { return cache_entry(thread)->is_resolved(code(thread)); } |
1565 | 44 static Bytecode* bytecode(JavaThread *thread) { return Bytecode_at(bcp(thread)); } |
45 static int get_index_u1(JavaThread *thread, Bytecodes::Code bc) | |
46 { return bytecode(thread)->get_index_u1(bc); } | |
47 static int get_index_u2(JavaThread *thread, Bytecodes::Code bc) | |
48 { return bytecode(thread)->get_index_u2(bc); } | |
49 static int get_index_u2_cpcache(JavaThread *thread, Bytecodes::Code bc) | |
50 { return bytecode(thread)->get_index_u2_cpcache(bc); } | |
0 | 51 static int number_of_dimensions(JavaThread *thread) { return bcp(thread)[3]; } |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
52 |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
53 static ConstantPoolCacheEntry* cache_entry_at(JavaThread *thread, int i) { return method(thread)->constants()->cache()->entry_at(i); } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
54 static ConstantPoolCacheEntry* cache_entry(JavaThread *thread) { return cache_entry_at(thread, Bytes::get_native_u2(bcp(thread) + 1)); } |
0 | 55 static void note_trap(JavaThread *thread, int reason, TRAPS); |
56 | |
941 | 57 // Inner work method for Interpreter's frequency counter overflow |
58 static nmethod* frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp); | |
59 | |
0 | 60 public: |
61 // Constants | |
62 static void ldc (JavaThread* thread, bool wide); | |
1602 | 63 static void resolve_ldc (JavaThread* thread, Bytecodes::Code bytecode); |
0 | 64 |
65 // Allocation | |
66 static void _new (JavaThread* thread, constantPoolOopDesc* pool, int index); | |
67 static void newarray (JavaThread* thread, BasicType type, jint size); | |
68 static void anewarray (JavaThread* thread, constantPoolOopDesc* pool, int index, jint size); | |
69 static void multianewarray(JavaThread* thread, jint* first_size_address); | |
70 static void register_finalizer(JavaThread* thread, oopDesc* obj); | |
71 | |
72 // Quicken instance-of and check-cast bytecodes | |
73 static void quicken_io_cc(JavaThread* thread); | |
74 | |
75 // Exceptions thrown by the interpreter | |
76 static void throw_AbstractMethodError(JavaThread* thread); | |
77 static void throw_IncompatibleClassChangeError(JavaThread* thread); | |
78 static void throw_StackOverflowError(JavaThread* thread); | |
79 static void throw_ArrayIndexOutOfBoundsException(JavaThread* thread, char* name, jint index); | |
80 static void throw_ClassCastException(JavaThread* thread, oopDesc* obj); | |
710 | 81 static void throw_WrongMethodTypeException(JavaThread* thread, oopDesc* mtype = NULL, oopDesc* mhandle = NULL); |
0 | 82 static void create_exception(JavaThread* thread, char* name, char* message); |
83 static void create_klass_exception(JavaThread* thread, char* name, oopDesc* obj); | |
84 static address exception_handler_for_exception(JavaThread* thread, oopDesc* exception); | |
85 static void throw_pending_exception(JavaThread* thread); | |
86 | |
87 // Statics & fields | |
88 static void resolve_get_put(JavaThread* thread, Bytecodes::Code bytecode); | |
89 | |
90 // Synchronization | |
91 static void monitorenter(JavaThread* thread, BasicObjectLock* elem); | |
92 static void monitorexit (JavaThread* thread, BasicObjectLock* elem); | |
93 | |
94 static void throw_illegal_monitor_state_exception(JavaThread* thread); | |
95 static void new_illegal_monitor_state_exception(JavaThread* thread); | |
96 | |
97 // Calls | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
98 static void resolve_invoke (JavaThread* thread, Bytecodes::Code bytecode); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
99 static void resolve_invokedynamic(JavaThread* thread); |
0 | 100 |
101 // Breakpoints | |
102 static void _breakpoint(JavaThread* thread, methodOopDesc* method, address bcp); | |
103 static Bytecodes::Code get_original_bytecode_at(JavaThread* thread, methodOopDesc* method, address bcp); | |
104 static void set_original_bytecode_at(JavaThread* thread, methodOopDesc* method, address bcp, Bytecodes::Code new_code); | |
105 static bool is_breakpoint(JavaThread *thread) { return Bytecodes::code_or_bp_at(bcp(thread)) == Bytecodes::_breakpoint; } | |
106 | |
107 // Safepoints | |
108 static void at_safepoint(JavaThread* thread); | |
109 | |
110 // Debugger support | |
111 static void post_field_access(JavaThread *thread, oopDesc* obj, | |
112 ConstantPoolCacheEntry *cp_entry); | |
113 static void post_field_modification(JavaThread *thread, oopDesc* obj, | |
114 ConstantPoolCacheEntry *cp_entry, jvalue *value); | |
115 static void post_method_entry(JavaThread *thread); | |
116 static void post_method_exit (JavaThread *thread); | |
117 static int interpreter_contains(address pc); | |
118 | |
119 // Native signature handlers | |
120 static void prepare_native_call(JavaThread* thread, methodOopDesc* method); | |
121 static address slow_signature_handler(JavaThread* thread, | |
122 methodOopDesc* method, | |
123 intptr_t* from, intptr_t* to); | |
124 | |
125 #if defined(IA32) || defined(AMD64) | |
126 // Popframe support (only needed on x86 and AMD64) | |
127 static void popframe_move_outgoing_args(JavaThread* thread, void* src_address, void* dest_address); | |
128 #endif | |
129 | |
130 // Platform dependent stuff | |
131 #include "incls/_interpreterRT_pd.hpp.incl" | |
132 | |
133 // Interpreter's frequency counter overflow | |
134 static nmethod* frequency_counter_overflow(JavaThread* thread, address branch_bcp); | |
135 | |
136 // Interpreter profiling support | |
137 static jint bcp_to_di(methodOopDesc* method, address cur_bcp); | |
138 static jint profile_method(JavaThread* thread, address cur_bcp); | |
139 static void update_mdp_for_ret(JavaThread* thread, int bci); | |
140 #ifdef ASSERT | |
141 static void verify_mdp(methodOopDesc* method, address bcp, address mdp); | |
142 #endif // ASSERT | |
143 }; | |
144 | |
145 | |
146 class SignatureHandlerLibrary: public AllStatic { | |
147 public: | |
148 enum { buffer_size = 1*K }; // the size of the temporary code buffer | |
149 enum { blob_size = 32*K }; // the size of a handler code blob. | |
150 | |
151 private: | |
152 static BufferBlob* _handler_blob; // the current buffer blob containing the generated handlers | |
153 static address _handler; // next available address within _handler_blob; | |
154 static GrowableArray<uint64_t>* _fingerprints; // the fingerprint collection | |
155 static GrowableArray<address>* _handlers; // the corresponding handlers | |
156 static address _buffer; // the temporary code buffer | |
157 | |
158 static address set_handler_blob(); | |
159 static void initialize(); | |
160 static address set_handler(CodeBuffer* buffer); | |
161 static void pd_set_handler(address handler); | |
162 | |
163 public: | |
164 static void add(methodHandle method); | |
165 }; |