RFR: 8178495: Bug in the align_size_up_ macro

Kim Barrett kim.barrett at oracle.com
Thu Jun 29 22:04:42 UTC 2017


> On Jun 28, 2017, at 11:08 AM, Stefan Karlsson <stefan.karlsson at oracle.com> wrote:
> 
> Hi all,
> 
> Please review this patch to fix a bug in the align_size_up_ macro.
> 
> http://cr.openjdk.java.net/~stefank/8178495/webrev.00/
> https://bugs.openjdk.java.net/browse/JDK-8178495

------------------------------------------------------------------------------
src/share/vm/utilities/globalDefinitions.hpp
 514 #define widen_to_type_of(what, type_carrier) ((what) | ((type_carrier) & 0))

I think a better form of widen_to_type_of is the following:

#define widen_to_type_of(what, type_carrier) (true ? (what) : (type_carrier))

The difference is that this just promotes as needed, and will never
execute any part of type_carrier. The definition in the webrev may not
be able to completely optimize away the carrier expression under some
conditions.

------------------------------------------------------------------------------ 
test/native/utilities/test_align.cpp 
  35 struct TypeInfo : AllStatic {
  36   static const bool is_unsigned = T(-1) > T(0);
  37   static const T    max = is_unsigned

We recently (JDK-8181318) made it possible to #include <limits> and
use std::numeric_limits<T>, so you could get is_signed and max() from
there.  max_alignment could then just be a static helper function
template. 

Also here:
 54 static const intptr_t max_intptr = (intptr_t)max_intx;

------------------------------------------------------------------------------ 
test/native/utilities/test_align.cpp 
  25 #include "logging/log.hpp"
and
  44 const static bool logging_enabled = false;
  45 #define log(...)            \
  ...

I'm guessing the logging macro is because logging/log stuff isn't
initialized yet when executing a TEST (as opposed to a TEST_VM)?  So
the #include is superfluous?

------------------------------------------------------------------------------ 
test/native/utilities/test_align.cpp 
  56 template <typename T, typename A>
  57 static void test_alignments() {
  ...
and
 117 TEST(Align, functions_and_macros) {
 ... calls to test_alignments for various types.

I keep meaning to find out if we support Google Test's "Typed Tests" [1],
and if not, try to figure out how hard it would be to change that.

[1] https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
Search for "Typed Tests".

------------------------------------------------------------------------------
test/native/utilities/test_align.cpp 
 79         ASSERT_EQ(align_size_up(value, alignment), (intptr_t)up);
and elsewhere

The Google Test docs suggest that the expected value be first, and the
value being tested be second, and that the failure reporting assumes
that when printing a failure message. Hm, I see the Google Test docs
have been changed since I read that, and now say

  Historical note: Before February 2016 *_EQ had a convention of
  calling it as ASSERT_EQ(expected, actual), so lots of existing code
  uses this order. Now *_EQ treats both parameters in the same way.

I wonder how old our Google Test code snapshot might be.

------------------------------------------------------------------------------



More information about the hotspot-dev mailing list