On Sep 19, 2013, at 3:19 PM, Lois Foltan <lois.fol...@oracle.com> wrote:
> > On 9/19/2013 6:09 PM, Christian Thalinger wrote: >> + #define CAST_TO_OOP(value) ((oop)(CHECK_UNHANDLED_OOPS_ONLY((void >> *))(value))) >> + #define CAST_FROM_OOP(new_type, value) >> ((new_type)(CHECK_UNHANDLED_OOPS_ONLY((void *))(value))) >> >> Could these two macros also be a method? > Hi Christian, > I assume by method you are implying methods within the oop class itself? Not necessarily. We already have a couple of inline methods is globalDefinitions.hpp. Would that work? > That would work only in the case of fastdebug builds where an oop is defined > as a class. In non-fastdebug builds, an oop is a (oopDesc *). The macros > provided a way to preserve the existing cast to & from an oop to a numerical > type in all builds, even non-fastdebug ones. > > Thanks for the initial review, > Lois > >> >> On Sep 19, 2013, at 8:13 AM, Lois Foltan <lois.fol...@oracle.com> wrote: >> >>> >>> Please review the following fix: >>> Webrev: >>> http://cr.openjdk.java.net/~hseigel/bug_jdk7195622.0/ >>> >>> Bug: JDK8 b44 hotspot:src/share/vm/oops/klass.hpp: Error:Initializing const >>> volatile oop& requires ... & >>> CheckUnhandledOops has limited usefulness now bug links at: >>> >>> https://bugs.openjdk.java.net/browse/JDK-7180556 >>> https://bugs.openjdk.java.net/browse/JDK-7195622 >>> >>> Summary of fix: >>> >>> Update the C++ oop structure definition in oopsHierarchy.hpp to solve >>> several problems with the current definition when compiled with various C++ >>> compilers across supported platforms. These changes initially address the >>> problem reported in JDK-7180556 and continue with additional improvements >>> to allow CHECK_UNHANDLED_OOPS to be defined in all fastdebug builds on all >>> platforms as suggested in JDK-7195622. Several notes concerning this fix: >>> >>> 1. A review should start at understanding the changes made to >>> oopsHierarchy.hpp >>> a. Addition of a non-volatile copy constructor to >>> address compile time errors >>> reported in JDK-7180556 and also currently by g++ >>> compilers on Linux. >>> b. Addition of member wise assignment operators to >>> handle many instances >>> of [non]volatile to [non]volatile oops within the >>> JVM. >>> Note: Solaris compilers would not allow for the >>> member wise assignment operators >>> of every flavor of non-volatile to >>> volatile and vice versa. However, unlike g++ compilers, >>> Solaris compilers had no issue passing a >>> volatile "this" pointer to a non-volatile >>> assignment operator. So the g++ >>> compilers needed these different flavors >>> of the assignment operator and Solaris >>> did not. >>> d. For similar reasons as 1b, addition of a volatile >>> explicit conversion from oop -> void *. >>> g++ specifically complained when trying to pass a >>> volatile "this" pointer. >>> e. Removal of the ambiguous behavior of having >>> overloaded copy constructor and >>> explicit user conversion member functions defined >>> of both integral and void *. >>> All C++ compilers, except Solaris, issue a compile >>> time error concerning this ambiguity. >>> >>> 2. Change #1e had the consequence of C++ compilers now >>> generating compile time >>> errors where the practice has been to cast an oop to and >>> from an integral type such >>> as intptr_t. To allow for this practice to continue, when >>> oop is a structure and not >>> a OopDesc *, as is the case when CHECK_UNHANDLED_OOPS is >>> defined, two new >>> macros were introduced within globalDefinitions.hpp, >>> CAST_TO_OOP and CAST_FROM_OOP. >>> >>> 3. Due to the change in #1a & #1b, the oop structure in no >>> longer considered a POD (plain old data) >>> by the g++ compilers on Linux and MacOS. This caused several >>> changes to be needed >>> throughout the JVM to add an (void *) cast of an oop when >>> invoking print_cr(). >>> >>> 4. Many instances of an assignment to a volatile oop required a >>> "const_cast<oop&>" to >>> cast away the volatileness of the lvalue. There is already >>> precedence for this >>> type of change within utilities/taskqueue.hpp. The >>> following comment was in place: >>> >>> // g++ complains if the volatile result of the assignment is >>> // unused, so we cast the volatile away. We cannot cast >>> directly >>> // to void, because gcc treats that as not using the result >>> of the >>> // assignment. However, casting to E& means that we trigger an >>> // unused-value warning. So, we cast the E& to void. >>> >>> 5. The addition of the volatile keyword to the >>> GenericTaskQueue's pop_local() & pop_global() >>> member functions was to accommodate the Solaris C++ >>> compiler's complaint about the assignment >>> of the volatile elements of the private member data _elems >>> when GenericTaskQueue is instantiated >>> with a non-volatile oop. Line #723 in pop_local(). This >>> was a result of #1b, Solaris' lack of >>> allowing for all flavors of volatile/non-volatile member >>> wise assignment operators. >>> Per Liden of the GC group did pre-review this specific >>> change with regards to performance >>> implications and was not concerned. >>> >>> 6. In utilities/hashtable.cpp, required CHECK_UNHANDLED_OOPS >>> conditional for the instantiation >>> of "template class Hashtable<oop, mtSymbol>". With >>> CHECK_UHANDLED_OOPS specified for a >>> fastdebug build, an unresolved symbol occurred. >>> philli:% nm --demangle >>> build//linux_amd64_compiler2/fastdebug/libjvm.so | grep Hashtable | grep >>> seed >>> U Hashtable<oop, (unsigned >>> short)2304>::_seed >>> 0000000000848890 t Hashtable<oop, (unsigned >>> short)256>::seed() >>> ... >>> >>> Making these improvements allows for CHECK_UNHANDLED_OOPS to be defined in >>> all fastdebug builds across the supported platforms. >>> >>> Builds: >>> Solaris (12u1 & 12u3 C++ compilers), >>> MacOS (llvm-g++ & clang++ compilers), >>> Linux (g++ v4.4.3 & g++ v4.7.3), >>> VS2010 >>> >>> Tests: >>> JTREG on MacOS, >>> vm.quick.testlist on LInux, >>> nsk.regression.testlist, nsk.stress.testlist on LInux, >>> JCK vm on Windows >>> >>> Thank you, Lois >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >