# HG changeset patch # User Yasumasa Suenaga # Date 1381150994 -32400 # Node ID e20b4494bc92c2264fe06da8a23d4895cca4534a # Parent a5ae4590ae5c5302188c2a122ac3288935a9e644 Bug 1568: Crash on Java8 EA reviewed-by: ykubota diff -r a5ae4590ae5c -r e20b4494bc92 agent/ChangeLog --- 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 + + * Bug 1568: Crash on Java8 EA + 2013-09-01 Yasumasa Suenaga * Bump to 1.0.1 diff -r a5ae4590ae5c -r e20b4494bc92 agent/src/jvmInfo.hpp --- 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. */ diff -r a5ae4590ae5c -r e20b4494bc92 agent/src/oopUtil.cpp --- 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.
* 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))){