src/share/vm/shark/sharkBlock.cpp

Print this page
rev 3850 : [mq]: shark.patch

@@ -168,14 +168,16 @@
       push(SharkValue::jint_constant(iter()->get_constant_u2()));
       break;
 
     case Bytecodes::_ldc:
     case Bytecodes::_ldc_w:
-    case Bytecodes::_ldc2_w:
-      push(SharkConstant::for_ldc(iter())->value(builder()));
+    case Bytecodes::_ldc2_w: {
+      SharkConstant* constant = SharkConstant::for_ldc(iter());
+      assert(constant->is_loaded(), "trap should handle unloaded classes");
+      push(constant->value(builder()));
       break;
-
+    }
     case Bytecodes::_iload_0:
     case Bytecodes::_lload_0:
     case Bytecodes::_fload_0:
     case Bytecodes::_dload_0:
     case Bytecodes::_aload_0:

@@ -998,13 +1000,13 @@
   builder()->CreateBr(done);
 
   builder()->SetInsertPoint(done);
   PHINode *result;
   if (is_long)
-    result = builder()->CreatePHI(SharkType::jlong_type(), "result");
+    result = builder()->CreatePHI(SharkType::jlong_type(), 0, "result");
   else
-    result = builder()->CreatePHI(SharkType::jint_type(), "result");
+    result = builder()->CreatePHI(SharkType::jint_type(), 0, "result");
   result->addIncoming(special_result, special_case);
   result->addIncoming(general_result, general_case);
 
   if (is_long)
     push(SharkValue::create_jlong(result, false));

@@ -1034,26 +1036,34 @@
     SharkConstant *constant = SharkConstant::for_field(iter());
     if (constant->is_loaded())
       value = constant->value(builder());
   }
   if (!is_get || value == NULL) {
-    if (!is_field)
-      object = builder()->CreateInlineOop(field->holder());
-
+    if (!is_field) {
+      object = builder()->CreateInlineOop(field->holder()->java_mirror());
+    }
     BasicType   basic_type = field->type()->basic_type();
-    const Type *stack_type = SharkType::to_stackType(basic_type);
-    const Type *field_type = SharkType::to_arrayType(basic_type);
+    Type *stack_type = SharkType::to_stackType(basic_type);
+    Type *field_type = SharkType::to_arrayType(basic_type);
 
     Value *addr = builder()->CreateAddressOfStructEntry(
       object, in_ByteSize(field->offset_in_bytes()),
       PointerType::getUnqual(field_type),
       "addr");
 
     // Do the access
     if (is_get) {
-      Value *field_value = builder()->CreateLoad(addr);
-
+      Value* field_value;
+      if (field->is_volatile()) {
+#if SHARK_LLVM_VERSION <= 31
+        field_value = builder()->CreateLoad(addr);
+#else
+        field_value = builder()->CreateAtomicLoad(addr);
+#endif
+      } else {
+        field_value = builder()->CreateLoad(addr);
+      }
       if (field_type != stack_type) {
         field_value = builder()->CreateIntCast(
           field_value, stack_type, basic_type != T_CHAR);
       }
 

@@ -1065,18 +1075,29 @@
       if (field_type != stack_type) {
         field_value = builder()->CreateIntCast(
           field_value, field_type, basic_type != T_CHAR);
       }
 
+      if (field->is_volatile()) {
+#if SHARK_LLVM_VERSION <= 31
       builder()->CreateStore(field_value, addr);
+#else
+        builder()->CreateAtomicStore(field_value, addr);
+#endif
+      } else {
+        builder()->CreateStore(field_value, addr);
+      }
 
-      if (!field->type()->is_primitive_type())
+      if (!field->type()->is_primitive_type()) {
         builder()->CreateUpdateBarrierSet(oopDesc::bs(), addr);
-
-      if (field->is_volatile())
+      }
+#if SHARK_LLVM_VERSION <= 31
+      if (field->is_volatile()) {
         builder()->CreateMemoryBarrier(SharkBuilder::BARRIER_STORELOAD);
     }
+#endif
+    }
   }
 
   // Push the value onto the stack where necessary
   if (is_get)
     push(value);

@@ -1103,11 +1124,11 @@
 
   builder()->SetInsertPoint(gt);
   builder()->CreateBr(done);
 
   builder()->SetInsertPoint(done);
-  PHINode *result = builder()->CreatePHI(SharkType::jint_type(), "result");
+  PHINode *result = builder()->CreatePHI(SharkType::jint_type(), 0, "result");
   result->addIncoming(LLVMValue::jint_constant(-1), lt);
   result->addIncoming(LLVMValue::jint_constant(0),  eq);
   result->addIncoming(LLVMValue::jint_constant(1),  gt);
 
   push(SharkValue::create_jint(result, false));

@@ -1150,11 +1171,11 @@
 
   builder()->SetInsertPoint(eq);
   builder()->CreateBr(done);
 
   builder()->SetInsertPoint(done);
-  PHINode *result = builder()->CreatePHI(SharkType::jint_type(), "result");
+  PHINode *result = builder()->CreatePHI(SharkType::jint_type(), 0, "result");
   result->addIncoming(LLVMValue::jint_constant(-1), lt);
   result->addIncoming(LLVMValue::jint_constant(0),  eq);
   result->addIncoming(LLVMValue::jint_constant(1),  gt);
 
   push(SharkValue::create_jint(result, false));