diff --git a/hotspot/src/share/vm/runtime/globals.cpp b/hotspot/src/share/vm/runtime/globals.cpp index 29c3ce506a4..d5e5ddbe9fd 100644 --- a/hotspot/src/share/vm/runtime/globals.cpp +++ b/hotspot/src/share/vm/runtime/globals.cpp @@ -303,13 +303,13 @@ void Flag::print_on(outputStream* st, bool withComments) { st->print("%-16s", get_bool() ? "true" : "false"); } if (is_intx()) { - st->print("%-16ld", get_intx()); + st->print(INTX_FORMAT_W(-16), get_intx()); } if (is_uintx()) { - st->print("%-16lu", get_uintx()); + st->print(UINTX_FORMAT_W(-16), get_uintx()); } if (is_uint64_t()) { - st->print("%-16lu", get_uint64_t()); + st->print(UINT64_FORMAT_W(-16), get_uint64_t()); } if (is_double()) { st->print("%-16f", get_double()); diff --git a/hotspot/test/runtime/CommandLine/PrintFlagsUintxTest.java b/hotspot/test/runtime/CommandLine/PrintFlagsUintxTest.java new file mode 100644 index 00000000000..74bdec34236 --- /dev/null +++ b/hotspot/test/runtime/CommandLine/PrintFlagsUintxTest.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8280963 + * @summary "%-16lu" formatting string is used to format uintx (uintptr_t) + * flag values for output. uintx is 64-bit on win64, and "lu" format + * is intended to be used with unsigned long that is 32-bit on win64. + * Thus flag values that are exact multiple of 4 GiB will be formatted + * into 0 in PrintFlags output. + * @library /testlibrary + */ + +import com.oracle.java.testlibrary.*; + +public class PrintFlagsUintxTest { + public static void main(String[] args) throws Exception { + if (!Platform.is64bit()) { + System.out.println("Test needs a 4GB heap and can only be run as a 64bit process, skipping."); + return; + } + + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-Xmx4g", "-XX:+PrintFlagsFinal", "-version"); + + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.stdoutShouldMatch(".*MaxHeapSize\\s+:= 4294967296\\s+.*"); + } +}