--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Wed Dec 21 12:47:29 2016 +0300
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Mon Dec 12 16:16:27 2016 +0300
@@ -3042,6 +3042,10 @@
GENERATE_VM_STRUCT_LAST_ENTRY()
};
+size_t VMStructs::localHotSpotVMStructsLength() {
+ return sizeof(localHotSpotVMStructs) / sizeof(VMStructEntry);
+}
+
VMTypeEntry VMStructs::localHotSpotVMTypes[] = {
VM_TYPES(GENERATE_VM_TYPE_ENTRY,
@@ -3104,6 +3108,10 @@
GENERATE_VM_TYPE_LAST_ENTRY()
};
+size_t VMStructs::localHotSpotVMTypesLength() {
+ return sizeof(localHotSpotVMTypes) / sizeof(VMTypeEntry);
+}
+
VMIntConstantEntry VMStructs::localHotSpotVMIntConstants[] = {
VM_INT_CONSTANTS(GENERATE_VM_INT_CONSTANT_ENTRY,
@@ -3146,6 +3154,10 @@
GENERATE_VM_INT_CONSTANT_LAST_ENTRY()
};
+size_t VMStructs::localHotSpotVMIntConstantsLength() {
+ return sizeof(localHotSpotVMIntConstants) / sizeof(VMIntConstantEntry);
+}
+
VMLongConstantEntry VMStructs::localHotSpotVMLongConstants[] = {
VM_LONG_CONSTANTS(GENERATE_VM_LONG_CONSTANT_ENTRY,
@@ -3175,6 +3187,10 @@
GENERATE_VM_LONG_CONSTANT_LAST_ENTRY()
};
+size_t VMStructs::localHotSpotVMLongConstantsLength() {
+ return sizeof(localHotSpotVMLongConstants) / sizeof(VMLongConstantEntry);
+}
+
// This is used both to check the types of referenced fields and, in
// debug builds, to ensure that all of the field types are present.
void
@@ -3466,45 +3482,3 @@
void vmStructs_init() {
debug_only(VMStructs::init());
}
-
-#ifndef PRODUCT
-void VMStructs::test() {
- // Make sure last entry in the each array is indeed the correct end marker.
- // The reason why these are static is to make sure they are zero initialized.
- // Putting them on the stack will leave some garbage in the padding of some fields.
- static VMStructEntry struct_last_entry = GENERATE_VM_STRUCT_LAST_ENTRY();
- assert(memcmp(&localHotSpotVMStructs[(sizeof(localHotSpotVMStructs) / sizeof(VMStructEntry)) - 1],
- &struct_last_entry,
- sizeof(VMStructEntry)) == 0, "Incorrect last entry in localHotSpotVMStructs");
-
- static VMTypeEntry type_last_entry = GENERATE_VM_TYPE_LAST_ENTRY();
- assert(memcmp(&localHotSpotVMTypes[sizeof(localHotSpotVMTypes) / sizeof(VMTypeEntry) - 1],
- &type_last_entry,
- sizeof(VMTypeEntry)) == 0, "Incorrect last entry in localHotSpotVMTypes");
-
- static VMIntConstantEntry int_last_entry = GENERATE_VM_INT_CONSTANT_LAST_ENTRY();
- assert(memcmp(&localHotSpotVMIntConstants[sizeof(localHotSpotVMIntConstants) / sizeof(VMIntConstantEntry) - 1],
- &int_last_entry,
- sizeof(VMIntConstantEntry)) == 0, "Incorrect last entry in localHotSpotVMIntConstants");
-
- static VMLongConstantEntry long_last_entry = GENERATE_VM_LONG_CONSTANT_LAST_ENTRY();
- assert(memcmp(&localHotSpotVMLongConstants[sizeof(localHotSpotVMLongConstants) / sizeof(VMLongConstantEntry) - 1],
- &long_last_entry,
- sizeof(VMLongConstantEntry)) == 0, "Incorrect last entry in localHotSpotVMLongConstants");
-
-
- // Check for duplicate entries in type array
- for (int i = 0; localHotSpotVMTypes[i].typeName != NULL; i++) {
- for (int j = i + 1; localHotSpotVMTypes[j].typeName != NULL; j++) {
- if (strcmp(localHotSpotVMTypes[i].typeName, localHotSpotVMTypes[j].typeName) == 0) {
- tty->print_cr("Duplicate entries for '%s'", localHotSpotVMTypes[i].typeName);
- assert(false, "Duplicate types in localHotSpotVMTypes array");
- }
- }
- }
-}
-
-void VMStructs_test() {
- VMStructs::test();
-}
-#endif
--- a/hotspot/src/share/vm/runtime/vmStructs.hpp Wed Dec 21 12:47:29 2016 +0300
+++ b/hotspot/src/share/vm/runtime/vmStructs.hpp Mon Dec 12 16:16:27 2016 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, 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
@@ -107,20 +107,28 @@
// The last entry is identified over in the serviceability agent by
// the fact that it has a NULL fieldName
static VMStructEntry localHotSpotVMStructs[];
+ // The function to get localHotSpotVMStructs length
+ static size_t localHotSpotVMStructsLength();
// The last entry is identified over in the serviceability agent by
// the fact that it has a NULL typeName
static VMTypeEntry localHotSpotVMTypes[];
+ // The function to get localHotSpotVMTypes length
+ static size_t localHotSpotVMTypesLength();
// Table of integer constants required by the serviceability agent.
// The last entry is identified over in the serviceability agent by
// the fact that it has a NULL typeName
static VMIntConstantEntry localHotSpotVMIntConstants[];
+ // The function to get localHotSpotVMIntConstants length
+ static size_t localHotSpotVMIntConstantsLength();
// Table of long constants required by the serviceability agent.
// The last entry is identified over in the serviceability agent by
// the fact that it has a NULL typeName
static VMLongConstantEntry localHotSpotVMLongConstants[];
+ // The function to get localHotSpotVMIntConstants length
+ static size_t localHotSpotVMLongConstantsLength();
/**
* Table of addresses.
--- a/hotspot/src/share/vm/utilities/internalVMTests.cpp Wed Dec 21 12:47:29 2016 +0300
+++ b/hotspot/src/share/vm/utilities/internalVMTests.cpp Mon Dec 12 16:16:27 2016 +0300
@@ -49,9 +49,6 @@
run_unit_test(GCTimer_test);
run_unit_test(ObjectMonitor_test);
run_unit_test(DirectivesParser_test);
-#if INCLUDE_VM_STRUCTS
- run_unit_test(VMStructs_test);
-#endif
tty->print_cr("All internal VM tests passed");
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/runtime/test_vmStructs.cpp Mon Dec 12 16:16:27 2016 +0300
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+#include "precompiled.hpp"
+#include "runtime/vmStructs.hpp"
+#include "utilities/macros.hpp"
+#include "unittest.hpp"
+
+#if INCLUDE_VM_STRUCTS
+TEST(VMStructs, last_entries) {
+ // Make sure last entry in the each array is indeed the correct end marker.
+ // The reason why these are static is to make sure they are zero initialized.
+ // Putting them on the stack will leave some garbage in the padding of some fields.
+ static VMStructEntry struct_last_entry = GENERATE_VM_STRUCT_LAST_ENTRY();
+ EXPECT_EQ(0, memcmp(&VMStructs::localHotSpotVMStructs[VMStructs::localHotSpotVMStructsLength() - 1],
+ &struct_last_entry,
+ sizeof(VMStructEntry))) << "Incorrect last entry in localHotSpotVMStructs";
+
+ static VMTypeEntry type_last_entry = GENERATE_VM_TYPE_LAST_ENTRY();
+ EXPECT_EQ(0, memcmp(&VMStructs::localHotSpotVMTypes[VMStructs::localHotSpotVMTypesLength() - 1],
+ &type_last_entry,
+ sizeof(VMTypeEntry))) << "Incorrect last entry in localHotSpotVMTypes";
+
+ static VMIntConstantEntry int_last_entry = GENERATE_VM_INT_CONSTANT_LAST_ENTRY();
+ EXPECT_EQ(0, memcmp(&VMStructs::localHotSpotVMIntConstants[VMStructs::localHotSpotVMIntConstantsLength() - 1],
+ &int_last_entry,
+ sizeof(VMIntConstantEntry))) << "Incorrect last entry in localHotSpotVMIntConstants";
+
+ static VMLongConstantEntry long_last_entry = GENERATE_VM_LONG_CONSTANT_LAST_ENTRY();
+ EXPECT_EQ(0, memcmp(&VMStructs::localHotSpotVMLongConstants[VMStructs::localHotSpotVMLongConstantsLength() - 1],
+ &long_last_entry,
+ sizeof(VMLongConstantEntry))) << "Incorrect last entry in localHotSpotVMLongConstants";
+}
+
+TEST(VMStructs, VMTypes_duplicates) {
+ // Check for duplicate entries in type array
+ for (int i = 0; VMStructs::localHotSpotVMTypes[i].typeName != NULL; i++) {
+ for (int j = i + 1; VMStructs::localHotSpotVMTypes[j].typeName != NULL; j++) {
+ EXPECT_STRNE(VMStructs::localHotSpotVMTypes[i].typeName, VMStructs::localHotSpotVMTypes[j].typeName)
+ << "Duplicate entries on indexes " << i << " and " << j;
+ }
+ }
+}
+#endif