Merge
authortwisti
Fri, 30 May 2014 10:07:19 -0700
changeset 24680 c07894b51878
parent 24668 26512f82f5d9 (current diff)
parent 24679 2ca270b3baf5 (diff)
child 24681 e6c4b47cd5e4
Merge
--- a/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp	Fri May 30 10:07:19 2014 -0700
@@ -1221,10 +1221,8 @@
   bool is_obj = (type == T_ARRAY || type == T_OBJECT);
   LIR_Opr offset = off.result();
 
-  if (data != dst) {
-    __ move(data, dst);
-    data = dst;
-  }
+  // Because we want a 2-arg form of xchg
+  __ move(data, dst);
 
   assert (!x->is_add() && (type == T_INT || (is_obj LP64_ONLY(&& UseCompressedOops))), "unexpected type");
   LIR_Address* addr;
@@ -1254,7 +1252,7 @@
     pre_barrier(ptr, LIR_OprFact::illegalOpr /* pre_val */,
                 true /* do_load */, false /* patch */, NULL);
   }
-  __ xchg(LIR_OprFact::address(addr), data, dst, tmp);
+  __ xchg(LIR_OprFact::address(addr), dst, dst, tmp);
   if (is_obj) {
     // Seems to be a precise address
     post_barrier(ptr, data);
--- a/hotspot/src/cpu/sparc/vm/copy_sparc.hpp	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/copy_sparc.hpp	Fri May 30 10:07:19 2014 -0700
@@ -184,7 +184,7 @@
   assert(MinObjAlignmentInBytes >= BytesPerLong, "need alternate implementation");
 
   if (value == 0 && UseBlockZeroing &&
-      (count > (BlockZeroingLowLimit >> LogHeapWordSize))) {
+      (count > (size_t)(BlockZeroingLowLimit >> LogHeapWordSize))) {
    // Call it only when block zeroing is used
    ((_zero_Fn)StubRoutines::zero_aligned_words())(tohw, count);
   } else {
--- a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/CallSite.java	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/CallSite.java	Fri May 30 10:07:19 2014 -0700
@@ -231,6 +231,9 @@
         // identical call sites with the same method name/bci are
         // possible so we have to try them all until we find the late
         // inline call site that has a matching inline id.
+        if (calls == null) {
+            return null;
+        }
         CallSite site = sites.pop();
         for (CallSite c : calls) {
             if (c.matches(site)) {
@@ -250,6 +253,27 @@
         return null;
     }
 
+    public ArrayDeque<CallSite> findCallSite2(CallSite site) {
+        if (calls == null) {
+            return null;
+        }
+
+        for (CallSite c : calls) {
+            if (c.matches(site)) {
+                ArrayDeque<CallSite> stack = new ArrayDeque<CallSite>();
+                stack.push(c);
+                return stack;
+            } else {
+                ArrayDeque<CallSite> stack = c.findCallSite2(site);
+                if (stack != null) {
+                    stack.push(c);
+                    return stack;
+                }
+            }
+        }
+        return null;
+    }
+
     public long getInlineId() {
         return inlineId;
     }
--- a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Compilation.java	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Compilation.java	Fri May 30 10:07:19 2014 -0700
@@ -49,6 +49,12 @@
         this.id = id;
     }
 
+    void reset() {
+        call = new CallSite();
+        lateInlineCall = new CallSite();
+        phases = new ArrayList<Phase>(4);
+    }
+
     Phase getPhase(String s) {
         for (Phase p : getPhases()) {
             if (p.getName().equals(s)) {
@@ -212,10 +218,6 @@
         return phases;
     }
 
-    public void setPhases(ArrayList<Phase> phases) {
-        this.setPhases(phases);
-    }
-
     public String getFailureReason() {
         return failureReason;
     }
@@ -240,10 +242,6 @@
         return call;
     }
 
-    public void setCall(CallSite call) {
-        this.call = call;
-    }
-
     public CallSite getLateInlineCall() {
         return lateInlineCall;
     }
--- a/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogParser.java	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogParser.java	Fri May 30 10:07:19 2014 -0700
@@ -395,6 +395,7 @@
             compile.setEnd(Double.parseDouble(search(atts, "stamp")));
             if (Integer.parseInt(search(atts, "success")) == 0) {
                 compile.setFailureReason(failureReason);
+                failureReason = null;
             }
         } else if (qname.equals("make_not_entrant")) {
             String id = makeId(atts);
@@ -451,6 +452,12 @@
             nmethods.put(id, nm);
             events.add(nm);
         } else if (qname.equals("parse")) {
+            if (failureReason != null && scopes.size() == 0 && !lateInlining) {
+                failureReason = null;
+                compile.reset();
+                site = compile.getCall();
+            }
+
             if (methodHandleSite != null) {
                 throw new InternalError("method handle site should have been replaced");
             }
@@ -529,6 +536,18 @@
 
             site = compile.getCall().findCallSite(thisCallScopes);
             if (site == null) {
+                System.out.println("call scopes:");
+                for (CallSite c : thisCallScopes) {
+                    System.out.println(c.getMethod() + " " + c.getBci() + " " + c.getInlineId());
+                }
+                CallSite c = thisCallScopes.getLast();
+                if (c.getInlineId() != 0) {
+                    System.out.println("Looking for call site in entire tree:");
+                    ArrayDeque<CallSite> stack = compile.getCall().findCallSite2(c);
+                    for (CallSite c2 : stack) {
+                        System.out.println(c2.getMethod() + " " + c2.getBci() + " " + c2.getInlineId());
+                    }
+                }
                 System.out.println(caller.getMethod() + " bci: " + bci);
                 throw new InternalError("couldn't find call site");
             }
--- a/hotspot/src/share/vm/c1/c1_LIR.cpp	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIR.cpp	Fri May 30 10:07:19 2014 -0700
@@ -1083,7 +1083,7 @@
 
 void LIR_OpArrayCopy::emit_code(LIR_Assembler* masm) {
   masm->emit_arraycopy(this);
-  masm->emit_code_stub(stub());
+  masm->append_code_stub(stub());
 }
 
 void LIR_OpUpdateCRC32::emit_code(LIR_Assembler* masm) {
@@ -1100,20 +1100,20 @@
 
 void LIR_OpAllocObj::emit_code(LIR_Assembler* masm) {
   masm->emit_alloc_obj(this);
-  masm->emit_code_stub(stub());
+  masm->append_code_stub(stub());
 }
 
 void LIR_OpBranch::emit_code(LIR_Assembler* masm) {
   masm->emit_opBranch(this);
   if (stub()) {
-    masm->emit_code_stub(stub());
+    masm->append_code_stub(stub());
   }
 }
 
 void LIR_OpConvert::emit_code(LIR_Assembler* masm) {
   masm->emit_opConvert(this);
   if (stub() != NULL) {
-    masm->emit_code_stub(stub());
+    masm->append_code_stub(stub());
   }
 }
 
@@ -1123,13 +1123,13 @@
 
 void LIR_OpAllocArray::emit_code(LIR_Assembler* masm) {
   masm->emit_alloc_array(this);
-  masm->emit_code_stub(stub());
+  masm->append_code_stub(stub());
 }
 
 void LIR_OpTypeCheck::emit_code(LIR_Assembler* masm) {
   masm->emit_opTypeCheck(this);
   if (stub()) {
-    masm->emit_code_stub(stub());
+    masm->append_code_stub(stub());
   }
 }
 
@@ -1144,7 +1144,7 @@
 void LIR_OpLock::emit_code(LIR_Assembler* masm) {
   masm->emit_lock(this);
   if (stub()) {
-    masm->emit_code_stub(stub());
+    masm->append_code_stub(stub());
   }
 }
 
--- a/hotspot/src/share/vm/c1/c1_LIR.hpp	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIR.hpp	Fri May 30 10:07:19 2014 -0700
@@ -1127,6 +1127,7 @@
   virtual void print_instr(outputStream* out) const   = 0;
   virtual void print_on(outputStream* st) const PRODUCT_RETURN;
 
+  virtual bool is_patching() { return false; }
   virtual LIR_OpCall* as_OpCall() { return NULL; }
   virtual LIR_OpJavaCall* as_OpJavaCall() { return NULL; }
   virtual LIR_OpLabel* as_OpLabel() { return NULL; }
@@ -1387,6 +1388,7 @@
     return (LIR_MoveKind)_flags;
   }
 
+  virtual bool is_patching() { return _patch != lir_patch_none; }
   virtual void emit_code(LIR_Assembler* masm);
   virtual LIR_Op1* as_Op1() { return this; }
   virtual const char * name() const PRODUCT_RETURN0;
@@ -1619,6 +1621,7 @@
   int       profiled_bci() const                 { return _profiled_bci;      }
   bool      should_profile() const               { return _should_profile;    }
 
+  virtual bool is_patching() { return _info_for_patch != NULL; }
   virtual void emit_code(LIR_Assembler* masm);
   virtual LIR_OpTypeCheck* as_OpTypeCheck() { return this; }
   void print_instr(outputStream* out) const PRODUCT_RETURN;
--- a/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp	Fri May 30 10:07:19 2014 -0700
@@ -58,7 +58,7 @@
     _masm->nop();
   }
   patch->install(_masm, patch_code, obj, info);
-  append_patching_stub(patch);
+  append_code_stub(patch);
 
 #ifdef ASSERT
   Bytecodes::Code code = info->scope()->method()->java_code_at_bci(info->stack()->bci());
@@ -131,11 +131,6 @@
 }
 
 
-void LIR_Assembler::append_patching_stub(PatchingStub* stub) {
-  _slow_case_stubs->append(stub);
-}
-
-
 void LIR_Assembler::check_codespace() {
   CodeSection* cs = _masm->code_section();
   if (cs->remaining() < (int)(NOT_LP64(1*K)LP64_ONLY(2*K))) {
@@ -144,7 +139,7 @@
 }
 
 
-void LIR_Assembler::emit_code_stub(CodeStub* stub) {
+void LIR_Assembler::append_code_stub(CodeStub* stub) {
   _slow_case_stubs->append(stub);
 }
 
@@ -442,7 +437,7 @@
 
 void LIR_Assembler::add_debug_info_for_null_check(int pc_offset, CodeEmitInfo* cinfo) {
   ImplicitNullCheckStub* stub = new ImplicitNullCheckStub(pc_offset, cinfo);
-  emit_code_stub(stub);
+  append_code_stub(stub);
 }
 
 void LIR_Assembler::add_debug_info_for_div0_here(CodeEmitInfo* info) {
@@ -451,7 +446,7 @@
 
 void LIR_Assembler::add_debug_info_for_div0(int pc_offset, CodeEmitInfo* cinfo) {
   DivByZeroStub* stub = new DivByZeroStub(pc_offset, cinfo);
-  emit_code_stub(stub);
+  append_code_stub(stub);
 }
 
 void LIR_Assembler::emit_rtcall(LIR_OpRTCall* op) {
--- a/hotspot/src/share/vm/c1/c1_LIRAssembler.hpp	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRAssembler.hpp	Fri May 30 10:07:19 2014 -0700
@@ -144,7 +144,7 @@
   // stubs
   void emit_slow_case_stubs();
   void emit_static_call_stub();
-  void emit_code_stub(CodeStub* op);
+  void append_code_stub(CodeStub* op);
   void add_call_info_here(CodeEmitInfo* info)                              { add_call_info(code_offset(), info); }
 
   // code patterns
--- a/hotspot/src/share/vm/c1/c1_LinearScan.cpp	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_LinearScan.cpp	Fri May 30 10:07:19 2014 -0700
@@ -2382,16 +2382,6 @@
   int arg_count = frame_map()->oop_map_arg_count();
   OopMap* map = new OopMap(frame_size, arg_count);
 
-  // Check if this is a patch site.
-  bool is_patch_info = false;
-  if (op->code() == lir_move) {
-    assert(!is_call_site, "move must not be a call site");
-    assert(op->as_Op1() != NULL, "move must be LIR_Op1");
-    LIR_Op1* move = (LIR_Op1*)op;
-
-    is_patch_info = move->patch_code() != lir_patch_none;
-  }
-
   // Iterate through active intervals
   for (Interval* interval = iw->active_first(fixedKind); interval != Interval::end(); interval = interval->next()) {
     int assigned_reg = interval->assigned_reg();
@@ -2406,7 +2396,7 @@
     // moves, any intervals which end at this instruction are included
     // in the oop map since we may safepoint while doing the patch
     // before we've consumed the inputs.
-    if (is_patch_info || op->id() < interval->current_to()) {
+    if (op->is_patching() || op->id() < interval->current_to()) {
 
       // caller-save registers must not be included into oop-maps at calls
       assert(!is_call_site || assigned_reg >= nof_regs || !is_caller_save(assigned_reg), "interval is in a caller-save register at a call -> register will be overwritten");
--- a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp	Fri May 30 10:07:19 2014 -0700
@@ -1267,8 +1267,10 @@
 // This is a support of the JVMTI PopFrame interface.
 // Make sure it is an invokestatic of a polymorphic intrinsic that has a member_name argument
 // and return it as a vm_result so that it can be reloaded in the list of invokestatic parameters.
-// The dmh argument is a reference to a DirectMethoHandle that has a member name field.
-IRT_ENTRY(void, InterpreterRuntime::member_name_arg_or_null(JavaThread* thread, address dmh,
+// The member_name argument is a saved reference (in local#0) to the member_name.
+// For backward compatibility with some JDK versions (7, 8) it can also be a direct method handle.
+// FIXME: remove DMH case after j.l.i.InvokerBytecodeGenerator code shape is updated.
+IRT_ENTRY(void, InterpreterRuntime::member_name_arg_or_null(JavaThread* thread, address member_name,
                                                             Method* method, address bcp))
   Bytecodes::Code code = Bytecodes::code_at(method, bcp);
   if (code != Bytecodes::_invokestatic) {
@@ -1280,8 +1282,12 @@
   Symbol* mname = cpool->name_ref_at(cp_index);
 
   if (MethodHandles::has_member_arg(cname, mname)) {
-    oop member_name = java_lang_invoke_DirectMethodHandle::member((oop)dmh);
-    thread->set_vm_result(member_name);
+    oop member_name_oop = (oop) member_name;
+    if (java_lang_invoke_DirectMethodHandle::is_instance(member_name_oop)) {
+      // FIXME: remove after j.l.i.InvokerBytecodeGenerator code shape is updated.
+      member_name_oop = java_lang_invoke_DirectMethodHandle::member(member_name_oop);
+    }
+    thread->set_vm_result(member_name_oop);
   }
 IRT_END
 #endif // INCLUDE_JVMTI
--- a/hotspot/src/share/vm/opto/c2compiler.cpp	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/share/vm/opto/c2compiler.cpp	Fri May 30 10:07:19 2014 -0700
@@ -155,6 +155,9 @@
       }
     }
 
+    // print inlining for last compilation only
+    C.dump_print_inlining();
+
     // No retry; just break the loop.
     break;
   }
--- a/hotspot/src/share/vm/opto/compile.cpp	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/share/vm/opto/compile.cpp	Fri May 30 10:07:19 2014 -0700
@@ -672,6 +672,7 @@
                   _print_inlining_list(NULL),
                   _print_inlining_stream(NULL),
                   _print_inlining_idx(0),
+                  _print_inlining_output(NULL),
                   _preserve_jvm_state(0),
                   _interpreter_frame_size(0) {
   C = this;
@@ -978,6 +979,7 @@
     _print_inlining_list(NULL),
     _print_inlining_stream(NULL),
     _print_inlining_idx(0),
+    _print_inlining_output(NULL),
     _preserve_jvm_state(0),
     _allowed_reasons(0),
     _interpreter_frame_size(0) {
@@ -2207,7 +2209,7 @@
 
  } // (End scope of igvn; run destructor if necessary for asserts.)
 
-  dump_inlining();
+  process_print_inlining();
   // A method with only infinite loops has no edges entering loops from root
   {
     NOT_PRODUCT( TracePhase t2("graphReshape", &_t_graphReshaping, TimeCompiler); )
@@ -3868,7 +3870,7 @@
   assert(!_print_inlining || _print_inlining_stream->size() == 0, "loosing data");
 }
 
-void Compile::dump_inlining() {
+void Compile::process_print_inlining() {
   bool do_print_inlining = print_inlining() || print_intrinsics();
   if (do_print_inlining || log() != NULL) {
     // Print inlining message for candidates that we couldn't inline
@@ -3885,9 +3887,21 @@
     }
   }
   if (do_print_inlining) {
+    ResourceMark rm;
+    stringStream ss;
     for (int i = 0; i < _print_inlining_list->length(); i++) {
-      tty->print("%s", _print_inlining_list->adr_at(i)->ss()->as_string());
+      ss.print("%s", _print_inlining_list->adr_at(i)->ss()->as_string());
     }
+    size_t end = ss.size();
+    _print_inlining_output = NEW_ARENA_ARRAY(comp_arena(), char, end+1);
+    strncpy(_print_inlining_output, ss.base(), end+1);
+    _print_inlining_output[end] = 0;
+  }
+}
+
+void Compile::dump_print_inlining() {
+  if (_print_inlining_output != NULL) {
+    tty->print_raw(_print_inlining_output);
   }
 }
 
--- a/hotspot/src/share/vm/opto/compile.hpp	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/share/vm/opto/compile.hpp	Fri May 30 10:07:19 2014 -0700
@@ -420,6 +420,7 @@
   stringStream* _print_inlining_stream;
   GrowableArray<PrintInliningBuffer>* _print_inlining_list;
   int _print_inlining_idx;
+  char* _print_inlining_output;
 
   // Only keep nodes in the expensive node list that need to be optimized
   void cleanup_expensive_nodes(PhaseIterGVN &igvn);
@@ -917,7 +918,8 @@
 
   void remove_useless_late_inlines(GrowableArray<CallGenerator*>* inlines, Unique_Node_List &useful);
 
-  void dump_inlining();
+  void process_print_inlining();
+  void dump_print_inlining();
 
   bool over_inlining_cutoff() const {
     if (!inlining_incrementally()) {
--- a/hotspot/src/share/vm/prims/whitebox.cpp	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/src/share/vm/prims/whitebox.cpp	Fri May 30 10:07:19 2014 -0700
@@ -33,9 +33,11 @@
 #include "prims/whitebox.hpp"
 #include "prims/wbtestmethods/parserTests.hpp"
 
+#include "runtime/thread.hpp"
 #include "runtime/arguments.hpp"
 #include "runtime/interfaceSupport.hpp"
 #include "runtime/os.hpp"
+
 #include "utilities/debug.hpp"
 #include "utilities/macros.hpp"
 #include "utilities/exceptions.hpp"
@@ -576,6 +578,15 @@
 WB_END
 
 
+WB_ENTRY(jlong, WB_GetThreadStackSize(JNIEnv* env, jobject o))
+  return (jlong) Thread::current()->stack_size();
+WB_END
+
+WB_ENTRY(jlong, WB_GetThreadRemainingStackSize(JNIEnv* env, jobject o))
+  JavaThread* t = JavaThread::current();
+  return (jlong) t->stack_available(os::current_stack_pointer()) - (jlong) StackShadowPages * os::vm_page_size();
+WB_END
+
 //Some convenience methods to deal with objects from java
 int WhiteBox::offset_for_field(const char* field_name, oop object,
     Symbol* signature_symbol) {
@@ -690,6 +701,8 @@
   {CC"getCPUFeatures",     CC"()Ljava/lang/String;",  (void*)&WB_GetCPUFeatures     },
   {CC"getNMethod",         CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;",
                                                       (void*)&WB_GetNMethod         },
+  {CC"getThreadStackSize", CC"()J",                   (void*)&WB_GetThreadStackSize },
+  {CC"getThreadRemainingStackSize", CC"()J",          (void*)&WB_GetThreadRemainingStackSize },
 };
 
 #undef CC
--- a/hotspot/test/TEST.groups	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/test/TEST.groups	Fri May 30 10:07:19 2014 -0700
@@ -139,7 +139,8 @@
   serviceability/jvmti/TestRedefineWithUnresolvedClass.java \
   compiler/tiered/NonTieredLevelsTest.java \
   compiler/tiered/TieredLevelsTest.java \
-  compiler/intrinsics/bmi/verifycode
+  compiler/intrinsics/bmi/verifycode \
+  runtime/whitebox/WBStackSize.java
 
 # Compact 2 adds full VM tests
 compact2 = \
--- a/hotspot/test/compiler/5091921/Test7005594.java	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/test/compiler/5091921/Test7005594.java	Fri May 30 10:07:19 2014 -0700
@@ -25,7 +25,6 @@
 /**
  * @test
  * @bug 7005594
- * @ignore 7117034
  * @summary Array overflow not handled correctly with loop optimzations
  *
  * @run shell Test7005594.sh
--- a/hotspot/test/compiler/5091921/Test7005594.sh	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/test/compiler/5091921/Test7005594.sh	Fri May 30 10:07:19 2014 -0700
@@ -78,7 +78,7 @@
 
 ${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} -d . Test7005594.java
 
-${TESTJAVA}/bin/java ${TESTVMOPTS} -Xms1600m -XX:+IgnoreUnrecognizedVMOptions -XX:-ZapUnusedHeapArea -Xcomp -XX:CompileOnly=Test7005594.test Test7005594 > test.out 2>&1
+${TESTJAVA}/bin/java ${TESTVMOPTS} -Xmx1600m -Xms1600m -XX:+IgnoreUnrecognizedVMOptions -XX:-ZapUnusedHeapArea -Xcomp -XX:CompileOnly=Test7005594.test Test7005594 > test.out 2>&1
 
 result=$?
 
@@ -97,7 +97,7 @@
 fi
 
 # The test should pass when no enough space for object heap
-grep "Could not reserve enough space for object heap" test.out
+grep "Could not reserve enough space for .*object heap" test.out
 if [ $? = 0 ]
 then
   echo "Passed"
--- a/hotspot/test/compiler/arguments/BMICommandLineOptionTestBase.java	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/test/compiler/arguments/BMICommandLineOptionTestBase.java	Fri May 30 10:07:19 2014 -0700
@@ -25,6 +25,12 @@
 
 /**
  * Base class for all X86 bit manipulation related command line options.
+ *
+ * Note that this test intended to verify that VM could be launched with
+ * specific options and that values of these options processed correctly.
+ * In order to do that test launch a new VM with tested options, the same
+ * flavor-specific flag as one that was used for parent VM (-client, -server,
+ * -minimal, -graal) and '-version'.
  */
 public abstract class BMICommandLineOptionTestBase
               extends CPUSpecificCommandLineOptionTest {
@@ -58,10 +64,11 @@
                                         String supportedCPUFeatures[],
                                         String unsupportedCPUFeatures[]) {
         super(".*", supportedCPUFeatures, unsupportedCPUFeatures);
-            this.optionName = optionName;
-            this.warningMessage = warningMessage;
-            this.errorMessage = CommandLineOptionTest.
-                UNRECOGNIZED_OPTION_ERROR_FORMAT.format(optionName);
+        this.optionName = optionName;
+        this.warningMessage = warningMessage;
+        this.errorMessage = String.format(
+                CommandLineOptionTest.UNRECOGNIZED_OPTION_ERROR_FORMAT,
+                optionName);
     }
 
 }
--- a/hotspot/test/compiler/arguments/BMISupportedCPUTest.java	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/test/compiler/arguments/BMISupportedCPUTest.java	Fri May 30 10:07:19 2014 -0700
@@ -28,6 +28,12 @@
  * Test on bit manipulation related command line options,
  * that should be executed on CPU that supports all required
  * features.
+ *
+ * Note that this test intended to verify that VM could be launched with
+ * specific options and that values of these options processed correctly.
+ * In order to do that test launch a new VM with tested options, the same
+ * flavor-specific flag as one that was used for parent VM (-client, -server,
+ * -minimal, -graal) and '-version'.
  */
 public class BMISupportedCPUTest extends BMICommandLineOptionTestBase {
 
@@ -49,24 +55,38 @@
 
     @Override
     public void runTestCases() throws Throwable {
-        // verify that VM will succesfully start up whithout warnings
-        CommandLineOptionTest.
-            verifyJVMStartup("-XX:+" + optionName,
-                             null, new String[] { warningMessage },
-                             ExitCode.OK);
+        /*
+          Verify that VM will successfully start up without warnings.
+          VM will be launched with following flags:
+          -XX:+<tested option> -version
+        */
+        CommandLineOptionTest.verifySameJVMStartup(null,
+                new String[] { warningMessage }, ExitCode.OK,
+                CommandLineOptionTest.prepareBooleanFlag(optionName, true));
 
-        // verify that VM will succesfully start up whithout warnings
-        CommandLineOptionTest.
-            verifyJVMStartup("-XX:-" + optionName,
-                             null, new String[] { warningMessage },
-                             ExitCode.OK);
+        /*
+          Verify that VM will successfully start up without warnings.
+          VM will be launched with following flags:
+          -XX:-<tested option> -version
+        */
+        CommandLineOptionTest.verifySameJVMStartup(null,
+                new String[] { warningMessage }, ExitCode.OK,
+                CommandLineOptionTest.prepareBooleanFlag(optionName, false));
 
-        // verify that on appropriate CPU option in on by default
-        CommandLineOptionTest.verifyOptionValue(optionName, "true");
+        /*
+          Verify that on appropriate CPU option in on by default.
+          VM will be launched with following flags:
+          -version
+        */
+        CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "true");
 
-        // verify that option could be explicitly turned off
-        CommandLineOptionTest.verifyOptionValue(optionName, "false",
-                                                "-XX:-" + optionName);
+        /*
+          Verify that option could be explicitly turned off.
+          VM will be launched with following flags:
+          -XX:-<tested option> -version
+        */
+        CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false",
+                CommandLineOptionTest.prepareBooleanFlag(optionName, false));
     }
 }
 
--- a/hotspot/test/compiler/arguments/BMIUnsupportedCPUTest.java	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/test/compiler/arguments/BMIUnsupportedCPUTest.java	Fri May 30 10:07:19 2014 -0700
@@ -28,6 +28,12 @@
  * Test on bit manipulation related command line options,
  * that should be executed on CPU that does not support
  * required features.
+ *
+ * Note that this test intended to verify that VM could be launched with
+ * specific options and that values of these options processed correctly.
+ * In order to do that test launch a new VM with tested options, the same
+ * flavor-specific flag as one that was used for parent VM (-client, -server,
+ * -minimal, -graal) and '-version'.
  */
 public class BMIUnsupportedCPUTest extends BMICommandLineOptionTestBase {
 
@@ -64,28 +70,38 @@
      */
     public void unsupportedX86CPUTestCases() throws Throwable {
 
-        // verify that VM will succesfully start up, but output will
-        // contain a warning
-        CommandLineOptionTest.
-            verifyJVMStartup("-XX:+" + optionName,
-                             new String[] { warningMessage },
-                             new String[] { errorMessage },
-                             ExitCode.OK);
+        /*
+          Verify that VM will successfully start up, but output will contain a
+          warning. VM will be launched with following options:
+          -XX:+<tested option> -version
+        */
+        CommandLineOptionTest.verifySameJVMStartup(
+                new String[] { warningMessage }, new String[] { errorMessage },
+                ExitCode.OK, CommandLineOptionTest.prepareBooleanFlag(
+                        optionName, true));
 
-        // verify that VM will succesfully startup without any warnings
-        CommandLineOptionTest.
-            verifyJVMStartup("-XX:-" + optionName,
-                             null,
-                             new String[] { warningMessage, errorMessage },
-                             ExitCode.OK);
+        /*
+          Verify that VM will successfully startup without any warnings.
+          VM will be launched with following options:
+          -XX:-<tested option> -version
+        */
+        CommandLineOptionTest.verifySameJVMStartup(null,
+                new String[] { warningMessage, errorMessage }, ExitCode.OK,
+                CommandLineOptionTest.prepareBooleanFlag(optionName, false));
 
-        // verify that on unsupported CPUs option is off by default
-        CommandLineOptionTest.verifyOptionValue(optionName, "false");
+        /*
+          Verify that on unsupported CPUs option is off by default.
+          VM will be launched with following options: -version
+        */
+        CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false");
 
-        // verify that on unsupported CPUs option will be off even if
-        // it was explicitly turned on by uset
-        CommandLineOptionTest.verifyOptionValue(optionName, "false",
-                                                     "-XX:+" + optionName);
+        /*
+          Verify that on unsupported CPUs option will be off even if
+          it was explicitly turned on by user. VM will be launched with
+          following options: -XX:+<tested option> -version
+        */
+        CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false",
+                CommandLineOptionTest.prepareBooleanFlag(optionName, true));
 
     }
 
@@ -97,18 +113,17 @@
      */
     public void unsupportedNonX86CPUTestCases() throws Throwable {
 
-        // verify that VM known nothing about tested option
-        CommandLineOptionTest.
-            verifyJVMStartup("-XX:+" + optionName,
-                             new String[] { errorMessage },
-                             null,
-                             ExitCode.FAIL);
+        /*
+          Verify that VM known nothing about tested option. VM will be launched
+          with following options: -XX:[+-]<tested option> -version
+        */
+        CommandLineOptionTest.verifySameJVMStartup(
+                new String[] { errorMessage }, null, ExitCode.FAIL,
+                CommandLineOptionTest.prepareBooleanFlag(optionName, true));
 
-        CommandLineOptionTest.
-            verifyJVMStartup("-XX:-" + optionName,
-                             new String[] { errorMessage },
-                             null,
-                             ExitCode.FAIL);
+        CommandLineOptionTest.verifySameJVMStartup(
+                new String[] { errorMessage }, null, ExitCode.FAIL,
+                CommandLineOptionTest.prepareBooleanFlag(optionName, false));
     }
 }
 
--- a/hotspot/test/compiler/arguments/TestUseCountTrailingZerosInstructionOnSupportedCPU.java	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/test/compiler/arguments/TestUseCountTrailingZerosInstructionOnSupportedCPU.java	Fri May 30 10:07:19 2014 -0700
@@ -40,7 +40,8 @@
 import com.oracle.java.testlibrary.cli.*;
 
 public class TestUseCountTrailingZerosInstructionOnSupportedCPU
-     extends BMISupportedCPUTest {
+        extends BMISupportedCPUTest {
+    private static final String DISABLE_BMI = "-XX:-UseBMI1Instructions";
 
     public TestUseCountTrailingZerosInstructionOnSupportedCPU() {
         super("UseCountTrailingZerosInstruction", TZCNT_WARNING, "bmi1");
@@ -51,18 +52,23 @@
 
         super.runTestCases();
 
-        // verify that option will be disabled if all BMI1 instuctions
-        // are explicitly disabled
-        CommandLineOptionTest.
-            verifyOptionValue("UseCountTrailingZerosInstruction", "false",
-                              "-XX:-UseBMI1Instructions");
+        /*
+          Verify that option will be disabled if all BMI1 instructions
+          are explicitly disabled. VM will be launched with following options:
+          -XX:-UseBMI1Instructions -version
+        */
+        CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false",
+                TestUseCountTrailingZerosInstructionOnSupportedCPU.DISABLE_BMI);
 
-        // verify that option could be turned on even if other BMI1
-        // instructions were turned off
-        CommandLineOptionTest.
-            verifyOptionValue("UseCountTrailingZerosInstruction", "true",
-                              "-XX:-UseBMI1Instructions",
-                              "-XX:+UseCountTrailingZerosInstruction");
+        /*
+          Verify that option could be turned on even if other BMI1
+          instructions were turned off. VM will be launched with following
+          options: -XX:-UseBMI1Instructions
+          -XX:+UseCountTrailingZerosInstruction -version
+        */
+        CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "true",
+                TestUseCountTrailingZerosInstructionOnSupportedCPU.DISABLE_BMI,
+                CommandLineOptionTest.prepareBooleanFlag(optionName, true));
     }
 
     public static void main(String args[]) throws Throwable {
--- a/hotspot/test/compiler/arguments/TestUseCountTrailingZerosInstructionOnUnsupportedCPU.java	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/test/compiler/arguments/TestUseCountTrailingZerosInstructionOnUnsupportedCPU.java	Fri May 30 10:07:19 2014 -0700
@@ -25,7 +25,7 @@
  * @test
  * @bug 8031321
  * @summary Verify processing of UseCountTrailingZerosInstruction option
- *          on CPU without TZCNT instuction (BMI1 feature) support.
+ *          on CPU without TZCNT instruction (BMI1 feature) support.
  * @library /testlibrary /testlibrary/whitebox
  * @build TestUseCountTrailingZerosInstructionOnUnsupportedCPU
  *        BMIUnsupportedCPUTest
@@ -40,7 +40,8 @@
 import com.oracle.java.testlibrary.cli.*;
 
 public class TestUseCountTrailingZerosInstructionOnUnsupportedCPU
-     extends BMIUnsupportedCPUTest {
+        extends BMIUnsupportedCPUTest {
+    private static final String ENABLE_BMI = "-XX:+UseBMI1Instructions";
 
     public TestUseCountTrailingZerosInstructionOnUnsupportedCPU() {
         super("UseCountTrailingZerosInstruction", TZCNT_WARNING, "bmi1");
@@ -51,16 +52,24 @@
 
         super.unsupportedX86CPUTestCases();
 
-        // verify that option will not be turned on during
-        // UseBMI1Instuctions processing
-        CommandLineOptionTest.
-            verifyOptionValue("UseCountTrailingZerosInstruction", "false",
-                              "-XX:+UseBMI1Instructions");
+        /*
+          Verify that option will not be turned on during UseBMI1Instructions
+          processing. VM will be launched with following options:
+          -XX:+UseBMI1Instructions -version
+        */
+        CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false",
+                TestUseCountTrailingZerosInstructionOnUnsupportedCPU.
+                        ENABLE_BMI);
 
-        CommandLineOptionTest.
-            verifyOptionValue("UseCountTrailingZerosInstruction", "false",
-                              "-XX:+UseCountTrailingZerosInstruction",
-                              "-XX:+UseBMI1Instructions");
+        /*
+          VM will be launched with following options:
+          -XX:+UseCountTrailingZerosInstruction -XX:+UseBMI1Instructions
+          -version
+        */
+        CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false",
+                CommandLineOptionTest.prepareBooleanFlag(optionName, true),
+                TestUseCountTrailingZerosInstructionOnUnsupportedCPU.
+                        ENABLE_BMI);
     }
 
     public static void main(String args[]) throws Throwable {
--- a/hotspot/test/compiler/uncommontrap/TestSpecTrapClassUnloading.java	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/test/compiler/uncommontrap/TestSpecTrapClassUnloading.java	Fri May 30 10:07:19 2014 -0700
@@ -25,7 +25,7 @@
  * @test
  * @bug 8031752
  * @summary speculative traps need to be cleaned up at GC
- * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -XX:+UseTypeSpeculation -XX:TypeProfileLevel=222 -XX:CompileCommand=exclude,java.lang.reflect.Method::invoke -XX:CompileCommand=exclude,sun.reflect.DelegatingMethodAccessorImpl::invoke -Xmx1M TestSpecTrapClassUnloading
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -XX:+UseTypeSpeculation -XX:TypeProfileLevel=222 -XX:CompileCommand=exclude,java.lang.reflect.Method::invoke -XX:CompileCommand=exclude,sun.reflect.DelegatingMethodAccessorImpl::invoke -Xmx512M TestSpecTrapClassUnloading
  *
  */
 
@@ -45,7 +45,7 @@
         MemoryChunk other;
         long[] array;
         MemoryChunk(MemoryChunk other) {
-            other = other;
+            this.other = other;
             array = new long[1024 * 1024 * 1024];
         }
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/whitebox/WBStackSize.java	Fri May 30 10:07:19 2014 -0700
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test WBStackSize
+ * @summary verify that whitebox functions getThreadFullStackSize() and getThreadRemainingStackSize are working
+ * @library /testlibrary /testlibrary/whitebox
+ * @build WBStackSize
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xss512k WBStackSize
+ */
+
+/*
+ * The test may product a false failure if too big StackYellowPages/StackRedPages/ShackShadowPages
+ * VM options are specified. The proper test would retrieve the page size from VM and account for these options
+ * instead of check below:
+ *     Math.abs(actualStackSize - configStackSize) > configStackSize * 0.1
+ *
+ * Please file a test bug, if this is a problem.
+ */
+
+import com.sun.management.HotSpotDiagnosticMXBean;
+import sun.hotspot.WhiteBox;
+
+public class WBStackSize {
+
+    static final long K = 1024;
+
+    static final long MIN_STACK_SIZE = 8 * K;
+    static final long MAX_STACK_SIZE_ALLOCATED_IN_MAIN = 200 * K; // current value is about 130k on 64-bit platforms
+
+    static final WhiteBox wb = WhiteBox.getWhiteBox();
+
+    static long stackSizeOnOverflow = -1;
+
+    static int eatAllStack() {
+        return eatAllStack() * 2;
+    }
+
+    static void testStackOverflow() {
+
+        stackSizeOnOverflow = wb.getThreadRemainingStackSize();
+
+        if (stackSizeOnOverflow > MIN_STACK_SIZE) {
+
+            try {
+                testStackOverflow();
+            } catch (StackOverflowError e) {
+                // We caught SOE too early. The error will be reported in main()
+            }
+
+        } else {
+
+            try {
+                eatAllStack();
+                throw new RuntimeException("Haven't caught StackOverflowError at all");
+            } catch (StackOverflowError e) {
+                // OK: we caught the anticipated error
+            }
+        }
+    }
+
+    public static void main(String[] args) {
+        HotSpotDiagnosticMXBean bean = sun.management.ManagementFactoryHelper.getDiagnosticMXBean();
+        long configStackSize = Long.valueOf(bean.getVMOption("ThreadStackSize").getValue()) * K;
+
+        System.out.println("ThreadStackSize VM option: " + configStackSize);
+
+        long actualStackSize = wb.getThreadStackSize();
+        System.out.println("Full stack size: " + actualStackSize);
+
+        if (Math.abs(actualStackSize - configStackSize) > configStackSize * 0.1) {
+            throw new RuntimeException("getThreadFullStackSize value [" + actualStackSize
+                                     + "] should be within 90%..110% of the value returned by HotSpotDiagnosticMXBean");
+        }
+
+        long remainingStackSize = wb.getThreadRemainingStackSize();
+        System.out.println("Remaining stack size in main(): " + remainingStackSize);
+
+        // Up to 200k can be already allocated by VM
+        if (remainingStackSize > configStackSize
+                || (configStackSize > MAX_STACK_SIZE_ALLOCATED_IN_MAIN
+                && remainingStackSize < configStackSize - MAX_STACK_SIZE_ALLOCATED_IN_MAIN)) {
+
+            throw new RuntimeException("getThreadRemainingStackSize value [" + remainingStackSize
+                                     + "] should be at least ThreadStackSize value [" + configStackSize + "] minus ["
+                                     + MAX_STACK_SIZE_ALLOCATED_IN_MAIN + "]");
+        }
+
+        testStackOverflow();
+
+        if (stackSizeOnOverflow > MIN_STACK_SIZE) {
+            throw new RuntimeException("Caught StackOverflowError too early: when there were "
+                                     + stackSizeOnOverflow + " bytes in stack");
+        } else if (stackSizeOnOverflow < 0) {
+            throw new RuntimeException("Internal test error: stackRemainingSize < 0");
+        } else {
+            System.out.println("Caught StackOverflowError as expected");
+        }
+    }
+}
--- a/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java	Thu May 29 13:01:54 2014 -0700
+++ b/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java	Fri May 30 10:07:19 2014 -0700
@@ -150,6 +150,8 @@
   public native int stressVirtualSpaceResize(long reservedSpaceSize, long magnitude, long iterations);
   public native void runMemoryUnitTests();
   public native void readFromNoaccessArea();
+  public native long getThreadStackSize();
+  public native long getThreadRemainingStackSize();
 
   // CPU features
   public native String getCPUFeatures();