comparison src/share/vm/shark/sharkNativeWrapper.cpp @ 7212:291ffc492eb6

Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
author Doug Simon <doug.simon@oracle.com>
date Fri, 14 Dec 2012 14:35:13 +0100
parents 2cd5e15048e6
children
comparison
equal deleted inserted replaced
7163:2ed8d74e5984 7212:291ffc492eb6
57 // the wrapper, which results in the odd mild inefficiency but is a 57 // the wrapper, which results in the odd mild inefficiency but is a
58 // damn sight easier to code. 58 // damn sight easier to code.
59 OopMap *oopmap = new OopMap( 59 OopMap *oopmap = new OopMap(
60 SharkStack::oopmap_slot_munge(stack()->oopmap_frame_size()), 60 SharkStack::oopmap_slot_munge(stack()->oopmap_frame_size()),
61 SharkStack::oopmap_slot_munge(arg_size())); 61 SharkStack::oopmap_slot_munge(arg_size()));
62 oopmap->set_oop(SharkStack::slot2reg(stack()->method_slot_offset()));
63 62
64 // Set up the oop_tmp slot if required: 63 // Set up the oop_tmp slot if required:
65 // - For static methods we use it to handlize the class argument 64 // - For static methods we use it to handlize the class argument
66 // for the call, and to protect the same during slow path locks 65 // for the call, and to protect the same during slow path locks
67 // (if synchronized). 66 // (if synchronized).
81 Unimplemented(); 80 Unimplemented();
82 _lock_slot_offset = 23; 81 _lock_slot_offset = 23;
83 } 82 }
84 83
85 // Start building the argument list 84 // Start building the argument list
86 std::vector<const Type*> param_types; 85 std::vector<Type*> param_types;
87 std::vector<Value*> param_values; 86 std::vector<Value*> param_values;
88 const PointerType *box_type = PointerType::getUnqual(SharkType::oop_type()); 87 PointerType *box_type = PointerType::getUnqual(SharkType::oop_type());
89 88
90 // First argument is the JNIEnv 89 // First argument is the JNIEnv
91 param_types.push_back(SharkType::jniEnv_type()); 90 param_types.push_back(SharkType::jniEnv_type());
92 param_values.push_back( 91 param_values.push_back(
93 builder()->CreateAddressOfStructEntry( 92 builder()->CreateAddressOfStructEntry(
147 146
148 builder()->SetInsertPoint(not_null); 147 builder()->SetInsertPoint(not_null);
149 builder()->CreateBr(merge); 148 builder()->CreateBr(merge);
150 149
151 builder()->SetInsertPoint(merge); 150 builder()->SetInsertPoint(merge);
152 phi = builder()->CreatePHI(box_type, "boxed_object"); 151 phi = builder()->CreatePHI(box_type, 0, "boxed_object");
153 phi->addIncoming(ConstantPointerNull::get(box_type), null); 152 phi->addIncoming(ConstantPointerNull::get(box_type), null);
154 phi->addIncoming(box, not_null); 153 phi->addIncoming(box, not_null);
155 box = phi; 154 box = phi;
156 155
157 param_types.push_back(box_type); 156 param_types.push_back(box_type);
168 case T_DOUBLE: 167 case T_DOUBLE:
169 adjusted_offset--; 168 adjusted_offset--;
170 // fall through 169 // fall through
171 170
172 default: 171 default:
173 const Type *param_type = SharkType::to_stackType(arg_type(i)); 172 Type *param_type = SharkType::to_stackType(arg_type(i));
174 173
175 param_types.push_back(param_type); 174 param_types.push_back(param_type);
176 param_values.push_back( 175 param_values.push_back(
177 builder()->CreateLoad(stack()->slot_addr(adjusted_offset, param_type))); 176 builder()->CreateLoad(stack()->slot_addr(adjusted_offset, param_type)));
178 } 177 }
199 // Change the thread state to _thread_in_native 198 // Change the thread state to _thread_in_native
200 CreateSetThreadState(_thread_in_native); 199 CreateSetThreadState(_thread_in_native);
201 200
202 // Make the call 201 // Make the call
203 BasicType result_type = target()->result_type(); 202 BasicType result_type = target()->result_type();
204 const Type* return_type; 203 Type* return_type;
205 if (result_type == T_VOID) 204 if (result_type == T_VOID)
206 return_type = SharkType::void_type(); 205 return_type = SharkType::void_type();
207 else if (is_returning_oop()) 206 else if (is_returning_oop())
208 return_type = box_type; 207 return_type = box_type;
209 else 208 else
211 Value* native_function = builder()->CreateIntToPtr( 210 Value* native_function = builder()->CreateIntToPtr(
212 LLVMValue::intptr_constant((intptr_t) target()->native_function()), 211 LLVMValue::intptr_constant((intptr_t) target()->native_function()),
213 PointerType::getUnqual( 212 PointerType::getUnqual(
214 FunctionType::get(return_type, param_types, false))); 213 FunctionType::get(return_type, param_types, false)));
215 Value *result = builder()->CreateCall( 214 Value *result = builder()->CreateCall(
216 native_function, param_values.begin(), param_values.end()); 215 native_function, llvm::makeArrayRef(param_values));
217 216
218 // Start the transition back to _thread_in_Java 217 // Start the transition back to _thread_in_Java
219 CreateSetThreadState(_thread_in_native_trans); 218 CreateSetThreadState(_thread_in_native_trans);
220 219
221 // Make sure new state is visible in the GC thread 220 // Make sure new state is visible in the GC thread
222 if (os::is_MP()) { 221 if (os::is_MP()) {
223 if (UseMembar) 222 if (UseMembar)
224 builder()->CreateMemoryBarrier(SharkBuilder::BARRIER_STORELOAD); 223 builder()->CreateFence(llvm::SequentiallyConsistent, llvm::CrossThread);
225 else 224 else
226 CreateWriteMemorySerializePage(); 225 CreateWriteMemorySerializePage();
227 } 226 }
228 227
229 // Handle safepoint operations, pending suspend requests, 228 // Handle safepoint operations, pending suspend requests,
303 builder()->SetInsertPoint(not_null); 302 builder()->SetInsertPoint(not_null);
304 Value *unboxed_result = builder()->CreateLoad(result); 303 Value *unboxed_result = builder()->CreateLoad(result);
305 builder()->CreateBr(merge); 304 builder()->CreateBr(merge);
306 305
307 builder()->SetInsertPoint(merge); 306 builder()->SetInsertPoint(merge);
308 PHINode *phi = builder()->CreatePHI(SharkType::oop_type(), "result"); 307 PHINode *phi = builder()->CreatePHI(SharkType::oop_type(), 0, "result");
309 phi->addIncoming(LLVMValue::null(), null); 308 phi->addIncoming(LLVMValue::null(), null);
310 phi->addIncoming(unboxed_result, not_null); 309 phi->addIncoming(unboxed_result, not_null);
311 result = phi; 310 result = phi;
312 } 311 }
313 312