changeset 25:e20b4494bc92

Bug 1568: Crash on Java8 EA reviewed-by: ykubota
author Yasumasa Suenaga <yasu@ysfactory.dip.jp>
date Mon, 07 Oct 2013 22:03:14 +0900
parents a5ae4590ae5c
children fa4bbeb769a3
files agent/ChangeLog agent/src/jvmInfo.hpp agent/src/oopUtil.cpp
diffstat 3 files changed, 52 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/agent/ChangeLog	Sun Sep 01 00:00:00 2013 +0900
+++ b/agent/ChangeLog	Mon Oct 07 22:03:14 2013 +0900
@@ -1,3 +1,7 @@
+2013-10-07  Yasumasa Suenaga  <suenaga.yasumasa@lab.ntt.co.jp>
+
+	* Bug 1568: Crash on Java8 EA 
+
 2013-09-01  Yasumasa Suenaga  <suenaga.yasumasa@lab.ntt.co.jp>
 
 	* Bump to 1.0.1
--- a/agent/src/jvmInfo.hpp	Sun Sep 01 00:00:00 2013 +0900
+++ b/agent/src/jvmInfo.hpp	Mon Oct 07 22:03:14 2013 +0900
@@ -394,6 +394,16 @@
     }
 
     /*!
+     * \brief Decision for 8003424: Enable Class Data Sharing for CompressedOops
+     * http://bugs.sun.com/view_bug.do?bug_id=8003424
+     * http://hg.openjdk.java.net/hsx/hotspot-rt/hotspot/rev/740e263c80c6
+     */
+    inline bool isAfterCR8003424(void){
+      // hs25.0-b46
+      return (this->_hsVersion >= MAKE_HS_VERSION(25, 0, 46));
+    }
+
+    /*!
      * \brief Get JVM name.
      * \return JVM name.
      */
--- a/agent/src/oopUtil.cpp	Sun Sep 01 00:00:00 2013 +0900
+++ b/agent/src/oopUtil.cpp	Mon Oct 07 22:03:14 2013 +0900
@@ -361,6 +361,16 @@
 int *narrowOffsetShift     = &dummyZeroInt;
 
 /*!
+* \brief Pointer of Klass COOP shift bits.
+ */
+int *narrowKlassOffsetShift     = &dummyZeroInt;
+
+/*!
+* \brief Pointer of COOP base Klass address.
+ */
+ptrdiff_t narrowKlassOffsetBase = 0;
+
+/*!
  * \brief Lock bit mask.<br>
  *        Value of "markOopDesc" class's "lock_mask_in_place" constant field.
  */
@@ -962,6 +972,23 @@
 }
 
 /*!
+ * \brief Convert COOP(narrowKlass) to wide Klass(normally Klass).
+ * \param narrowKlass [in] Java Klass object(compressed Klass pointer).
+ * \return Wide Klass object.
+ */
+inline void *getWideKlass(unsigned int narrowKlass) {
+  
+  /*
+   * narrowKlass decoding is defined in
+   * inline Klass* Klass::decode_klass_not_null(narrowKlass v)
+   * hotspot/src/share/vm/oops/klass.inline.hpp
+   */
+  
+  return (void*)(narrowKlassOffsetBase +
+                      ((ptrdiff_t)narrowKlass << (*narrowKlassOffsetShift)));
+}
+
+/*!
  * \brief Getting oop's class information(It's "Klass", not "KlassOop").
  * \param klassOop [in] Java heap object(Inner "KlassOop" class).
  * \return Class information object(Inner "Klass" class).
@@ -1003,7 +1030,7 @@
     
     if (likely(testAddr != NULL)) {
       /* Decode COOP. */
-      tempAddr = getWideOop(*testAddr);
+      tempAddr = getWideKlass(*testAddr);
     }
   } else {
     /* Get oop's klassOop from "_klass" field. */
@@ -1520,6 +1547,10 @@
       (void **)&narrowOffsetBase},
     {"Universe", "_narrow_oop._shift",          NULL,
       (void **)&narrowOffsetShift},
+    {"Universe", "_narrow_klass._base",         NULL,
+      (void **)&narrowKlassOffsetBase},
+    {"Universe", "_narrow_klass._shift",        NULL,
+      (void **)&narrowKlassOffsetShift},
     {"oopDesc",  "_metadata._klass",            &ofsKlassAtOop,
       NULL},
     {"oopDesc",  "_metadata._compressed_klass", &ofsCoopKlassAtOop,
@@ -1557,6 +1588,11 @@
     return false;
   }
 
+  if(!jvmInfo->isAfterCR8003424()){
+    narrowKlassOffsetBase = narrowOffsetBase;
+    narrowKlassOffsetShift = narrowOffsetShift;
+  }
+
   if(!jvmInfo->isAfterCR6964458()){
     /* List of common class size. */
     TTypeSizeMap typeMap[] = {
@@ -2265,6 +2301,7 @@
   /* Get object. */
   collectedHeap = (*(void**)collectedHeap);
   narrowOffsetBase = (ptrdiff_t)*(void**)narrowOffsetBase;
+  narrowKlassOffsetBase = (ptrdiff_t)*(void**)narrowKlassOffsetBase;
   
   /* Setup for WatcherThread. */
   if(unlikely(!setupOverrideFunction(watcherThread_hook))){