changeset 2:567b17d89a33

Bug 1568: Crash on Java8 EA reviewed-by: ykubota
author Yasumasa Suenaga <yasu@ysfactory.dip.jp>
date Mon, 07 Oct 2013 22:03:23 +0900
parents c8755f1dc153
children 22ac65b59e18
files agent/ChangeLog agent/src/oopUtil.cpp
diffstat 2 files changed, 58 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/agent/ChangeLog	Mon Sep 09 00:00:00 2013 +0900
+++ b/agent/ChangeLog	Mon Oct 07 22:03:23 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-09  Yasumasa Suenaga  <suenaga.yasumasa@lab.ntt.co.jp>
 
 	* Initial Release
--- a/agent/src/oopUtil.cpp	Mon Sep 09 00:00:00 2013 +0900
+++ b/agent/src/oopUtil.cpp	Mon Oct 07 22:03:23 2013 +0900
@@ -391,6 +391,16 @@
 int *narrowOffsetShift     = &dummyZeroInt;
 
 /*!
+* \brief Pointer of Klass COOP base address.
+ */
+ptrdiff_t narrowKlassOffsetBase = 0;
+
+/*!
+* \brief Pointer of Klass COOP shift bits.
+ */
+int *narrowKlassOffsetShift     = &dummyZeroInt;
+
+/*!
  * \brief Lock bit mask.<br>
  *        Value of "markOopDesc" class's "lock_mask_in_place" constant value.
  */
@@ -1066,6 +1076,15 @@
  */
 bool enableCR8004883 = false;
 
+/*!
+ * \brief Flag of JVM is applyed CR#8003424.<br>
+ *        Decision for CR8003424:
+ *        8003424: Enable Class Data Sharing for CompressedOops
+ * \sa http://bugs.sun.com/view_bug.do?bug_id=8003424
+ * \sa http://hg.openjdk.java.net/hsx/hotspot-rt/hotspot/rev/740e263c80c6
+ */
+bool enableCR8003424 = false;
+
 /* Variable for hotspot version. */
 
 /*!
@@ -1196,6 +1215,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).
@@ -1230,7 +1266,7 @@
         
         if (likely(testAddr != NULL)) {
             /* Decode COOP. */
-            tempAddr = getWideOop(*testAddr);
+            tempAddr = getWideKlass(*testAddr);
         }
     } else {
         /* Get oop's klassOop from "_klass" field. */
@@ -2055,6 +2091,10 @@
             NULL,               (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",
@@ -2111,6 +2151,11 @@
             " info:Common from:VMStructs");
         return false;
     }
+
+    if(!enableCR8003424){
+      narrowKlassOffsetBase = narrowOffsetBase;
+      narrowKlassOffsetShift = narrowOffsetShift;
+    }
     
     /* List of common class size. */
     TTypeSizeMap typeMap[] = {
@@ -2779,6 +2824,13 @@
         const unsigned int afterCR8004883 = 25 << 24 | 14;
         enableCR8004883 = (hotSpotVersion >= afterCR8004883);
 
+        /*
+         * See CR8003424:
+         * 8003424: Enable Class Data Sharing for CompressedOops
+         */
+        const unsigned int afterCR8003424 = 25 << 24 | 46;
+        enableCR8003424 = (hotSpotVersion >= afterCR8003424);
+
         /* Search flag symbol in libjvm. */
         searchCommonFlags();
         
@@ -2873,6 +2925,7 @@
     /* Get object. */
     collectedHeap = (*(void**)collectedHeap);
     narrowOffsetBase = (ptrdiff_t)*(void**)narrowOffsetBase;
+    narrowKlassOffsetBase = (ptrdiff_t)*(void**)narrowKlassOffsetBase;
     
     /* Setup for WatcherThread. */
     if(unlikely(!setupOverrideFunction(watcherThread_hook))){