Warnings Cleanup in Hotspot

Jeremy Manson jeremymanson at google.com
Fri May 17 10:32:06 PDT 2013


I wonder why that didn't pop up when I compiled it.

I disagree with David.  Casting to void is the accepted strategy for
getting rid of unused value warnings.  It makes perfect sense to me; if you
cast to void, it isn't a value anymore.  It's also good documentation: it
says you know you aren't using the value, and that that is not a mistake.
 I did it several times in my patch.

Furthermore, turning on the warning will prevent mistakes like the strcmp /
strcpy one I fixed in my patch.  It seems worth it to have a few scattered
(void) casts in the VM.

Jeremy


On Thu, May 16, 2013 at 6:59 PM, David Holmes <david.holmes at oracle.com>wrote:

> Calvin,
>
>
> On 17/05/2013 4:55 AM, Calvin Cheung wrote:
>
>> Jeremy,
>>
>> It seems your suggested patch is incomplete as the build on linux was
>> failing.
>> Recall that warnings are treated as errors as in gcc.make:
>>    # Compiler warnings are treated as errors
>>    WARNINGS_ARE_ERRORS = -Werror
>>
>> Below is the list of files I needed to change for the build to go
>> through on linux:
>> make/linux/makefiles/gcc.make
>> src/share/vm/c1/c1_IR.cpp
>> src/share/vm/ci/ciUtilities.**hpp
>> src/share/vm/classfile/**genericSignatures.cpp
>> src/share/vm/classfile/**verifier.hpp
>> src/share/vm/code/nmethod.cpp
>> src/share/vm/memory/**cardTableModRefBS.cpp
>> src/share/vm/memory/universe.**cpp
>> src/share/vm/oops/**constantPool.cpp
>> src/share/vm/prims/forte.cpp
>> src/share/vm/runtime/perfData.**hpp
>> src/share/vm/runtime/**sharedRuntime.cpp
>> src/share/vm/services/**diagnosticArgument.cpp
>> src/share/vm/utilities/**exceptions.hpp
>> src/share/vm/utilities/**taskqueue.hpp
>>
>> Most of the warnings are related to: "statement has no effect"
>> e.g. in exceptions.hpp, I needed to change
>> #define CHECK                                    THREAD); if
>> (HAS_PENDING_EXCEPTION) return       ; (0
>> to
>> #define CHECK                                    THREAD); if
>> (HAS_PENDING_EXCEPTION) return ; (void)(0
>>
>> I don't want to share webrev yet since I haven't built on other
>> platforms and haven't done any testing on the change.
>>
>> 2 ways I'm thinking of fixing it:
>> 1) include the -Wunused-value warning flag
>>      this means changes are required on the files listed above
>>
>> 2) not include the -Wunused-value warning flag but only fixing the
>> potential coding errors which would impact functionality as you pointed
>> out in your email. This should result in a smaller changeset.
>>
>
> I think I prefer #2 mainly because:
>
> 0;
>
> and
>
> (void)0;
>
> are equally bereft of any effect so I don't see why the compiler complains
> about one and accepts the other. As this seems completely arbitrary
> different compilers may have different views, or change their view over
> time. So I suggest not changing this and only fix the real issues that
> -Wunused-value produces.
>
> Just my 2c.
>
> David
> ------
>
>
>  Calvin
>>
>> On 5/16/2013 10:55 AM, Jeremy Manson wrote:
>>
>>> Okay.  Is there anything you want me to do?
>>>
>>> Jeremy
>>>
>>>
>>> On Wed, May 15, 2013 at 2:37 PM, Calvin Cheung
>>> <calvin.cheung at oracle.com <mailto:calvin.cheung at oracle.**com<calvin.cheung at oracle.com>>>
>>> wrote:
>>>
>>>     Jeremy,
>>>
>>>     We'll fix it in hs25 first and then backport it to hs24 if the fix
>>>     is applicable there.
>>>
>>>     Calvin
>>>
>>>
>>>     On 5/15/2013 2:14 PM, Jeremy Manson wrote:
>>>
>>>>     Thanks, Calvin.  What does followup look like?
>>>>
>>>>     Jeremy
>>>>
>>>>
>>>>     On Mon, May 13, 2013 at 9:59 AM, Calvin Cheung
>>>>     <calvin.cheung at oracle.com <mailto:calvin.cheung at oracle.**com<calvin.cheung at oracle.com>>>
>>>> wrote:
>>>>
>>>>         Hi Jeremy,
>>>>
>>>>         I've created 8014431 (cleanup warnings indicated by the
>>>>         -Wunused-value compiler option on linux) to track this. It'll
>>>>         take a few hours for it to show up in the bugs.sun.com
>>>>         <http://bugs.sun.com>
>>>>         http://bugs.sun.com/**bugdatabase/view_bug.do?bug_**id=8014431<http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8014431>
>>>>
>>>>         Calvin
>>>>
>>>>
>>>>         On 5/10/2013 11:38 AM, Jeremy Manson wrote:
>>>>
>>>>             Okay, I turned on -Wunused-value in the gcc makefile for
>>>>             Linux.  I also ran this on a more recent build of HS (I
>>>>             was using something very, very old), and I got a few more
>>>>             warnings (including a couple that actually looked as if
>>>>             they would impact functionality).  Thoughts on this?
>>>>
>>>>             diff --git a/make/linux/makefiles/gcc.**make
>>>>             b/make/linux/makefiles/gcc.**make
>>>>             --- a/make/linux/makefiles/gcc.**make
>>>>             +++ b/make/linux/makefiles/gcc.**make
>>>>             @@ -126,7 +126,7 @@
>>>>              # Compiler warnings are treated as errors
>>>>              WARNINGS_ARE_ERRORS = -Werror
>>>>             -WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wundef
>>>>             -Wunused-function
>>>>             +WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wundef
>>>>             -Wunused-function -Wunused-value
>>>>              # Since GCC 4.3, -Wconversion has changed its meanings
>>>>             to warn these implicit
>>>>              # conversions which might affect the values. Only enable
>>>>             it in earlier versions.
>>>>             diff --git a/src/share/vm/c1/c1_IR.cpp
>>>>             b/src/share/vm/c1/c1_IR.cpp
>>>>             --- a/src/share/vm/c1/c1_IR.cpp
>>>>             +++ b/src/share/vm/c1/c1_IR.cpp
>>>>             @@ -506,7 +506,7 @@
>>>>                _loop_map(0, 0),          // initialized later with
>>>>             correct size
>>>>                _compilation(c)
>>>>              {
>>>>             -  TRACE_LINEAR_SCAN(2, "***** computing linear-scan
>>>>             block order");
>>>>             +  TRACE_LINEAR_SCAN(2, tty->print_cr("***** computing
>>>>             linear-scan block order"));
>>>>                init_visited();
>>>>                count_edges(start_block, NULL);
>>>>             @@ -683,7 +683,7 @@
>>>>              }
>>>>              void
>>>>             ComputeLinearScanOrder::**assign_loop_depth(BlockBegin*
>>>>             start_block) {
>>>>             -  TRACE_LINEAR_SCAN(3, "----- computing loop-depth and
>>>>             weight");
>>>>             +  TRACE_LINEAR_SCAN(3, tty->print_cr("----- computing
>>>>             loop-depth and weight"));
>>>>                init_visited();
>>>>                assert(_work_list.is_empty(), "work list must be empty
>>>>             before processing");
>>>>             @@ -868,7 +868,7 @@
>>>>              }
>>>>              void ComputeLinearScanOrder::**compute_order(BlockBegin*
>>>>             start_block) {
>>>>             -  TRACE_LINEAR_SCAN(3, "----- computing final block
>>>> order");
>>>>             +  TRACE_LINEAR_SCAN(3, tty->print_cr("----- computing
>>>>             final block order"));
>>>>                // the start block is always the first block in the
>>>>             linear scan order
>>>>                _linear_scan_order = new BlockList(_num_blocks);
>>>>             diff --git a/src/share/vm/code/nmethod.**cpp
>>>>             b/src/share/vm/code/nmethod.**cpp
>>>>             --- a/src/share/vm/code/nmethod.**cpp
>>>>             +++ b/src/share/vm/code/nmethod.**cpp
>>>>             @@ -2602,7 +2602,8 @@
>>>>              relocation_begin()-1+ip[1]);
>>>>                    for (; ip < index_end; ip++)
>>>>                      tty->print_cr("  (%d ?)", ip[0]);
>>>>             -      tty->print_cr("          @" INTPTR_FORMAT ":
>>>>             index_size=%d", ip, *ip++);
>>>>             +      tty->print_cr("          @" INTPTR_FORMAT ":
>>>>             index_size=%d", ip, *ip);
>>>>             +      ip++;
>>>>                    tty->print_cr("reloc_end @" INTPTR_FORMAT ":", ip);
>>>>                  }
>>>>                }
>>>>             diff --git a/src/share/vm/memory/**cardTableModRefBS.cpp
>>>>             b/src/share/vm/memory/**cardTableModRefBS.cpp
>>>>             --- a/src/share/vm/memory/**cardTableModRefBS.cpp
>>>>             +++ b/src/share/vm/memory/**cardTableModRefBS.cpp
>>>>             @@ -395,7 +395,7 @@
>>>>                }
>>>>                // Touch the last card of the covered region to show
>>>>             that it
>>>>                // is committed (or SEGV).
>>>>             -  debug_only(*byte_for(_covered[**ind].last());)
>>>>             +  debug_only((void) (*byte_for(_covered[ind].last(**)));)
>>>>                debug_only(verify_guard();)
>>>>              }
>>>>             diff --git a/src/share/vm/memory/**universe.cpp
>>>>             b/src/share/vm/memory/**universe.cpp
>>>>             --- a/src/share/vm/memory/**universe.cpp
>>>>             +++ b/src/share/vm/memory/**universe.cpp
>>>>             @@ -532,7 +532,9 @@
>>>>                if (vt) vt->initialize_vtable(false, CHECK);
>>>>                if (ko->oop_is_instance()) {
>>>>                  InstanceKlass* ik = (InstanceKlass*)ko;
>>>>             -    for (KlassHandle s_h(THREAD, ik->subklass()); s_h()
>>>>             != NULL; s_h = (THREAD, s_h()->next_sibling())) {
>>>>             +    for (KlassHandle s_h(THREAD, ik->subklass());
>>>>             +         s_h() != NULL;
>>>>             +         s_h = KlassHandle(THREAD, s_h()->next_sibling()))
>>>> {
>>>>                    reinitialize_vtable_of(s_h, CHECK);
>>>>                  }
>>>>                }
>>>>             diff --git a/src/share/vm/runtime/**sharedRuntime.cpp
>>>>             b/src/share/vm/runtime/**sharedRuntime.cpp
>>>>             --- a/src/share/vm/runtime/**sharedRuntime.cpp
>>>>             +++ b/src/share/vm/runtime/**sharedRuntime.cpp
>>>>             @@ -2733,7 +2733,7 @@
>>>>                // ResourceObject, so do not put any ResourceMarks in
>>>>             here.
>>>>                char *s = sig->as_C_string();
>>>>                int len = (int)strlen(s);
>>>>             -  *s++; len--;                  // Skip opening paren
>>>>             +  s++; len--;                   // Skip opening paren
>>>>                char *t = s+len;
>>>>                while( *(--t) != ')' ) ;      // Find close paren
>>>>             diff --git a/src/share/vm/services/**diagnosticArgument.cpp
>>>>             b/src/share/vm/services/**diagnosticArgument.cpp
>>>>             --- a/src/share/vm/services/**diagnosticArgument.cpp
>>>>             +++ b/src/share/vm/services/**diagnosticArgument.cpp
>>>>             @@ -232,7 +232,7 @@
>>>>                } else {
>>>>                  _value._time = 0;
>>>>                  _value._nanotime = 0;
>>>>             -    strcmp(_value._unit, "ns");
>>>>             +    strcpy(_value._unit, "ns");
>>>>                }
>>>>              }
>>>>             diff --git a/src/share/vm/utilities/**taskqueue.hpp
>>>>             b/src/share/vm/utilities/**taskqueue.hpp
>>>>             --- a/src/share/vm/utilities/**taskqueue.hpp
>>>>             +++ b/src/share/vm/utilities/**taskqueue.hpp
>>>>             @@ -340,8 +340,12 @@
>>>>                if (dirty_n_elems == N - 1) {
>>>>                  // Actually means 0, so do the push.
>>>>                  uint localBot = _bottom;
>>>>             -    // g++ complains if the volatile result of the
>>>>             assignment is unused.
>>>>             -  const_cast<E&>(_elems[**localBot] = t);
>>>>             +    // 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.
>>>>             +    (void) const_cast<E&>(_elems[**localBot] = t);
>>>>              OrderAccess::release_store(&_**bottom,
>>>>             increment_index(localBot));
>>>>              TASKQUEUE_STATS_ONLY(stats.**record_push());
>>>>                  return true;
>>>>             @@ -397,7 +401,12 @@
>>>>                  return false;
>>>>                }
>>>>             -  const_cast<E&>(t = _elems[oldAge.top()]);
>>>>             +  // 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.
>>>>             +  (void) const_cast<E&>(t = _elems[oldAge.top()]);
>>>>                Age newAge(oldAge);
>>>>                newAge.increment();
>>>>                Age resAge = _age.cmpxchg(newAge, oldAge);
>>>>             @@ -640,8 +649,12 @@
>>>>                uint dirty_n_elems = dirty_size(localBot, top);
>>>>                assert(dirty_n_elems < N, "n_elems out of range.");
>>>>                if (dirty_n_elems < max_elems()) {
>>>>             -    // g++ complains if the volatile result of the
>>>>             assignment is unused.
>>>>             -  const_cast<E&>(_elems[**localBot] = t);
>>>>             +    // 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.
>>>>             +    (void) const_cast<E&>(_elems[**localBot] = t);
>>>>              OrderAccess::release_store(&_**bottom,
>>>>             increment_index(localBot));
>>>>              TASKQUEUE_STATS_ONLY(stats.**record_push());
>>>>                  return true;
>>>>             @@ -665,7 +678,12 @@
>>>>                // This is necessary to prevent any read below from
>>>>             being reordered
>>>>                // before the store just above.
>>>>                OrderAccess::fence();
>>>>             -  const_cast<E&>(t = _elems[localBot]);
>>>>             +  // 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.
>>>>             +  (void) const_cast<E&>(t = _elems[localBot]);
>>>>                // This is a second read of "age"; the "size()" above
>>>>             is the first.
>>>>                // If there's still at least one element in the queue,
>>>>             based on the
>>>>                // "_bottom" and "age" we've read, then there can be
>>>>             no interference with
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/attachments/20130517/b6fa1093/attachment-0001.html 


More information about the hotspot-runtime-dev mailing list