Warnings Cleanup in Hotspot
Calvin Cheung
calvin.cheung at oracle.com
Mon May 20 12:57:34 PDT 2013
Yes. I've a patch which passes jprt. I'll do a bit more testing before
sending out a review request.
Calvin
On 5/20/2013 12:46 PM, Jeremy Manson wrote:
> Calvin,
>
> Do you want to take this over, or should I generate a new patch? I
> note that there are a couple of other places I missed (all of which
> seem to have the same pattern of (0)).
>
> Jeremy
>
>
> On Fri, May 17, 2013 at 4:18 PM, Jeremy Manson
> <jeremymanson at google.com <mailto:jeremymanson at google.com>> wrote:
>
> Nice catch - I guess before, that was expanding to
>
> bool match = compare_entry_to(k1, cp2, k2, THREAD);
> if (HAS_PENDING_EXCEPTION) return false;
> (0) && compare_operand_to(i1, cp2, i2, THREAD);
> if (HAS_PENDING_EXCEPTION) return false;
> (0);
>
> which is perfectly legal, but booogus...
>
> Jeremy
>
>
>
>
> On Fri, May 17, 2013 at 3:08 PM, Calvin Cheung
> <calvin.cheung at oracle.com <mailto:calvin.cheung at oracle.com>> wrote:
>
> On 5/17/2013 10:32 AM, Jeremy Manson wrote:
>> I wonder why that didn't pop up when I compiled it.
> I cloned my repo from the following:
> http://hg.openjdk.java.net/hsx/hotspot-rt/hotspot
>
> g++ version is 4.4.6
>
> The file list I mentioned was for fastdebug build on linux_x64.
> When I switched to product build, I found couple more files
> need to be changed.
> Then I needed to change more files for the 32-bit build.
> So there will be few more files added to the list.
>
>>
>> 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.
> After adding the (void) cast in CHECK_false, I'm seeing the
> following error:
> constantPool.cpp:1067: error: void value not ignored as it
> ought to be
> 1066 bool match = compare_entry_to(k1, cp2, k2,
> CHECK_false) &&
> 1067 compare_operand_to(i1, cp2, i2,
> CHECK_false);
> 1068 return match;
>
> the way I fixed it is to break up 1066 - 1067 into 2
> statements such as follows:
> 1066 bool match_entry = compare_entry_to(k1, cp2, k2,
> CHECK_false);
> 1067 bool match_operand = compare_operand_to(i1, cp2, i2,
> CHECK_false);
> 1068 return (match_entry && match_operand);
>
> Calvin
>
>>
>> Jeremy
>>
>>
>> On Thu, May 16, 2013 at 6:59 PM, David Holmes
>> <david.holmes at oracle.com <mailto: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>
>> <mailto:calvin.cheung at oracle.com
>> <mailto: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>
>> <mailto:calvin.cheung at oracle.com
>> <mailto: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>
>> 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/20130520/028563df/attachment-0001.html
More information about the hotspot-runtime-dev
mailing list